diff --git a/public/assets/ark-library/banners/README.md b/public/assets/ark-library/banners/README.md new file mode 100644 index 0000000..d8b8f04 --- /dev/null +++ b/public/assets/ark-library/banners/README.md @@ -0,0 +1,9 @@ +# Home banner slider images + +Drop banner images here as `banner-1.png`, `banner-2.png`, `banner-3.png`, `banner-4.png`. + +- Used by `src/components/FigmaBanner.tsx` (home page slider on `/`) +- Recommended size: 780 × 400 px (2x of mobile 390 × 200) +- Format: PNG or WebP; PNG keeps the existing pipeline +- Filenames are fixed; replace the file to swap a slide +- To add more slides, append to `BANNER_SLIDES` in `FigmaBanner.tsx` diff --git a/public/assets/ark-library/banners/banner-1.png b/public/assets/ark-library/banners/banner-1.png new file mode 100644 index 0000000..6f769b4 Binary files /dev/null and b/public/assets/ark-library/banners/banner-1.png differ diff --git a/public/assets/ark-library/banners/banner-2.png b/public/assets/ark-library/banners/banner-2.png new file mode 100644 index 0000000..ff9a1ef Binary files /dev/null and b/public/assets/ark-library/banners/banner-2.png differ diff --git a/public/assets/ark-library/banners/banner-3.png b/public/assets/ark-library/banners/banner-3.png new file mode 100644 index 0000000..3132516 Binary files /dev/null and b/public/assets/ark-library/banners/banner-3.png differ diff --git a/public/assets/ark-library/banners/banner-4.png b/public/assets/ark-library/banners/banner-4.png new file mode 100644 index 0000000..7896a43 Binary files /dev/null and b/public/assets/ark-library/banners/banner-4.png differ diff --git a/src/components/FigmaBanner.tsx b/src/components/FigmaBanner.tsx index 072ff54..437c8cf 100644 --- a/src/components/FigmaBanner.tsx +++ b/src/components/FigmaBanner.tsx @@ -23,22 +23,36 @@ type BannerSlide = { alt: string; }; +const BANNERS_BASE = "/assets/ark-library/banners"; + const BANNER_SLIDES: BannerSlide[] = [ { id: "ark-banner-1", - mobile: `${FIGMA_ASSET_BASE}/banner-mobile-1.png`, - desktop: `${FIGMA_ASSET_BASE}/banner-desktop.png`, + mobile: `${BANNERS_BASE}/banner-1.png`, + desktop: `${BANNERS_BASE}/banner-1.png`, alt: "", }, { id: "ark-banner-2", - mobile: `${FIGMA_ASSET_BASE}/banner-375.png`, - desktop: `${FIGMA_ASSET_BASE}/banner-wide.png`, + mobile: `${BANNERS_BASE}/banner-2.png`, + desktop: `${BANNERS_BASE}/banner-2.png`, + alt: "", + }, + { + id: "ark-banner-3", + mobile: `${BANNERS_BASE}/banner-3.png`, + desktop: `${BANNERS_BASE}/banner-3.png`, + alt: "", + }, + { + id: "ark-banner-4", + mobile: `${BANNERS_BASE}/banner-4.png`, + desktop: `${BANNERS_BASE}/banner-4.png`, alt: "", }, ]; -const AUTOPLAY_MS = 5000; +const AUTOPLAY_MS = 3000; const RESUME_AFTER_INTERACTION_MS = 8000; export function FigmaBanner() { diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index c7db3e4..a3fcf26 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -27,6 +27,7 @@ export function Home() { const [err, setErr] = useState(null); const recRowRef = useRef(null); const [canScrollRec, setCanScrollRec] = useState(false); + const [recScroll, setRecScroll] = useState({ ratio: 1, progress: 0 }); useEffect(() => { const langParam = encodeURIComponent(langQuery(lang)); @@ -64,14 +65,26 @@ export function Home() { return; } - const updateCanScroll = () => { - setCanScrollRec(row.scrollWidth > row.clientWidth + 1); + const update = () => { + const overflow = row.scrollWidth > row.clientWidth + 1; + setCanScrollRec(overflow); + const ratio = overflow ? row.clientWidth / row.scrollWidth : 1; + const maxScroll = Math.max(1, row.scrollWidth - row.clientWidth); + const progress = overflow ? row.scrollLeft / maxScroll : 0; + setRecScroll({ + ratio: Math.min(1, Math.max(0.15, ratio)), + progress: Math.min(1, Math.max(0, progress)), + }); }; - updateCanScroll(); - const resizeObserver = new ResizeObserver(updateCanScroll); + update(); + const resizeObserver = new ResizeObserver(update); resizeObserver.observe(row); - return () => resizeObserver.disconnect(); + row.addEventListener("scroll", update, { passive: true }); + return () => { + resizeObserver.disconnect(); + row.removeEventListener("scroll", update); + }; }, [rec.length]); const scrollRec = (dir: 1 | -1) => { @@ -147,8 +160,14 @@ export function Home() { ))} -
-
+
+
{canScrollRec ? (