diff --git a/apps/loopover-ui/src/components/site/breadcrumbs.tsx b/apps/loopover-ui/src/components/site/breadcrumbs.tsx deleted file mode 100644 index 255ba3cb0b..0000000000 --- a/apps/loopover-ui/src/components/site/breadcrumbs.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Link } from "@tanstack/react-router"; -import { ChevronRight } from "lucide-react"; - -import { cn } from "@/lib/utils"; - -export interface Crumb { - to?: string; - label: string; -} - -/** - * Consistent breadcrumb rail used on /app, /docs, /api headers. - * The last crumb is always rendered as the current page (no link). - */ -export function Breadcrumbs({ items, className }: { items: Crumb[]; className?: string }) { - return ( - - - {items.map((c, i) => { - const last = i === items.length - 1; - return ( - - {i > 0 && } - {!last && c.to ? ( - - {c.label} - - ) : ( - - {c.label} - - )} - - ); - })} - - - ); -} diff --git a/apps/loopover-ui/src/components/site/scroll-flow.tsx b/apps/loopover-ui/src/components/site/scroll-flow.tsx deleted file mode 100644 index 50e9336448..0000000000 --- a/apps/loopover-ui/src/components/site/scroll-flow.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { motion } from "motion/react"; -import { useEffect, useRef, useState } from "react"; -import type { ReactNode } from "react"; - -import { cn } from "@/lib/utils"; - -export interface FlowStep { - k: string; - title: string; - body: string; - code?: string; - icon?: ReactNode; -} - -/** - * Vertical scroll-linked flow: as the user scrolls, the step closest to the - * viewport midline becomes the highlighted one. Static-export safe. - */ -export function ScrollFlow({ steps, className }: { steps: FlowStep[]; className?: string }) { - const [active, setActive] = useState(0); - const refs = useRef>([]); - - useEffect(() => { - const io = new IntersectionObserver( - (entries) => { - const visible = entries - .filter((e) => e.isIntersecting) - .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0]; - if (visible) { - const idx = refs.current.findIndex((el) => el === visible.target); - if (idx >= 0) setActive(idx); - } - }, - { rootMargin: "-40% 0px -40% 0px", threshold: [0.25, 0.5, 0.75] }, - ); - refs.current.forEach((el) => el && io.observe(el)); - return () => io.disconnect(); - }, [steps.length]); - - return ( - - - {steps.map((s, i) => ( - { - refs.current[i] = el; - }} - className="relative" - > - - {i + 1} - - - {s.title} - - {s.body} - - ))} - - - - - - - - - step {active + 1} / {steps.length} - - - - {steps[active].code ?? steps[active].body} - - - - - - ); -}
{s.body}