Aaditya

Hero Dithered

Heroes

About

A launch hero with a dithered photo: headline, lede, actions and a stats row beside an image in any of seven dither methods. Container queries, so it lays out by the space it gets.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds Hero Dithered to your project and fits it to your theme.

Code

How Hero Dithered is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client"

import * as React from "react"
import { cn } from "@/lib/utils"
import { DitherAlgorithm, HeroDithered } from "@/components/ui/hero-dithered"

const reducedMotion = () =>
  typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches

/** How long a choice holds a tour before it carries on. */
const RESUME_MS = 5000

/**
 * Steps through `values` on a timer, so a 21st preview (and its cover video) shows every option
 * without a click. Picking a value holds it, and the tour carries on from there after
 * `RESUME_MS`, so a click never leaves the preview still. Reduced motion never starts it.
 */
function useCycle<T>(values: readonly T[], ms: number) {
  const [index, setIndex] = React.useState(0)
  const [heldAt, setHeldAt] = React.useState(0)
  React.useEffect(() => {
    if (reducedMotion()) return
    let id = 0
    const start = () => {
      id = window.setInterval(() => setIndex((n) => (n + 1) % values.length), ms)
    }
    const wait = window.setTimeout(start, heldAt ? RESUME_MS : 0)
    return () => {
      window.clearTimeout(wait)
      window.clearInterval(id)
    }
  }, [heldAt, values.length, ms])
  const pick = React.useCallback(
    (value: T) => {
      setHeldAt(Date.now())
      setIndex(Math.max(0, values.indexOf(value)))
    },
    [values],
  )
  return [values[index] as T, pick] as const
}

const METHODS = [
  { value: "atkinson", label: "Atkinson" },
  { value: "bayer-8", label: "Bayer 8" },
  { value: "floyd-steinberg", label: "Floyd-Steinberg" },
  { value: "blue-noise", label: "blue noise" },
] as const satisfies readonly { value: DitherAlgorithm; label: string }[]

const VALUES = METHODS.map((m) => m.value)

const FIT_CSS = "html,body{overflow:hidden}[data-fit-small] [data-fit-hide]{display:none!important}"

/**
 * 21st shows a demo in a small frame: about 674 by 421 on a component page, 358 by 224 on a
 * phone and 245 by 139 on a profile card. A demo taller than its frame gets scrollbars, which
 * render white on dark pages. FitFrame fills the frame exactly instead.
 *
 * - "scale": the content shrinks until it fits, centered. For visuals such as orbs.
 * - "crop": the content stays at full size from the top and fades out at the bottom. For text
 *   that streams in, where a changing scale would make the page breathe.
 *
 * `minWidth` lays out a wide demo (a table, a two column panel) at that width and scales it down
 * to the frame, instead of letting it collapse to a narrow layout. The frame centers it, so it
 * shrinks evenly on both sides.
 *
 * Anything marked `data-fit-hide` (state buttons, the chatcn.dev line) drops out in frames
 * shorter than `hideBelow`, so a profile card shows the visual alone.
 */
function FitFrame({
  children,
  mode = "scale",
  hideBelow = 360,
  minWidth,
}: {
  children: React.ReactNode
  mode?: "scale" | "crop"
  hideBelow?: number
  minWidth?: string
}) {
  const content = React.useRef<HTMLDivElement>(null)
  const [cropped, setCropped] = React.useState(false)

  React.useLayoutEffect(() => {
    const el = content.current
    if (!el) return
    const measure = () => {
      const vw = window.innerWidth
      const vh = window.innerHeight
      el.toggleAttribute("data-fit-small", vh < hideBelow)
      // Layout sizes ignore the transform, so measuring never feeds back.
      const w = Math.max(el.offsetWidth, el.scrollWidth)
      const h = Math.max(el.offsetHeight, el.scrollHeight)
      const scale = mode === "scale" ? Math.min(1, vw / w, vh / h) : 1
      el.style.transform = scale < 1 ? `scale(${scale})` : ""
      setCropped(mode === "crop" && h > vh + 1)
    }
    measure()
    const observer = new ResizeObserver(measure)
    observer.observe(el)
    // Content that changes inside a fixed width box (a headline that cycles words) never resizes
    // the box itself, so changes below it measure again on the next frame.
    let frame = 0
    const mutations = new MutationObserver(() => {
      cancelAnimationFrame(frame)
      frame = requestAnimationFrame(measure)
    })
    mutations.observe(el, { subtree: true, childList: true, characterData: true })
    window.addEventListener("resize", measure)
    return () => {
      observer.disconnect()
      mutations.disconnect()
      cancelAnimationFrame(frame)
      window.removeEventListener("resize", measure)
    }
  }, [mode, hideBelow])

  const fade = "linear-gradient(to bottom, #000 calc(100% - 40px), transparent)"
  return (
    <div
      className="flex w-full justify-center overflow-hidden"
      style={{
        height: "100dvh",
        alignItems: mode === "crop" ? "flex-start" : "center",
        maskImage: cropped ? fade : undefined,
        WebkitMaskImage: cropped ? fade : undefined,
      }}
    >
      <style>{FIT_CSS}</style>
      <div
        ref={content}
        className="w-full shrink-0"
        style={{ transformOrigin: mode === "crop" ? "top center" : "center", minWidth }}
      >
        {children}
      </div>
    </div>
  )
}

// picsum.photos id 1074, 800 x 600, inline so the 21st preview needs no image host.
const lioness = {
  alt: "A lioness lying in the grass, eyes on the camera",
  width: 800,
  height: 600,
  src: "data:image/webp;base64,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",
}

type ButtonVariant = "solid" | "outline" | "ghost" | "subtle"

type ButtonSize = "xs" | "sm" | "md" | "lg" | "icon-xs" | "icon-sm" | "icon-md" | "icon-lg"

interface ButtonProps extends React.ComponentProps<"button"> {
  variant?: ButtonVariant
  size?: ButtonSize
}

const base = cn(
  "chatcn-focus inline-flex shrink-0 items-center justify-center gap-1.5 font-medium whitespace-nowrap select-none",
  "ease-(--chatcn-ease-standard) transition-[background-color,color,box-shadow,scale] duration-150",
  "active:scale-(--chatcn-press-scale) active:duration-100 disabled:pointer-events-none disabled:opacity-50",
  "[&_svg]:pointer-events-none [&_svg]:shrink-0",
)

const variants: Record<ButtonVariant, string> = {
  solid: "bg-(color:--chatcn-primary) text-(color:--chatcn-primary-fg) hover:bg-(color:--chatcn-primary-hover)",
  outline: "bg-(color:--chatcn-card) text-(color:--chatcn-fg) shadow-(--chatcn-shadow-xs) hover:bg-(color:--chatcn-fill-hover)",
  ghost: "text-(color:--chatcn-fg-muted) hover:bg-(color:--chatcn-fill-hover) hover:text-(color:--chatcn-fg)",
  subtle: "bg-(color:--chatcn-fill) text-(color:--chatcn-fg) hover:bg-(color:--chatcn-fill-hover)",
}

// Heights follow the control scale: 24, 28, 32, 36. Radii stay concentric inside 12 px surfaces.
const sizes: Record<ButtonSize, string> = {
  xs: "h-6 rounded-(--chatcn-radius-sm) px-2 text-[0.75rem]/[1rem] [&_svg]:size-3.5",
  sm: "h-7 rounded-(--chatcn-radius-sm) px-2.5 text-[0.8125rem]/[1.25rem] [&_svg]:size-3.5",
  md: "h-8 rounded-(--chatcn-radius-md) px-3 text-[0.875rem]/[1.25rem] tracking-[-0.003em] [&_svg]:size-4",
  lg: "h-9 rounded-(--chatcn-radius-md) px-3.5 text-[0.875rem]/[1.25rem] tracking-[-0.003em] [&_svg]:size-4",
  "icon-xs": "size-6 rounded-(--chatcn-radius-sm) active:scale-(--chatcn-press-scale-icon) [&_svg]:size-3.5",
  "icon-sm": "size-7 rounded-(--chatcn-radius-sm) active:scale-(--chatcn-press-scale-icon) [&_svg]:size-3.5",
  "icon-md": "size-8 rounded-(--chatcn-radius-md) active:scale-(--chatcn-press-scale-icon) [&_svg]:size-4",
  "icon-lg": "size-9 rounded-(--chatcn-radius-md) active:scale-(--chatcn-press-scale-icon) [&_svg]:size-4",
}

/** Class names for anything that should look like a button, such as a link. */
function buttonVariants({
  variant = "ghost",
  size = "md",
}: {
  variant?: ButtonVariant
  size?: ButtonSize
} = {}) {
  return cn(base, variants[variant], sizes[size])
}

function Button({
  variant = "ghost",
  size = "md",
  type = "button",
  className,
  ...props
}: ButtonProps) {
  return (
    <button
      type={type}
      data-slot="button"
      data-variant={variant}
      className={cn(buttonVariants({ variant, size }), className)}
      {...props}
    />
  )
}

/** The line under each 21st demo that points back to the kit. */
function MoreOn({ slug, children }: { slug: string; children: React.ReactNode }) {
  return (
    <p data-fit-hide className="text-[0.75rem]/[1rem] text-(color:--chatcn-fg-faint) text-center text-balance">
      {children}{" "}
      <a
        href={`https://chatcn.dev/docs/components/${slug}`}
        target="_blank"
        rel="noopener"
        className="text-(color:--chatcn-fg-subtle) hover:text-(color:--chatcn-fg) underline underline-offset-2"
      >
        chatcn.dev
      </a>
    </p>
  )
}

/**
 * A launch hero for a trail camera, its frame dithered in a new method every second and a half,
 * the caption naming each one. Laid out at desktop width and scaled into the preview.
 */
export default function HeroDitheredPreview() {
  const [algorithm] = useCycle<DitherAlgorithm>(VALUES, 1500)
  const method = METHODS.find((m) => m.value === algorithm)?.label ?? "Atkinson"
  return (
    <FitFrame minWidth="68rem">
      <div className="flex w-full flex-col items-center justify-center gap-2 pb-6">
        <HeroDithered
          className="[&>div]:py-10"
          title="Trail cameras that know what they saw."
          description="Ridgeline 2 names 140 species on the camera itself in 90 ms and sends you a frame only when it matters. One battery lasts the season."
          src={lioness.src}
          alt={lioness.alt}
          algorithm={algorithm}
          pixelSize={3}
          aspectRatio="4:3"
          reveal={false}
          caption={`Frame 48,112 from a camera in the Masai Mara, dithered with ${method}.`}
          stats={[
            { value: "140", label: "Species named on device" },
            { value: "90 ms", label: "To tag a frame" },
            { value: "6 mo", label: "On one battery" },
          ]}
          actions={
            <>
              <Button variant="solid" size="lg" className="chatcn-press">
                Order a kit
              </Button>
              <Button variant="outline" size="lg">
                See sample frames
              </Button>
            </>
          }
        />
        <MoreOn slug="hero-dithered">Seven dither methods, a hover reveal, any photo. On</MoreOn>
      </div>
    </FitFrame>
  )
}

More in Heroes

View all
  • Responsive Hero Banner

    Responsive Hero Banner

    2.1K
  • SaaS Template

    SaaS Template

    2.6K
  • Hero

    Hero

    1.3K
  • Centered Hero with Image Fan

    Centered Hero with Image Fan

    1K
  • Hero 03

    Hero 03

    350
  • Hero Section

    Hero Section

    177
  • HeroSectionWithGradient

    HeroSectionWithGradient

    368
  • Glass Fold

    Glass Fold

    400