KQ-1808 · BULLSEYE/PANES

Bullseye Panes

A view seen through a leaded window of bullseye glass, drawn per pixel in one WebGL2 pass: roundels in hexagonal rows, each spun crown glass that is thick at its centre with a pontil knob that turns its piece of the view over, swirled so the picture twists toward the middle, magnified there, rippled by spiral ridges and fringed with colour, between flatter quarries and rounded lead cames that each carry one thin highlight. The view drifts slowly behind the glass (a garden painted in code that wraps, or your own image or video), and the pointer shifts the viewpoint on springs.glide so the thick centres move most and every swirl turns with the hand; it returns, and the first sighting swings in, on springs.drift. The keyboard's way in is a button behind the content: arrow keys shift the viewpoint, Enter, Space or Escape bring it back to centre.

KQ-1808 · BULLSEYE/PANES

Waylight · crown glass

Spun by hand, leaded by eye.

A garden seen through bullseye glass

Arrow keys shift your viewpoint behind the glass; Enter, Space or Escape bring it back to centre.

8 across · swirl 0.60 · move to turn the glass

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/bullseye-panes

Props

roundels
number
default 8
How many roundels sit across the window, 4 to 14; none is ever narrower than 36 px.
swirl
number
default 0.6
How hard each disc is swirled, 0 (plain lenses) to 1 (the view twists half a turn toward the middle).
lead
number
default 3
The lead cames' width, in px, 1 to 8.
src
string
default —
The view behind the glass: an image or video URL. A cross-origin file must allow CORS. Defaults to a garden painted in code.
kind
"image" | "video"
default —
Whether `src` is an image or a video. Defaults to a guess from the file's extension.
alt
string
default "A garden seen through bullseye glass"
Describes the view for assistive technology.
magnify
number
default 0.5
How much the thick centres magnify, 0 to 1.
tint
string
default "oklch(0.93 0.035 150)"
The glass's own colour, any CSS colour; old crown glass is a pale green.
leadColor
string
default "oklch(0.33 0.012 250)"
The cames' colour, any CSS colour.
drift
number
default 0.3
How fast the view drifts behind the glass, 0 (still) to 1.
parallax
number
default 0.6
How far the pointer shifts the viewpoint, 0 to 1.
children
React.ReactNode
default —
Content above the window: a hero line, a heading, a call to action.
intro
boolean
default true
The first time the window is seen, the viewpoint swings in from the side and every swirl turns into place.
interactive
boolean
default true
The pointer and keys shift the viewpoint.
paused
boolean
default false
Hold the view where it is; the viewpoint still answers.
label
string
default "Bullseye window"
Names the window for assistive technology.
seed
number
default 6
Seeds the garden and each disc's swirl, so two windows never match.
dpr
number
default 2
Cap on the canvas's device pixel ratio, at most 2.
disabled
boolean
default false
Shows the window but takes no input.
className
string
default "h-56 w-full"
Sizes the box.