diff --git a/src/admin/AdminNavClient.tsx b/src/admin/AdminNavClient.tsx index 276e0764..e46e13f4 100644 --- a/src/admin/AdminNavClient.tsx +++ b/src/admin/AdminNavClient.tsx @@ -71,8 +71,7 @@ export default function AdminNavClient({ 'border-b border-gray-200 dark:border-gray-800', )}> {items.map(({ label, href, count }) => diff --git a/src/components/MaskedScroll.tsx b/src/components/MaskedScroll.tsx index 172e1490..a9f4775e 100644 --- a/src/components/MaskedScroll.tsx +++ b/src/components/MaskedScroll.tsx @@ -4,16 +4,14 @@ import useMaskedScroll, { MaskedScrollExternalProps } from './useMaskedScroll'; export default function MaskedScroll({ direction = 'vertical', - fadeHeight = 24, + fadeHeight, hideScrollbar, className, - classNameContent, style, children, ...props }: HTMLAttributes & MaskedScrollExternalProps & { - classNameContent?: string hideScrollbar?: boolean }) { const ref = useRef(null); @@ -22,25 +20,16 @@ MaskedScrollExternalProps & { return
-
- {children} -
+ {children}
; } diff --git a/src/components/cmdk/CommandKClient.tsx b/src/components/cmdk/CommandKClient.tsx index 6ff81133..7b3d86bb 100644 --- a/src/components/cmdk/CommandKClient.tsx +++ b/src/components/cmdk/CommandKClient.tsx @@ -167,7 +167,7 @@ export default function CommandKClient({ const refScroll = useRef(null); const { maskImage, updateMask } = useMaskedScroll({ ref: refScroll, - listenForScrollEvents: false, + updateMaskOnEvents: false, }); // Manage action/path waiting state @@ -207,7 +207,11 @@ export default function CommandKClient({ useEffect(() => { isOpenRef.current = isOpen; - }, [isOpen]); + if (isOpen) { + const timeout = setTimeout(updateMask, 100); + return () => clearTimeout(timeout); + } + }, [isOpen, updateMask]); useEffect(() => { const down = (e: KeyboardEvent) => { @@ -556,7 +560,10 @@ export default function CommandKClient({
setQueryLive(e.currentTarget.value)} + onChangeCapture={(e) => { + setQueryLive(e.currentTarget.value); + updateMask(); + }} className={clsx( 'w-full min-w-0!', 'focus:ring-0', @@ -585,14 +592,15 @@ export default function CommandKClient({ onScroll={updateMask} className={clsx( 'overflow-y-auto', - 'mx-3 py-2', + 'mx-3 pt-2 pb-3.5', + '[&>*>*>*]:mt-2.5', )} - style={{ maxHeight, maskImage }} + style={{ maskImage, maxHeight }} > - - {isLoading ? 'Searching ...' : 'No results found'} - -
+
+ + {isLoading ? 'Searching ...' : 'No results found'} + {queriedSections .concat(categorySections) .concat(sectionPages) @@ -604,7 +612,8 @@ export default function CommandKClient({ key={heading} heading={
{accessory && @@ -614,11 +623,6 @@ export default function CommandKClient({ className={clsx( 'uppercase', 'select-none', - '[&>*:first-child]:py-1', - '[&>*:first-child]:font-medium', - '[&>*:first-child]:text-dim', - '[&>*:first-child]:text-xs', - '[&>*:first-child]:tracking-wider', )} > {items.map(({ @@ -672,14 +676,14 @@ export default function CommandKClient({ />; })} )} + {footer && !queryLive && +
+ {footer} +
}
- {footer && !queryLive && -
- {footer} -
} diff --git a/src/components/useMaskedScroll.ts b/src/components/useMaskedScroll.ts index fc0317d7..595210f2 100644 --- a/src/components/useMaskedScroll.ts +++ b/src/components/useMaskedScroll.ts @@ -10,41 +10,48 @@ export default function useMaskedScroll({ direction = 'vertical', fadeHeight = 24, // Disable when calling 'updateMask' explicitly - listenForScrollEvents = true, + updateMaskOnEvents = true, }: MaskedScrollExternalProps & { ref: RefObject - listenForScrollEvents?: boolean + updateMaskOnEvents?: boolean }) { - const [position, setPosition] = useState<'start' | 'middle' | 'end'>('start'); + const [position, setPosition] = useState({ start: true, end: true }); const isVertical = direction === 'vertical'; const updateMask = useCallback(() => { const ref = containerRef?.current; if (ref) { - const isStart = isVertical + const start = isVertical ? ref.scrollTop === 0 : ref.scrollLeft === 0; - const isEnd = isVertical + const end = isVertical ? ref.scrollHeight - ref.scrollTop === ref.clientHeight : ref.scrollWidth - ref.scrollLeft === ref.clientWidth; - setPosition(isStart ? 'start' : isEnd ? 'end' : 'middle'); + setPosition({ start, end }); } }, [containerRef, isVertical]); useEffect(() => { const ref = containerRef?.current; - if (ref && listenForScrollEvents) { - ref.addEventListener('scroll', updateMask); - return () => ref.removeEventListener('scroll', updateMask); + if (ref) { + updateMask(); + if (updateMaskOnEvents) { + ref.onscroll = updateMask; + ref.onresize = updateMask; + return () => { + ref.onscroll = null; + ref.onresize = null; + }; + } } - }, [containerRef, updateMask, listenForScrollEvents]); + }, [containerRef, updateMask, updateMaskOnEvents]); const maskImage = useMemo(() => { - // eslint-disable-next-line max-len - let mask = `linear-gradient(to ${isVertical ? 'bottom' : 'right'}, transparent, black `; - mask += `${position !== 'start' ? fadeHeight : 0}px, black calc(100% - `; - mask += `${position !== 'end' ? fadeHeight : 0}px), transparent)`; + let mask = `linear-gradient(to ${isVertical ? 'bottom' : 'right'}, `; + mask += 'transparent, black '; + mask += `${!position.start ? fadeHeight : 0}px, black calc(100% - `; + mask += `${!position.end ? fadeHeight : 0}px), transparent)`; return mask; }, [fadeHeight, isVertical, position]); diff --git a/src/photo/PhotoGridPage.tsx b/src/photo/PhotoGridPage.tsx index b984b20d..c68896e7 100644 --- a/src/photo/PhotoGridPage.tsx +++ b/src/photo/PhotoGridPage.tsx @@ -39,9 +39,8 @@ export default function PhotoGridPage({ diff --git a/src/photo/PhotoLarge.tsx b/src/photo/PhotoLarge.tsx index 3ca4dd2f..49ec1525 100644 --- a/src/photo/PhotoLarge.tsx +++ b/src/photo/PhotoLarge.tsx @@ -48,6 +48,7 @@ import PhotoRecipeOverlay from '@/recipe/PhotoRecipeOverlay'; import PhotoRecipe from '@/recipe/PhotoRecipe'; import PhotoLens from '@/lens/PhotoLens'; import { lensFromPhoto } from '@/lens'; +import MaskedScroll from '@/components/MaskedScroll'; export default function PhotoLarge({ photo, @@ -258,16 +259,17 @@ export default function PhotoLarge({ } classNameSide="relative" contentSide={ -
- -
+ + {/* Meta */}
@@ -459,8 +461,8 @@ export default function PhotoLarge({
-
- + +
} /> );