diff --git a/packages/frontend/core/src/components/pure/cmdk/main.css.ts b/packages/frontend/core/src/components/pure/cmdk/main.css.ts index cd672d946a..94f92ac726 100644 --- a/packages/frontend/core/src/components/pure/cmdk/main.css.ts +++ b/packages/frontend/core/src/components/pure/cmdk/main.css.ts @@ -124,13 +124,15 @@ globalStyle(`${root} [cmdk-list]`, { minHeight: 120, overflow: 'auto', overscrollBehavior: 'contain', - transition: '.1s ease', - transitionProperty: 'height', height: 'min(330px, calc(var(--cmdk-list-height) + 8px))', padding: '0 0 8px 6px', scrollbarGutter: 'stable', }); +globalStyle(`${root} [cmdk-list]:not([data-opening])`, { + transition: 'height .1s ease', +}); + globalStyle(`${root} [cmdk-list]::-webkit-scrollbar`, { width: 6, height: 6, diff --git a/packages/frontend/core/src/components/pure/cmdk/main.tsx b/packages/frontend/core/src/components/pure/cmdk/main.tsx index 66f68c9b4d..6102511993 100644 --- a/packages/frontend/core/src/components/pure/cmdk/main.tsx +++ b/packages/frontend/core/src/components/pure/cmdk/main.tsx @@ -5,7 +5,7 @@ import type { PageMeta } from '@blocksuite/store'; import type { CommandCategory } from '@toeverything/infra/command'; import clsx from 'clsx'; import { useAtom, useSetAtom } from 'jotai'; -import { Suspense, useLayoutEffect, useMemo } from 'react'; +import { Suspense, useLayoutEffect, useMemo, useState } from 'react'; import { cmdkQueryAtom, @@ -126,8 +126,10 @@ export const CMDKContainer = ({ query, children, pageMeta, + open, ...rest }: React.PropsWithChildren<{ + open: boolean; className?: string; query: string; pageMeta?: PageMeta; @@ -136,6 +138,24 @@ export const CMDKContainer = ({ const t = useAFFiNEI18N(); const [value, setValue] = useAtom(cmdkValueAtom); const isInEditor = pageMeta !== undefined; + const [opening, setOpening] = useState(open); + + // fix list height animation on openning + useLayoutEffect(() => { + if (open) { + setOpening(true); + const timeout = setTimeout(() => { + setOpening(false); + }, 150); + return () => { + clearTimeout(timeout); + }; + } else { + setOpening(false); + } + return; + }, [open]); + return ( - {children} + + {children} + ); }; export const CMDKQuickSearchModal = ({ pageMeta, + open, ...props }: CMDKModalProps & { pageMeta?: PageMeta }) => { const [query, setQuery] = useAtom(cmdkQueryAtom); useLayoutEffect(() => { - if (props.open) { + if (open) { setQuery(''); } - }, [props.open, setQuery]); + }, [open, setQuery]); return ( - + }> diff --git a/tests/storybook/src/stories/quick-search/quick-search-modal.stories.tsx b/tests/storybook/src/stories/quick-search/quick-search-modal.stories.tsx index 1cfbf5da3b..469760e95b 100644 --- a/tests/storybook/src/stories/quick-search/quick-search-modal.stories.tsx +++ b/tests/storybook/src/stories/quick-search/quick-search-modal.stories.tsx @@ -30,7 +30,7 @@ export const CMDKPanelStory: StoryFn = () => { return ( <> - + );