{"version":3,"sources":["../src/components/Timeline/Timeline.context.ts","../src/components/Timeline/TimelineItem.tsx","../src/components/Timeline/TimelineBlock.tsx","../src/components/Timeline/Timeline.tsx"],"names":["createContext","useContext","jsx","cn","useRef","useState","useEffect","forwardRef","jsxs","Children","useCallback"],"mappings":"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","file":"chunk-RN2EW7CK.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { TimelineVariant } from \"./Timeline.types\";\n\ninterface TimelineContextValue {\n  variant: TimelineVariant;\n  index: number;\n  total: number;\n  animated: boolean;\n}\n\nexport const TimelineContext = createContext<TimelineContextValue>({\n  variant: \"stacked\",\n  index: 0,\n  total: 0,\n  animated: true,\n});\n\nexport function useTimeline() {\n  return useContext(TimelineContext);\n}\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTimeline } from \"./Timeline.context\";\nimport type { TimelineItemProps } from \"./Timeline.types\";\nimport type { Color } from \"../../utils/types\";\n\nconst dotColorClasses: Record<Color, string> = {\n  slate: \"bg-slate-400 dark:bg-slate-600\", gray: \"bg-gray-400 dark:bg-gray-600\",\n  zinc: \"bg-zinc-300 dark:bg-zinc-600\", neutral: \"bg-neutral-400 dark:bg-neutral-600\",\n  stone: \"bg-stone-400 dark:bg-stone-600\",\n  red: \"bg-red-500\", orange: \"bg-orange-500\", amber: \"bg-amber-500\",\n  yellow: \"bg-yellow-500\", lime: \"bg-lime-500\", green: \"bg-green-500\",\n  emerald: \"bg-emerald-500\", teal: \"bg-teal-500\", cyan: \"bg-cyan-500\",\n  sky: \"bg-sky-500\", blue: \"bg-blue-500\", indigo: \"bg-indigo-500\",\n  violet: \"bg-violet-500\", purple: \"bg-purple-500\", fuchsia: \"bg-fuchsia-500\",\n  pink: \"bg-pink-500\", rose: \"bg-rose-500\",\n};\n\nconst ringColorClasses: Record<Color, string> = {\n  slate: \"ring-slate-400/30\", gray: \"ring-gray-400/30\",\n  zinc: \"ring-zinc-400/30 dark:ring-zinc-500/30\", neutral: \"ring-neutral-400/30\",\n  stone: \"ring-stone-400/30\",\n  red: \"ring-red-500/30\", orange: \"ring-orange-500/30\", amber: \"ring-amber-500/30\",\n  yellow: \"ring-yellow-500/30\", lime: \"ring-lime-500/30\", green: \"ring-green-500/30\",\n  emerald: \"ring-emerald-500/30\", teal: \"ring-teal-500/30\", cyan: \"ring-cyan-500/30\",\n  sky: \"ring-sky-500/30\", blue: \"ring-blue-500/30\", indigo: \"ring-indigo-500/30\",\n  violet: \"ring-violet-500/30\", purple: \"ring-purple-500/30\", fuchsia: \"ring-fuchsia-500/30\",\n  pink: \"ring-pink-500/30\", rose: \"ring-rose-500/30\",\n};\n\nfunction Dot({ icon, emoji, color, active }: Pick<TimelineItemProps, \"icon\" | \"emoji\" | \"color\" | \"active\">) {\n  const c = color ?? \"zinc\";\n\n  if (emoji) {\n    return (\n      <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-zinc-200 bg-zinc-100 dark:border-zinc-700 dark:bg-zinc-800\">\n        <span className=\"text-sm\">{emoji}</span>\n      </span>\n    );\n  }\n\n  if (icon) {\n    return (\n      <span\n        className={cn(\n          \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-white\",\n          dotColorClasses[c],\n          active && \"ring-4\",\n          active && ringColorClasses[c],\n        )}\n      >\n        {icon}\n      </span>\n    );\n  }\n\n  return (\n    <span\n      className={cn(\n        \"h-3 w-3 shrink-0 rounded-full\",\n        dotColorClasses[c],\n        active && \"ring-4\",\n        active && ringColorClasses[c],\n      )}\n    />\n  );\n}\n\nfunction useIntersectionReveal(animated: boolean) {\n  const ref = useRef<HTMLDivElement>(null);\n  const [visible, setVisible] = useState(!animated);\n\n  useEffect(() => {\n    if (!animated || !ref.current) return;\n    const el = ref.current;\n    const observer = new IntersectionObserver(\n      ([entry]) => { if (entry.isIntersecting) { setVisible(true); observer.disconnect(); } },\n      { threshold: 0.2 },\n    );\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, [animated]);\n\n  return { ref, visible };\n}\n\nexport const TimelineItem = forwardRef<HTMLDivElement, TimelineItemProps>(\n  ({ children, icon, emoji, date, color = \"zinc\", active = false, className }, _ref) => {\n    const { variant, index, total, animated } = useTimeline();\n    const { ref, visible } = useIntersectionReveal(animated);\n    const isLast = index === total - 1;\n    const isLargeDot = !!icon || !!emoji;\n    const isEven = index % 2 === 0;\n\n    // ── Horizontal ────────────────────────────────────────\n    if (variant === \"horizontal\") {\n      return (\n        <div\n          ref={ref}\n          data-react-fancy-timeline-item=\"\"\n          className={cn(\n            \"flex flex-col items-center\",\n            !isLast && \"min-w-40\",\n            animated && \"transition duration-500 ease-out\",\n            animated && (visible ? \"translate-y-0 opacity-100\" : \"translate-y-4 opacity-0\"),\n            className,\n          )}\n        >\n          {/* Dot + horizontal line (fixed height for alignment) */}\n          <div className=\"flex h-8 w-full items-center\">\n            {index > 0\n              ? <div className=\"h-px flex-1 bg-zinc-200 dark:bg-zinc-700\" />\n              : <div className=\"flex-1\" />}\n            <Dot icon={icon} emoji={emoji} color={color} active={active} />\n            {!isLast\n              ? <div className=\"h-px flex-1 bg-zinc-200 dark:bg-zinc-700\" />\n              : <div className=\"flex-1\" />}\n          </div>\n\n          {/* Content below */}\n          <div className=\"mt-3 max-w-40 px-2 text-center\">\n            {date && <time className=\"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400\">{date}</time>}\n            {children}\n          </div>\n        </div>\n      );\n    }\n\n    // ── Alternating ───────────────────────────────────────\n    if (variant === \"alternating\") {\n      return (\n        <div\n          ref={ref}\n          data-react-fancy-timeline-item=\"\"\n          className={cn(\n            \"relative flex gap-x-4 md:grid md:grid-cols-[1fr_1.5rem_1fr] md:gap-x-6\",\n            animated && \"transition duration-500 ease-out\",\n            animated && (visible ? \"translate-y-0 opacity-100\" : \"translate-y-4 opacity-0\"),\n            className,\n          )}\n        >\n          {/* Dot (sits on top of the background line) */}\n          <div className=\"relative z-10 flex w-8 shrink-0 justify-center md:col-start-2 md:row-start-1 md:w-auto md:justify-center\">\n            {!isLargeDot ? <div className=\"mt-1.5\"><Dot icon={icon} emoji={emoji} color={color} active={active} /></div> : <Dot icon={icon} emoji={emoji} color={color} active={active} />}\n          </div>\n\n          {/* Content */}\n          <div className={cn(\n            \"min-w-0 flex-1\",\n            !isLast && \"pb-8\",\n            isLargeDot && \"pt-1\",\n            isEven ? \"md:col-start-1 md:row-start-1 md:text-right\" : \"md:col-start-3\",\n          )}>\n            {date && <time className=\"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400\">{date}</time>}\n            {children}\n          </div>\n        </div>\n      );\n    }\n\n    // ── Stacked (default) ─────────────────────────────────\n    return (\n      <div\n        ref={ref}\n        data-react-fancy-timeline-item=\"\"\n        className={cn(\n          \"relative flex gap-x-4\",\n          animated && \"transition duration-500 ease-out\",\n          animated && (visible ? \"translate-y-0 opacity-100\" : \"translate-y-4 opacity-0\"),\n          className,\n        )}\n      >\n        {/* Dot (sits on top of the background line) */}\n        <div className=\"relative z-10 flex w-8 shrink-0 justify-center\">\n          {!isLargeDot\n            ? <div className=\"mt-1.5\"><Dot icon={icon} emoji={emoji} color={color} active={active} /></div>\n            : <Dot icon={icon} emoji={emoji} color={color} active={active} />}\n        </div>\n\n        {/* Content */}\n        <div className={cn(\"min-w-0 flex-1\", !isLast && \"pb-8\", isLargeDot && \"pt-1\")}>\n          {date && <time className=\"text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400\">{date}</time>}\n          {children}\n        </div>\n      </div>\n    );\n  },\n);\n\nTimelineItem.displayName = \"TimelineItem\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { TimelineItem } from \"./TimelineItem\";\nimport type { TimelineBlockProps } from \"./Timeline.types\";\n\nexport const TimelineBlock = forwardRef<HTMLDivElement, TimelineBlockProps>(\n  ({ heading, children, icon, emoji, color = \"zinc\", active = false, className }, ref) => {\n    return (\n      <TimelineItem icon={icon} emoji={emoji} color={color} active={active}>\n        <div\n          ref={ref}\n          data-react-fancy-timeline-block=\"\"\n          className={cn(\n            \"rounded-lg border border-zinc-200 bg-white p-4 dark:border-zinc-700 dark:bg-zinc-900\",\n            active && \"ring-2 ring-blue-500/20 dark:ring-blue-400/20\",\n            className,\n          )}\n        >\n          {heading && (\n            <div className=\"mb-2 text-sm font-semibold text-zinc-900 dark:text-zinc-100\">\n              {heading}\n            </div>\n          )}\n          <div className=\"text-sm text-zinc-600 dark:text-zinc-400\">{children}</div>\n        </div>\n      </TimelineItem>\n    );\n  },\n);\n\nTimelineBlock.displayName = \"TimelineBlock\";\n","import { Children, forwardRef, useCallback, useRef, type WheelEvent } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { TimelineContext } from \"./Timeline.context\";\nimport { TimelineItem } from \"./TimelineItem\";\nimport { TimelineBlock } from \"./TimelineBlock\";\nimport type { TimelineProps, TimelineVariant } from \"./Timeline.types\";\n\nconst TimelineRoot = forwardRef<HTMLDivElement, TimelineProps>(\n  ({\n    children,\n    variant: variantProp,\n    orientation,\n    events,\n    heading,\n    description,\n    animated = true,\n    className,\n  }, ref) => {\n    const scrollRef = useRef<HTMLDivElement>(null);\n\n    // Backward compat: map deprecated orientation to variant\n    let variant: TimelineVariant = variantProp ?? \"stacked\";\n    if (!variantProp && orientation) {\n      variant = orientation === \"horizontal\" ? \"horizontal\" : \"stacked\";\n    }\n\n    const isHorizontal = variant === \"horizontal\";\n    const isAlternating = variant === \"alternating\";\n\n    // Build items from events prop (data-driven) or children (compound)\n    const items = events\n      ? events.map((e, i) => (\n          <TimelineItem key={i} date={e.date} emoji={e.emoji} icon={e.icon} color={e.color}>\n            {e.title && <h3 className=\"font-semibold text-zinc-900 dark:text-white\">{e.title}</h3>}\n            {e.description && <div className=\"mt-1 text-sm leading-relaxed text-zinc-600 dark:text-zinc-400\">{e.description}</div>}\n          </TimelineItem>\n        ))\n      : Children.toArray(children);\n\n    const handleWheel = useCallback((e: WheelEvent) => {\n      if (!scrollRef.current) return;\n      e.preventDefault();\n      scrollRef.current.scrollLeft += e.deltaY;\n    }, []);\n\n    const content = items.map((child, i) => (\n      <TimelineContext.Provider key={i} value={{ variant, index: i, total: items.length, animated }}>\n        {child}\n      </TimelineContext.Provider>\n    ));\n\n    return (\n      <div ref={ref} data-react-fancy-timeline=\"\" data-variant={variant} className={className}>\n        {(heading || description) && (\n          <div className=\"mb-8\">\n            {heading && <h2 className=\"text-xl font-semibold text-zinc-900 dark:text-white\">{heading}</h2>}\n            {description && <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">{description}</p>}\n          </div>\n        )}\n\n        {isHorizontal ? (\n          <div\n            ref={scrollRef}\n            className=\"overflow-x-auto pb-4 -mb-4\"\n            style={{ scrollbarWidth: \"thin\", scrollbarColor: \"rgb(161 161 170) transparent\" }}\n            onWheel={handleWheel}\n          >\n            <div className=\"flex min-w-max items-start\">\n              {content}\n            </div>\n          </div>\n        ) : (\n          /* Vertical variants: continuous background line behind all events */\n          <div className=\"relative\">\n            {items.length > 1 && (\n              <div className={cn(\n                \"absolute top-0 bottom-0 w-px bg-zinc-200 dark:bg-zinc-700\",\n                isAlternating\n                  ? \"left-4 md:left-1/2 md:-translate-x-px\"\n                  : \"left-4\",\n              )} />\n            )}\n            {content}\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nTimelineRoot.displayName = \"Timeline\";\n\nexport const Timeline = Object.assign(TimelineRoot, {\n  Item: TimelineItem,\n  Block: TimelineBlock,\n});\n"]}