From 60c5314c3acce8f8d37cd81cf9991f38499b3219 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Wed, 30 Apr 2025 00:35:07 -0500 Subject: [PATCH] Simplify masked scroll approach --- src/components/useMaskedScroll.ts | 18 ++++++++++-------- src/share/ShareModal.tsx | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/useMaskedScroll.ts b/src/components/useMaskedScroll.ts index 51f52532..b9f00f33 100644 --- a/src/components/useMaskedScroll.ts +++ b/src/components/useMaskedScroll.ts @@ -1,4 +1,7 @@ -import { RefObject, useCallback, useEffect, useMemo, useState } from 'react'; +import { RefObject, useCallback, useEffect, useMemo } from 'react'; + +const CSS_VAR_START = '--mask-start'; +const CSS_VAR_END = '--mask-end'; export interface MaskedScrollExternalProps { direction?: 'vertical' | 'horizontal' @@ -17,8 +20,6 @@ export default function useMaskedScroll({ ref: RefObject updateMaskOnEvents?: boolean }) { - const [position, setPosition] = useState({ start: true, end: true }); - const isVertical = direction === 'vertical'; const updateMask = useCallback(() => { @@ -30,9 +31,10 @@ export default function useMaskedScroll({ const end = isVertical ? Math.abs((ref.scrollHeight - ref.scrollTop) - ref.clientHeight) < 1 : Math.abs((ref.scrollWidth - ref.scrollLeft) - ref.clientWidth) < 1; - setPosition({ start, end }); + ref.style.setProperty(CSS_VAR_START, `${!start ? fadeSize : 0}px`); + ref.style.setProperty(CSS_VAR_END, `${!end ? fadeSize : 0}px`); } - }, [containerRef, isVertical]); + }, [containerRef, fadeSize, isVertical]); useEffect(() => { const ref = containerRef?.current; @@ -62,10 +64,10 @@ export default function useMaskedScroll({ const maskImage = useMemo(() => { let mask = `linear-gradient(to ${isVertical ? 'bottom' : 'right'}, `; mask += 'transparent, black '; - mask += `${!position.start ? fadeSize : 0}px, black calc(100% - `; - mask += `${!position.end ? fadeSize : 0}px), transparent)`; + mask += `var(${CSS_VAR_START}), black calc(100% - `; + mask += `var(${CSS_VAR_END})), transparent)`; return mask; - }, [fadeSize, isVertical, position]); + }, [isVertical]); return { maskImage, updateMask }; } diff --git a/src/share/ShareModal.tsx b/src/share/ShareModal.tsx index f71f220b..4ffa9121 100644 --- a/src/share/ShareModal.tsx +++ b/src/share/ShareModal.tsx @@ -89,7 +89,7 @@ export default function ShareModal({ scrollToEndOnMount hideScrollbar > -
+
{shortenUrl(pathShare)}