diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/frame-order-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/frame-order-button.ts index 7b6ce4d31..53e632877 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/frame-order-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/frame-order-button.ts @@ -29,14 +29,12 @@ export class EdgelessFrameOrderButton extends WithDisposable(LitElement) { } override firstUpdated() { - this._edgelessFrameOrderPopper = createButtonPopper( - this._edgelessFrameOrderButton, - this._edgelessFrameOrderMenu, - ({ display }) => this.setPopperShow(display === 'show'), - { - mainAxis: 22, - } - ); + this._edgelessFrameOrderPopper = createButtonPopper({ + reference: this._edgelessFrameOrderButton, + popperElement: this._edgelessFrameOrderMenu, + stateUpdated: ({ display }) => this.setPopperShow(display === 'show'), + mainAxis: 22, + }); } protected override render() { diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/navigator-setting-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/navigator-setting-button.ts index 7cf43d0a6..4cc9e7269 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/navigator-setting-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/present/navigator-setting-button.ts @@ -96,14 +96,12 @@ export class EdgelessNavigatorSettingButton extends WithDisposable(LitElement) { } override firstUpdated() { - this._navigatorSettingPopper = createButtonPopper( - this._navigatorSettingButton, - this._navigatorSettingMenu, - ({ display }) => this.setPopperShow(display === 'show'), - { - mainAxis: 22, - } - ); + this._navigatorSettingPopper = createButtonPopper({ + reference: this._navigatorSettingButton, + popperElement: this._navigatorSettingMenu, + stateUpdated: ({ display }) => this.setPopperShow(display === 'show'), + mainAxis: 22, + }); } override render() { diff --git a/blocksuite/affine/components/src/toolbar/menu-button.ts b/blocksuite/affine/components/src/toolbar/menu-button.ts index 4c58c2866..dd38cde42 100644 --- a/blocksuite/affine/components/src/toolbar/menu-button.ts +++ b/blocksuite/affine/components/src/toolbar/menu-button.ts @@ -1,5 +1,8 @@ import { PANEL_BASE } from '@blocksuite/affine-shared/styles'; -import { createButtonPopper } from '@blocksuite/affine-shared/utils'; +import { + type ButtonPopperOptions, + createButtonPopper, +} from '@blocksuite/affine-shared/utils'; import { WithDisposable } from '@blocksuite/global/lit'; import { css, @@ -25,13 +28,12 @@ export class EditorMenuButton extends WithDisposable(LitElement) { private _popper!: ReturnType; override firstUpdated() { - this._popper = createButtonPopper( - this._trigger, - this._content, - ({ display }) => { + this._popper = createButtonPopper({ + reference: this._trigger, + popperElement: this._content, + stateUpdated: ({ display }) => { const opened = display === 'show'; this._trigger.showTooltip = !opened; - this.dispatchEvent( new CustomEvent('toggle', { detail: opened, @@ -41,12 +43,11 @@ export class EditorMenuButton extends WithDisposable(LitElement) { }) ); }, - { - mainAxis: 12, - ignoreShift: true, - offsetHeight: 6 * 4, - } - ); + mainAxis: 12, + ignoreShift: true, + offsetHeight: 6 * 4, + ...this.popperOptions, + }); this._disposables.addFromEvent(this, 'keydown', (e: KeyboardEvent) => { e.stopPropagation(); if (e.key === 'Escape') { @@ -93,6 +94,9 @@ export class EditorMenuButton extends WithDisposable(LitElement) { @property({ attribute: false }) accessor contentPadding: string | undefined = undefined; + + @property({ attribute: false }) + accessor popperOptions: Partial = {}; } export class EditorMenuContent extends LitElement { diff --git a/blocksuite/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts b/blocksuite/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts index aab25292a..4e12c1be5 100644 --- a/blocksuite/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts +++ b/blocksuite/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts @@ -172,17 +172,15 @@ export class FramePanelHeader extends WithDisposable(LitElement) { override firstUpdated() { const disposables = this.disposables; - this._framesSettingMenuPopper = createButtonPopper( - this._frameSettingButton, - this._frameSettingMenu, - ({ display }) => { + this._framesSettingMenuPopper = createButtonPopper({ + reference: this._frameSettingButton, + popperElement: this._frameSettingMenu, + stateUpdated: ({ display }) => { this._settingPopperShow = display === 'show'; }, - { - mainAxis: 14, - crossAxis: -100, - } - ); + mainAxis: 14, + crossAxis: -100, + }); disposables.add(this._framesSettingMenuPopper); } diff --git a/blocksuite/affine/fragments/fragment-outline/src/card/outline-card.ts b/blocksuite/affine/fragments/fragment-outline/src/card/outline-card.ts index 85afd88ca..9e3852ade 100644 --- a/blocksuite/affine/fragments/fragment-outline/src/card/outline-card.ts +++ b/blocksuite/affine/fragments/fragment-outline/src/card/outline-card.ts @@ -152,17 +152,15 @@ export class OutlineNoteCard extends SignalWatcher( } override firstUpdated() { - this._displayModePopper = createButtonPopper( - this._displayModeButtonGroup, - this._displayModePanel, - ({ display }) => { + this._displayModePopper = createButtonPopper({ + reference: this._displayModeButtonGroup, + popperElement: this._displayModePanel, + stateUpdated: ({ display }) => { this._showPopper$.value = display === 'show'; }, - { - mainAxis: 0, - crossAxis: -60, - } - ); + mainAxis: 0, + crossAxis: -60, + }); this.disposables.add(this._displayModePopper); } diff --git a/blocksuite/affine/fragments/fragment-outline/src/header/outline-panel-header.ts b/blocksuite/affine/fragments/fragment-outline/src/header/outline-panel-header.ts index 1dab2896d..50ec1cfe9 100644 --- a/blocksuite/affine/fragments/fragment-outline/src/header/outline-panel-header.ts +++ b/blocksuite/affine/fragments/fragment-outline/src/header/outline-panel-header.ts @@ -22,17 +22,15 @@ export class OutlinePanelHeader extends SignalWatcher( private readonly _settingPopperShow$ = signal(false); override firstUpdated() { - this._notePreviewSettingMenuPopper = createButtonPopper( - this._noteSettingButton, - this._notePreviewSettingMenu, - ({ display }) => { + this._notePreviewSettingMenuPopper = createButtonPopper({ + reference: this._noteSettingButton, + popperElement: this._notePreviewSettingMenu, + stateUpdated: ({ display }) => { this._settingPopperShow$.value = display === 'show'; }, - { - mainAxis: 14, - crossAxis: -30, - } - ); + mainAxis: 14, + crossAxis: -30, + }); this.disposables.add(this._notePreviewSettingMenuPopper); } diff --git a/blocksuite/affine/shared/src/utils/button-popper.ts b/blocksuite/affine/shared/src/utils/button-popper.ts index d6904517f..82d924926 100644 --- a/blocksuite/affine/shared/src/utils/button-popper.ts +++ b/blocksuite/affine/shared/src/utils/button-popper.ts @@ -32,6 +32,17 @@ export function listenClickAway( type Display = 'show' | 'hidden'; const ATTR_SHOW = 'data-show'; + +export type ButtonPopperOptions = { + reference: HTMLElement; + popperElement: HTMLElement; + stateUpdated?: (state: { display: Display }) => void; + mainAxis?: number; + crossAxis?: number; + rootBoundary?: Rect | (() => Rect | undefined); + ignoreShift?: boolean; + offsetHeight?: number; +}; /** * Using attribute 'data-show' to control popper visibility. * @@ -44,28 +55,19 @@ const ATTR_SHOW = 'data-show'; * } * ``` */ -export function createButtonPopper( - reference: HTMLElement, - popperElement: HTMLElement, - stateUpdated: (state: { display: Display }) => void = () => { - /** DEFAULT EMPTY FUNCTION */ - }, - { +export function createButtonPopper(options: ButtonPopperOptions) { + let display: Display = 'hidden'; + let cleanup: (() => void) | void; + const { + reference, + popperElement, + stateUpdated = () => {}, mainAxis, crossAxis, rootBoundary, ignoreShift, offsetHeight, - }: { - mainAxis?: number; - crossAxis?: number; - rootBoundary?: Rect | (() => Rect | undefined); - ignoreShift?: boolean; - offsetHeight?: number; - } = {} -) { - let display: Display = 'hidden'; - let cleanup: (() => void) | void; + } = options; const originMaxHeight = window.getComputedStyle(popperElement).maxHeight; diff --git a/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts b/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts index 4ed203d30..99f498886 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts @@ -146,15 +146,14 @@ export class ChatCopyMore extends WithDisposable(LitElement) { this._morePopper?.dispose(); this._morePopper = null; } else if (!this._morePopper) { - this._morePopper = createButtonPopper( - this._moreButton, - this._moreMenu, - ({ display }) => (this._showMoreMenu = display === 'show'), - { - mainAxis: 0, - crossAxis: -100, - } - ); + this._morePopper = createButtonPopper({ + reference: this._moreButton, + popperElement: this._moreMenu, + stateUpdated: ({ display }) => + (this._showMoreMenu = display === 'show'), + mainAxis: 0, + crossAxis: -100, + }); } } }