diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index 1865994155..1199fade4b 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -35,6 +35,9 @@ "@blocksuite/affine-fragment-outline": "workspace:*", "@blocksuite/affine-gfx-text": "workspace:*", "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", + "@blocksuite/affine-inline-link": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", @@ -91,6 +94,9 @@ "./blocks/table": "./src/blocks/table.ts", "./data-view": "./src/data-view/index.ts", "./data-view/effects": "./src/data-view/effects.ts", + "./inlines/link": "./src/inlines/link.ts", + "./inlines/reference": "./src/inlines/reference.ts", + "./inlines/preset": "./src/inlines/preset.ts", "./widgets/drag-handle": "./src/widgets/drag-handle.ts", "./widgets/edgeless-auto-connect": "./src/widgets/edgeless-auto-connect.ts", "./widgets/frame-title": "./src/widgets/frame-title.ts", diff --git a/blocksuite/affine/all/src/adapters/extension.ts b/blocksuite/affine/all/src/adapters/extension.ts index 4f3bb93a2d..051639c949 100644 --- a/blocksuite/affine/all/src/adapters/extension.ts +++ b/blocksuite/affine/all/src/adapters/extension.ts @@ -5,7 +5,7 @@ import { InlineDeltaToPlainTextAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, NotionHtmlInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine-rich-text'; +} from '@blocksuite/affine-inline-preset'; import { AttachmentAdapterFactoryExtension, HtmlAdapterFactoryExtension, diff --git a/blocksuite/affine/all/src/effects.ts b/blocksuite/affine/all/src/effects.ts index 17428e397d..5dcba51ca2 100644 --- a/blocksuite/affine/all/src/effects.ts +++ b/blocksuite/affine/all/src/effects.ts @@ -45,6 +45,9 @@ import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine- 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 inlineLinkEffects } from '@blocksuite/affine-inline-link/effects'; +import { effects as inlinePresetEffects } from '@blocksuite/affine-inline-preset/effects'; +import { effects as inlineReferenceEffects } from '@blocksuite/affine-inline-reference/effects'; import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects'; import { effects as widgetDragHandleEffects } from '@blocksuite/affine-widget-drag-handle/effects'; import { effects as widgetEdgelessAutoConnectEffects } from '@blocksuite/affine-widget-edgeless-auto-connect/effects'; @@ -113,6 +116,10 @@ export function effects() { dataViewEffects(); richTextEffects(); + inlineReferenceEffects(); + inlinePresetEffects(); + inlineLinkEffects(); + blockNoteEffects(); blockAttachmentEffects(); blockBookmarkEffects(); diff --git a/blocksuite/affine/all/src/extensions/common.ts b/blocksuite/affine/all/src/extensions/common.ts index b67d6f7c73..43c4411b4d 100644 --- a/blocksuite/affine/all/src/extensions/common.ts +++ b/blocksuite/affine/all/src/extensions/common.ts @@ -25,10 +25,7 @@ import { PageSurfaceRefBlockSpec, } from '@blocksuite/affine-block-surface-ref'; import { TableBlockSpec } from '@blocksuite/affine-block-table'; -import { - RefNodeSlotsExtension, - RichTextExtensions, -} from '@blocksuite/affine-rich-text'; +import { inlinePresetExtensions } from '@blocksuite/affine-inline-preset'; import { DefaultOpenDocExtension, DocDisplayMetaService, @@ -38,10 +35,9 @@ import { import type { ExtensionType } from '@blocksuite/store'; export const CommonBlockSpecs: ExtensionType[] = [ + inlinePresetExtensions, DocDisplayMetaService, - RefNodeSlotsExtension, EditPropsStore, - RichTextExtensions, LatexBlockSpec, ListBlockSpec, DatabaseBlockSpec, diff --git a/blocksuite/affine/all/src/inlines/link.ts b/blocksuite/affine/all/src/inlines/link.ts new file mode 100644 index 0000000000..27dec5bed0 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/link.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-link'; diff --git a/blocksuite/affine/all/src/inlines/preset.ts b/blocksuite/affine/all/src/inlines/preset.ts new file mode 100644 index 0000000000..eed4409277 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/preset.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-preset'; diff --git a/blocksuite/affine/all/src/inlines/reference.ts b/blocksuite/affine/all/src/inlines/reference.ts new file mode 100644 index 0000000000..b1ff50317a --- /dev/null +++ b/blocksuite/affine/all/src/inlines/reference.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-reference'; diff --git a/blocksuite/affine/all/tsconfig.json b/blocksuite/affine/all/tsconfig.json index da7b34ada4..6a8ab64ee1 100644 --- a/blocksuite/affine/all/tsconfig.json +++ b/blocksuite/affine/all/tsconfig.json @@ -32,6 +32,9 @@ { "path": "../fragments/fragment-outline" }, { "path": "../gfx/text" }, { "path": "../gfx/turbo-renderer" }, + { "path": "../inlines/link" }, + { "path": "../inlines/preset" }, + { "path": "../inlines/reference" }, { "path": "../model" }, { "path": "../rich-text" }, { "path": "../shared" }, diff --git a/blocksuite/affine/blocks/block-callout/package.json b/blocksuite/affine/blocks/block-callout/package.json index aea159b7ba..4be535dbe6 100644 --- a/blocksuite/affine/blocks/block-callout/package.json +++ b/blocksuite/affine/blocks/block-callout/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-callout/src/callout-block.ts b/blocksuite/affine/blocks/block-callout/src/callout-block.ts index 00f6ae00f3..74c44106ac 100644 --- a/blocksuite/affine/blocks/block-callout/src/callout-block.ts +++ b/blocksuite/affine/blocks/block-callout/src/callout-block.ts @@ -1,7 +1,7 @@ import { CaptionedBlockComponent } from '@blocksuite/affine-components/caption'; import { createLitPortal } from '@blocksuite/affine-components/portal'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import { type CalloutBlockModel } from '@blocksuite/affine-model'; -import { DefaultInlineManagerExtension } from '@blocksuite/affine-rich-text'; import { NOTE_SELECTOR } from '@blocksuite/affine-shared/consts'; import { DocModeProvider, @@ -12,7 +12,6 @@ import type { BlockComponent } from '@blocksuite/block-std'; import { flip, offset } from '@floating-ui/dom'; import { css, html } from 'lit'; import { query } from 'lit/decorators.js'; - export class CalloutBlockComponent extends CaptionedBlockComponent { static override styles = css` :host { diff --git a/blocksuite/affine/blocks/block-callout/tsconfig.json b/blocksuite/affine/blocks/block-callout/tsconfig.json index 090131b11a..3b03fbd474 100644 --- a/blocksuite/affine/blocks/block-callout/tsconfig.json +++ b/blocksuite/affine/blocks/block-callout/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-code/package.json b/blocksuite/affine/blocks/block-code/package.json index 231b0d6b20..81e4a57b76 100644 --- a/blocksuite/affine/blocks/block-code/package.json +++ b/blocksuite/affine/blocks/block-code/package.json @@ -11,6 +11,8 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-link": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-code/src/clipboard/index.ts b/blocksuite/affine/blocks/block-code/src/clipboard/index.ts index 469e1a6332..0259f9a850 100644 --- a/blocksuite/affine/blocks/block-code/src/clipboard/index.ts +++ b/blocksuite/affine/blocks/block-code/src/clipboard/index.ts @@ -1,4 +1,4 @@ -import { deleteTextCommand } from '@blocksuite/affine-rich-text'; +import { deleteTextCommand } from '@blocksuite/affine-inline-preset'; import { HtmlAdapter, pasteMiddleware, diff --git a/blocksuite/affine/blocks/block-code/src/code-block-inline.ts b/blocksuite/affine/blocks/block-code/src/code-block-inline.ts index 63f585b852..2c6f908b5c 100644 --- a/blocksuite/affine/blocks/block-code/src/code-block-inline.ts +++ b/blocksuite/affine/blocks/block-code/src/code-block-inline.ts @@ -1,3 +1,4 @@ +import { LinkInlineSpecExtension } from '@blocksuite/affine-inline-link'; import { BackgroundInlineSpecExtension, BoldInlineSpecExtension, @@ -5,10 +6,9 @@ import { ColorInlineSpecExtension, ItalicInlineSpecExtension, LatexInlineSpecExtension, - LinkInlineSpecExtension, StrikeInlineSpecExtension, UnderlineInlineSpecExtension, -} from '@blocksuite/affine-rich-text'; +} from '@blocksuite/affine-inline-preset'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { InlineManagerExtension, diff --git a/blocksuite/affine/blocks/block-code/src/code-keymap.ts b/blocksuite/affine/blocks/block-code/src/code-keymap.ts index a7f3d3fd50..9904f34cc8 100644 --- a/blocksuite/affine/blocks/block-code/src/code-keymap.ts +++ b/blocksuite/affine/blocks/block-code/src/code-keymap.ts @@ -1,5 +1,5 @@ +import { textKeymap } from '@blocksuite/affine-inline-preset'; import { CodeBlockSchema } from '@blocksuite/affine-model'; -import { textKeymap } from '@blocksuite/affine-rich-text'; import { KeymapExtension } from '@blocksuite/block-std'; export const CodeKeymapExtension = KeymapExtension(textKeymap, { diff --git a/blocksuite/affine/blocks/block-code/src/highlight/affine-code-unit.ts b/blocksuite/affine/blocks/block-code/src/highlight/affine-code-unit.ts index 40c8223413..890d549f17 100644 --- a/blocksuite/affine/blocks/block-code/src/highlight/affine-code-unit.ts +++ b/blocksuite/affine/blocks/block-code/src/highlight/affine-code-unit.ts @@ -1,4 +1,4 @@ -import { affineTextStyles } from '@blocksuite/affine-rich-text'; +import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/block-std'; import { ZERO_WIDTH_SPACE } from '@blocksuite/block-std/inline'; diff --git a/blocksuite/affine/blocks/block-code/tsconfig.json b/blocksuite/affine/blocks/block-code/tsconfig.json index 090131b11a..fa21e142d4 100644 --- a/blocksuite/affine/blocks/block-code/tsconfig.json +++ b/blocksuite/affine/blocks/block-code/tsconfig.json @@ -8,6 +8,8 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../inlines/link" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-database/package.json b/blocksuite/affine/blocks/block-database/package.json index c0beb587e9..6c12a57466 100644 --- a/blocksuite/affine/blocks/block-database/package.json +++ b/blocksuite/affine/blocks/block-database/package.json @@ -11,6 +11,8 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-database/src/detail-panel/block-renderer.ts b/blocksuite/affine/blocks/block-database/src/detail-panel/block-renderer.ts index 8afca6e1d2..d581b21428 100644 --- a/blocksuite/affine/blocks/block-database/src/detail-panel/block-renderer.ts +++ b/blocksuite/affine/blocks/block-database/src/detail-panel/block-renderer.ts @@ -1,4 +1,4 @@ -import { DefaultInlineManagerExtension } from '@blocksuite/affine-rich-text'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import type { EditorHost } from '@blocksuite/block-std'; import { ShadowlessElement } from '@blocksuite/block-std'; import type { DetailSlotProps } from '@blocksuite/data-view'; diff --git a/blocksuite/affine/blocks/block-database/src/properties/link/cell-renderer.ts b/blocksuite/affine/blocks/block-database/src/properties/link/cell-renderer.ts index bbba759180..ed793dd085 100644 --- a/blocksuite/affine/blocks/block-database/src/properties/link/cell-renderer.ts +++ b/blocksuite/affine/blocks/block-database/src/properties/link/cell-renderer.ts @@ -1,4 +1,4 @@ -import { RefNodeSlotsProvider } from '@blocksuite/affine-rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine-inline-reference'; import { ParseDocUrlProvider } from '@blocksuite/affine-shared/services'; import { isValidUrl, diff --git a/blocksuite/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts b/blocksuite/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts index 26a796d329..0d2b30ced3 100644 --- a/blocksuite/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts +++ b/blocksuite/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts @@ -1,13 +1,13 @@ -import type { - AffineInlineEditor, - RichText, -} from '@blocksuite/affine-rich-text'; -import { DefaultInlineManagerExtension } from '@blocksuite/affine-rich-text'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; +import type { RichText } from '@blocksuite/affine-rich-text'; import { ParseDocUrlProvider, TelemetryProvider, } from '@blocksuite/affine-shared/services'; -import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import type { + AffineInlineEditor, + AffineTextAttributes, +} from '@blocksuite/affine-shared/types'; import { getViewportElement, isValidUrl, diff --git a/blocksuite/affine/blocks/block-database/src/properties/title/text.ts b/blocksuite/affine/blocks/block-database/src/properties/title/text.ts index f50f4efcca..9be370bf1b 100644 --- a/blocksuite/affine/blocks/block-database/src/properties/title/text.ts +++ b/blocksuite/affine/blocks/block-database/src/properties/title/text.ts @@ -1,7 +1,5 @@ -import { - DefaultInlineManagerExtension, - type RichText, -} from '@blocksuite/affine-rich-text'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; +import type { RichText } from '@blocksuite/affine-rich-text'; import { ParseDocUrlProvider, TelemetryProvider, diff --git a/blocksuite/affine/blocks/block-database/tsconfig.json b/blocksuite/affine/blocks/block-database/tsconfig.json index cac1929af0..c231481930 100644 --- a/blocksuite/affine/blocks/block-database/tsconfig.json +++ b/blocksuite/affine/blocks/block-database/tsconfig.json @@ -9,6 +9,8 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../inlines/preset" }, + { "path": "../../inlines/reference" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-edgeless-text/package.json b/blocksuite/affine/blocks/block-edgeless-text/package.json index 9d0c4e588a..a95f785153 100644 --- a/blocksuite/affine/blocks/block-edgeless-text/package.json +++ b/blocksuite/affine/blocks/block-edgeless-text/package.json @@ -12,6 +12,7 @@ "dependencies": { "@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts b/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts index dd1b65b182..aa7c0f48fa 100644 --- a/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts +++ b/blocksuite/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts @@ -1,10 +1,10 @@ import { TextUtils } from '@blocksuite/affine-block-surface'; +import { formatBlockCommand } from '@blocksuite/affine-inline-preset'; import { type EdgelessTextBlockModel, ListBlockModel, ParagraphBlockModel, } from '@blocksuite/affine-model'; -import { formatBlockCommand } from '@blocksuite/affine-rich-text'; import { ThemeProvider } from '@blocksuite/affine-shared/services'; import { matchModels } from '@blocksuite/affine-shared/utils'; import type { BlockComponent } from '@blocksuite/block-std'; diff --git a/blocksuite/affine/blocks/block-edgeless-text/tsconfig.json b/blocksuite/affine/blocks/block-edgeless-text/tsconfig.json index 952a90d3ce..8b82812cb7 100644 --- a/blocksuite/affine/blocks/block-edgeless-text/tsconfig.json +++ b/blocksuite/affine/blocks/block-edgeless-text/tsconfig.json @@ -9,6 +9,7 @@ "references": [ { "path": "../block-surface" }, { "path": "../../components" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-embed/package.json b/blocksuite/affine/blocks/block-embed/package.json index 949a309bb8..3ec0992dc7 100644 --- a/blocksuite/affine/blocks/block-embed/package.json +++ b/blocksuite/affine/blocks/block-embed/package.json @@ -12,6 +12,7 @@ "dependencies": { "@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts index 80b8402f93..4d650609fb 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -1,11 +1,11 @@ import { SurfaceBlockModel } from '@blocksuite/affine-block-surface'; import { isPeekable, Peekable } from '@blocksuite/affine-components/peek'; +import { RefNodeSlotsProvider } from '@blocksuite/affine-inline-reference'; import type { DocMode, EmbedLinkedDocModel, EmbedLinkedDocStyles, } from '@blocksuite/affine-model'; -import { RefNodeSlotsProvider } from '@blocksuite/affine-rich-text'; import { EMBED_CARD_HEIGHT, EMBED_CARD_WIDTH, diff --git a/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts index 4f342cc329..4cbad37e88 100644 --- a/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts +++ b/blocksuite/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts @@ -1,4 +1,8 @@ import { Peekable } from '@blocksuite/affine-components/peek'; +import { + type DocLinkClickedEvent, + RefNodeSlotsProvider, +} from '@blocksuite/affine-inline-reference'; import { type AliasInfo, type DocMode, @@ -6,10 +10,6 @@ import { NoteDisplayMode, type ReferenceInfo, } from '@blocksuite/affine-model'; -import { - type DocLinkClickedEvent, - RefNodeSlotsProvider, -} from '@blocksuite/affine-rich-text'; import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; import { DocDisplayMetaProvider, diff --git a/blocksuite/affine/blocks/block-embed/tsconfig.json b/blocksuite/affine/blocks/block-embed/tsconfig.json index 360fd51ed1..dec8de5499 100644 --- a/blocksuite/affine/blocks/block-embed/tsconfig.json +++ b/blocksuite/affine/blocks/block-embed/tsconfig.json @@ -9,6 +9,7 @@ "references": [ { "path": "../block-surface" }, { "path": "../../components" }, + { "path": "../../inlines/reference" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-latex/package.json b/blocksuite/affine/blocks/block-latex/package.json index 0bae3cef4b..25cf1bb67f 100644 --- a/blocksuite/affine/blocks/block-latex/package.json +++ b/blocksuite/affine/blocks/block-latex/package.json @@ -12,6 +12,7 @@ "dependencies": { "@blocksuite/affine-block-note": "workspace:*", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-latex/src/configs/slash-menu.ts b/blocksuite/affine/blocks/block-latex/src/configs/slash-menu.ts index 51b08426d6..b976e90ee7 100644 --- a/blocksuite/affine/blocks/block-latex/src/configs/slash-menu.ts +++ b/blocksuite/affine/blocks/block-latex/src/configs/slash-menu.ts @@ -1,4 +1,4 @@ -import { insertInlineLatex } from '@blocksuite/affine-rich-text'; +import { insertInlineLatex } from '@blocksuite/affine-inline-preset'; import { getSelectedModelsCommand, getTextSelectionCommand, diff --git a/blocksuite/affine/blocks/block-latex/tsconfig.json b/blocksuite/affine/blocks/block-latex/tsconfig.json index 7dfc290bbd..85b2d659da 100644 --- a/blocksuite/affine/blocks/block-latex/tsconfig.json +++ b/blocksuite/affine/blocks/block-latex/tsconfig.json @@ -9,6 +9,7 @@ "references": [ { "path": "../block-note" }, { "path": "../../components" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-list/package.json b/blocksuite/affine/blocks/block-list/package.json index 7887c03c26..f938152bbd 100644 --- a/blocksuite/affine/blocks/block-list/package.json +++ b/blocksuite/affine/blocks/block-list/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-list/src/list-block.ts b/blocksuite/affine/blocks/block-list/src/list-block.ts index 5c36023fa6..b108af06c0 100644 --- a/blocksuite/affine/blocks/block-list/src/list-block.ts +++ b/blocksuite/affine/blocks/block-list/src/list-block.ts @@ -3,11 +3,9 @@ import '@blocksuite/affine-shared/commands'; import { CaptionedBlockComponent } from '@blocksuite/affine-components/caption'; import { playCheckAnimation } from '@blocksuite/affine-components/icons'; import { TOGGLE_BUTTON_PARENT_CLASS } from '@blocksuite/affine-components/toggle-button'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import type { ListBlockModel } from '@blocksuite/affine-model'; -import { - DefaultInlineManagerExtension, - type RichText, -} from '@blocksuite/affine-rich-text'; +import type { RichText } from '@blocksuite/affine-rich-text'; import { BLOCK_CHILDREN_CONTAINER_PADDING_LEFT, NOTE_SELECTOR, diff --git a/blocksuite/affine/blocks/block-list/src/list-keymap.ts b/blocksuite/affine/blocks/block-list/src/list-keymap.ts index 649fbd1ad7..11d63a3c5a 100644 --- a/blocksuite/affine/blocks/block-list/src/list-keymap.ts +++ b/blocksuite/affine/blocks/block-list/src/list-keymap.ts @@ -1,5 +1,6 @@ +import { textKeymap } from '@blocksuite/affine-inline-preset'; import { ListBlockSchema } from '@blocksuite/affine-model'; -import { markdownInput, textKeymap } from '@blocksuite/affine-rich-text'; +import { markdownInput } from '@blocksuite/affine-rich-text'; import { getSelectedModelsCommand } from '@blocksuite/affine-shared/commands'; import { KeymapExtension, TextSelection } from '@blocksuite/block-std'; import { IS_MAC } from '@blocksuite/global/env'; diff --git a/blocksuite/affine/blocks/block-list/tsconfig.json b/blocksuite/affine/blocks/block-list/tsconfig.json index b7256b24bc..3ad8f63b98 100644 --- a/blocksuite/affine/blocks/block-list/tsconfig.json +++ b/blocksuite/affine/blocks/block-list/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-note/package.json b/blocksuite/affine/blocks/block-note/package.json index 1bc0d744bc..fa4031fb10 100644 --- a/blocksuite/affine/blocks/block-note/package.json +++ b/blocksuite/affine/blocks/block-note/package.json @@ -14,6 +14,7 @@ "@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-fragment-doc-title": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-note/src/configs/slash-menu.ts b/blocksuite/affine/blocks/block-note/src/configs/slash-menu.ts index 4e8d5ec7f5..c851d27423 100644 --- a/blocksuite/affine/blocks/block-note/src/configs/slash-menu.ts +++ b/blocksuite/affine/blocks/block-note/src/configs/slash-menu.ts @@ -1,9 +1,11 @@ import { formatBlockCommand, - type TextConversionConfig, - textConversionConfigs, type TextFormatConfig, textFormatConfigs, +} from '@blocksuite/affine-inline-preset'; +import { + type TextConversionConfig, + textConversionConfigs, } from '@blocksuite/affine-rich-text'; import { isInsideBlockByFlavour } from '@blocksuite/affine-shared/utils'; import { diff --git a/blocksuite/affine/blocks/block-note/tsconfig.json b/blocksuite/affine/blocks/block-note/tsconfig.json index 34e19eaf88..6fd9bb9bfa 100644 --- a/blocksuite/affine/blocks/block-note/tsconfig.json +++ b/blocksuite/affine/blocks/block-note/tsconfig.json @@ -11,6 +11,7 @@ { "path": "../block-surface" }, { "path": "../../components" }, { "path": "../../fragments/fragment-doc-title" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-paragraph/package.json b/blocksuite/affine/blocks/block-paragraph/package.json index 0c9c7e0c25..bb93507204 100644 --- a/blocksuite/affine/blocks/block-paragraph/package.json +++ b/blocksuite/affine/blocks/block-paragraph/package.json @@ -12,6 +12,7 @@ "dependencies": { "@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-paragraph/src/paragraph-block.ts b/blocksuite/affine/blocks/block-paragraph/src/paragraph-block.ts index 9d8ea326ce..4e9405eccb 100644 --- a/blocksuite/affine/blocks/block-paragraph/src/paragraph-block.ts +++ b/blocksuite/affine/blocks/block-paragraph/src/paragraph-block.ts @@ -1,10 +1,8 @@ import { CaptionedBlockComponent } from '@blocksuite/affine-components/caption'; import { TOGGLE_BUTTON_PARENT_CLASS } from '@blocksuite/affine-components/toggle-button'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import type { ParagraphBlockModel } from '@blocksuite/affine-model'; -import { - DefaultInlineManagerExtension, - type RichText, -} from '@blocksuite/affine-rich-text'; +import type { RichText } from '@blocksuite/affine-rich-text'; import { BLOCK_CHILDREN_CONTAINER_PADDING_LEFT, NOTE_SELECTOR, diff --git a/blocksuite/affine/blocks/block-paragraph/src/paragraph-keymap.ts b/blocksuite/affine/blocks/block-paragraph/src/paragraph-keymap.ts index 42db42629a..d35201c638 100644 --- a/blocksuite/affine/blocks/block-paragraph/src/paragraph-keymap.ts +++ b/blocksuite/affine/blocks/block-paragraph/src/paragraph-keymap.ts @@ -1,3 +1,4 @@ +import { textKeymap } from '@blocksuite/affine-inline-preset'; import { CalloutBlockModel, ParagraphBlockModel, @@ -7,7 +8,6 @@ import { focusTextModel, getInlineEditorByModel, markdownInput, - textKeymap, } from '@blocksuite/affine-rich-text'; import { calculateCollapsedSiblings, diff --git a/blocksuite/affine/blocks/block-paragraph/tsconfig.json b/blocksuite/affine/blocks/block-paragraph/tsconfig.json index a0f9c669b5..500df54d81 100644 --- a/blocksuite/affine/blocks/block-paragraph/tsconfig.json +++ b/blocksuite/affine/blocks/block-paragraph/tsconfig.json @@ -9,6 +9,7 @@ "references": [ { "path": "../../components" }, { "path": "../../gfx/turbo-renderer" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-root/package.json b/blocksuite/affine/blocks/block-root/package.json index e371e92e98..283de42cf3 100644 --- a/blocksuite/affine/blocks/block-root/package.json +++ b/blocksuite/affine/blocks/block-root/package.json @@ -28,6 +28,9 @@ "@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-fragment-doc-title": "workspace:*", "@blocksuite/affine-gfx-text": "workspace:*", + "@blocksuite/affine-inline-link": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-root/src/clipboard/page-clipboard.ts b/blocksuite/affine/blocks/block-root/src/clipboard/page-clipboard.ts index acbb721fd1..57a4afe77a 100644 --- a/blocksuite/affine/blocks/block-root/src/clipboard/page-clipboard.ts +++ b/blocksuite/affine/blocks/block-root/src/clipboard/page-clipboard.ts @@ -1,4 +1,4 @@ -import { deleteTextCommand } from '@blocksuite/affine-rich-text'; +import { deleteTextCommand } from '@blocksuite/affine-inline-preset'; import { pasteMiddleware, replaceIdMiddleware, diff --git a/blocksuite/affine/blocks/block-root/src/configs/toolbar.ts b/blocksuite/affine/blocks/block-root/src/configs/toolbar.ts index d6140df9a4..8bb0d190cb 100644 --- a/blocksuite/affine/blocks/block-root/src/configs/toolbar.ts +++ b/blocksuite/affine/blocks/block-root/src/configs/toolbar.ts @@ -16,9 +16,9 @@ import { formatNativeCommand, formatTextCommand, isFormatSupported, - textConversionConfigs, textFormatConfigs, -} from '@blocksuite/affine-rich-text'; +} from '@blocksuite/affine-inline-preset'; +import { textConversionConfigs } from '@blocksuite/affine-rich-text'; import { copySelectedModelsCommand, deleteSelectedModelsCommand, diff --git a/blocksuite/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts b/blocksuite/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts index a0dd83fdf7..06fab32381 100644 --- a/blocksuite/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts +++ b/blocksuite/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts @@ -20,21 +20,23 @@ import { getSurfaceBlock } from '@blocksuite/affine-block-surface'; import { insertSurfaceRefBlockCommand } from '@blocksuite/affine-block-surface-ref'; import { toggleEmbedCardCreateModal } from '@blocksuite/affine-components/embed-card-modal'; import { toast } from '@blocksuite/affine-components/toast'; -import type { FrameBlockModel } from '@blocksuite/affine-model'; +import { toggleLink } from '@blocksuite/affine-inline-link'; import { formatBlockCommand, formatNativeCommand, formatTextCommand, - getInlineEditorByModel, getTextStyle, - insertContent, insertInlineLatex, toggleBold, toggleCode, toggleItalic, - toggleLink, toggleStrike, toggleUnderline, +} from '@blocksuite/affine-inline-preset'; +import type { FrameBlockModel } from '@blocksuite/affine-model'; +import { + getInlineEditorByModel, + insertContent, } from '@blocksuite/affine-rich-text'; import { copySelectedModelsCommand, diff --git a/blocksuite/affine/blocks/block-root/src/widgets/linked-doc/config.ts b/blocksuite/affine/blocks/block-root/src/widgets/linked-doc/config.ts index 71e40c7ca7..64e164dc17 100644 --- a/blocksuite/affine/blocks/block-root/src/widgets/linked-doc/config.ts +++ b/blocksuite/affine/blocks/block-root/src/widgets/linked-doc/config.ts @@ -5,14 +5,12 @@ import { NewDocIcon, } from '@blocksuite/affine-components/icons'; import { toast } from '@blocksuite/affine-components/toast'; -import { - type AffineInlineEditor, - insertLinkedNode, -} from '@blocksuite/affine-rich-text'; +import { insertLinkedNode } from '@blocksuite/affine-inline-reference'; import { DocModeProvider, TelemetryProvider, } from '@blocksuite/affine-shared/services'; +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; import { createDefaultDoc, isFuzzyMatch, diff --git a/blocksuite/affine/blocks/block-root/tsconfig.json b/blocksuite/affine/blocks/block-root/tsconfig.json index 33b5f75e25..fb0cd62006 100644 --- a/blocksuite/affine/blocks/block-root/tsconfig.json +++ b/blocksuite/affine/blocks/block-root/tsconfig.json @@ -25,6 +25,9 @@ { "path": "../../components" }, { "path": "../../fragments/fragment-doc-title" }, { "path": "../../gfx/text" }, + { "path": "../../inlines/link" }, + { "path": "../../inlines/preset" }, + { "path": "../../inlines/reference" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/blocks/block-table/package.json b/blocksuite/affine/blocks/block-table/package.json index 22c63acb6b..b5e672c8d4 100644 --- a/blocksuite/affine/blocks/block-table/package.json +++ b/blocksuite/affine/blocks/block-table/package.json @@ -12,6 +12,7 @@ "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.4.0", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", diff --git a/blocksuite/affine/blocks/block-table/src/table-cell.ts b/blocksuite/affine/blocks/block-table/src/table-cell.ts index 8d6ac7d9ad..0011bf7e80 100644 --- a/blocksuite/affine/blocks/block-table/src/table-cell.ts +++ b/blocksuite/affine/blocks/block-table/src/table-cell.ts @@ -5,11 +5,9 @@ import { popupTargetFromElement, } from '@blocksuite/affine-components/context-menu'; import { TextBackgroundDuotoneIcon } from '@blocksuite/affine-components/icons'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import type { TableColumn, TableRow } from '@blocksuite/affine-model'; -import { - DefaultInlineManagerExtension, - RichText, -} from '@blocksuite/affine-rich-text'; +import { RichText } from '@blocksuite/affine-rich-text'; import { cssVarV2 } from '@blocksuite/affine-shared/theme'; import { getViewportElement } from '@blocksuite/affine-shared/utils'; import { ShadowlessElement } from '@blocksuite/block-std'; diff --git a/blocksuite/affine/blocks/block-table/tsconfig.json b/blocksuite/affine/blocks/block-table/tsconfig.json index 1562eb9cb0..e8cb028cca 100644 --- a/blocksuite/affine/blocks/block-table/tsconfig.json +++ b/blocksuite/affine/blocks/block-table/tsconfig.json @@ -9,6 +9,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/inlines/link/package.json b/blocksuite/affine/inlines/link/package.json new file mode 100644 index 0000000000..659db5c67b --- /dev/null +++ b/blocksuite/affine/inlines/link/package.json @@ -0,0 +1,46 @@ +{ + "name": "@blocksuite/affine-inline-link", + "description": "Inline link for BlockSuite.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", + "@blocksuite/affine-model": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/block-std": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.6", + "@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", + "collapse-white-space": "^2.1.0", + "date-fns": "^4.0.0", + "lit": "^3.2.0", + "lit-html": "^3.2.1", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1", + "yjs": "^13.6.21", + "zod": "^3.23.8" + }, + "exports": { + ".": "./src/index.ts", + "./effects": "./src/effects.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.20.0" +} diff --git a/blocksuite/affine/inlines/link/src/adapters/html/html-inline.ts b/blocksuite/affine/inlines/link/src/adapters/html/html-inline.ts new file mode 100644 index 0000000000..b92d6affe9 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/html/html-inline.ts @@ -0,0 +1,70 @@ +import { + type HtmlAST, + HtmlASTToDeltaExtension, +} from '@blocksuite/affine-shared/adapters'; +import type { Element } from 'hast'; + +const isElement = (ast: HtmlAST): ast is Element => { + return ast.type === 'element'; +}; + +export const htmlLinkElementToDeltaMatcher = HtmlASTToDeltaExtension({ + name: 'link-element', + match: ast => isElement(ast) && ast.tagName === 'a', + toDelta: (ast, context) => { + if (!isElement(ast)) { + return []; + } + const href = ast.properties?.href; + if (typeof href !== 'string') { + return []; + } + const { configs } = context; + const baseUrl = configs.get('docLinkBaseUrl') ?? ''; + if (baseUrl && href.startsWith(baseUrl)) { + const path = href.substring(baseUrl.length); + // ^ - /{pageId}?mode={mode}&blockIds={blockIds}&elementIds={elementIds} + const match = path.match(/^\/([^?]+)(\?.*)?$/); + if (match) { + const pageId = match?.[1]; + const search = match?.[2]; + const searchParams = search ? new URLSearchParams(search) : undefined; + const mode = searchParams?.get('mode'); + const blockIds = searchParams?.get('blockIds')?.split(','); + const elementIds = searchParams?.get('elementIds')?.split(','); + + return [ + { + insert: ' ', + attributes: { + reference: { + type: 'LinkedPage', + pageId, + params: { + mode: + mode && ['edgeless', 'page'].includes(mode) + ? (mode as 'edgeless' | 'page') + : undefined, + blockIds, + elementIds, + }, + }, + }, + }, + ]; + } + } + return ast.children.flatMap(child => + context.toDelta(child, { trim: false }).map(delta => { + if (href.startsWith('http')) { + delta.attributes = { + ...delta.attributes, + link: href, + }; + return delta; + } + return delta; + }) + ); + }, +}); diff --git a/blocksuite/affine/inlines/link/src/adapters/html/inline-delta.ts b/blocksuite/affine/inlines/link/src/adapters/html/inline-delta.ts new file mode 100644 index 0000000000..3300af5c88 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/html/inline-delta.ts @@ -0,0 +1,25 @@ +import type { InlineHtmlAST } from '@blocksuite/affine-shared/adapters'; +import { InlineDeltaToHtmlAdapterExtension } from '@blocksuite/affine-shared/adapters'; + +export const linkDeltaToHtmlAdapterMatcher = InlineDeltaToHtmlAdapterExtension({ + name: 'link', + match: delta => !!delta.attributes?.link, + toAST: (delta, _) => { + const hast: InlineHtmlAST = { + type: 'text', + value: delta.insert, + }; + const link = delta.attributes?.link; + if (!link) { + return hast; + } + return { + type: 'element', + tagName: 'a', + properties: { + href: link, + }, + children: [hast], + }; + }, +}); diff --git a/blocksuite/affine/inlines/link/src/adapters/index.ts b/blocksuite/affine/inlines/link/src/adapters/index.ts new file mode 100644 index 0000000000..5603485379 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/index.ts @@ -0,0 +1,6 @@ +export * from './html/html-inline'; +export * from './html/inline-delta'; +export * from './markdown/inline-delta'; +export * from './markdown/markdown-inline'; +export * from './notion-html/html-inline'; +export * from './plain-text/inline-delta'; diff --git a/blocksuite/affine/rich-text/src/inline/adapters/markdown/index.ts b/blocksuite/affine/inlines/link/src/adapters/markdown/index.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/adapters/markdown/index.ts rename to blocksuite/affine/inlines/link/src/adapters/markdown/index.ts diff --git a/blocksuite/affine/inlines/link/src/adapters/markdown/inline-delta.ts b/blocksuite/affine/inlines/link/src/adapters/markdown/inline-delta.ts new file mode 100644 index 0000000000..9c548ac962 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/markdown/inline-delta.ts @@ -0,0 +1,36 @@ +import { InlineDeltaToMarkdownAdapterExtension } from '@blocksuite/affine-shared/adapters'; +import type { PhrasingContent } from 'mdast'; + +export const linkDeltaToMarkdownAdapterMatcher = + InlineDeltaToMarkdownAdapterExtension({ + name: 'link', + match: delta => !!delta.attributes?.link, + toAST: (delta, context) => { + const mdast: PhrasingContent = { + type: 'text', + value: delta.insert, + }; + const link = delta.attributes?.link; + if (!link) { + return mdast; + } + + const { current: currentMdast } = context; + if ('value' in currentMdast) { + if (currentMdast.value === '') { + return { + type: 'text', + value: link, + }; + } + if (mdast.value !== link) { + return { + type: 'link', + url: link, + children: [currentMdast], + }; + } + } + return mdast; + }, + }); diff --git a/blocksuite/affine/inlines/link/src/adapters/markdown/markdown-inline.ts b/blocksuite/affine/inlines/link/src/adapters/markdown/markdown-inline.ts new file mode 100644 index 0000000000..ab9762b1ff --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/markdown/markdown-inline.ts @@ -0,0 +1,52 @@ +import { MarkdownASTToDeltaExtension } from '@blocksuite/affine-shared/adapters'; + +export const markdownLinkToDeltaMatcher = MarkdownASTToDeltaExtension({ + name: 'link', + match: ast => ast.type === 'link', + toDelta: (ast, context) => { + if (!('children' in ast) || !('url' in ast)) { + return []; + } + const { configs } = context; + const baseUrl = configs.get('docLinkBaseUrl') ?? ''; + if (baseUrl && ast.url.startsWith(baseUrl)) { + const path = ast.url.substring(baseUrl.length); + // ^ - /{pageId}?mode={mode}&blockIds={blockIds}&elementIds={elementIds} + const match = path.match(/^\/([^?]+)(\?.*)?$/); + if (match) { + const pageId = match?.[1]; + const search = match?.[2]; + const searchParams = search ? new URLSearchParams(search) : undefined; + const mode = searchParams?.get('mode'); + const blockIds = searchParams?.get('blockIds')?.split(','); + const elementIds = searchParams?.get('elementIds')?.split(','); + + return [ + { + insert: ' ', + attributes: { + reference: { + type: 'LinkedPage', + pageId, + params: { + mode: + mode && ['edgeless', 'page'].includes(mode) + ? (mode as 'edgeless' | 'page') + : undefined, + blockIds, + elementIds, + }, + }, + }, + }, + ]; + } + } + return ast.children.flatMap(child => + context.toDelta(child).map(delta => { + delta.attributes = { ...delta.attributes, link: ast.url }; + return delta; + }) + ); + }, +}); diff --git a/blocksuite/affine/inlines/link/src/adapters/notion-html/html-inline.ts b/blocksuite/affine/inlines/link/src/adapters/notion-html/html-inline.ts new file mode 100644 index 0000000000..1766ab26bf --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/notion-html/html-inline.ts @@ -0,0 +1,52 @@ +import { + type HtmlAST, + NotionHtmlASTToDeltaExtension, +} from '@blocksuite/affine-shared/adapters'; +import type { Element } from 'hast'; + +const isElement = (ast: HtmlAST): ast is Element => { + return ast.type === 'element'; +}; + +export const notionHtmlLinkElementToDeltaMatcher = + NotionHtmlASTToDeltaExtension({ + name: 'link-element', + match: ast => isElement(ast) && ast.tagName === 'a', + toDelta: (ast, context) => { + if (!isElement(ast)) { + return []; + } + + const href = ast.properties?.href; + if (typeof href !== 'string') { + return []; + } + const { toDelta, options } = context; + return ast.children.flatMap(child => + toDelta(child, options).map(delta => { + if (options.pageMap) { + const pageId = options.pageMap.get(decodeURIComponent(href)); + if (pageId) { + delta.attributes = { + ...delta.attributes, + reference: { + type: 'LinkedPage', + pageId, + }, + }; + delta.insert = ' '; + return delta; + } + } + if (href.startsWith('http')) { + delta.attributes = { + ...delta.attributes, + link: href, + }; + return delta; + } + return delta; + }) + ); + }, + }); diff --git a/blocksuite/affine/inlines/link/src/adapters/plain-text/inline-delta.ts b/blocksuite/affine/inlines/link/src/adapters/plain-text/inline-delta.ts new file mode 100644 index 0000000000..bd74784318 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/adapters/plain-text/inline-delta.ts @@ -0,0 +1,25 @@ +import { + InlineDeltaToPlainTextAdapterExtension, + type TextBuffer, +} from '@blocksuite/affine-shared/adapters'; + +export const linkDeltaMarkdownAdapterMatch = + InlineDeltaToPlainTextAdapterExtension({ + name: 'link', + match: delta => !!delta.attributes?.link, + toAST: delta => { + const linkText = delta.insert; + const node: TextBuffer = { + content: linkText, + }; + const link = delta.attributes?.link; + if (!link) { + return node; + } + + const content = `${linkText ? `${linkText}: ` : ''}${link}`; + return { + content, + }; + }, + }); diff --git a/blocksuite/affine/inlines/link/src/command.ts b/blocksuite/affine/inlines/link/src/command.ts new file mode 100644 index 0000000000..0055ad14ab --- /dev/null +++ b/blocksuite/affine/inlines/link/src/command.ts @@ -0,0 +1,42 @@ +import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import type { Command } from '@blocksuite/block-std'; +import { + INLINE_ROOT_ATTR, + type InlineRootElement, +} from '@blocksuite/block-std/inline'; + +import { toggleLinkPopup } from './link-node/link-popup/toggle-link-popup'; + +export const toggleLink: Command = (ctx, next) => { + const selection = document.getSelection(); + if (!selection || selection.rangeCount === 0) return false; + + const range = selection.getRangeAt(0); + if (range.collapsed) return false; + const inlineRoot = range.startContainer.parentElement?.closest< + InlineRootElement + >(`[${INLINE_ROOT_ATTR}]`); + if (!inlineRoot) return false; + + const inlineEditor = inlineRoot.inlineEditor; + const targetInlineRange = inlineEditor.getInlineRange(); + + if (!targetInlineRange || targetInlineRange.length === 0) return false; + + const format = inlineEditor.getFormat(targetInlineRange); + if (format.link) { + inlineEditor.formatText(targetInlineRange, { link: null }); + return next(); + } + + const abortController = new AbortController(); + const popup = toggleLinkPopup( + ctx.std, + 'create', + inlineEditor, + targetInlineRange, + abortController + ); + abortController.signal.addEventListener('abort', () => popup.remove()); + return next(); +}; diff --git a/blocksuite/affine/inlines/link/src/effects.ts b/blocksuite/affine/inlines/link/src/effects.ts new file mode 100644 index 0000000000..7906e05c9b --- /dev/null +++ b/blocksuite/affine/inlines/link/src/effects.ts @@ -0,0 +1,7 @@ +import { AffineLink } from './link-node/affine-link'; +import { LinkPopup } from './link-node/link-popup/link-popup'; + +export function effects() { + customElements.define('link-popup', LinkPopup); + customElements.define('affine-link', AffineLink); +} diff --git a/blocksuite/affine/inlines/link/src/exts.ts b/blocksuite/affine/inlines/link/src/exts.ts new file mode 100644 index 0000000000..67ee45b106 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/exts.ts @@ -0,0 +1,9 @@ +import type { ExtensionType } from '@blocksuite/store'; + +import { LinkInlineSpecExtension } from './inline-spec'; +import { linkToolbar } from './toolbar'; + +export const inlineLinkExtensions: ExtensionType[] = [ + LinkInlineSpecExtension, + linkToolbar, +]; diff --git a/blocksuite/affine/inlines/link/src/index.ts b/blocksuite/affine/inlines/link/src/index.ts new file mode 100644 index 0000000000..77e3423d9c --- /dev/null +++ b/blocksuite/affine/inlines/link/src/index.ts @@ -0,0 +1,6 @@ +export * from './adapters'; +export * from './command'; +export * from './exts'; +export * from './inline-spec'; +export * from './link-node'; +export * from './toolbar'; diff --git a/blocksuite/affine/inlines/link/src/inline-spec.ts b/blocksuite/affine/inlines/link/src/inline-spec.ts new file mode 100644 index 0000000000..8a284a2e58 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/inline-spec.ts @@ -0,0 +1,20 @@ +import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import { StdIdentifier } from '@blocksuite/block-std'; +import { InlineSpecExtension } from '@blocksuite/block-std/inline'; +import { html } from 'lit'; +import { z } from 'zod'; + +export const LinkInlineSpecExtension = + InlineSpecExtension('link', provider => { + const std = provider.get(StdIdentifier); + return { + name: 'link', + schema: z.string().optional().nullable().catch(undefined), + match: delta => { + return !!delta.attributes?.link; + }, + renderer: ({ delta }) => { + return html``; + }, + }; + }); diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/affine-link.ts b/blocksuite/affine/inlines/link/src/link-node/affine-link.ts similarity index 97% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/affine-link.ts rename to blocksuite/affine/inlines/link/src/link-node/affine-link.ts index e9b98c47d3..4b0ea49ed4 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/affine-link.ts +++ b/blocksuite/affine/inlines/link/src/link-node/affine-link.ts @@ -1,9 +1,11 @@ import { whenHover } from '@blocksuite/affine-components/hover'; +import { RefNodeSlotsProvider } from '@blocksuite/affine-inline-reference'; import type { ReferenceInfo } from '@blocksuite/affine-model'; import { ParseDocUrlProvider, ToolbarRegistryIdentifier, } from '@blocksuite/affine-shared/services'; +import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import type { BlockComponent, BlockStdScope } from '@blocksuite/block-std'; import { BLOCK_ID_ATTR, ShadowlessElement } from '@blocksuite/block-std'; @@ -18,9 +20,6 @@ import { css, html } from 'lit'; import { property } from 'lit/decorators.js'; import { type StyleInfo, styleMap } from 'lit/directives/style-map.js'; -import { RefNodeSlotsProvider } from '../../../../extension'; -import { affineTextStyles } from '../affine-text'; - export class AffineLink extends WithDisposable(ShadowlessElement) { static override styles = css` affine-link a:hover [data-v-text='true'] { diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/configs/toolbar.ts b/blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/configs/toolbar.ts rename to blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/index.ts b/blocksuite/affine/inlines/link/src/link-node/index.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/index.ts rename to blocksuite/affine/inlines/link/src/link-node/index.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/link-popup.ts b/blocksuite/affine/inlines/link/src/link-node/link-popup/link-popup.ts similarity index 99% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/link-popup.ts rename to blocksuite/affine/inlines/link/src/link-node/link-popup/link-popup.ts index 9d81a1f6cb..69a8603341 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/link-popup.ts +++ b/blocksuite/affine/inlines/link/src/link-node/link-popup/link-popup.ts @@ -1,4 +1,5 @@ import type { EditorIconButton } from '@blocksuite/affine-components/toolbar'; +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; import { isValidUrl, normalizeUrl, @@ -13,7 +14,6 @@ import { html, LitElement } from 'lit'; import { property, query } from 'lit/decorators.js'; import { choose } from 'lit/directives/choose.js'; -import type { AffineInlineEditor } from '../../../affine-inline-specs'; import { linkPopupStyle } from './styles'; export class LinkPopup extends WithDisposable(LitElement) { diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/styles.ts b/blocksuite/affine/inlines/link/src/link-node/link-popup/styles.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/styles.ts rename to blocksuite/affine/inlines/link/src/link-node/link-popup/styles.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/toggle-link-popup.ts b/blocksuite/affine/inlines/link/src/link-node/link-popup/toggle-link-popup.ts similarity index 89% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/toggle-link-popup.ts rename to blocksuite/affine/inlines/link/src/link-node/link-popup/toggle-link-popup.ts index 9711482715..98b9c1dbd7 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/link-node/link-popup/toggle-link-popup.ts +++ b/blocksuite/affine/inlines/link/src/link-node/link-popup/toggle-link-popup.ts @@ -1,7 +1,7 @@ +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; import type { BlockStdScope } from '@blocksuite/block-std'; import type { InlineRange } from '@blocksuite/block-std/inline'; -import type { AffineInlineEditor } from '../../../affine-inline-specs'; import { LinkPopup } from './link-popup'; export function toggleLinkPopup( diff --git a/blocksuite/affine/inlines/link/src/toolbar.ts b/blocksuite/affine/inlines/link/src/toolbar.ts new file mode 100644 index 0000000000..6b00c75fd4 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/toolbar.ts @@ -0,0 +1,9 @@ +import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services'; +import { BlockFlavourIdentifier } from '@blocksuite/block-std'; + +import { builtinInlineLinkToolbarConfig } from './link-node/configs/toolbar.js'; + +export const linkToolbar = ToolbarModuleExtension({ + id: BlockFlavourIdentifier('affine:link'), + config: builtinInlineLinkToolbarConfig, +}); diff --git a/blocksuite/affine/inlines/link/tsconfig.json b/blocksuite/affine/inlines/link/tsconfig.json new file mode 100644 index 0000000000..90cfdb6092 --- /dev/null +++ b/blocksuite/affine/inlines/link/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../components" }, + { "path": "../reference" }, + { "path": "../../model" }, + { "path": "../../shared" }, + { "path": "../../../framework/block-std" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/store" } + ] +} diff --git a/blocksuite/affine/inlines/preset/package.json b/blocksuite/affine/inlines/preset/package.json new file mode 100644 index 0000000000..64c319054d --- /dev/null +++ b/blocksuite/affine/inlines/preset/package.json @@ -0,0 +1,54 @@ +{ + "name": "@blocksuite/affine-inline-preset", + "description": "Inline preset for BlockSuite.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-link": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", + "@blocksuite/affine-model": "workspace:*", + "@blocksuite/affine-rich-text": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/block-std": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.6", + "@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/hast": "^3.0.4", + "@types/katex": "^0.16.7", + "@types/lodash-es": "^4.17.12", + "@types/mdast": "^4.0.4", + "collapse-white-space": "^2.1.0", + "date-fns": "^4.0.0", + "katex": "^0.16.11", + "lit": "^3.2.0", + "lit-html": "^3.2.1", + "lodash-es": "^4.17.21", + "remark-math": "^6.0.0", + "rxjs": "^7.8.1", + "shiki": "^3.0.0", + "yjs": "^13.6.21", + "zod": "^3.23.8" + }, + "exports": { + ".": "./src/index.ts", + "./effects": "./src/effects.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.20.0" +} diff --git a/blocksuite/affine/rich-text/src/inline/adapters/extensions.ts b/blocksuite/affine/inlines/preset/src/adapters/extensions.ts similarity index 77% rename from blocksuite/affine/rich-text/src/inline/adapters/extensions.ts rename to blocksuite/affine/inlines/preset/src/adapters/extensions.ts index e0d2127509..75d2ecaa23 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/extensions.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/extensions.ts @@ -15,3 +15,10 @@ export const InlineAdapterExtensions: ExtensionType[] = [ InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, ].flat(); + +export * from './html/html-inline'; +export * from './html/inline-delta'; +export * from './markdown/inline-delta'; +export * from './markdown/markdown-inline'; +export * from './notion-html/html-inline'; +export * from './plain-text/inline-delta'; diff --git a/blocksuite/affine/rich-text/src/inline/adapters/html/html-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts similarity index 72% rename from blocksuite/affine/rich-text/src/inline/adapters/html/html-inline.ts rename to blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts index 5b39176fff..da5f10f35c 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/html/html-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts @@ -1,3 +1,4 @@ +import { htmlLinkElementToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { type HtmlAST, HtmlASTToDeltaExtension, @@ -136,67 +137,6 @@ export const htmlUnderlineElementToDeltaMatcher = HtmlASTToDeltaExtension({ }, }); -export const htmlLinkElementToDeltaMatcher = HtmlASTToDeltaExtension({ - name: 'link-element', - match: ast => isElement(ast) && ast.tagName === 'a', - toDelta: (ast, context) => { - if (!isElement(ast)) { - return []; - } - const href = ast.properties?.href; - if (typeof href !== 'string') { - return []; - } - const { configs } = context; - const baseUrl = configs.get('docLinkBaseUrl') ?? ''; - if (baseUrl && href.startsWith(baseUrl)) { - const path = href.substring(baseUrl.length); - // ^ - /{pageId}?mode={mode}&blockIds={blockIds}&elementIds={elementIds} - const match = path.match(/^\/([^?]+)(\?.*)?$/); - if (match) { - const pageId = match?.[1]; - const search = match?.[2]; - const searchParams = search ? new URLSearchParams(search) : undefined; - const mode = searchParams?.get('mode'); - const blockIds = searchParams?.get('blockIds')?.split(','); - const elementIds = searchParams?.get('elementIds')?.split(','); - - return [ - { - insert: ' ', - attributes: { - reference: { - type: 'LinkedPage', - pageId, - params: { - mode: - mode && ['edgeless', 'page'].includes(mode) - ? (mode as 'edgeless' | 'page') - : undefined, - blockIds, - elementIds, - }, - }, - }, - }, - ]; - } - } - return ast.children.flatMap(child => - context.toDelta(child, { trim: false }).map(delta => { - if (href.startsWith('http')) { - delta.attributes = { - ...delta.attributes, - link: href, - }; - return delta; - } - return delta; - }) - ); - }, -}); - export const htmlMarkElementToDeltaMatcher = HtmlASTToDeltaExtension({ name: 'mark-element', match: ast => isElement(ast) && ast.tagName === 'mark', diff --git a/blocksuite/affine/rich-text/src/inline/adapters/html/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts similarity index 73% rename from blocksuite/affine/rich-text/src/inline/adapters/html/inline-delta.ts rename to blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts index b2b2b4c2f1..2bcd787fdc 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/html/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts @@ -1,8 +1,7 @@ +import { linkDeltaToHtmlAdapterMatcher } from '@blocksuite/affine-inline-link'; +import { referenceDeltaToHtmlAdapterMatcher } from '@blocksuite/affine-inline-reference'; import type { InlineHtmlAST } from '@blocksuite/affine-shared/adapters'; -import { - AdapterTextUtils, - InlineDeltaToHtmlAdapterExtension, -} from '@blocksuite/affine-shared/adapters'; +import { InlineDeltaToHtmlAdapterExtension } from '@blocksuite/affine-shared/adapters'; import { ThemeProvider } from '@blocksuite/affine-shared/services'; export const boldDeltaToHtmlAdapterMatcher = InlineDeltaToHtmlAdapterExtension({ @@ -74,66 +73,6 @@ export const underlineDeltaToHtmlAdapterMatcher = }, }); -export const referenceDeltaToHtmlAdapterMatcher = - InlineDeltaToHtmlAdapterExtension({ - name: 'reference', - match: delta => !!delta.attributes?.reference, - toAST: (delta, context) => { - let hast: InlineHtmlAST = { - type: 'text', - value: delta.insert, - }; - const reference = delta.attributes?.reference; - if (!reference) { - return hast; - } - - const { configs } = context; - const title = configs.get(`title:${reference.pageId}`); - const url = AdapterTextUtils.generateDocUrl( - configs.get('docLinkBaseUrl') ?? '', - String(reference.pageId), - reference.params ?? Object.create(null) - ); - if (title) { - hast.value = title; - } - hast = { - type: 'element', - tagName: 'a', - properties: { - href: url, - }, - children: [hast], - }; - - return hast; - }, - }); - -export const linkDeltaToHtmlAdapterMatcher = InlineDeltaToHtmlAdapterExtension({ - name: 'link', - match: delta => !!delta.attributes?.link, - toAST: (delta, _) => { - const hast: InlineHtmlAST = { - type: 'text', - value: delta.insert, - }; - const link = delta.attributes?.link; - if (!link) { - return hast; - } - return { - type: 'element', - tagName: 'a', - properties: { - href: link, - }, - children: [hast], - }; - }, -}); - export const highlightBackgroundDeltaToHtmlAdapterMatcher = InlineDeltaToHtmlAdapterExtension({ name: 'highlight-background', diff --git a/blocksuite/affine/rich-text/src/inline/adapters/markdown/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts similarity index 68% rename from blocksuite/affine/rich-text/src/inline/adapters/markdown/inline-delta.ts rename to blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts index ee66081c80..b46f55a6da 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/markdown/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts @@ -1,5 +1,6 @@ +import { linkDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-link'; +import { referenceDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-reference'; import { - AdapterTextUtils, FOOTNOTE_DEFINITION_PREFIX, InlineDeltaToMarkdownAdapterExtension, } from '@blocksuite/affine-shared/adapters'; @@ -57,77 +58,6 @@ export const inlineCodeDeltaToMarkdownAdapterMatcher = }), }); -export const referenceDeltaToMarkdownAdapterMatcher = - InlineDeltaToMarkdownAdapterExtension({ - name: 'reference', - match: delta => !!delta.attributes?.reference, - toAST: (delta, context) => { - let mdast: PhrasingContent = { - type: 'text', - value: delta.insert, - }; - const reference = delta.attributes?.reference; - if (!reference) { - return mdast; - } - - const { configs } = context; - const title = configs.get(`title:${reference.pageId}`); - const params = reference.params ?? {}; - const url = AdapterTextUtils.generateDocUrl( - configs.get('docLinkBaseUrl') ?? '', - String(reference.pageId), - params - ); - mdast = { - type: 'link', - url, - children: [ - { - type: 'text', - value: title ?? '', - }, - ], - }; - - return mdast; - }, - }); - -export const linkDeltaToMarkdownAdapterMatcher = - InlineDeltaToMarkdownAdapterExtension({ - name: 'link', - match: delta => !!delta.attributes?.link, - toAST: (delta, context) => { - const mdast: PhrasingContent = { - type: 'text', - value: delta.insert, - }; - const link = delta.attributes?.link; - if (!link) { - return mdast; - } - - const { current: currentMdast } = context; - if ('value' in currentMdast) { - if (currentMdast.value === '') { - return { - type: 'text', - value: link, - }; - } - if (mdast.value !== link) { - return { - type: 'link', - url: link, - children: [currentMdast], - }; - } - } - return mdast; - }, - }); - export const latexDeltaToMarkdownAdapterMatcher = InlineDeltaToMarkdownAdapterExtension({ name: 'inlineLatex', diff --git a/blocksuite/affine/rich-text/src/inline/adapters/markdown/markdown-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts similarity index 71% rename from blocksuite/affine/rich-text/src/inline/adapters/markdown/markdown-inline.ts rename to blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts index 7932f0ba0d..ea79aa6014 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/markdown/markdown-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts @@ -1,3 +1,4 @@ +import { markdownLinkToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { FootNoteReferenceParamsSchema } from '@blocksuite/affine-model'; import { FOOTNOTE_DEFINITION_PREFIX, @@ -74,57 +75,6 @@ export const markdownDeleteToDeltaMatcher = MarkdownASTToDeltaExtension({ }, }); -export const markdownLinkToDeltaMatcher = MarkdownASTToDeltaExtension({ - name: 'link', - match: ast => ast.type === 'link', - toDelta: (ast, context) => { - if (!('children' in ast) || !('url' in ast)) { - return []; - } - const { configs } = context; - const baseUrl = configs.get('docLinkBaseUrl') ?? ''; - if (baseUrl && ast.url.startsWith(baseUrl)) { - const path = ast.url.substring(baseUrl.length); - // ^ - /{pageId}?mode={mode}&blockIds={blockIds}&elementIds={elementIds} - const match = path.match(/^\/([^?]+)(\?.*)?$/); - if (match) { - const pageId = match?.[1]; - const search = match?.[2]; - const searchParams = search ? new URLSearchParams(search) : undefined; - const mode = searchParams?.get('mode'); - const blockIds = searchParams?.get('blockIds')?.split(','); - const elementIds = searchParams?.get('elementIds')?.split(','); - - return [ - { - insert: ' ', - attributes: { - reference: { - type: 'LinkedPage', - pageId, - params: { - mode: - mode && ['edgeless', 'page'].includes(mode) - ? (mode as 'edgeless' | 'page') - : undefined, - blockIds, - elementIds, - }, - }, - }, - }, - ]; - } - } - return ast.children.flatMap(child => - context.toDelta(child).map(delta => { - delta.attributes = { ...delta.attributes, link: ast.url }; - return delta; - }) - ); - }, -}); - export const markdownListToDeltaMatcher = MarkdownASTToDeltaExtension({ name: 'list', match: ast => ast.type === 'list', diff --git a/blocksuite/affine/rich-text/src/inline/adapters/notion-html/html-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts similarity index 86% rename from blocksuite/affine/rich-text/src/inline/adapters/notion-html/html-inline.ts rename to blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts index d09787fe21..99a9e90ab6 100644 --- a/blocksuite/affine/rich-text/src/inline/adapters/notion-html/html-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts @@ -1,3 +1,4 @@ +import { notionHtmlLinkElementToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { HastUtils, type HtmlAST, @@ -185,49 +186,6 @@ export const notionHtmlUnderlineElementToDeltaMatcher = }, }); -export const notionHtmlLinkElementToDeltaMatcher = - NotionHtmlASTToDeltaExtension({ - name: 'link-element', - match: ast => isElement(ast) && ast.tagName === 'a', - toDelta: (ast, context) => { - if (!isElement(ast)) { - return []; - } - - const href = ast.properties?.href; - if (typeof href !== 'string') { - return []; - } - const { toDelta, options } = context; - return ast.children.flatMap(child => - toDelta(child, options).map(delta => { - if (options.pageMap) { - const pageId = options.pageMap.get(decodeURIComponent(href)); - if (pageId) { - delta.attributes = { - ...delta.attributes, - reference: { - type: 'LinkedPage', - pageId, - }, - }; - delta.insert = ' '; - return delta; - } - } - if (href.startsWith('http')) { - delta.attributes = { - ...delta.attributes, - link: href, - }; - return delta; - } - return delta; - }) - ); - }, - }); - export const notionHtmlMarkElementToDeltaMatcher = NotionHtmlASTToDeltaExtension({ name: 'mark-element', diff --git a/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts new file mode 100644 index 0000000000..19d78f7d98 --- /dev/null +++ b/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts @@ -0,0 +1,30 @@ +import { linkDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-link'; +import { referenceDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-reference'; +import { + InlineDeltaToPlainTextAdapterExtension, + type TextBuffer, +} from '@blocksuite/affine-shared/adapters'; +import type { ExtensionType } from '@blocksuite/store'; + +export const latexDeltaMarkdownAdapterMatch = + InlineDeltaToPlainTextAdapterExtension({ + name: 'inlineLatex', + match: delta => !!delta.attributes?.latex, + toAST: delta => { + const node: TextBuffer = { + content: delta.insert, + }; + if (!delta.attributes?.latex) { + return node; + } + return { + content: delta.attributes?.latex, + }; + }, + }); + +export const InlineDeltaToPlainTextAdapterExtensions: ExtensionType[] = [ + referenceDeltaMarkdownAdapterMatch, + linkDeltaMarkdownAdapterMatch, + latexDeltaMarkdownAdapterMatch, +]; diff --git a/blocksuite/affine/rich-text/src/format/config.ts b/blocksuite/affine/inlines/preset/src/command/config.ts similarity index 98% rename from blocksuite/affine/rich-text/src/format/config.ts rename to blocksuite/affine/inlines/preset/src/command/config.ts index 2a2ece2a84..e193b5834e 100644 --- a/blocksuite/affine/rich-text/src/format/config.ts +++ b/blocksuite/affine/inlines/preset/src/command/config.ts @@ -6,6 +6,7 @@ import { StrikethroughIcon, UnderlineIcon, } from '@blocksuite/affine-components/icons'; +import { toggleLink } from '@blocksuite/affine-inline-link'; import { type EditorHost, TextSelection } from '@blocksuite/block-std'; import type { TemplateResult } from 'lit'; @@ -14,7 +15,6 @@ import { toggleBold, toggleCode, toggleItalic, - toggleLink, toggleStrike, toggleUnderline, } from './text-style.js'; diff --git a/blocksuite/affine/rich-text/src/format/consts.ts b/blocksuite/affine/inlines/preset/src/command/consts.ts similarity index 100% rename from blocksuite/affine/rich-text/src/format/consts.ts rename to blocksuite/affine/inlines/preset/src/command/consts.ts diff --git a/blocksuite/affine/rich-text/src/format/delete-text.ts b/blocksuite/affine/inlines/preset/src/command/delete-text.ts similarity index 100% rename from blocksuite/affine/rich-text/src/format/delete-text.ts rename to blocksuite/affine/inlines/preset/src/command/delete-text.ts diff --git a/blocksuite/affine/rich-text/src/format/format-block.ts b/blocksuite/affine/inlines/preset/src/command/format-block.ts similarity index 100% rename from blocksuite/affine/rich-text/src/format/format-block.ts rename to blocksuite/affine/inlines/preset/src/command/format-block.ts diff --git a/blocksuite/affine/rich-text/src/format/format-native.ts b/blocksuite/affine/inlines/preset/src/command/format-native.ts similarity index 100% rename from blocksuite/affine/rich-text/src/format/format-native.ts rename to blocksuite/affine/inlines/preset/src/command/format-native.ts diff --git a/blocksuite/affine/rich-text/src/format/format-text.ts b/blocksuite/affine/inlines/preset/src/command/format-text.ts similarity index 97% rename from blocksuite/affine/rich-text/src/format/format-text.ts rename to blocksuite/affine/inlines/preset/src/command/format-text.ts index efc24d4c07..1958158a22 100644 --- a/blocksuite/affine/rich-text/src/format/format-text.ts +++ b/blocksuite/affine/inlines/preset/src/command/format-text.ts @@ -1,3 +1,4 @@ +import { clearMarksOnDiscontinuousInput } from '@blocksuite/affine-rich-text'; import { getSelectedBlocksCommand } from '@blocksuite/affine-shared/commands'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import type { Command, TextSelection } from '@blocksuite/block-std'; @@ -7,7 +8,6 @@ import { } from '@blocksuite/block-std/inline'; import { FORMAT_TEXT_SUPPORT_FLAVOURS } from './consts.js'; -import { clearMarksOnDiscontinuousInput } from './utils.js'; // for text selection export const formatTextCommand: Command<{ diff --git a/blocksuite/affine/rich-text/src/format/index.ts b/blocksuite/affine/inlines/preset/src/command/index.ts similarity index 85% rename from blocksuite/affine/rich-text/src/format/index.ts rename to blocksuite/affine/inlines/preset/src/command/index.ts index f2bcbeeb34..ebaafab5f3 100644 --- a/blocksuite/affine/rich-text/src/format/index.ts +++ b/blocksuite/affine/inlines/preset/src/command/index.ts @@ -16,13 +16,8 @@ export { toggleBold, toggleCode, toggleItalic, - toggleLink, toggleStrike, toggleTextStyleCommand, toggleUnderline, } from './text-style.js'; -export { - clearMarksOnDiscontinuousInput, - insertContent, - isFormatSupported, -} from './utils.js'; +export { isFormatSupported } from './utils.js'; diff --git a/blocksuite/affine/rich-text/src/format/insert-inline-latex.ts b/blocksuite/affine/inlines/preset/src/command/insert-inline-latex.ts similarity index 100% rename from blocksuite/affine/rich-text/src/format/insert-inline-latex.ts rename to blocksuite/affine/inlines/preset/src/command/insert-inline-latex.ts diff --git a/blocksuite/affine/rich-text/src/format/text-style.ts b/blocksuite/affine/inlines/preset/src/command/text-style.ts similarity index 69% rename from blocksuite/affine/rich-text/src/format/text-style.ts rename to blocksuite/affine/inlines/preset/src/command/text-style.ts index d340390706..75cdb3a21d 100644 --- a/blocksuite/affine/rich-text/src/format/text-style.ts +++ b/blocksuite/affine/inlines/preset/src/command/text-style.ts @@ -4,12 +4,7 @@ import { } from '@blocksuite/affine-shared/commands'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import type { Command } from '@blocksuite/block-std'; -import { - INLINE_ROOT_ATTR, - type InlineRootElement, -} from '@blocksuite/block-std/inline'; -import { toggleLinkPopup } from '../inline/index.js'; import { formatBlockCommand } from './format-block.js'; import { formatNativeCommand } from './format-native.js'; import { formatTextCommand } from './format-text.js'; @@ -71,40 +66,6 @@ export const toggleUnderline = toggleTextStyleCommandWrapper('underline'); export const toggleStrike = toggleTextStyleCommandWrapper('strike'); export const toggleCode = toggleTextStyleCommandWrapper('code'); -export const toggleLink: Command = (ctx, next) => { - const selection = document.getSelection(); - if (!selection || selection.rangeCount === 0) return false; - - const range = selection.getRangeAt(0); - if (range.collapsed) return false; - const inlineRoot = range.startContainer.parentElement?.closest< - InlineRootElement - >(`[${INLINE_ROOT_ATTR}]`); - if (!inlineRoot) return false; - - const inlineEditor = inlineRoot.inlineEditor; - const targetInlineRange = inlineEditor.getInlineRange(); - - if (!targetInlineRange || targetInlineRange.length === 0) return false; - - const format = inlineEditor.getFormat(targetInlineRange); - if (format.link) { - inlineEditor.formatText(targetInlineRange, { link: null }); - return next(); - } - - const abortController = new AbortController(); - const popup = toggleLinkPopup( - ctx.std, - 'create', - inlineEditor, - targetInlineRange, - abortController - ); - abortController.signal.addEventListener('abort', () => popup.remove()); - return next(); -}; - export const getTextStyle: Command<{}, { textStyle: AffineTextAttributes }> = ( ctx, next diff --git a/blocksuite/affine/rich-text/src/format/utils.ts b/blocksuite/affine/inlines/preset/src/command/utils.ts similarity index 78% rename from blocksuite/affine/rich-text/src/format/utils.ts rename to blocksuite/affine/inlines/preset/src/command/utils.ts index 1e9f7217f4..666af33881 100644 --- a/blocksuite/affine/rich-text/src/format/utils.ts +++ b/blocksuite/affine/inlines/preset/src/command/utils.ts @@ -3,11 +3,13 @@ import { getSelectedBlocksCommand, getTextSelectionCommand, } from '@blocksuite/affine-shared/commands'; -import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import type { + AffineInlineEditor, + AffineTextAttributes, +} from '@blocksuite/affine-shared/types'; import { BLOCK_ID_ATTR, type BlockComponent, - type BlockStdScope, type Chain, type InitCommandCtx, } from '@blocksuite/block-std'; @@ -17,11 +19,7 @@ import { type InlineRange, type InlineRootElement, } from '@blocksuite/block-std/inline'; -import type { BlockModel } from '@blocksuite/store'; -import { effect } from '@preact/signals-core'; -import { getInlineEditorByModel } from '../dom.js'; -import type { AffineInlineEditor } from '../inline/index.js'; import { FORMAT_BLOCK_SUPPORT_FLAVOURS, FORMAT_NATIVE_SUPPORT_FLAVOURS, @@ -209,50 +207,3 @@ export function isFormatSupported(chain: Chain) { (_type, inlineEditors) => inlineEditors.length > 0 ); } - -// When the user selects a range, check if it matches the previous selection. -// If it does, apply the marks from the previous selection. -// If it does not, remove the marks from the previous selection. -export function clearMarksOnDiscontinuousInput( - inlineEditor: InlineEditor -): void { - let inlineRange = inlineEditor.getInlineRange(); - const dispose = effect(() => { - const r = inlineEditor.inlineRange$.value; - if ( - inlineRange && - r && - (inlineRange.index === r.index || inlineRange.index === r.index + 1) - ) { - inlineRange = r; - } else { - inlineEditor.resetMarks(); - dispose(); - } - }); -} - -export function insertContent( - std: BlockStdScope, - model: BlockModel, - text: string, - attributes?: AffineTextAttributes -) { - if (!model.text) { - console.error("Can't insert text! Text not found"); - return; - } - const inlineEditor = getInlineEditorByModel(std, model); - if (!inlineEditor) { - console.error("Can't insert text! Inline editor not found"); - return; - } - const inlineRange = inlineEditor.getInlineRange(); - const index = inlineRange ? inlineRange.index : model.text.length; - model.text.insert(text, index, attributes as Record); - // Update the caret to the end of the inserted text - inlineEditor.setInlineRange({ - index: index + text.length, - length: 0, - }); -} diff --git a/blocksuite/affine/rich-text/src/all-extensions.ts b/blocksuite/affine/inlines/preset/src/default-inline-manager.ts similarity index 66% rename from blocksuite/affine/rich-text/src/all-extensions.ts rename to blocksuite/affine/inlines/preset/src/default-inline-manager.ts index 7d909186b6..0e8b42a23b 100644 --- a/blocksuite/affine/rich-text/src/all-extensions.ts +++ b/blocksuite/affine/inlines/preset/src/default-inline-manager.ts @@ -1,6 +1,7 @@ +import { LinkInlineSpecExtension } from '@blocksuite/affine-inline-link'; +import { ReferenceInlineSpecExtension } from '@blocksuite/affine-inline-reference'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { InlineManagerExtension } from '@blocksuite/block-std/inline'; -import type { ExtensionType } from '@blocksuite/store'; import { BackgroundInlineSpecExtension, @@ -8,17 +9,11 @@ import { CodeInlineSpecExtension, ColorInlineSpecExtension, FootNoteInlineSpecExtension, - InlineAdapterExtensions, - InlineSpecExtensions, ItalicInlineSpecExtension, LatexInlineSpecExtension, - LinkInlineSpecExtension, - MarkdownExtensions, - ReferenceInlineSpecExtension, StrikeInlineSpecExtension, UnderlineInlineSpecExtension, -} from './inline/index.js'; -import { LatexEditorInlineManagerExtension } from './inline/presets/nodes/latex-node/latex-editor-menu.js'; +} from './inline-spec'; export const DefaultInlineManagerExtension = InlineManagerExtension({ @@ -37,11 +32,3 @@ export const DefaultInlineManagerExtension = FootNoteInlineSpecExtension.identifier, ], }); - -export const RichTextExtensions: ExtensionType[] = [ - InlineSpecExtensions, - MarkdownExtensions, - LatexEditorInlineManagerExtension, - DefaultInlineManagerExtension, - InlineAdapterExtensions, -].flat(); diff --git a/blocksuite/affine/inlines/preset/src/effects.ts b/blocksuite/affine/inlines/preset/src/effects.ts new file mode 100644 index 0000000000..7f58f21782 --- /dev/null +++ b/blocksuite/affine/inlines/preset/src/effects.ts @@ -0,0 +1,29 @@ +import { AffineText } from './nodes/affine-text'; +import { AffineFootnoteNode } from './nodes/footnote-node/footnote-node'; +import { FootNotePopup } from './nodes/footnote-node/footnote-popup'; +import { FootNotePopupChip } from './nodes/footnote-node/footnote-popup-chip'; +import { LatexEditorMenu } from './nodes/latex-node/latex-editor-menu'; +import { LatexEditorUnit } from './nodes/latex-node/latex-editor-unit'; +import { AffineLatexNode } from './nodes/latex-node/latex-node'; + +export function effects() { + customElements.define('affine-text', AffineText); + customElements.define('latex-editor-menu', LatexEditorMenu); + customElements.define('latex-editor-unit', LatexEditorUnit); + customElements.define('affine-latex-node', AffineLatexNode); + customElements.define('affine-footnote-node', AffineFootnoteNode); + customElements.define('footnote-popup', FootNotePopup); + customElements.define('footnote-popup-chip', FootNotePopupChip); +} + +declare global { + interface HTMLElementTagNameMap { + 'affine-latex-node': AffineLatexNode; + 'affine-footnote-node': AffineFootnoteNode; + 'footnote-popup': FootNotePopup; + 'footnote-popup-chip': FootNotePopupChip; + 'affine-text': AffineText; + 'latex-editor-unit': LatexEditorUnit; + 'latex-editor-menu': LatexEditorMenu; + } +} diff --git a/blocksuite/affine/inlines/preset/src/exts.ts b/blocksuite/affine/inlines/preset/src/exts.ts new file mode 100644 index 0000000000..a864a20b76 --- /dev/null +++ b/blocksuite/affine/inlines/preset/src/exts.ts @@ -0,0 +1,13 @@ +import { InlineAdapterExtensions } from './adapters/extensions'; +import { DefaultInlineManagerExtension } from './default-inline-manager'; +import { InlineSpecExtensions } from './inline-spec'; +import { MarkdownExtensions } from './markdown'; +import { LatexEditorInlineManagerExtension } from './nodes/latex-node/latex-editor-menu'; + +export const inlinePresetExtensions = [ + DefaultInlineManagerExtension, + ...MarkdownExtensions, + LatexEditorInlineManagerExtension, + ...InlineSpecExtensions, + ...InlineAdapterExtensions, +]; diff --git a/blocksuite/affine/inlines/preset/src/index.ts b/blocksuite/affine/inlines/preset/src/index.ts new file mode 100644 index 0000000000..22e36e05c4 --- /dev/null +++ b/blocksuite/affine/inlines/preset/src/index.ts @@ -0,0 +1,12 @@ +import type * as RichTextEffects from '@blocksuite/affine-rich-text/effects'; + +declare type _GLOBAL_ = typeof RichTextEffects; + +export * from './adapters/extensions'; +export * from './command'; +export * from './default-inline-manager'; +export * from './exts'; +export * from './inline-spec'; +export * from './keymap'; +export * from './markdown'; +export * from './nodes'; diff --git a/blocksuite/affine/rich-text/src/inline/presets/affine-inline-specs.ts b/blocksuite/affine/inlines/preset/src/inline-spec.ts similarity index 63% rename from blocksuite/affine/rich-text/src/inline/presets/affine-inline-specs.ts rename to blocksuite/affine/inlines/preset/src/inline-spec.ts index 417b92e2b3..b7c9cd4157 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/affine-inline-specs.ts +++ b/blocksuite/affine/inlines/preset/src/inline-spec.ts @@ -1,24 +1,18 @@ -import { FootNoteSchema, ReferenceInfoSchema } from '@blocksuite/affine-model'; -import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services'; +import { inlineLinkExtensions } from '@blocksuite/affine-inline-link'; +import { inlineReferenceExtensions } from '@blocksuite/affine-inline-reference'; +import { FootNoteSchema } from '@blocksuite/affine-model'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; -import { BlockFlavourIdentifier, StdIdentifier } from '@blocksuite/block-std'; +import { StdIdentifier } from '@blocksuite/block-std'; import { - type InlineEditor, type InlineRootElement, InlineSpecExtension, } from '@blocksuite/block-std/inline'; +import type { ExtensionType } from '@blocksuite/store'; import { html } from 'lit'; import { z } from 'zod'; import { FootNoteNodeConfigIdentifier } from './nodes/footnote-node/footnote-config.js'; -import { builtinInlineLinkToolbarConfig } from './nodes/link-node/configs/toolbar.js'; -import { builtinInlineReferenceToolbarConfig } from './nodes/reference-node/configs/toolbar.js'; -import { - ReferenceNodeConfigExtension, - ReferenceNodeConfigProvider, -} from './nodes/reference-node/reference-config.js'; -export type AffineInlineEditor = InlineEditor; export type AffineInlineRootElement = InlineRootElement; export const BoldInlineSpecExtension = @@ -126,65 +120,6 @@ export const LatexInlineSpecExtension = }; }); -export const ReferenceInlineSpecExtension = - InlineSpecExtension('reference', provider => { - const std = provider.get(StdIdentifier); - const configProvider = new ReferenceNodeConfigProvider(std); - const config = - provider.getOptional(ReferenceNodeConfigExtension.identifier) ?? {}; - if (config.customContent) { - configProvider.setCustomContent(config.customContent); - } - if (config.interactable !== undefined) { - configProvider.setInteractable(config.interactable); - } - if (config.hidePopup !== undefined) { - configProvider.setHidePopup(config.hidePopup); - } - return { - name: 'reference', - schema: z - .object({ - type: z.enum([ - // @deprecated Subpage is deprecated, use LinkedPage instead - 'Subpage', - 'LinkedPage', - ]), - }) - .merge(ReferenceInfoSchema) - .optional() - .nullable() - .catch(undefined), - match: delta => { - return !!delta.attributes?.reference; - }, - renderer: ({ delta, selected }) => { - return html``; - }, - embed: true, - }; - }); - -export const LinkInlineSpecExtension = - InlineSpecExtension('link', provider => { - const std = provider.get(StdIdentifier); - return { - name: 'link', - schema: z.string().optional().nullable().catch(undefined), - match: delta => { - return !!delta.attributes?.link; - }, - renderer: ({ delta }) => { - return html``; - }, - }; - }); - export const LatexEditorUnitSpecExtension = InlineSpecExtension({ name: 'latex-editor-unit', @@ -217,7 +152,7 @@ export const FootNoteInlineSpecExtension = }; }); -export const InlineSpecExtensions = [ +export const InlineSpecExtensions: ExtensionType[] = [ BoldInlineSpecExtension, ItalicInlineSpecExtension, UnderlineInlineSpecExtension, @@ -226,18 +161,8 @@ export const InlineSpecExtensions = [ BackgroundInlineSpecExtension, ColorInlineSpecExtension, LatexInlineSpecExtension, - ReferenceInlineSpecExtension, - LinkInlineSpecExtension, + ...inlineLinkExtensions, + ...inlineReferenceExtensions, LatexEditorUnitSpecExtension, FootNoteInlineSpecExtension, - - ToolbarModuleExtension({ - id: BlockFlavourIdentifier('affine:reference'), - config: builtinInlineReferenceToolbarConfig, - }), - - ToolbarModuleExtension({ - id: BlockFlavourIdentifier('affine:link'), - config: builtinInlineLinkToolbarConfig, - }), ]; diff --git a/blocksuite/affine/rich-text/src/keymap/basic.ts b/blocksuite/affine/inlines/preset/src/keymap/basic.ts similarity index 98% rename from blocksuite/affine/rich-text/src/keymap/basic.ts rename to blocksuite/affine/inlines/preset/src/keymap/basic.ts index e580ad8aa2..1f6af366af 100644 --- a/blocksuite/affine/rich-text/src/keymap/basic.ts +++ b/blocksuite/affine/inlines/preset/src/keymap/basic.ts @@ -1,3 +1,8 @@ +import { + focusTextModel, + getInlineEditorByModel, + selectTextModel, +} from '@blocksuite/affine-rich-text'; import { BlockSelection, type BlockStdScope, @@ -5,12 +10,6 @@ import { type UIEventHandler, } from '@blocksuite/block-std'; -import { - focusTextModel, - getInlineEditorByModel, - selectTextModel, -} from '../dom.js'; - export const textCommonKeymap = ( std: BlockStdScope ): Record => { diff --git a/blocksuite/affine/rich-text/src/keymap/bracket.ts b/blocksuite/affine/inlines/preset/src/keymap/bracket.ts similarity index 97% rename from blocksuite/affine/rich-text/src/keymap/bracket.ts rename to blocksuite/affine/inlines/preset/src/keymap/bracket.ts index 6021c31458..1df9cee6f5 100644 --- a/blocksuite/affine/rich-text/src/keymap/bracket.ts +++ b/blocksuite/affine/inlines/preset/src/keymap/bracket.ts @@ -1,4 +1,6 @@ +import { insertLinkedNode } from '@blocksuite/affine-inline-reference'; import { CodeBlockModel } from '@blocksuite/affine-model'; +import { getInlineEditorByModel } from '@blocksuite/affine-rich-text'; import { BRACKET_PAIRS } from '@blocksuite/affine-shared/consts'; import { createDefaultDoc, matchModels } from '@blocksuite/affine-shared/utils'; import { @@ -8,9 +10,6 @@ import { } from '@blocksuite/block-std'; import type { InlineEditor } from '@blocksuite/block-std/inline'; -import { getInlineEditorByModel } from '../dom.js'; -import { insertLinkedNode } from '../linked-node.js'; - export const bracketKeymap = ( std: BlockStdScope ): Record => { diff --git a/blocksuite/affine/rich-text/src/keymap/format.ts b/blocksuite/affine/inlines/preset/src/keymap/format.ts similarity index 94% rename from blocksuite/affine/rich-text/src/keymap/format.ts rename to blocksuite/affine/inlines/preset/src/keymap/format.ts index 0f4a7bd04c..852867dfa7 100644 --- a/blocksuite/affine/rich-text/src/keymap/format.ts +++ b/blocksuite/affine/inlines/preset/src/keymap/format.ts @@ -4,7 +4,7 @@ import { type UIEventHandler, } from '@blocksuite/block-std'; -import { textFormatConfigs } from '../format/index.js'; +import { textFormatConfigs } from '../command/index.js'; export const textFormatKeymap = (std: BlockStdScope) => textFormatConfigs diff --git a/blocksuite/affine/rich-text/src/keymap/index.ts b/blocksuite/affine/inlines/preset/src/keymap/index.ts similarity index 100% rename from blocksuite/affine/rich-text/src/keymap/index.ts rename to blocksuite/affine/inlines/preset/src/keymap/index.ts index 9983ade1f0..57e598f713 100644 --- a/blocksuite/affine/rich-text/src/keymap/index.ts +++ b/blocksuite/affine/inlines/preset/src/keymap/index.ts @@ -9,7 +9,7 @@ export const textKeymap = ( ): Record => { return { ...textCommonKeymap(std), - ...textFormatKeymap(std), ...bracketKeymap(std), + ...textFormatKeymap(std), }; }; diff --git a/blocksuite/affine/rich-text/src/inline/presets/markdown.ts b/blocksuite/affine/inlines/preset/src/markdown.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/markdown.ts rename to blocksuite/affine/inlines/preset/src/markdown.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/affine-text.ts b/blocksuite/affine/inlines/preset/src/nodes/affine-text.ts similarity index 50% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/affine-text.ts rename to blocksuite/affine/inlines/preset/src/nodes/affine-text.ts index 1c2a16a68f..14aa158a26 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/affine-text.ts +++ b/blocksuite/affine/inlines/preset/src/nodes/affine-text.ts @@ -1,46 +1,11 @@ +import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/block-std'; import { ZERO_WIDTH_SPACE } from '@blocksuite/block-std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { html } from 'lit'; import { property } from 'lit/decorators.js'; -import { type StyleInfo, styleMap } from 'lit/directives/style-map.js'; - -export function affineTextStyles( - props: AffineTextAttributes, - override?: Readonly -): StyleInfo { - let textDecorations = ''; - if (props.underline) { - textDecorations += 'underline'; - } - if (props.strike) { - textDecorations += ' line-through'; - } - - let inlineCodeStyle = {}; - if (props.code) { - inlineCodeStyle = { - 'font-family': 'var(--affine-font-code-family)', - background: 'var(--affine-background-code-block)', - border: '1px solid var(--affine-border-color)', - 'border-radius': '4px', - color: 'var(--affine-text-primary-color)', - 'font-variant-ligatures': 'none', - 'line-height': 'auto', - }; - } - - return { - 'font-weight': props.bold ? 'bolder' : 'inherit', - 'font-style': props.italic ? 'italic' : 'normal', - 'background-color': props.background ? props.background : undefined, - color: props.color ? props.color : undefined, - 'text-decoration': textDecorations.length > 0 ? textDecorations : 'none', - ...inlineCodeStyle, - ...override, - }; -} +import { styleMap } from 'lit/directives/style-map.js'; export class AffineText extends ShadowlessElement { override render() { diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-config.ts b/blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-config.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-config.ts rename to blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-config.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-node.ts b/blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-node.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-node.ts rename to blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-node.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-popup-chip.ts b/blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-popup-chip.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-popup-chip.ts rename to blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-popup-chip.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-popup.ts b/blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-popup.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/footnote-node/footnote-popup.ts rename to blocksuite/affine/inlines/preset/src/nodes/footnote-node/footnote-popup.ts diff --git a/blocksuite/affine/inlines/preset/src/nodes/index.ts b/blocksuite/affine/inlines/preset/src/nodes/index.ts new file mode 100644 index 0000000000..36ac32824a --- /dev/null +++ b/blocksuite/affine/inlines/preset/src/nodes/index.ts @@ -0,0 +1,2 @@ +export * from './footnote-node/footnote-config.js'; +export { AffineFootnoteNode } from './footnote-node/footnote-node.js'; diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-editor-menu.ts b/blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-editor-menu.ts similarity index 98% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-editor-menu.ts rename to blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-editor-menu.ts index 2b73993e55..ba33cfe8c3 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-editor-menu.ts +++ b/blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-editor-menu.ts @@ -13,7 +13,7 @@ import { property } from 'lit/decorators.js'; import { codeToTokensBase, type ThemedToken } from 'shiki'; import * as Y from 'yjs'; -import { LatexEditorUnitSpecExtension } from '../../affine-inline-specs.js'; +import { LatexEditorUnitSpecExtension } from '../../inline-spec'; export const LatexEditorInlineManagerExtension = InlineManagerExtension({ diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-editor-unit.ts b/blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-editor-unit.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-editor-unit.ts rename to blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-editor-unit.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-node.ts b/blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-node.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/latex-node/latex-node.ts rename to blocksuite/affine/inlines/preset/src/nodes/latex-node/latex-node.ts diff --git a/blocksuite/affine/inlines/preset/tsconfig.json b/blocksuite/affine/inlines/preset/tsconfig.json new file mode 100644 index 0000000000..ba2192dd36 --- /dev/null +++ b/blocksuite/affine/inlines/preset/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../components" }, + { "path": "../link" }, + { "path": "../reference" }, + { "path": "../../model" }, + { "path": "../../rich-text" }, + { "path": "../../shared" }, + { "path": "../../../framework/block-std" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/store" } + ] +} diff --git a/blocksuite/affine/inlines/reference/package.json b/blocksuite/affine/inlines/reference/package.json new file mode 100644 index 0000000000..967fa918d9 --- /dev/null +++ b/blocksuite/affine/inlines/reference/package.json @@ -0,0 +1,45 @@ +{ + "name": "@blocksuite/affine-inline-reference", + "description": "Inline reference for BlockSuite.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-model": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/block-std": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.6", + "@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", + "collapse-white-space": "^2.1.0", + "date-fns": "^4.0.0", + "lit": "^3.2.0", + "lit-html": "^3.2.1", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1", + "yjs": "^13.6.21", + "zod": "^3.23.8" + }, + "exports": { + ".": "./src/index.ts", + "./effects": "./src/effects.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.20.0" +} diff --git a/blocksuite/affine/inlines/reference/src/adapters/html/inline-delta.ts b/blocksuite/affine/inlines/reference/src/adapters/html/inline-delta.ts new file mode 100644 index 0000000000..faf3653810 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/adapters/html/inline-delta.ts @@ -0,0 +1,42 @@ +import type { InlineHtmlAST } from '@blocksuite/affine-shared/adapters'; +import { + AdapterTextUtils, + InlineDeltaToHtmlAdapterExtension, +} from '@blocksuite/affine-shared/adapters'; + +export const referenceDeltaToHtmlAdapterMatcher = + InlineDeltaToHtmlAdapterExtension({ + name: 'reference', + match: delta => !!delta.attributes?.reference, + toAST: (delta, context) => { + let hast: InlineHtmlAST = { + type: 'text', + value: delta.insert, + }; + const reference = delta.attributes?.reference; + if (!reference) { + return hast; + } + + const { configs } = context; + const title = configs.get(`title:${reference.pageId}`); + const url = AdapterTextUtils.generateDocUrl( + configs.get('docLinkBaseUrl') ?? '', + String(reference.pageId), + reference.params ?? Object.create(null) + ); + if (title) { + hast.value = title; + } + hast = { + type: 'element', + tagName: 'a', + properties: { + href: url, + }, + children: [hast], + }; + + return hast; + }, + }); diff --git a/blocksuite/affine/inlines/reference/src/adapters/index.ts b/blocksuite/affine/inlines/reference/src/adapters/index.ts new file mode 100644 index 0000000000..cb35a2a61f --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/adapters/index.ts @@ -0,0 +1,3 @@ +export * from './html/inline-delta'; +export * from './markdown/inline-delta'; +export * from './plain-text/inline-delta'; diff --git a/blocksuite/affine/inlines/reference/src/adapters/markdown/inline-delta.ts b/blocksuite/affine/inlines/reference/src/adapters/markdown/inline-delta.ts new file mode 100644 index 0000000000..f05f200769 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/adapters/markdown/inline-delta.ts @@ -0,0 +1,42 @@ +import { + AdapterTextUtils, + InlineDeltaToMarkdownAdapterExtension, +} from '@blocksuite/affine-shared/adapters'; +import type { PhrasingContent } from 'mdast'; + +export const referenceDeltaToMarkdownAdapterMatcher = + InlineDeltaToMarkdownAdapterExtension({ + name: 'reference', + match: delta => !!delta.attributes?.reference, + toAST: (delta, context) => { + let mdast: PhrasingContent = { + type: 'text', + value: delta.insert, + }; + const reference = delta.attributes?.reference; + if (!reference) { + return mdast; + } + + const { configs } = context; + const title = configs.get(`title:${reference.pageId}`); + const params = reference.params ?? {}; + const url = AdapterTextUtils.generateDocUrl( + configs.get('docLinkBaseUrl') ?? '', + String(reference.pageId), + params + ); + mdast = { + type: 'link', + url, + children: [ + { + type: 'text', + value: title ?? '', + }, + ], + }; + + return mdast; + }, + }); diff --git a/blocksuite/affine/inlines/reference/src/adapters/plain-text/inline-delta.ts b/blocksuite/affine/inlines/reference/src/adapters/plain-text/inline-delta.ts new file mode 100644 index 0000000000..f66a0febb3 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/adapters/plain-text/inline-delta.ts @@ -0,0 +1,33 @@ +import { + AdapterTextUtils, + InlineDeltaToPlainTextAdapterExtension, + type TextBuffer, +} from '@blocksuite/affine-shared/adapters'; + +export const referenceDeltaMarkdownAdapterMatch = + InlineDeltaToPlainTextAdapterExtension({ + name: 'reference', + match: delta => !!delta.attributes?.reference, + toAST: (delta, context) => { + const node: TextBuffer = { + content: delta.insert, + }; + const reference = delta.attributes?.reference; + if (!reference) { + return node; + } + + const { configs } = context; + const title = configs.get(`title:${reference.pageId}`) ?? ''; + const url = AdapterTextUtils.generateDocUrl( + configs.get('docLinkBaseUrl') ?? '', + String(reference.pageId), + reference.params ?? Object.create(null) + ); + const content = `${title ? `${title}: ` : ''}${url}`; + + return { + content, + }; + }, + }); diff --git a/blocksuite/affine/inlines/reference/src/effects.ts b/blocksuite/affine/inlines/reference/src/effects.ts new file mode 100644 index 0000000000..e3967d5de5 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/effects.ts @@ -0,0 +1,13 @@ +import { AffineReference, ReferencePopup } from './reference-node'; + +export function effects() { + customElements.define('reference-popup', ReferencePopup); + customElements.define('affine-reference', AffineReference); +} + +declare global { + interface HTMLElementTagNameMap { + 'affine-reference': AffineReference; + 'reference-popup': ReferencePopup; + } +} diff --git a/blocksuite/affine/inlines/reference/src/exts.ts b/blocksuite/affine/inlines/reference/src/exts.ts new file mode 100644 index 0000000000..0f7d9255ec --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/exts.ts @@ -0,0 +1,11 @@ +import type { ExtensionType } from '@blocksuite/store'; + +import { ReferenceInlineSpecExtension } from './inline-spec'; +import { RefNodeSlotsExtension } from './reference-node'; +import { referenceNodeToolbar } from './toolbar'; + +export const inlineReferenceExtensions: ExtensionType[] = [ + referenceNodeToolbar, + ReferenceInlineSpecExtension, + RefNodeSlotsExtension, +]; diff --git a/blocksuite/affine/inlines/reference/src/index.ts b/blocksuite/affine/inlines/reference/src/index.ts new file mode 100644 index 0000000000..75b2ddc7fc --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/index.ts @@ -0,0 +1,6 @@ +export * from './adapters'; +export * from './exts'; +export * from './inline-spec'; +export * from './reference-node'; +export * from './toolbar'; +export * from './utils'; diff --git a/blocksuite/affine/inlines/reference/src/inline-spec.ts b/blocksuite/affine/inlines/reference/src/inline-spec.ts new file mode 100644 index 0000000000..6f8ef9cdb9 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/inline-spec.ts @@ -0,0 +1,55 @@ +import { ReferenceInfoSchema } from '@blocksuite/affine-model'; +import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import { StdIdentifier } from '@blocksuite/block-std'; +import { InlineSpecExtension } from '@blocksuite/block-std/inline'; +import { html } from 'lit'; +import { z } from 'zod'; + +import { + ReferenceNodeConfigExtension, + ReferenceNodeConfigProvider, +} from './reference-node/reference-config'; + +export const ReferenceInlineSpecExtension = + InlineSpecExtension('reference', provider => { + const std = provider.get(StdIdentifier); + const configProvider = new ReferenceNodeConfigProvider(std); + const config = + provider.getOptional(ReferenceNodeConfigExtension.identifier) ?? {}; + if (config.customContent) { + configProvider.setCustomContent(config.customContent); + } + if (config.interactable !== undefined) { + configProvider.setInteractable(config.interactable); + } + if (config.hidePopup !== undefined) { + configProvider.setHidePopup(config.hidePopup); + } + return { + name: 'reference', + schema: z + .object({ + type: z.enum([ + // @deprecated Subpage is deprecated, use LinkedPage instead + 'Subpage', + 'LinkedPage', + ]), + }) + .merge(ReferenceInfoSchema) + .optional() + .nullable() + .catch(undefined), + match: delta => { + return !!delta.attributes?.reference; + }, + renderer: ({ delta, selected }) => { + return html``; + }, + embed: true, + }; + }); diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/configs/toolbar.ts b/blocksuite/affine/inlines/reference/src/reference-node/configs/toolbar.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/configs/toolbar.ts rename to blocksuite/affine/inlines/reference/src/reference-node/configs/toolbar.ts diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/index.ts b/blocksuite/affine/inlines/reference/src/reference-node/index.ts similarity index 68% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/index.ts rename to blocksuite/affine/inlines/reference/src/reference-node/index.ts index 75f2c9d3eb..1c83d9fc4b 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/index.ts +++ b/blocksuite/affine/inlines/reference/src/reference-node/index.ts @@ -1,4 +1,6 @@ export * from './reference-config'; export { AffineReference } from './reference-node'; +export * from './reference-node-slots'; +export { ReferencePopup } from './reference-popup/reference-popup'; export { toggleReferencePopup } from './reference-popup/toggle-reference-popup'; export type { DocLinkClickedEvent, RefNodeSlots } from './types'; diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-config.ts b/blocksuite/affine/inlines/reference/src/reference-node/reference-config.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-config.ts rename to blocksuite/affine/inlines/reference/src/reference-node/reference-config.ts diff --git a/blocksuite/affine/rich-text/src/extension/ref-node-slots.ts b/blocksuite/affine/inlines/reference/src/reference-node/reference-node-slots.ts similarity index 50% rename from blocksuite/affine/rich-text/src/extension/ref-node-slots.ts rename to blocksuite/affine/inlines/reference/src/reference-node/reference-node-slots.ts index f4e77569e1..9ff2050e72 100644 --- a/blocksuite/affine/rich-text/src/extension/ref-node-slots.ts +++ b/blocksuite/affine/inlines/reference/src/reference-node/reference-node-slots.ts @@ -1,8 +1,20 @@ +import type { ReferenceInfo } from '@blocksuite/affine-model'; +import type { OpenDocMode } from '@blocksuite/affine-shared/services'; +import type { EditorHost } from '@blocksuite/block-std'; import { createIdentifier } from '@blocksuite/global/di'; import type { ExtensionType } from '@blocksuite/store'; import { Subject } from 'rxjs'; -import type { RefNodeSlots } from '../inline/index.js'; +export type DocLinkClickedEvent = ReferenceInfo & { + // default is active view + openMode?: OpenDocMode; + event?: MouseEvent; + host: EditorHost; +}; + +export type RefNodeSlots = { + docLinkClicked: Subject; +}; export const RefNodeSlotsProvider = createIdentifier('AffineRefNodeSlots'); diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-node.ts b/blocksuite/affine/inlines/reference/src/reference-node/reference-node.ts similarity index 98% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-node.ts rename to blocksuite/affine/inlines/reference/src/reference-node/reference-node.ts index 4b5f592269..e81a5a0b6c 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-node.ts +++ b/blocksuite/affine/inlines/reference/src/reference-node/reference-node.ts @@ -9,6 +9,7 @@ import { DocDisplayMetaProvider, ToolbarRegistryIdentifier, } from '@blocksuite/affine-shared/services'; +import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { cloneReferenceInfo, @@ -31,9 +32,8 @@ import { choose } from 'lit/directives/choose.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { styleMap } from 'lit/directives/style-map.js'; -import { RefNodeSlotsProvider } from '../../../../extension'; -import { affineTextStyles } from '../affine-text'; import type { ReferenceNodeConfigProvider } from './reference-config'; +import { RefNodeSlotsProvider } from './reference-node-slots'; import type { DocLinkClickedEvent } from './types'; @Peekable({ action: false }) diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/reference-popup.ts b/blocksuite/affine/inlines/reference/src/reference-node/reference-popup/reference-popup.ts similarity index 97% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/reference-popup.ts rename to blocksuite/affine/inlines/reference/src/reference-node/reference-popup/reference-popup.ts index 4d5561dd3a..cd3aaa6d0e 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/reference-popup.ts +++ b/blocksuite/affine/inlines/reference/src/reference-node/reference-popup/reference-popup.ts @@ -10,7 +10,7 @@ import { FONT_XS, PANEL_BASE } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { stopPropagation } from '@blocksuite/affine-shared/utils'; import { type BlockStdScope, ShadowlessElement } from '@blocksuite/block-std'; -import type { InlineRange } from '@blocksuite/block-std/inline'; +import type { InlineEditor, InlineRange } from '@blocksuite/block-std/inline'; import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit'; import { DoneIcon, ResetIcon } from '@blocksuite/icons/lit'; import { computePosition, inline, offset, shift } from '@floating-ui/dom'; @@ -19,8 +19,6 @@ import { css, html } from 'lit'; import { property, query } from 'lit/decorators.js'; import { live } from 'lit/directives/live.js'; -import type { AffineInlineEditor } from '../../../affine-inline-specs'; - export class ReferencePopup extends SignalWatcher( WithDisposable(ShadowlessElement) ) { @@ -244,7 +242,7 @@ export class ReferencePopup extends SignalWatcher( accessor docTitle!: string; @property({ attribute: false }) - accessor inlineEditor!: AffineInlineEditor; + accessor inlineEditor!: InlineEditor; @property({ attribute: false }) accessor inlineRange!: InlineRange; diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/toggle-reference-popup.ts b/blocksuite/affine/inlines/reference/src/reference-node/reference-popup/toggle-reference-popup.ts similarity index 76% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/toggle-reference-popup.ts rename to blocksuite/affine/inlines/reference/src/reference-node/reference-popup/toggle-reference-popup.ts index 8805d8d98d..f6654e059f 100644 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/reference-popup/toggle-reference-popup.ts +++ b/blocksuite/affine/inlines/reference/src/reference-node/reference-popup/toggle-reference-popup.ts @@ -1,15 +1,15 @@ import type { ReferenceInfo } from '@blocksuite/affine-model'; +import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import type { BlockStdScope } from '@blocksuite/block-std'; -import type { InlineRange } from '@blocksuite/block-std/inline'; +import type { InlineEditor, InlineRange } from '@blocksuite/block-std/inline'; -import type { AffineInlineEditor } from '../../../affine-inline-specs'; import { ReferencePopup } from './reference-popup'; export function toggleReferencePopup( std: BlockStdScope, docTitle: string, referenceInfo: ReferenceInfo, - inlineEditor: AffineInlineEditor, + inlineEditor: InlineEditor, inlineRange: InlineRange, abortController: AbortController ): ReferencePopup { diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/types.ts b/blocksuite/affine/inlines/reference/src/reference-node/types.ts similarity index 100% rename from blocksuite/affine/rich-text/src/inline/presets/nodes/reference-node/types.ts rename to blocksuite/affine/inlines/reference/src/reference-node/types.ts diff --git a/blocksuite/affine/inlines/reference/src/toolbar.ts b/blocksuite/affine/inlines/reference/src/toolbar.ts new file mode 100644 index 0000000000..eae3d7f704 --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/toolbar.ts @@ -0,0 +1,9 @@ +import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services'; +import { BlockFlavourIdentifier } from '@blocksuite/block-std'; + +import { builtinInlineReferenceToolbarConfig } from './reference-node/configs/toolbar'; + +export const referenceNodeToolbar = ToolbarModuleExtension({ + id: BlockFlavourIdentifier('affine:reference'), + config: builtinInlineReferenceToolbarConfig, +}); diff --git a/blocksuite/affine/rich-text/src/linked-node.ts b/blocksuite/affine/inlines/reference/src/utils.ts similarity index 87% rename from blocksuite/affine/rich-text/src/linked-node.ts rename to blocksuite/affine/inlines/reference/src/utils.ts index d19c1de968..6e9af094ca 100644 --- a/blocksuite/affine/rich-text/src/linked-node.ts +++ b/blocksuite/affine/inlines/reference/src/utils.ts @@ -1,6 +1,5 @@ import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts'; - -import { type AffineInlineEditor } from './inline/index.js'; +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; export function insertLinkedNode({ inlineEditor, diff --git a/blocksuite/affine/inlines/reference/tsconfig.json b/blocksuite/affine/inlines/reference/tsconfig.json new file mode 100644 index 0000000000..1e2cb0da10 --- /dev/null +++ b/blocksuite/affine/inlines/reference/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../components" }, + { "path": "../../model" }, + { "path": "../../shared" }, + { "path": "../../../framework/block-std" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/store" } + ] +} diff --git a/blocksuite/affine/rich-text/package.json b/blocksuite/affine/rich-text/package.json index 8580f9c1b4..3a0c352ee8 100644 --- a/blocksuite/affine/rich-text/package.json +++ b/blocksuite/affine/rich-text/package.json @@ -19,22 +19,15 @@ "@blocksuite/store": "workspace:*", "@floating-ui/dom": "^1.6.13", "@lit/context": "^1.1.2", - "@lottiefiles/dotlottie-wc": "^0.4.0", "@preact/signals-core": "^1.8.0", "@toeverything/theme": "^1.1.12", - "@types/hast": "^3.0.4", - "@types/katex": "^0.16.7", "@types/lodash-es": "^4.17.12", - "@types/mdast": "^4.0.4", "collapse-white-space": "^2.1.0", "date-fns": "^4.0.0", - "katex": "^0.16.11", "lit": "^3.2.0", "lit-html": "^3.2.1", "lodash-es": "^4.17.21", - "remark-math": "^6.0.0", "rxjs": "^7.8.1", - "shiki": "^3.0.0", "yjs": "^13.6.21", "zod": "^3.23.8" }, diff --git a/blocksuite/affine/rich-text/src/effects.ts b/blocksuite/affine/rich-text/src/effects.ts index 7ff84171be..d8af73a919 100644 --- a/blocksuite/affine/rich-text/src/effects.ts +++ b/blocksuite/affine/rich-text/src/effects.ts @@ -1,46 +1,11 @@ -import { - AffineFootnoteNode, - AffineLink, - AffineReference, -} from './inline/index.js'; -import { AffineText } from './inline/presets/nodes/affine-text.js'; -import { FootNotePopup } from './inline/presets/nodes/footnote-node/footnote-popup.js'; -import { FootNotePopupChip } from './inline/presets/nodes/footnote-node/footnote-popup-chip.js'; -import { LatexEditorMenu } from './inline/presets/nodes/latex-node/latex-editor-menu.js'; -import { LatexEditorUnit } from './inline/presets/nodes/latex-node/latex-editor-unit.js'; -import { AffineLatexNode } from './inline/presets/nodes/latex-node/latex-node.js'; -import { LinkPopup } from './inline/presets/nodes/link-node/link-popup/link-popup.js'; -import { ReferencePopup } from './inline/presets/nodes/reference-node/reference-popup/reference-popup.js'; import { RichText } from './rich-text.js'; export function effects() { - customElements.define('affine-text', AffineText); - customElements.define('latex-editor-menu', LatexEditorMenu); - customElements.define('latex-editor-unit', LatexEditorUnit); customElements.define('rich-text', RichText); - customElements.define('affine-latex-node', AffineLatexNode); - customElements.define('link-popup', LinkPopup); - customElements.define('affine-link', AffineLink); - customElements.define('reference-popup', ReferencePopup); - customElements.define('affine-reference', AffineReference); - customElements.define('affine-footnote-node', AffineFootnoteNode); - customElements.define('footnote-popup', FootNotePopup); - customElements.define('footnote-popup-chip', FootNotePopupChip); } declare global { interface HTMLElementTagNameMap { - 'affine-latex-node': AffineLatexNode; - 'affine-reference': AffineReference; - 'affine-footnote-node': AffineFootnoteNode; - 'footnote-popup': FootNotePopup; - 'footnote-popup-chip': FootNotePopupChip; - 'affine-link': AffineLink; - 'affine-text': AffineText; 'rich-text': RichText; - 'reference-popup': ReferencePopup; - 'latex-editor-unit': LatexEditorUnit; - 'latex-editor-menu': LatexEditorMenu; - 'link-popup': LinkPopup; } } diff --git a/blocksuite/affine/rich-text/src/extension/index.ts b/blocksuite/affine/rich-text/src/extension/index.ts deleted file mode 100644 index 5e8d60898e..0000000000 --- a/blocksuite/affine/rich-text/src/extension/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ref-node-slots.js'; diff --git a/blocksuite/affine/rich-text/src/index.ts b/blocksuite/affine/rich-text/src/index.ts index 915b737edd..7074cd72c5 100644 --- a/blocksuite/affine/rich-text/src/index.ts +++ b/blocksuite/affine/rich-text/src/index.ts @@ -1,4 +1,3 @@ -export * from './all-extensions'; export { type TextConversionConfig, textConversionConfigs } from './conversion'; export { asyncGetRichText, @@ -11,10 +10,6 @@ export { onModelTextUpdated, selectTextModel, } from './dom'; -export * from './extension'; -export * from './format'; -export * from './inline'; -export { textKeymap } from './keymap'; -export { insertLinkedNode } from './linked-node'; export { markdownInput } from './markdown'; export { RichText } from './rich-text'; +export * from './utils'; diff --git a/blocksuite/affine/rich-text/src/inline/adapters/plain-text/inline-delta.ts b/blocksuite/affine/rich-text/src/inline/adapters/plain-text/inline-delta.ts deleted file mode 100644 index 7a10c98f7a..0000000000 --- a/blocksuite/affine/rich-text/src/inline/adapters/plain-text/inline-delta.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - AdapterTextUtils, - InlineDeltaToPlainTextAdapterExtension, - type TextBuffer, -} from '@blocksuite/affine-shared/adapters'; -import type { ExtensionType } from '@blocksuite/store'; - -export const referenceDeltaMarkdownAdapterMatch = - InlineDeltaToPlainTextAdapterExtension({ - name: 'reference', - match: delta => !!delta.attributes?.reference, - toAST: (delta, context) => { - const node: TextBuffer = { - content: delta.insert, - }; - const reference = delta.attributes?.reference; - if (!reference) { - return node; - } - - const { configs } = context; - const title = configs.get(`title:${reference.pageId}`) ?? ''; - const url = AdapterTextUtils.generateDocUrl( - configs.get('docLinkBaseUrl') ?? '', - String(reference.pageId), - reference.params ?? Object.create(null) - ); - const content = `${title ? `${title}: ` : ''}${url}`; - - return { - content, - }; - }, - }); - -export const linkDeltaMarkdownAdapterMatch = - InlineDeltaToPlainTextAdapterExtension({ - name: 'link', - match: delta => !!delta.attributes?.link, - toAST: delta => { - const linkText = delta.insert; - const node: TextBuffer = { - content: linkText, - }; - const link = delta.attributes?.link; - if (!link) { - return node; - } - - const content = `${linkText ? `${linkText}: ` : ''}${link}`; - return { - content, - }; - }, - }); - -export const latexDeltaMarkdownAdapterMatch = - InlineDeltaToPlainTextAdapterExtension({ - name: 'inlineLatex', - match: delta => !!delta.attributes?.latex, - toAST: delta => { - const node: TextBuffer = { - content: delta.insert, - }; - if (!delta.attributes?.latex) { - return node; - } - return { - content: delta.attributes?.latex, - }; - }, - }); - -export const InlineDeltaToPlainTextAdapterExtensions: ExtensionType[] = [ - referenceDeltaMarkdownAdapterMatch, - linkDeltaMarkdownAdapterMatch, - latexDeltaMarkdownAdapterMatch, -]; diff --git a/blocksuite/affine/rich-text/src/inline/index.ts b/blocksuite/affine/rich-text/src/inline/index.ts deleted file mode 100644 index 7f2178a2ff..0000000000 --- a/blocksuite/affine/rich-text/src/inline/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './adapters/extensions'; -export * from './adapters/html/html-inline'; -export * from './adapters/html/inline-delta'; -export * from './adapters/markdown'; -export * from './adapters/notion-html/html-inline'; -export * from './adapters/plain-text/inline-delta'; -export * from './presets/affine-inline-specs'; -export * from './presets/markdown'; -export * from './presets/nodes/index'; diff --git a/blocksuite/affine/rich-text/src/inline/presets/nodes/index.ts b/blocksuite/affine/rich-text/src/inline/presets/nodes/index.ts deleted file mode 100644 index deeb48450b..0000000000 --- a/blocksuite/affine/rich-text/src/inline/presets/nodes/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { affineTextStyles } from './affine-text.js'; -export * from './footnote-node/footnote-config.js'; -export { AffineFootnoteNode } from './footnote-node/footnote-node.js'; -export { AffineLink, toggleLinkPopup } from './link-node/index.js'; -export * from './reference-node/index.js'; diff --git a/blocksuite/affine/rich-text/src/rich-text.ts b/blocksuite/affine/rich-text/src/rich-text.ts index 8145d0dc43..7870a5bbcd 100644 --- a/blocksuite/affine/rich-text/src/rich-text.ts +++ b/blocksuite/affine/rich-text/src/rich-text.ts @@ -1,4 +1,7 @@ -import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import type { + AffineInlineEditor, + AffineTextAttributes, +} from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/block-std'; import { type AttributeRenderer, @@ -19,7 +22,6 @@ import * as Y from 'yjs'; import { z } from 'zod'; import { onVBeforeinput, onVCompositionEnd } from './hooks.js'; -import type { AffineInlineEditor } from './inline/index.js'; interface RichTextStackItem { meta: Map<'richtext-v-range', InlineRange | null>; diff --git a/blocksuite/affine/rich-text/src/utils.ts b/blocksuite/affine/rich-text/src/utils.ts new file mode 100644 index 0000000000..3a65ffd508 --- /dev/null +++ b/blocksuite/affine/rich-text/src/utils.ts @@ -0,0 +1,54 @@ +import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; +import type { BlockStdScope } from '@blocksuite/block-std'; +import type { InlineEditor } from '@blocksuite/block-std/inline'; +import type { BlockModel } from '@blocksuite/store'; +import { effect } from '@preact/signals-core'; + +import { getInlineEditorByModel } from './dom'; + +export function insertContent( + std: BlockStdScope, + model: BlockModel, + text: string, + attributes?: AffineTextAttributes +) { + if (!model.text) { + console.error("Can't insert text! Text not found"); + return; + } + const inlineEditor = getInlineEditorByModel(std, model); + if (!inlineEditor) { + console.error("Can't insert text! Inline editor not found"); + return; + } + const inlineRange = inlineEditor.getInlineRange(); + const index = inlineRange ? inlineRange.index : model.text.length; + model.text.insert(text, index, attributes as Record); + // Update the caret to the end of the inserted text + inlineEditor.setInlineRange({ + index: index + text.length, + length: 0, + }); +} + +// When the user selects a range, check if it matches the previous selection. +// If it does, apply the marks from the previous selection. +// If it does not, remove the marks from the previous selection. +export function clearMarksOnDiscontinuousInput( + inlineEditor: InlineEditor +): void { + let inlineRange = inlineEditor.getInlineRange(); + const dispose = effect(() => { + const r = inlineEditor.inlineRange$.value; + if ( + inlineRange && + r && + (inlineRange.index === r.index || inlineRange.index === r.index + 1) + ) { + inlineRange = r; + } else { + inlineEditor.resetMarks(); + dispose(); + } + }); +} diff --git a/blocksuite/affine/shared/src/styles/index.ts b/blocksuite/affine/shared/src/styles/index.ts index ab0e071c85..626f93651f 100644 --- a/blocksuite/affine/shared/src/styles/index.ts +++ b/blocksuite/affine/shared/src/styles/index.ts @@ -1,3 +1,4 @@ export { FONT_BASE, FONT_SM, FONT_XS } from './font'; export { PANEL_BASE, PANEL_BASE_COLORS } from './panel'; export { scrollbarStyle } from './scrollbar-style'; +export { affineTextStyles } from './text'; diff --git a/blocksuite/affine/shared/src/styles/text.ts b/blocksuite/affine/shared/src/styles/text.ts new file mode 100644 index 0000000000..f0d6f73808 --- /dev/null +++ b/blocksuite/affine/shared/src/styles/text.ts @@ -0,0 +1,39 @@ +import type { StyleInfo } from 'lit/directives/style-map.js'; + +import type { AffineTextAttributes } from '../types'; + +export function affineTextStyles( + props: AffineTextAttributes, + override?: Readonly +): StyleInfo { + let textDecorations = ''; + if (props.underline) { + textDecorations += 'underline'; + } + if (props.strike) { + textDecorations += ' line-through'; + } + + let inlineCodeStyle = {}; + if (props.code) { + inlineCodeStyle = { + 'font-family': 'var(--affine-font-code-family)', + background: 'var(--affine-background-code-block)', + border: '1px solid var(--affine-border-color)', + 'border-radius': '4px', + color: 'var(--affine-text-primary-color)', + 'font-variant-ligatures': 'none', + 'line-height': 'auto', + }; + } + + return { + 'font-weight': props.bold ? 'bolder' : 'inherit', + 'font-style': props.italic ? 'italic' : 'normal', + 'background-color': props.background ? props.background : undefined, + color: props.color ? props.color : undefined, + 'text-decoration': textDecorations.length > 0 ? textDecorations : 'none', + ...inlineCodeStyle, + ...override, + }; +} diff --git a/blocksuite/affine/shared/src/types/index.ts b/blocksuite/affine/shared/src/types/index.ts index e934438747..e83c394e17 100644 --- a/blocksuite/affine/shared/src/types/index.ts +++ b/blocksuite/affine/shared/src/types/index.ts @@ -4,6 +4,7 @@ import type { ReferenceInfo, } from '@blocksuite/affine-model'; import type { BlockComponent } from '@blocksuite/block-std'; +import type { InlineEditor } from '@blocksuite/block-std/inline'; import type { BlockModel } from '@blocksuite/store'; export * from './uni-component'; export interface EditingState { @@ -73,3 +74,5 @@ export interface AffineTextAttributes { latex?: string | null; footnote?: FootNote | null; } + +export type AffineInlineEditor = InlineEditor; diff --git a/blocksuite/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts b/blocksuite/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts index 44b913500a..7c426e084f 100644 --- a/blocksuite/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts +++ b/blocksuite/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts @@ -1,10 +1,10 @@ import { createLitPortal } from '@blocksuite/affine-components/portal'; -import type { AffineInlineEditor } from '@blocksuite/affine-rich-text'; import { cleanSpecifiedTail, getInlineEditorByModel, getTextContentFromInlineRange, } from '@blocksuite/affine-rich-text'; +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; import { createKeydownObserver, getCurrentNativeRange, diff --git a/blocksuite/affine/widgets/widget-slash-menu/src/widget.ts b/blocksuite/affine/widgets/widget-slash-menu/src/widget.ts index 3207bd64b2..4015104b7e 100644 --- a/blocksuite/affine/widgets/widget-slash-menu/src/widget.ts +++ b/blocksuite/affine/widgets/widget-slash-menu/src/widget.ts @@ -1,7 +1,5 @@ -import { - type AffineInlineEditor, - getInlineEditorByModel, -} from '@blocksuite/affine-rich-text'; +import { getInlineEditorByModel } from '@blocksuite/affine-rich-text'; +import type { AffineInlineEditor } from '@blocksuite/affine-shared/types'; import type { UIEventStateContext } from '@blocksuite/block-std'; import { TextSelection, WidgetComponent } from '@blocksuite/block-std'; import { InlineEditor } from '@blocksuite/block-std/inline'; diff --git a/blocksuite/playground/apps/starter/utils/extensions.ts b/blocksuite/playground/apps/starter/utils/extensions.ts index 54896af546..529bbe49de 100644 --- a/blocksuite/playground/apps/starter/utils/extensions.ts +++ b/blocksuite/playground/apps/starter/utils/extensions.ts @@ -2,7 +2,7 @@ import { EdgelessEditorBlockSpecs, PageEditorBlockSpecs, } from '@blocksuite/affine/extensions'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { CommunityCanvasTextFonts, DocModeProvider, diff --git a/packages/frontend/apps/android/src/app.tsx b/packages/frontend/apps/android/src/app.tsx index c39506d737..94d0a0ada3 100644 --- a/packages/frontend/apps/android/src/app.tsx +++ b/packages/frontend/apps/android/src/app.tsx @@ -30,7 +30,7 @@ import { Container } from '@blocksuite/affine/global/di'; import { InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine/rich-text'; +} from '@blocksuite/affine/inlines/preset'; import { docLinkBaseURLMiddleware, MarkdownAdapter, diff --git a/packages/frontend/apps/ios/src/app.tsx b/packages/frontend/apps/ios/src/app.tsx index 12546b68a5..1c8f3d8b34 100644 --- a/packages/frontend/apps/ios/src/app.tsx +++ b/packages/frontend/apps/ios/src/app.tsx @@ -36,7 +36,7 @@ import { Container } from '@blocksuite/affine/global/di'; import { InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine/rich-text'; +} from '@blocksuite/affine/inlines/preset'; import { docLinkBaseURLMiddleware, MarkdownAdapter, diff --git a/packages/frontend/core/src/blocksuite/ai/_common/chat-actions-handle.ts b/packages/frontend/core/src/blocksuite/ai/_common/chat-actions-handle.ts index e616e0c29a..fcb60da95b 100644 --- a/packages/frontend/core/src/blocksuite/ai/_common/chat-actions-handle.ts +++ b/packages/frontend/core/src/blocksuite/ai/_common/chat-actions-handle.ts @@ -13,12 +13,12 @@ import { getCommonBoundWithRotation, type SerializedXYWH, } from '@blocksuite/affine/global/gfx'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { type DocMode, NoteBlockModel, NoteDisplayMode, } from '@blocksuite/affine/model'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; import { getFirstBlockCommand, getLastBlockCommand, diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts index 409fca3703..61763ca7cb 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts @@ -16,7 +16,7 @@ import { WithDisposable } from '@blocksuite/affine/global/lit'; import { InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine/rich-text'; +} from '@blocksuite/affine/inlines/preset'; import { codeBlockWrapMiddleware } from '@blocksuite/affine/shared/adapters'; import { LinkPreviewerService } from '@blocksuite/affine/shared/services'; import type { diff --git a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts index 7dc7e5f064..c397121afa 100644 --- a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts +++ b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts @@ -3,7 +3,7 @@ import { Container } from '@blocksuite/affine/global/di'; import { InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine/rich-text'; +} from '@blocksuite/affine/inlines/preset'; import { TestWorkspace } from '@blocksuite/affine/store/test'; import { describe, expect, test } from 'vitest'; diff --git a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts index 11d1dd9585..8955ecde61 100644 --- a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts +++ b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts @@ -6,7 +6,7 @@ import { type TextSelection, } from '@blocksuite/affine/block-std'; import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image'; -import { deleteTextCommand } from '@blocksuite/affine/rich-text'; +import { deleteTextCommand } from '@blocksuite/affine/inlines/preset'; import { isInsideEdgelessEditor } from '@blocksuite/affine/shared/utils'; import { type BlockModel, Slice } from '@blocksuite/affine/store'; diff --git a/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts b/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts index f19585b2db..409134e583 100644 --- a/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts +++ b/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts @@ -41,15 +41,15 @@ import { type MenuItemGroup, } from '@blocksuite/affine/components/toolbar'; import { watch } from '@blocksuite/affine/global/lit'; +import { + AffineReference, + toggleReferencePopup, +} from '@blocksuite/affine/inlines/reference'; import { BookmarkBlockModel, EmbedLinkedDocModel, EmbedSyncedDocModel, } from '@blocksuite/affine/model'; -import { - AffineReference, - toggleReferencePopup, -} from '@blocksuite/affine/rich-text'; import { getSelectedModelsCommand } from '@blocksuite/affine/shared/commands'; import { ImageSelection } from '@blocksuite/affine/shared/selection'; import { diff --git a/packages/frontend/core/src/blocksuite/extensions/footnote-config.ts b/packages/frontend/core/src/blocksuite/extensions/footnote-config.ts index be29ff7e6a..1a8e4951a4 100644 --- a/packages/frontend/core/src/blocksuite/extensions/footnote-config.ts +++ b/packages/frontend/core/src/blocksuite/extensions/footnote-config.ts @@ -1,4 +1,4 @@ -import { FootNoteNodeConfigExtension } from '@blocksuite/affine/rich-text'; +import { FootNoteNodeConfigExtension } from '@blocksuite/affine/inlines/preset'; import type { SpecBuilder } from '@blocksuite/affine/shared/utils'; // Disable hover effect for footnote node diff --git a/packages/frontend/core/src/blocksuite/extensions/reference-renderer.ts b/packages/frontend/core/src/blocksuite/extensions/reference-renderer.ts index 2e3603cc47..19a00e0424 100644 --- a/packages/frontend/core/src/blocksuite/extensions/reference-renderer.ts +++ b/packages/frontend/core/src/blocksuite/extensions/reference-renderer.ts @@ -1,6 +1,6 @@ import type { ElementOrFactory } from '@affine/component'; -import type { AffineReference } from '@blocksuite/affine/rich-text'; -import { ReferenceNodeConfigExtension } from '@blocksuite/affine/rich-text'; +import type { AffineReference } from '@blocksuite/affine/inlines/reference'; +import { ReferenceNodeConfigExtension } from '@blocksuite/affine/inlines/reference'; import type { ExtensionType } from '@blocksuite/affine/store'; import type { TemplateResult } from 'lit'; diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx index d90735cd46..9daabd2e51 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx @@ -19,7 +19,7 @@ import { WorkspaceService } from '@affine/core/modules/workspace'; import { isNewTabTrigger } from '@affine/core/utils'; import track from '@affine/track'; import { DisposableGroup } from '@blocksuite/affine/global/disposable'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { AiIcon, FrameIcon, diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx index 48516441d1..e511ad52ca 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx @@ -6,7 +6,7 @@ import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta'; import { SearchMenuService } from '@affine/core/modules/search-menu/services'; import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkspaceService } from '@affine/core/modules/workspace'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { DocModeProvider } from '@blocksuite/affine/shared/services'; import { createSignalFromObservable, diff --git a/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx b/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx index c96bcb9160..c092335ace 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx @@ -21,8 +21,8 @@ import { } from '@affine/core/modules/workspace'; import { useI18n } from '@affine/i18n'; import { DisposableGroup } from '@blocksuite/affine/global/disposable'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { type DocMode, DocModes } from '@blocksuite/affine/model'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; import { Logo1Icon } from '@blocksuite/icons/rc'; import { FrameworkScope, useLiveData, useService } from '@toeverything/infra'; import clsx from 'clsx'; diff --git a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx index 31ac8f76d0..736183fe48 100644 --- a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx +++ b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx @@ -26,7 +26,7 @@ import { ImageProxyService, } from '@blocksuite/affine/blocks/image'; import { DisposableGroup } from '@blocksuite/affine/global/disposable'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { LinkPreviewerService } from '@blocksuite/affine/shared/services'; import { FrameworkScope, diff --git a/packages/frontend/core/src/modules/at-menu-config/services/index.ts b/packages/frontend/core/src/modules/at-menu-config/services/index.ts index c4928d0958..44de379822 100644 --- a/packages/frontend/core/src/modules/at-menu-config/services/index.ts +++ b/packages/frontend/core/src/modules/at-menu-config/services/index.ts @@ -8,7 +8,7 @@ import { LinkedWidgetUtils, } from '@blocksuite/affine/blocks/root'; import type { DocMode } from '@blocksuite/affine/model'; -import type { AffineInlineEditor } from '@blocksuite/affine/rich-text'; +import type { AffineInlineEditor } from '@blocksuite/affine/shared/types'; import type { DocMeta } from '@blocksuite/affine/store'; import { Text } from '@blocksuite/affine/store'; import { diff --git a/packages/frontend/core/src/modules/doc-info/views/database-properties/cells/rich-text.tsx b/packages/frontend/core/src/modules/doc-info/views/database-properties/cells/rich-text.tsx index 8c7e0e59a3..0aa9d8c853 100644 --- a/packages/frontend/core/src/modules/doc-info/views/database-properties/cells/rich-text.tsx +++ b/packages/frontend/core/src/modules/doc-info/views/database-properties/cells/rich-text.tsx @@ -1,10 +1,8 @@ import { PropertyValue } from '@affine/component'; import { ConfigModal } from '@affine/core/components/mobile'; import type { BlockStdScope } from '@blocksuite/affine/block-std'; -import { - DefaultInlineManagerExtension, - RichText, -} from '@blocksuite/affine/rich-text'; +import { DefaultInlineManagerExtension } from '@blocksuite/affine/inlines/preset'; +import { RichText } from '@blocksuite/affine/rich-text'; import type { Store } from '@blocksuite/affine/store'; import { TextIcon } from '@blocksuite/icons/rc'; import { type LiveData, useLiveData } from '@toeverything/infra'; diff --git a/packages/frontend/core/src/modules/docs-search/worker/in-worker.ts b/packages/frontend/core/src/modules/docs-search/worker/in-worker.ts index 9c72b3e08f..aa765e307a 100644 --- a/packages/frontend/core/src/modules/docs-search/worker/in-worker.ts +++ b/packages/frontend/core/src/modules/docs-search/worker/in-worker.ts @@ -1,5 +1,9 @@ import { defaultBlockMarkdownAdapterMatchers } from '@blocksuite/affine/adapters'; import { Container } from '@blocksuite/affine/global/di'; +import { + InlineDeltaToMarkdownAdapterExtensions, + MarkdownInlineToDeltaAdapterExtensions, +} from '@blocksuite/affine/inlines/preset'; import { type AttachmentBlockModel, type BookmarkBlockModel, @@ -8,10 +12,6 @@ import { type TableBlockModel, TableModelFlavour, } from '@blocksuite/affine/model'; -import { - InlineDeltaToMarkdownAdapterExtensions, - MarkdownInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine/rich-text'; import { MarkdownAdapter } from '@blocksuite/affine/shared/adapters'; import type { AffineTextAttributes } from '@blocksuite/affine/shared/types'; import { diff --git a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts index cab16bba83..18bf7fd235 100644 --- a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts +++ b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts @@ -1,5 +1,6 @@ import type { BlockComponent, EditorHost } from '@blocksuite/affine/block-std'; import type { SurfaceRefBlockComponent } from '@blocksuite/affine/blocks/surface-ref'; +import { AffineReference } from '@blocksuite/affine/inlines/reference'; import type { AttachmentBlockModel, DocMode, @@ -8,7 +9,6 @@ import type { ImageBlockModel, SurfaceRefBlockModel, } from '@blocksuite/affine/model'; -import { AffineReference } from '@blocksuite/affine/rich-text'; import type { Block, BlockModel } from '@blocksuite/affine/store'; import { Entity, LiveData } from '@toeverything/infra'; import type { TemplateResult } from 'lit'; 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 58f4b99fd6..3c18c34608 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 @@ -11,7 +11,7 @@ import { DebugLogger } from '@affine/debug'; import { GfxControllerIdentifier } from '@blocksuite/affine/block-std/gfx'; import { DisposableGroup } from '@blocksuite/affine/global/disposable'; import { Bound } from '@blocksuite/affine/global/gfx'; -import { RefNodeSlotsProvider } from '@blocksuite/affine/rich-text'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { FrameworkScope, useLiveData, diff --git a/tests/blocksuite/e2e/utils/asserts.ts b/tests/blocksuite/e2e/utils/asserts.ts index 83c2ef9c0d..f227d2465c 100644 --- a/tests/blocksuite/e2e/utils/asserts.ts +++ b/tests/blocksuite/e2e/utils/asserts.ts @@ -8,10 +8,8 @@ import type { import type { InlineRootElement } from '@blocksuite/affine/block-std/inline'; import type { EdgelessNoteBackground } from '@blocksuite/affine/blocks/note'; import type { NoteBlockModel, RootBlockModel } from '@blocksuite/affine/model'; -import type { - AffineInlineEditor, - RichText, -} from '@blocksuite/affine/rich-text'; +import type { RichText } from '@blocksuite/affine/rich-text'; +import type { AffineInlineEditor } from '@blocksuite/affine/shared/types'; import type { BlockModel } from '@blocksuite/affine/store'; import { expect, type Locator, type Page } from '@playwright/test'; diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 876bb0c58c..eccd843f26 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -30,6 +30,9 @@ export const PackageList = [ 'blocksuite/affine/fragments/fragment-outline', 'blocksuite/affine/gfx/text', 'blocksuite/affine/gfx/turbo-renderer', + 'blocksuite/affine/inlines/link', + 'blocksuite/affine/inlines/preset', + 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -82,6 +85,7 @@ export const PackageList = [ name: '@blocksuite/affine-block-callout', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -96,6 +100,8 @@ export const PackageList = [ name: '@blocksuite/affine-block-code', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/inlines/link', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -125,6 +131,8 @@ export const PackageList = [ name: '@blocksuite/affine-block-database', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', + 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -154,6 +162,7 @@ export const PackageList = [ workspaceDependencies: [ 'blocksuite/affine/blocks/block-surface', 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -168,6 +177,7 @@ export const PackageList = [ workspaceDependencies: [ 'blocksuite/affine/blocks/block-surface', 'blocksuite/affine/components', + 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -212,6 +222,7 @@ export const PackageList = [ workspaceDependencies: [ 'blocksuite/affine/blocks/block-note', 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -226,6 +237,7 @@ export const PackageList = [ name: '@blocksuite/affine-block-list', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -242,6 +254,7 @@ export const PackageList = [ 'blocksuite/affine/blocks/block-surface', 'blocksuite/affine/components', 'blocksuite/affine/fragments/fragment-doc-title', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -257,6 +270,7 @@ export const PackageList = [ workspaceDependencies: [ 'blocksuite/affine/components', 'blocksuite/affine/gfx/turbo-renderer', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -287,6 +301,9 @@ export const PackageList = [ 'blocksuite/affine/components', 'blocksuite/affine/fragments/fragment-doc-title', 'blocksuite/affine/gfx/text', + 'blocksuite/affine/inlines/link', + 'blocksuite/affine/inlines/preset', + 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -336,6 +353,7 @@ export const PackageList = [ name: '@blocksuite/affine-block-table', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', @@ -437,6 +455,46 @@ export const PackageList = [ 'blocksuite/framework/store', ], }, + { + location: 'blocksuite/affine/inlines/link', + name: '@blocksuite/affine-inline-link', + workspaceDependencies: [ + 'blocksuite/affine/components', + 'blocksuite/affine/inlines/reference', + 'blocksuite/affine/model', + 'blocksuite/affine/shared', + 'blocksuite/framework/block-std', + 'blocksuite/framework/global', + 'blocksuite/framework/store', + ], + }, + { + location: 'blocksuite/affine/inlines/preset', + name: '@blocksuite/affine-inline-preset', + workspaceDependencies: [ + 'blocksuite/affine/components', + 'blocksuite/affine/inlines/link', + 'blocksuite/affine/inlines/reference', + 'blocksuite/affine/model', + 'blocksuite/affine/rich-text', + 'blocksuite/affine/shared', + 'blocksuite/framework/block-std', + 'blocksuite/framework/global', + 'blocksuite/framework/store', + ], + }, + { + location: 'blocksuite/affine/inlines/reference', + name: '@blocksuite/affine-inline-reference', + workspaceDependencies: [ + 'blocksuite/affine/components', + 'blocksuite/affine/model', + 'blocksuite/affine/shared', + 'blocksuite/framework/block-std', + 'blocksuite/framework/global', + 'blocksuite/framework/store', + ], + }, { location: 'blocksuite/affine/model', name: '@blocksuite/affine-model', @@ -931,6 +989,9 @@ export type PackageName = | '@blocksuite/affine-fragment-outline' | '@blocksuite/affine-gfx-text' | '@blocksuite/affine-gfx-turbo-renderer' + | '@blocksuite/affine-inline-link' + | '@blocksuite/affine-inline-preset' + | '@blocksuite/affine-inline-reference' | '@blocksuite/affine-model' | '@blocksuite/affine-rich-text' | '@blocksuite/affine-shared' diff --git a/tsconfig.json b/tsconfig.json index e33ee124c0..b552b065b4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -77,6 +77,9 @@ { "path": "./blocksuite/affine/fragments/fragment-outline" }, { "path": "./blocksuite/affine/gfx/text" }, { "path": "./blocksuite/affine/gfx/turbo-renderer" }, + { "path": "./blocksuite/affine/inlines/link" }, + { "path": "./blocksuite/affine/inlines/preset" }, + { "path": "./blocksuite/affine/inlines/reference" }, { "path": "./blocksuite/affine/model" }, { "path": "./blocksuite/affine/rich-text" }, { "path": "./blocksuite/affine/shared" }, diff --git a/yarn.lock b/yarn.lock index dc6ba2ed6a..dd6e0cb065 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2367,6 +2367,7 @@ __metadata: resolution: "@blocksuite/affine-block-callout@workspace:blocksuite/affine/blocks/block-callout" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2394,6 +2395,8 @@ __metadata: resolution: "@blocksuite/affine-block-code@workspace:blocksuite/affine/blocks/block-code" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-link": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2446,6 +2449,8 @@ __metadata: resolution: "@blocksuite/affine-block-database@workspace:blocksuite/affine/blocks/block-database" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2499,6 +2504,7 @@ __metadata: dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2523,6 +2529,7 @@ __metadata: dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2604,6 +2611,7 @@ __metadata: dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2632,6 +2640,7 @@ __metadata: resolution: "@blocksuite/affine-block-list@workspace:blocksuite/affine/blocks/block-list" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2660,6 +2669,7 @@ __metadata: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-fragment-doc-title": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2688,6 +2698,7 @@ __metadata: dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2728,6 +2739,9 @@ __metadata: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-fragment-doc-title": "workspace:*" "@blocksuite/affine-gfx-text": "workspace:*" + "@blocksuite/affine-inline-link": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2825,6 +2839,7 @@ __metadata: dependencies: "@atlaskit/pragmatic-drag-and-drop": "npm:^1.4.0" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -2995,6 +3010,97 @@ __metadata: languageName: unknown linkType: soft +"@blocksuite/affine-inline-link@workspace:*, @blocksuite/affine-inline-link@workspace:blocksuite/affine/inlines/link": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-inline-link@workspace:blocksuite/affine/inlines/link" + dependencies: + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" + "@blocksuite/affine-model": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/block-std": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.6" + "@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" + collapse-white-space: "npm:^2.1.0" + date-fns: "npm:^4.0.0" + lit: "npm:^3.2.0" + lit-html: "npm:^3.2.1" + 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-inline-preset@workspace:*, @blocksuite/affine-inline-preset@workspace:blocksuite/affine/inlines/preset": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-inline-preset@workspace:blocksuite/affine/inlines/preset" + dependencies: + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-link": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" + "@blocksuite/affine-model": "workspace:*" + "@blocksuite/affine-rich-text": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/block-std": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.6" + "@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/hast": "npm:^3.0.4" + "@types/katex": "npm:^0.16.7" + "@types/lodash-es": "npm:^4.17.12" + "@types/mdast": "npm:^4.0.4" + collapse-white-space: "npm:^2.1.0" + date-fns: "npm:^4.0.0" + katex: "npm:^0.16.11" + lit: "npm:^3.2.0" + lit-html: "npm:^3.2.1" + lodash-es: "npm:^4.17.21" + remark-math: "npm:^6.0.0" + rxjs: "npm:^7.8.1" + shiki: "npm:^3.0.0" + yjs: "npm:^13.6.21" + zod: "npm:^3.23.8" + languageName: unknown + linkType: soft + +"@blocksuite/affine-inline-reference@workspace:*, @blocksuite/affine-inline-reference@workspace:blocksuite/affine/inlines/reference": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-inline-reference@workspace:blocksuite/affine/inlines/reference" + dependencies: + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-model": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/block-std": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.6" + "@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" + collapse-white-space: "npm:^2.1.0" + date-fns: "npm:^4.0.0" + lit: "npm:^3.2.0" + lit-html: "npm:^3.2.1" + 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-model@workspace:*, @blocksuite/affine-model@workspace:blocksuite/affine/model": version: 0.0.0-use.local resolution: "@blocksuite/affine-model@workspace:blocksuite/affine/model" @@ -3025,22 +3131,15 @@ __metadata: "@blocksuite/store": "workspace:*" "@floating-ui/dom": "npm:^1.6.13" "@lit/context": "npm:^1.1.2" - "@lottiefiles/dotlottie-wc": "npm:^0.4.0" "@preact/signals-core": "npm:^1.8.0" "@toeverything/theme": "npm:^1.1.12" - "@types/hast": "npm:^3.0.4" - "@types/katex": "npm:^0.16.7" "@types/lodash-es": "npm:^4.17.12" - "@types/mdast": "npm:^4.0.4" collapse-white-space: "npm:^2.1.0" date-fns: "npm:^4.0.0" - katex: "npm:^0.16.11" lit: "npm:^3.2.0" lit-html: "npm:^3.2.1" lodash-es: "npm:^4.17.21" - remark-math: "npm:^6.0.0" rxjs: "npm:^7.8.1" - shiki: "npm:^3.0.0" yjs: "npm:^13.6.21" zod: "npm:^3.23.8" languageName: unknown @@ -3270,6 +3369,9 @@ __metadata: "@blocksuite/affine-fragment-outline": "workspace:*" "@blocksuite/affine-gfx-text": "workspace:*" "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" + "@blocksuite/affine-inline-link": "workspace:*" + "@blocksuite/affine-inline-preset": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*"