Aaditya

Relight Sphere

AI chats

About

Place the light for an image relighting model. Drag a key light over a shaded sphere, past the rim for a rim light, then set intensity, softness and color temperature with a live preview on the photo.

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

Code

How Relight Sphere 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 { RelightPreview, RelightSphere, RelightValue } from "@/components/ui/relight-sphere"

// The photo ships inline (picsum.photos id 91, 640 x 960), so the preview needs no image host.
const PORTRAIT_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 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>
  )
}

/** Place a warm key light, preview it on the portrait, then send it to the relighting model. */
export default function RelightSpherePreview() {
  const portrait = {
    src: PORTRAIT_SRC,
    alt: "A man in a dark sweater holding a twin lens reflex camera at chest height",
    width: 640,
    height: 960,
  }
  const [value, setValue] = React.useState<RelightValue>({
    azimuth: -50,
    elevation: 20,
    intensity: 0.75,
    softness: 0.35,
    temperature: 4300,
  })
  const [applying, setApplying] = React.useState(false)
  React.useEffect(() => {
    if (!applying) return
    const id = window.setTimeout(() => setApplying(false), 2400)
    return () => window.clearTimeout(id)
  }, [applying])

  return (
    <div className="flex min-h-[520px] w-full flex-col items-center justify-center gap-8 p-6">
      <div className="@container w-full max-w-3xl">
        <div className="grid items-start gap-6 @md:grid-cols-[minmax(0,1fr)_15rem] @2xl:grid-cols-[minmax(0,1fr)_17rem]">
          <RelightPreview
            {...portrait}
            value={value}
            pending={applying}
            className="@max-md:max-h-[28rem]"
          />
          <div className="flex min-w-0 flex-col gap-4">
            <RelightSphere value={value} onValueChange={setValue} applying={applying} />
            <Button variant="solid" size="lg" disabled={applying} onClick={() => setApplying(true)}>
              {applying ? "Relighting" : "Relight portrait"}
            </Button>
          </div>
        </div>
      </div>
      <MoreOn slug="relight-sphere">Drag the light around the sphere. More image tools on</MoreOn>
    </div>
  )
}

Dependencies

More by Aaditya

View all
  • Dither Orb

    Dither Orb

    7
  • Pixel Orb

    Pixel Orb

    3
  • Voice Orb

    Voice Orb

    2
  • Dither Gradient

    Dither Gradient

    1
  • Wireframe Globe

    Wireframe Globe

    1
  • Particle Text

    Particle Text

    1
  • Split Flap

    Split Flap

    1
  • Agent Lanes

    Agent Lanes

    1

More in AI chats

View all
  • AI Actions

    AI Actions

    335
  • System Message

    System Message

    71
  • Aquarium Prompt

    Aquarium Prompt

    9
  • Message With Header And Delivery Status

    Message With Header And Delivery Status

    50
  • Color Picker

    Color Picker

    154
  • Attachments

    Attachments

    30
  • Cost Meter

    Cost Meter

    41
  • ASCII Orb

    ASCII Orb

Explore more

Part of chatcn — browse the full library on 21st.dev.