diff --git a/blocksuite/affine/components/src/caption/block-caption.ts b/blocksuite/affine/components/src/caption/block-caption.ts index fa70562143..2bf6d478dc 100644 --- a/blocksuite/affine/components/src/caption/block-caption.ts +++ b/blocksuite/affine/components/src/caption/block-caption.ts @@ -9,6 +9,7 @@ import { stdContext, TextSelection, } from '@blocksuite/std'; +import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/std/inline'; import type { BlockModel, Store } from '@blocksuite/store'; import { Text } from '@blocksuite/store'; import { consume } from '@lit/context'; @@ -121,6 +122,8 @@ export class BlockCaptionEditor< override connectedCallback(): void { super.connectedCallback(); + this.setAttribute(RANGE_SYNC_EXCLUDE_ATTR, 'true'); + this.caption = this.model.props.caption; this.disposables.add( diff --git a/blocksuite/affine/components/src/context-menu/menu-renderer.ts b/blocksuite/affine/components/src/context-menu/menu-renderer.ts index aa5471c293..a84a069e3e 100644 --- a/blocksuite/affine/components/src/context-menu/menu-renderer.ts +++ b/blocksuite/affine/components/src/context-menu/menu-renderer.ts @@ -8,6 +8,7 @@ import { SearchIcon, } from '@blocksuite/icons/lit'; import { ShadowlessElement } from '@blocksuite/std'; +import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/std/inline'; import { autoPlacement, autoUpdate, @@ -383,6 +384,7 @@ export const getDefaultModalRoot = (ele: HTMLElement) => { }; export const createModal = (container: HTMLElement = document.body) => { const div = document.createElement('div'); + div.setAttribute(RANGE_SYNC_EXCLUDE_ATTR, 'true'); div.style.pointerEvents = 'auto'; div.style.position = 'absolute'; div.style.left = '0'; diff --git a/blocksuite/framework/std/src/inline/range/range-binding.ts b/blocksuite/framework/std/src/inline/range/range-binding.ts index 0f10e70147..0c4f808ca6 100644 --- a/blocksuite/framework/std/src/inline/range/range-binding.ts +++ b/blocksuite/framework/std/src/inline/range/range-binding.ts @@ -2,8 +2,6 @@ import type { BaseSelection, BlockModel } from '@blocksuite/store'; import throttle from 'lodash-es/throttle'; import { TextSelection } from '../../selection/index.js'; -import type { BlockComponent } from '../../view/element/block-component.js'; -import { BLOCK_ID_ATTR } from '../../view/index.js'; import { isActiveInEditor } from './active.js'; import { RANGE_SYNC_EXCLUDE_ATTR } from './consts.js'; import type { RangeManager } from './range-manager.js'; @@ -211,8 +209,13 @@ export class RangeBinding { const el = getElement(range.commonAncestorContainer); if (!el) return; - const block = el.closest(`[${BLOCK_ID_ATTR}]`); - if (block?.getAttribute(RANGE_SYNC_EXCLUDE_ATTR) === 'true') return; + + const closestExclude = el.closest(`[${RANGE_SYNC_EXCLUDE_ATTR}]`); + if (closestExclude?.getAttribute(RANGE_SYNC_EXCLUDE_ATTR) === 'true') + return; + + const closestEditable = el.closest('[contenteditable]'); + if (closestEditable?.getAttribute('contenteditable') === 'false') return; const startElement = getElement(range.startContainer); const endElement = getElement(range.endContainer);