{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "solar-snapshot-hero",
  "title": "Solar Snapshot Hero",
  "author": "AlgorizeTech",
  "description": "Ask the user to pick one of 16 hero variants: https://avaraui.com/view/hero. This is the Solar snapshot hero. Skip the question if the user already named one. A lightweight interactive hero section featuring a pointer-following sun orb, animated action buttons, an avatar stack, and a click-to-capture Polaroid screenshot stack in the bottom-right where each captured frame auto-clears after 10 seconds.",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [
    "https://avaraui.com/r/avatar-stack.json",
    "https://avaraui.com/r/button.json",
    "utils"
  ],
  "files": [
    {
      "path": "src/components/custom/blocks/SolarSnapshotHeroBlock.tsx",
      "content": "\"use client\";\n\nimport React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { Star } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { accentTokens } from \"@/lib/accent\";\nimport Button, { type ButtonVariant } from \"./Button\";\nimport {\n  Avatar,\n  AvatarFallback,\n  AvatarGroup,\n  AvatarGroupTooltip,\n  AvatarImage,\n  type StackAvatar,\n} from \"./AvatarStackBlock\";\n\n/* ═══════════════════════════════════════════════\n   TYPES & INTERFACES\n   ═══════════════════════════════════════════════ */\n\nexport interface SolarSnapshotItem {\n  id: string;\n  shotNumber: number;\n  sunX: number; // 0 to 100 (%)\n  sunY: number; // 0 to 100 (%)\n  timestamp: string; // e.g. \"14:22\"\n  rotation: number; // Polaroid tilt angle in degrees\n  offsetX: number; // Subtle horizontal stack offset in px\n  offsetY: number; // Subtle vertical stack offset in px\n  isCompact: boolean; // True when captured on a small screen (< 640px)\n  createdAt: number;\n}\n\nexport interface SolarSnapshotHeroProps\n  extends React.HTMLAttributes<HTMLElement> {\n  badgeText?: string;\n  badgeTag?: string;\n  title?: string;\n  titleAccent?: string;\n  description?: string;\n  primaryActionLabel?: string;\n  primaryActionHref?: string;\n  primaryButtonVariant?: ButtonVariant;\n  secondaryActionLabel?: string;\n  secondaryActionHref?: string;\n  secondaryButtonVariant?: ButtonVariant;\n  avatars?: (string | StackAvatar)[];\n  trustText?: string;\n  rating?: number;\n  snapshotDurationMs?: number;\n  maxSnapshots?: number;\n  accent?: string;\n  color?: string;\n  linkComponent?: React.ElementType;\n}\n\n/* ═══════════════════════════════════════════════\n   DEFAULT CLOUDINARY AVATARS\n   ═══════════════════════════════════════════════ */\n\nexport const DEFAULT_SOLAR_AVATARS: StackAvatar[] = [\n  {\n    src: \"https://res.cloudinary.com/dodndg7ai/image/upload/f_webp,q_auto,w_120,c_limit/v1790145139/pexels-photo-1036623-1790145143487.jpg\",\n    alt: \"Elena Vance\",\n    name: \"Elena Vance\",\n    role: \"Creative Director\",\n  },\n  {\n    src: \"https://res.cloudinary.com/dodndg7ai/image/upload/f_webp,q_auto,w_120,c_limit/v1790145142/pexels-photo-2043590-1790145143488.jpg\",\n    alt: \"Marcus Chen\",\n    name: \"Marcus Chen\",\n    role: \"Visual Architect\",\n  },\n  {\n    src: \"https://res.cloudinary.com/dodndg7ai/image/upload/f_webp,q_auto,w_120,c_limit/v1790145139/pexels-photo-1587009-1790145143488.jpg\",\n    alt: \"Sarah Jenkins\",\n    name: \"Sarah Jenkins\",\n    role: \"Lighting Designer\",\n  },\n  {\n    src: \"https://res.cloudinary.com/dodndg7ai/image/upload/f_webp,q_auto,w_120,c_limit/v1790082180/pexels-photo-1520760-1790082180553.jpg\",\n    alt: \"David Miller\",\n    name: \"David Miller\",\n    role: \"Optical Engineer\",\n  },\n];\n\nconst POLAROID_ROTATIONS = [-4.2, 3.0, -2.2, 4.5, -3.4, 2.0, -4.8, 3.5];\nconst POLAROID_OFFSETS_X = [-6, 5, -3, 7, -5, 4, -7, 6];\nconst POLAROID_OFFSETS_Y = [2, -2, 2, -3, 2, -2, 3, -2];\n\nfunction formatCurrentTime(): string {\n  const now = new Date();\n  const hours = String(now.getHours()).padStart(2, \"0\");\n  const minutes = String(now.getMinutes()).padStart(2, \"0\");\n  return `${hours}:${minutes}`;\n}\n\n/* ═══════════════════════════════════════════════\n   RADIANT SOLAR ORB GRAPHIC (REALISTIC SUN + LENS FLARE RAYS)\n   ═══════════════════════════════════════════════ */\n\nfunction RadiantSunGraphic({ size = \"lg\" }: { size?: \"sm\" | \"lg\" }) {\n  const isSmall = size === \"sm\";\n  return (\n    <div className=\"relative flex items-center justify-center\">\n      {/* Outer Soft Solar Atmosphere */}\n      <span\n        className={cn(\n          \"absolute rounded-full bg-[radial-gradient(circle,rgba(251,191,36,0.42)_0%,rgba(249,115,22,0.16)_45%,transparent_72%)] blur-xl\",\n          isSmall ? \"size-20\" : \"size-36\"\n        )}\n      />\n      {/* Concentric Lens Halo Ring */}\n      <span\n        className={cn(\n          \"absolute rounded-full border border-amber-300/35 bg-amber-300/10\",\n          isSmall ? \"size-11\" : \"size-20\"\n        )}\n      />\n      {/* Horizontal & Vertical Solar Flare Rays */}\n      <span\n        className={cn(\n          \"absolute h-[1.5px] bg-gradient-to-r from-transparent via-amber-200/90 to-transparent\",\n          isSmall ? \"w-16\" : \"w-28\"\n        )}\n      />\n      <span\n        className={cn(\n          \"absolute w-[1.5px] bg-gradient-to-b from-transparent via-amber-200/90 to-transparent\",\n          isSmall ? \"h-16\" : \"h-28\"\n        )}\n      />\n      {/* Diagonal Soft Starburst Rays */}\n      <span\n        className={cn(\n          \"absolute rotate-45 h-[1px] bg-gradient-to-r from-transparent via-amber-300/70 to-transparent\",\n          isSmall ? \"w-11\" : \"w-18\"\n        )}\n      />\n      <span\n        className={cn(\n          \"absolute -rotate-45 h-[1px] bg-gradient-to-r from-transparent via-amber-300/70 to-transparent\",\n          isSmall ? \"w-11\" : \"w-18\"\n        )}\n      />\n      {/* Molten Glowing Sun Disc */}\n      <span\n        className={cn(\n          \"relative rounded-full bg-[radial-gradient(circle,#FFFFFF_0%,#FEF08A_40%,#F59E0B_78%,#EA580C_100%)] shadow-[0_0_30px_8px_rgba(251,191,36,0.75),0_0_60px_16px_rgba(249,115,22,0.35)]\",\n          isSmall ? \"size-5\" : \"size-8\"\n        )}\n      />\n    </div>\n  );\n}\n\n/* ═══════════════════════════════════════════════\n   POLAROID SNAPSHOT CARD\n   RENDERS AN EXACT MINIATURE SCREENSHOT OF THIS HERO SECTION\n   WITH THE SUN FROZEN AT THE CLICKED (sunX, sunY) POSITION\n   ═══════════════════════════════════════════════ */\n\ninterface PolaroidCardProps {\n  shot: SolarSnapshotItem;\n  stackIndex: number;\n  durationMs: number;\n  trustText?: string;\n  title?: string;\n  titleAccent?: string;\n  description?: string;\n  primaryActionLabel?: string;\n  secondaryActionLabel?: string;\n  avatars: StackAvatar[];\n  rating: number;\n}\n\nfunction PolaroidSnapshotCard({\n  shot,\n  stackIndex,\n  durationMs,\n  trustText,\n  title,\n  titleAccent,\n  description,\n  primaryActionLabel,\n  secondaryActionLabel,\n  avatars,\n  rating,\n}: PolaroidCardProps) {\n  const [exiting, setExiting] = useState(false);\n  const [mounted, setMounted] = useState(false);\n\n  useEffect(() => {\n    const enterRaf = requestAnimationFrame(() => setMounted(true));\n    const exitTimer = setTimeout(() => {\n      setExiting(true);\n    }, Math.max(durationMs - 400, 100));\n\n    return () => {\n      cancelAnimationFrame(enterRaf);\n      clearTimeout(exitTimer);\n    };\n  }, [durationMs]);\n\n  return (\n    <div\n      style={{\n        zIndex: 20 + stackIndex,\n        transform: mounted\n          ? exiting\n            ? `translate3d(${shot.offsetX}px, ${shot.offsetY + 18}px, 0) rotate(${shot.rotation * 1.1}deg) scale(0.88)`\n            : `translate3d(${shot.offsetX}px, ${shot.offsetY}px, 0) rotate(${shot.rotation}deg) scale(1)`\n          : `translate3d(0px, -20px, 0) rotate(0deg) scale(1.08)`,\n        opacity: mounted ? (exiting ? 0 : 1) : 0,\n      }}\n      className=\"pointer-events-none absolute bottom-0 right-0 w-[195px] sm:w-[236px] rounded-xl bg-card/95 dark:bg-card/90 p-2 sm:p-2.5 pb-4 sm:pb-5 border border-border/60 shadow-[0_4px_14px_-4px_rgba(0,0,0,0.06),0_1px_4px_-1px_rgba(0,0,0,0.03)] backdrop-blur-md transition-all duration-350 ease-out select-none\"\n    >\n      {/* Inner Captured Section Screenshot Window */}\n      <div className=\"relative h-[118px] sm:h-[136px] w-full overflow-hidden rounded-lg border border-border/40 bg-background text-foreground\">\n        {/* Scaled-down 1:1 Live Replica of Our Hero Section (Responsive to Small vs Large Screen Capture) */}\n        <div\n          style={\n            shot.isCompact\n              ? {\n                  width: \"390px\",\n                  height: \"280px\",\n                  transform: \"scale(0.455)\",\n                  transformOrigin: \"top left\",\n                }\n              : {\n                  width: \"800px\",\n                  height: \"460px\",\n                  transform: \"scale(0.295)\",\n                  transformOrigin: \"top left\",\n                }\n          }\n          className={cn(\n            \"relative overflow-hidden bg-background text-foreground flex flex-col items-center justify-center text-center\",\n            shot.isCompact ? \"px-5 py-3\" : \"px-10\"\n          )}\n        >\n          {/* Full-Section Subtle Dot Matrix Backdrop */}\n          <div\n            className=\"\n              absolute inset-0 opacity-[0.11] dark:opacity-[0.12]\n              bg-[radial-gradient(circle_at_center,currentColor_1px,transparent_1px)]\n              [background-size:24px_24px]\n              [mask-image:radial-gradient(ellipse_96%_92%_at_50%_50%,black_75%,transparent_100%)]\n            \"\n          />\n\n          {/* Captured Ambient Sun Illumination at Clicked Position */}\n          <div\n            style={{\n              background: `radial-gradient(${shot.isCompact ? \"240px\" : \"380px\"} circle at ${shot.sunX}% ${shot.sunY}%, rgba(251, 191, 36, 0.25), rgba(249, 115, 22, 0.08) 48%, transparent 78%)`,\n            }}\n            className=\"absolute inset-0\"\n          />\n\n          {/* THE CAPTURED SUN AT EXACT CLICKED (sunX, sunY) COORDINATES (BEHIND CONTENT) */}\n          <div\n            style={{\n              left: `${shot.sunX}%`,\n              top: `${shot.sunY}%`,\n            }}\n            className=\"absolute -translate-x-1/2 -translate-y-1/2 z-10\"\n          >\n            <RadiantSunGraphic size=\"sm\" />\n          </div>\n\n          {/* Section Content Replica inside Screenshot (ABOVE SUN) */}\n          <div\n            className={cn(\n              \"relative z-20 flex flex-col items-center\",\n              shot.isCompact ? \"w-full max-w-[340px]\" : \"max-w-2xl\"\n            )}\n          >\n            {/* Top Unified Avatar + Rating Pill (Avatars only on small view, full pill on large view) */}\n            <div\n              className={cn(\n                \"inline-flex items-center rounded-full border border-border/70 bg-card/85\",\n                shot.isCompact ? \"mb-2.5 p-1\" : \"mb-5 gap-3 p-1.5 pr-4\"\n              )}\n            >\n              <div className=\"flex -space-x-2\">\n                {avatars.slice(0, 4).map((av, i) => (\n                  <img\n                    key={i}\n                    src={av.src}\n                    alt={av.alt ?? \"\"}\n                    className={cn(\n                      \"rounded-full border-2 border-background object-cover\",\n                      shot.isCompact ? \"size-4.5\" : \"size-6\"\n                    )}\n                  />\n                ))}\n              </div>\n              {!shot.isCompact && (\n                <>\n                  <div className=\"flex items-center gap-0.5\">\n                    {Array.from({ length: rating }).map((_, idx) => (\n                      <Star\n                        key={idx}\n                        className=\"size-2.5 fill-amber-400 text-amber-400\"\n                      />\n                    ))}\n                  </div>\n                  {trustText && (\n                    <span className=\"text-[11px] font-medium text-muted-foreground\">\n                      {trustText}\n                    </span>\n                  )}\n                </>\n              )}\n            </div>\n\n            <div\n              style={{\n                fontFamily:\n                  '\"Space Grotesk\", \"Plus Jakarta Sans\", var(--font-sans), system-ui, sans-serif',\n              }}\n              className={cn(\n                \"font-extrabold tracking-[-0.04em] text-foreground leading-[1.12]\",\n                shot.isCompact ? \"text-[1.35rem]\" : \"text-[2.6rem]\"\n              )}\n            >\n              <span className=\"block\">{title}</span>\n              {titleAccent && (\n                <span\n                  className={cn(\n                    \"relative inline-flex items-center justify-center rounded-xl border border-primary/35 bg-primary/[0.08] text-primary\",\n                    shot.isCompact\n                      ? \"mt-1.5 px-2.5 py-0.5\"\n                      : \"mt-2 px-4 py-1\"\n                  )}\n                >\n                  {/* Corner bracket ticks */}\n                  <span className=\"absolute -top-1 -left-1 size-2 border-t-2 border-l-2 border-primary\" />\n                  <span className=\"absolute -top-1 -right-1 size-2 border-t-2 border-r-2 border-primary\" />\n                  <span className=\"absolute -bottom-1 -left-1 size-2 border-b-2 border-l-2 border-primary\" />\n                  <span className=\"absolute -bottom-1 -right-1 size-2 border-b-2 border-r-2 border-primary\" />\n                  <span className=\"bg-gradient-to-r from-primary via-amber-500 to-orange-500 bg-clip-text text-transparent\">\n                    {titleAccent}\n                  </span>\n                </span>\n              )}\n            </div>\n\n            {description && (\n              <div\n                className={cn(\n                  \"rounded-xl border border-border/60 bg-muted/30 text-muted-foreground line-clamp-2\",\n                  shot.isCompact\n                    ? \"mt-2 max-w-[310px] px-2.5 py-1 text-[9px]\"\n                    : \"mt-4 max-w-lg px-4 py-2 text-xs\"\n                )}\n              >\n                {description}\n              </div>\n            )}\n\n            {/* Mini Buttons: Stacked full-width in small view, side-by-side in large view */}\n            <div\n              className={cn(\n                \"flex items-center\",\n                shot.isCompact\n                  ? \"mt-2.5 flex-col gap-1.5 w-full max-w-[260px]\"\n                  : \"mt-5 flex-row gap-3\"\n              )}\n            >\n              {primaryActionLabel && (\n                <span\n                  className={cn(\n                    \"rounded-lg bg-primary font-semibold text-primary-foreground inline-flex items-center justify-center gap-1.5\",\n                    shot.isCompact\n                      ? \"w-full py-1.5 px-3 text-[9.5px]\"\n                      : \"px-5 py-2 text-xs\"\n                  )}\n                >\n                  {primaryActionLabel}\n                  <span>→</span>\n                </span>\n              )}\n              {secondaryActionLabel && (\n                <span\n                  className={cn(\n                    \"rounded-lg border border-border bg-muted/60 font-semibold text-foreground inline-flex items-center justify-center gap-1.5\",\n                    shot.isCompact\n                      ? \"w-full py-1.5 px-3 text-[9.5px]\"\n                      : \"px-5 py-2 text-xs\"\n                  )}\n                >\n                  {secondaryActionLabel}\n                  <span>→</span>\n                </span>\n              )}\n            </div>\n          </div>\n        </div>\n      </div>\n\n      {/* Polaroid Bottom Caption Strip: Timestamp + Shot Number */}\n      <div className=\"mt-1.5 flex items-center justify-between px-1 font-mono text-[10px] sm:text-[11px] font-medium tracking-wider text-muted-foreground\">\n        <span>{shot.timestamp}</span>\n        <span className=\"text-primary/80 font-semibold\">\n          #{String(shot.shotNumber).padStart(2, \"0\")}\n        </span>\n      </div>\n    </div>\n  );\n}\n\n/* ═══════════════════════════════════════════════\n   MAIN COMPONENT: SolarSnapshotHero\n   ═══════════════════════════════════════════════ */\n\nexport const SolarSnapshotHero = forwardRef<HTMLElement, SolarSnapshotHeroProps>(\n  (\n    {\n      badgeText,\n      badgeTag,\n      title = \"Where natural light meets\",\n      titleAccent = \"expressive digital craft.\",\n      description = \"Guide the radiant sun across the canvas with your cursor and click anywhere to capture an instant live snapshot of the stage.\",\n      primaryActionLabel = \"Initiate Project\",\n      primaryActionHref = \"#explore\",\n      primaryButtonVariant = \"pricing-typographic\",\n      secondaryActionLabel = \"Explore Studio\",\n      secondaryActionHref = \"#lightbox\",\n      secondaryButtonVariant = \"pricing-typographic-muted\",\n      avatars = DEFAULT_SOLAR_AVATARS,\n      trustText = \"Trusted by 14,800+ creators\",\n      rating = 5,\n      snapshotDurationMs = 10000,\n      maxSnapshots = 8,\n      accent,\n      color,\n      linkComponent: LinkComp = \"a\",\n      className,\n      style,\n      ...props\n    },\n    ref\n  ) => {\n    const sectionRef = useRef<HTMLElement | null>(null);\n    const sunOrbRef = useRef<HTMLDivElement | null>(null);\n    const ambientGlowRef = useRef<HTMLDivElement | null>(null);\n\n    // Cursor position in percentage (0..100) for snapshot capture, stored in ref to avoid re-renders on mousemove\n    const sunPosRef = useRef<{ x: number; y: number; clientX: number; clientY: number }>({\n      x: 76,\n      y: 22,\n      clientX: 0,\n      clientY: 0,\n    });\n\n    const [cursorActive, setCursorActive] = useState(false);\n    const [shutterFlash, setShutterFlash] = useState(false);\n    const [snapshots, setSnapshots] = useState<SolarSnapshotItem[]>([]);\n    const shotCounterRef = useRef(0);\n    const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n      new Map()\n    );\n\n    // Cleanup all active 10-second snapshot timers on unmount\n    useEffect(() => {\n      const timers = timersRef.current;\n      return () => {\n        timers.forEach((timer) => clearTimeout(timer));\n        timers.clear();\n      };\n    }, []);\n\n    // Lightweight pointer tracker (zero React state updates during move)\n    const handlePointerMove = useCallback(\n      (e: React.PointerEvent<HTMLElement>) => {\n        // Freeze the sun when cursor is over avatars or buttons\n        const target = e.target as HTMLElement | null;\n        if (target?.closest(\"a, button, [data-no-snapshot]\")) {\n          return;\n        }\n\n        const el = sectionRef.current;\n        if (!el) return;\n        const rect = el.getBoundingClientRect();\n        const relX = e.clientX - rect.left;\n        const relY = e.clientY - rect.top;\n        const pctX = Math.min(Math.max((relX / rect.width) * 100, 2), 98);\n        const pctY = Math.min(Math.max((relY / rect.height) * 100, 2), 98);\n\n        sunPosRef.current = {\n          x: pctX,\n          y: pctY,\n          clientX: relX,\n          clientY: relY,\n        };\n\n        if (sunOrbRef.current) {\n          sunOrbRef.current.style.transform = `translate3d(${relX}px, ${relY}px, 0)`;\n        }\n        if (ambientGlowRef.current) {\n          ambientGlowRef.current.style.background = `radial-gradient(600px circle at ${relX}px ${relY}px, rgba(251, 191, 36, 0.16), rgba(249, 115, 22, 0.05) 45%, transparent 75%)`;\n        }\n      },\n      []\n    );\n\n    // Click anywhere in the hero section to capture a live screenshot at the current sun position\n    const handleSectionClick = useCallback(\n      (e: React.MouseEvent<HTMLElement>) => {\n        // Do not trigger snapshot if user clicked inside an interactive button or link\n        const target = e.target as HTMLElement | null;\n        if (target?.closest(\"a, button, [data-no-snapshot]\")) {\n          return;\n        }\n\n        const el = sectionRef.current;\n        let pctX = sunPosRef.current.x;\n        let pctY = sunPosRef.current.y;\n        let isCompact = false;\n\n        if (el) {\n          const rect = el.getBoundingClientRect();\n          const relX = e.clientX - rect.left;\n          const relY = e.clientY - rect.top;\n          pctX = Math.min(Math.max((relX / rect.width) * 100, 5), 95);\n          pctY = Math.min(Math.max((relY / rect.height) * 100, 6), 94);\n          isCompact = rect.width < 640;\n        }\n\n        shotCounterRef.current += 1;\n        const num = shotCounterRef.current;\n        const id = `shot-${Date.now()}-${num}`;\n        const idx = (num - 1) % POLAROID_ROTATIONS.length;\n\n        const newShot: SolarSnapshotItem = {\n          id,\n          shotNumber: num,\n          sunX: Math.round(pctX * 10) / 10,\n          sunY: Math.round(pctY * 10) / 10,\n          timestamp: formatCurrentTime(),\n          rotation: POLAROID_ROTATIONS[idx],\n          offsetX: POLAROID_OFFSETS_X[idx],\n          offsetY: POLAROID_OFFSETS_Y[idx],\n          isCompact,\n          createdAt: Date.now(),\n        };\n\n        // Trigger camera shutter flash\n        setShutterFlash(true);\n        setTimeout(() => setShutterFlash(false), 140);\n\n        setSnapshots((prev) => [...prev.slice(-(maxSnapshots - 1)), newShot]);\n\n        // Schedule individual 10-second auto-removal for THIS snapshot\n        const timer = setTimeout(() => {\n          setSnapshots((current) => current.filter((item) => item.id !== id));\n          timersRef.current.delete(id);\n        }, snapshotDurationMs);\n\n        timersRef.current.set(id, timer);\n      },\n      [maxSnapshots, snapshotDurationMs]\n    );\n\n    const resolvedAvatars: StackAvatar[] = React.useMemo(\n      () =>\n        avatars.map((a, index) =>\n          typeof a === \"string\"\n            ? {\n                src: a,\n                alt: `Creator ${index + 1}`,\n                name: `Creator ${index + 1}`,\n              }\n            : a\n        ),\n      [avatars]\n    );\n\n    const customStyle: React.CSSProperties = {\n      ...accentTokens(accent || color),\n      ...style,\n    };\n\n    return (\n      <section\n        ref={(node) => {\n          sectionRef.current = node;\n          if (typeof ref === \"function\") ref(node);\n          else if (ref) (ref as any).current = node;\n        }}\n        onPointerEnter={() => setCursorActive(true)}\n        onPointerLeave={() => setCursorActive(false)}\n        onPointerMove={handlePointerMove}\n        onClick={handleSectionClick}\n        style={customStyle}\n        className={cn(\n          \"relative w-full min-h-[680px] sm:min-h-[740px] lg:min-h-[780px] overflow-hidden bg-background text-foreground select-none cursor-crosshair flex items-center justify-center py-20 sm:py-24\",\n          className\n        )}\n        {...props}\n      >\n        <style>{`\n          @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap');\n        `}</style>\n\n        {/* ═════════════════════════════════════════\n            1. RADIAL DOT-MATRIX & SOLAR ATMOSPHERE BACKDROP\n            ═════════════════════════════════════════ */}\n        <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n          {/* Full-section radial dot pattern visible subtly across both small & large screens */}\n          <div className=\"\n            absolute inset-0 opacity-[0.11] dark:opacity-[0.12]\n            bg-[radial-gradient(circle_at_center,currentColor_1px,transparent_1px)]\n            [background-size:24px_24px]\n            [mask-image:radial-gradient(ellipse_96%_92%_at_50%_50%,black_75%,transparent_100%)]\n          \" />\n\n          {/* Soft ambient aura */}\n          <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[720px] h-[360px] rounded-full bg-primary/[0.04] blur-[120px]\" />\n\n          {/* Dynamic pointer-following ambient sun illumination */}\n          <div\n            ref={ambientGlowRef}\n            className=\"absolute inset-0 transition-opacity duration-300\"\n            style={{\n              background:\n                \"radial-gradient(600px circle at 76% 22%, rgba(251, 191, 36, 0.16), rgba(249, 115, 22, 0.05) 45%, transparent 75%)\",\n            }}\n          />\n        </div>\n\n        {/* Camera Shutter Flash Overlay on Click */}\n        <div\n          className={cn(\n            \"pointer-events-none absolute inset-0 z-40 bg-white dark:bg-amber-100 transition-opacity duration-150\",\n            shutterFlash ? \"opacity-25\" : \"opacity-0\"\n          )}\n        />\n\n        {/* ═════════════════════════════════════════\n            2. RADIANT SUN CURSOR ORB WITH LENS FLARE RAYS (z-10: TRAVELS BEHIND TEXT, AVATARS & BUTTONS)\n            ═════════════════════════════════════════ */}\n        <div\n          ref={sunOrbRef}\n          style={{\n            transform: \"translate3d(76vw, 135px, 0)\",\n          }}\n          className={cn(\n            \"pointer-events-none absolute top-0 left-0 z-10 -ml-14 -mt-14 size-28 flex items-center justify-center transition-opacity duration-200 will-change-transform\",\n            cursorActive ? \"opacity-100\" : \"opacity-90\"\n          )}\n        >\n          <RadiantSunGraphic size=\"lg\" />\n        </div>\n\n        {/* ═════════════════════════════════════════\n            3. VERTICALLY & HORIZONTALLY CENTERED HERO CONTENT\n            (EQUAL TOP & BOTTOM GAP)\n            ═════════════════════════════════════════ */}\n        <div className=\"container relative z-20 mx-auto px-4 sm:px-6 lg:px-8\">\n          <div className=\"mx-auto max-w-4xl flex flex-col items-center justify-center text-center\">\n            {/* Top Unified Social Proof Capsule (Avatars only on small screens, full capsule on large screens) */}\n            {resolvedAvatars.length > 0 && (\n              <div\n                data-no-snapshot\n                className=\"mb-7 sm:mb-9 inline-flex items-center justify-center sm:gap-3.5 rounded-full border border-border/70 bg-card/75 hover:bg-card/95 p-1.5 sm:pr-4 text-xs shadow-[0_2px_12px_-4px_rgba(0,0,0,0.05)] backdrop-blur-md transition-colors cursor-auto\"\n              >\n                <AvatarGroup showTooltip={true} className=\"m-0 p-0 h-8 -space-x-2\">\n                  {resolvedAvatars.map((avatar, index) => (\n                    <Avatar\n                      key={index}\n                      className=\"size-8 !rounded-full border-2 border-background ring-0 cursor-pointer\"\n                    >\n                      <AvatarImage\n                        src={avatar.src}\n                        alt={avatar.alt ?? avatar.name ?? \"\"}\n                        className=\"!rounded-full object-cover\"\n                      />\n                      <AvatarFallback className=\"!rounded-full bg-muted text-[10px] font-medium\">\n                        {(avatar.name ?? avatar.alt ?? \"U\").slice(0, 2)}\n                      </AvatarFallback>\n                      <AvatarGroupTooltip designation={avatar.role ?? avatar.designation}>\n                        {avatar.name ?? avatar.alt}\n                      </AvatarGroupTooltip>\n                    </Avatar>\n                  ))}\n                </AvatarGroup>\n\n                <span className=\"hidden sm:block h-4 w-px bg-border/70\" />\n\n                <div className=\"hidden sm:flex items-center gap-1.5\">\n                  <div className=\"flex items-center gap-0.5\">\n                    {Array.from({ length: rating }).map((_, idx) => (\n                      <Star\n                        key={idx}\n                        className=\"size-3 fill-amber-400 text-amber-400\"\n                      />\n                    ))}\n                  </div>\n                  {trustText && (\n                    <span className=\"text-xs font-medium text-muted-foreground\">\n                      {trustText}\n                    </span>\n                  )}\n                </div>\n              </div>\n            )}\n\n            {/* Distinctive Geometric Frame Headline */}\n            <h1\n              style={{\n                fontFamily:\n                  '\"Space Grotesk\", \"Plus Jakarta Sans\", var(--font-sans), system-ui, sans-serif',\n              }}\n              className=\"max-w-4xl text-[1.75rem] sm:text-5xl md:text-6xl lg:text-[4rem] font-extrabold tracking-[-0.04em] text-foreground leading-[1.16] sm:leading-[1.12] text-balance\"\n            >\n              <span className=\"block text-foreground\">{title}</span>\n              {titleAccent && (\n                <span className=\"relative mt-2 sm:mt-3 inline-flex items-center justify-center rounded-xl sm:rounded-2xl border border-primary/30 bg-primary/[0.07] px-3.5 sm:px-6 py-1 sm:py-1.5 text-primary shadow-[inset_0_1px_0_0_rgba(255,255,255,0.2)]\">\n                  {/* Precision Corner Frame Ticks */}\n                  <span className=\"pointer-events-none absolute -top-1 -left-1 size-2 sm:size-2.5 border-t-2 border-l-2 border-primary\" />\n                  <span className=\"pointer-events-none absolute -top-1 -right-1 size-2 sm:size-2.5 border-t-2 border-r-2 border-primary\" />\n                  <span className=\"pointer-events-none absolute -bottom-1 -left-1 size-2 sm:size-2.5 border-b-2 border-l-2 border-primary\" />\n                  <span className=\"pointer-events-none absolute -bottom-1 -right-1 size-2 sm:size-2.5 border-b-2 border-r-2 border-primary\" />\n                  <span className=\"bg-gradient-to-r from-primary via-amber-500 to-orange-500 bg-clip-text text-transparent\">\n                    {titleAccent}\n                  </span>\n                </span>\n              )}\n            </h1>\n\n            {/* Framed Editorial Callout Description */}\n            {description && (\n              <div className=\"mt-6 sm:mt-7 max-w-xl sm:max-w-2xl rounded-2xl border border-border/60 bg-muted/25 px-4 sm:px-6 py-3 sm:py-3.5 backdrop-blur-xs\">\n                <p className=\"text-xs sm:text-[15px] text-muted-foreground leading-relaxed font-medium text-balance\">\n                  {description}\n                </p>\n              </div>\n            )}\n\n            {/* CTA Buttons from the Last Preview of Button Component */}\n            <div\n              data-no-snapshot\n              className=\"mt-8 sm:mt-10 flex flex-col sm:flex-row items-center justify-center gap-3.5 sm:gap-4 w-full sm:w-auto cursor-auto\"\n            >\n              {primaryActionLabel && (\n                <LinkComp\n                  href={primaryActionHref}\n                  className=\"w-full sm:w-auto inline-block\"\n                >\n                  <Button\n                    variant={primaryButtonVariant}\n                    showArrow\n                    className=\"w-full sm:w-auto justify-center cursor-pointer\"\n                  >\n                    {primaryActionLabel}\n                  </Button>\n                </LinkComp>\n              )}\n\n              {secondaryActionLabel && (\n                <LinkComp\n                  href={secondaryActionHref}\n                  className=\"w-full sm:w-auto inline-block\"\n                >\n                  <Button\n                    variant={secondaryButtonVariant}\n                    showArrow\n                    className=\"w-full sm:w-auto justify-center cursor-pointer\"\n                  >\n                    {secondaryActionLabel}\n                  </Button>\n                </LinkComp>\n              )}\n            </div>\n          </div>\n        </div>\n\n        {/* ═════════════════════════════════════════\n            4. BOTTOM-RIGHT POLAROID SNAPSHOT STACK\n            (ULTRA-SOFT SHADOW, STACKS IN BOTTOM-RIGHT, CLEARS AFTER 10S)\n            ═════════════════════════════════════════ */}\n        <div className=\"pointer-events-none absolute bottom-6 right-5 sm:bottom-8 sm:right-8 lg:bottom-10 lg:right-12 z-30 w-[210px] sm:w-[250px] h-[160px] sm:h-[190px]\">\n          {snapshots.map((shot, idx) => (\n            <PolaroidSnapshotCard\n              key={shot.id}\n              shot={shot}\n              stackIndex={idx}\n              durationMs={snapshotDurationMs}\n              trustText={trustText}\n              title={title}\n              titleAccent={titleAccent}\n              description={description}\n              primaryActionLabel={primaryActionLabel}\n              secondaryActionLabel={secondaryActionLabel}\n              avatars={resolvedAvatars}\n              rating={rating}\n            />\n          ))}\n        </div>\n      </section>\n    );\n  }\n);\n\nSolarSnapshotHero.displayName = \"SolarSnapshotHero\";\n\nexport default SolarSnapshotHero;\n",
      "type": "registry:component",
      "target": "components/custom/blocks/SolarSnapshotHeroBlock.tsx"
    },
    {
      "path": "src/lib/accent.ts",
      "content": "import type { CSSProperties } from \"react\";\n\n/**\n * Bridging the docs colour picker into a preview.\n *\n * Most blocks are already written against the `--primary` token (`bg-primary`,\n * `ring-primary/30`, `text-primary-foreground`…). Rather than teaching each one a\n * bespoke `color` prop, a demo can repoint that token for its own subtree and\n * every one of those classes follows along.\n */\n\n/** The swatches the picker offers, as concrete CSS colours. */\nconst PRESET_HEX: Record<string, string> = {\n  lavender: \"#9b8afb\",\n  indigo: \"#6366f1\",\n  rose: \"#f43f5e\",\n  emerald: \"#10b981\",\n  zinc: \"#18181b\",\n};\n\n/** True when the picker sits on \"Default\" — the page theme should win. */\nexport function isDefaultAccent(color?: string): boolean {\n  return !color || color === \"primary\" || color === \"default\";\n}\n\n/**\n * Turns a picker value into a CSS colour, or null for \"Default\" — meaning\n * nothing should be overridden, so the theme (and the sidebar customizer)\n * keeps control.\n */\nexport function resolveAccent(color?: string): string | null {\n  if (isDefaultAccent(color)) return null;\n  return PRESET_HEX[color as string] ?? (color as string);\n}\n\n/**\n * The picker value in a form every block accepts. Blocks know the older swatch\n * names but not \"lavender\" — and since that is also a CSS named colour\n * (#e6e6fa), a block that passes unknown names straight through would paint\n * the wrong shade, while others fall back to a different palette. Demos that\n * hand the picker value to such a block run it through this first. Every\n * other value is returned untouched.\n */\nexport function toBlockColor(color: string): string;\nexport function toBlockColor(color: string | undefined): string | undefined;\nexport function toBlockColor(color?: string): string | undefined {\n  return color === \"lavender\" ? PRESET_HEX.lavender : color;\n}\n\nfunction parseHex(input: string): [number, number, number] | null {\n  const hex = input.trim().replace(/^#/, \"\");\n  if (/^[a-f\\d]{3}$/i.test(hex)) {\n    const [r, g, b] = hex.split(\"\");\n    return [parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16)];\n  }\n  if (/^[a-f\\d]{6}$/i.test(hex)) {\n    return [\n      parseInt(hex.slice(0, 2), 16),\n      parseInt(hex.slice(2, 4), 16),\n      parseInt(hex.slice(4, 6), 16),\n    ];\n  }\n  return null;\n}\n\n/** Legible foreground for content sitting on a filled `color` swatch. */\nexport function accentForeground(color: string): string {\n  const rgb = parseHex(color);\n  if (!rgb) return \"#ffffff\";\n  const channel = (v: number) => {\n    const c = v / 255;\n    return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n  };\n  const luminance =\n    0.2126 * channel(rgb[0]) +\n    0.7152 * channel(rgb[1]) +\n    0.0722 * channel(rgb[2]);\n  return luminance > 0.45 ? \"#09090b\" : \"#ffffff\";\n}\n\n/** The theme tokens a picked accent repoints, as `--name` → value. */\nexport function accentTokens(color?: string): Record<string, string> {\n  const resolved = resolveAccent(color);\n  if (!resolved) return {};\n  return {\n    \"--primary\": resolved,\n    \"--primary-foreground\": accentForeground(resolved),\n    \"--ring\": resolved,\n  };\n}\n\n/**\n * Inline style repointing `--primary` at the picked accent for one subtree.\n * `--primary-foreground` is derived alongside it, otherwise a light pick leaves\n * `text-primary-foreground` content unreadable on its own fill. Returns `{}` on\n * \"Default\" so the page theme still wins.\n */\nexport function accentStyle(color?: string): CSSProperties {\n  return accentTokens(color) as CSSProperties;\n}\n",
      "type": "registry:component",
      "target": "lib/accent.ts"
    }
  ],
  "docs": "Named exports: SolarSnapshotHero (default), DEFAULT_SOLAR_AVATARS, SolarSnapshotItem, and SolarSnapshotHeroProps.",
  "categories": [
    "marketing",
    "layout",
    "media"
  ],
  "type": "registry:component"
}
