diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index eb0f138357..40288ba0c2 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -6,7 +6,6 @@ import { useCallback, useContext, useEffect, - useMemo, useRef, useState, } from 'react'; @@ -168,12 +167,12 @@ export const TOC = () => { }, [updateTocDataSource]); const onClick = async (blockId?: string) => { - if (blockId === activeBlockId) { - return; - } - setActiveBlockId(blockId); - await editor.scrollManager.scrollIntoViewByBlockId(blockId); + await editor.scrollManager.scrollIntoViewByBlockId( + blockId, + 'smooth', + 'primary' + ); }; return ( diff --git a/libs/components/editor-core/src/editor/scroll/scroll.ts b/libs/components/editor-core/src/editor/scroll/scroll.ts index 69b4d85703..2a580089a3 100644 --- a/libs/components/editor-core/src/editor/scroll/scroll.ts +++ b/libs/components/editor-core/src/editor/scroll/scroll.ts @@ -1,5 +1,5 @@ -import { CSSProperties, type UIEvent } from 'react'; import EventEmitter from 'eventemitter3'; +import { type UIEvent } from 'react'; import { domToRect, Rect } from '@toeverything/utils'; import type { Editor as BlockEditor } from '../editor'; @@ -14,6 +14,8 @@ type ScrollController = { unLockScroll: () => void; }; +type ScrollPrimary = undefined | 'primary'; + export class ScrollManager { private _editor: BlockEditor; private _scrollContainer: HTMLElement; @@ -150,20 +152,29 @@ export class ScrollManager { public async scrollIntoViewByBlockId( blockId: string, - behavior: ScrollBehavior = 'smooth' + behavior: ScrollBehavior = 'smooth', + ability?: ScrollPrimary ) { const block = await this._editor.getBlockById(blockId); - await this.scrollIntoViewByBlock(block, behavior); + await this.scrollIntoViewByBlock(block, behavior, ability); } public async scrollIntoViewByBlock( block: AsyncBlock, - behavior: ScrollBehavior = 'smooth' + behavior: ScrollBehavior = 'smooth', + ability?: ScrollPrimary ) { if (!block.dom) { return console.warn(`Block is not exist.`); } + + /* use dom primary ability */ + if (ability === 'primary') { + block.dom.scrollIntoView({ block: 'start', behavior }); + return; + } + const containerRect = domToRect(this._scrollContainer); const blockRect = domToRect(block.dom);