{"version":3,"sources":["../src/components/Marquee/Marquee.tsx"],"names":["forwardRef","useRef","useImperativeHandle","useState","useEffect","Children","jsx","Fragment","cn","jsxs"],"mappings":"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","file":"chunk-ZVDW2VX5.cjs","sourcesContent":["import {\n  Children,\n  Fragment,\n  forwardRef,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n  type CSSProperties,\n  type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { MarqueeProps } from \"./Marquee.types\";\n\nfunction toLength(value: string | number): string {\n  return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport const Marquee = forwardRef<HTMLDivElement, MarqueeProps>(\n  (\n    {\n      children,\n      items,\n      speed = 40,\n      duration,\n      direction = \"left\",\n      pauseOnHover = false,\n      paused = false,\n      gap = 40,\n      fade = true,\n      separator,\n      angle = 0,\n      decorative = true,\n      className,\n      style,\n      ...rest\n    },\n    ref,\n  ) => {\n    const rootRef = useRef<HTMLDivElement>(null);\n    const unitRef = useRef<HTMLDivElement>(null);\n    useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n    // copies = how many times the item sequence repeats inside ONE loop copy,\n    // so short content still fills the strip edge-to-edge (no blank wrap).\n    const [copies, setCopies] = useState(1);\n    const [measuredDuration, setMeasuredDuration] = useState<number | null>(null);\n\n    // Measure one content unit (incl. its trailing gap) + the container:\n    //  - auto-fill: repeat the unit until one loop copy covers the container\n    //  - px/s mode: derive the loop duration from the loop distance so the\n    //    perceived speed stays constant regardless of content width.\n    // Browser-only (effect) — SSR renders one unit at the fallback pace.\n    useEffect(() => {\n      const root = rootRef.current;\n      const unit = unitRef.current;\n      if (!root || !unit || typeof ResizeObserver === \"undefined\") return;\n      const update = () => {\n        const unitWidth = unit.getBoundingClientRect().width;\n        const containerWidth = root.clientWidth;\n        if (unitWidth <= 0) return;\n        const nextCopies = Math.max(1, Math.ceil(containerWidth / unitWidth));\n        setCopies(nextCopies);\n        if (duration === undefined) {\n          setMeasuredDuration((unitWidth * nextCopies) / Math.max(speed, 1));\n        }\n      };\n      update();\n      const observer = new ResizeObserver(update);\n      observer.observe(root);\n      observer.observe(unit);\n      return () => observer.disconnect();\n    }, [duration, speed]);\n\n    const loopSeconds = duration ?? measuredDuration ?? 40;\n    const itemNodes: ReactNode[] = items ?? Children.toArray(children);\n    const hasSeparator = separator !== undefined && separator !== null;\n\n    // One unit = the item sequence once (separator after every item so the\n    // wrap point looks identical to any other joint).\n    const renderUnit = (duplicate: boolean, unitElRef?: React.Ref<HTMLDivElement>) => (\n      <div\n        ref={unitElRef}\n        className=\"fancy-marquee__unit\"\n        aria-hidden={duplicate || undefined}\n      >\n        {itemNodes.map((node, i) => (\n          <Fragment key={i}>\n            <div className=\"fancy-marquee__item\" data-react-fancy-marquee-item=\"\" data-index={i}>\n              {node}\n            </div>\n            {hasSeparator && (\n              <div\n                className=\"fancy-marquee__separator\"\n                data-react-fancy-marquee-separator=\"\"\n                aria-hidden=\"true\"\n              >\n                {separator}\n              </div>\n            )}\n          </Fragment>\n        ))}\n      </div>\n    );\n\n    // Two identical groups + translateX(-50%) keyframes = seamless wrap. Only\n    // the very first unit is exposed to AT; every repeat is aria-hidden.\n    const renderGroup = (duplicate: boolean) => (\n      <div\n        className=\"fancy-marquee__group\"\n        data-react-fancy-marquee-group=\"\"\n        aria-hidden={duplicate || undefined}\n      >\n        {Array.from({ length: copies }, (_, c) =>\n          <Fragment key={c}>\n            {renderUnit(duplicate || c > 0, !duplicate && c === 0 ? unitRef : undefined)}\n          </Fragment>,\n        )}\n      </div>\n    );\n\n    const cssVars: CSSProperties = {\n      \"--fancy-marquee-duration\": `${loopSeconds}s`,\n      \"--fancy-marquee-gap\": toLength(gap),\n      ...(fade !== false && {\n        \"--fancy-marquee-fade\": fade === true ? \"48px\" : toLength(fade),\n      }),\n    } as CSSProperties;\n\n    // Tilted strips widen slightly (the classic 102% / -1% trick) so the\n    // rotation never exposes the page background at the edges.\n    const angleStyle: CSSProperties = angle\n      ? { transform: `rotate(${angle}deg)`, width: \"102%\", marginLeft: \"-1%\" }\n      : {};\n\n    return (\n      <div\n        ref={rootRef}\n        data-react-fancy-marquee=\"\"\n        data-direction={direction}\n        data-paused={paused ? \"\" : undefined}\n        aria-hidden={decorative || undefined}\n        className={cn(\n          \"fancy-marquee\",\n          fade !== false && \"fancy-marquee--fade\",\n          pauseOnHover && \"fancy-marquee--pause-hover\",\n          className,\n        )}\n        style={{ ...cssVars, ...angleStyle, ...style }}\n        {...rest}\n      >\n        <div className=\"fancy-marquee__track\" data-react-fancy-marquee-track=\"\">\n          {renderGroup(false)}\n          {renderGroup(true)}\n        </div>\n      </div>\n    );\n  },\n);\n\nMarquee.displayName = \"Marquee\";\n"]}