KQ-1608 · NIGHT/SIDE

Night Side

An invented world as a dotted globe on Canvas 2D: seeded continents, a body shaded per pixel with a soft terminator and a warm twilight band, and city lights glowing on the dark half. Change the hour and the day sweeps round on springs.drift while each city switches on with its own flicker as night reaches it; routes between offices rise as arcs on springs.glide the first time the globe is seen, then pulses of light ride them and ring out on arrival. Drag turns it 1:1 and tips it with a rubber band, a throw coasts, a click brings an office round on glide; arrow keys turn and tip, Page Up and Page Down step through the offices, Home faces one and Escape lets it turn again.

KQ-1608 · NIGHT/SIDE

Gaugeworks · network

Six offices, one working day

Drag or use the arrow keys to turn and tip the globe. Page Up and Page Down bring each office to the front, Home faces it, Escape lets the globe turn again.
  • Coldbrook: 16:56 local time, day.
  • Basinworks: 20:24 local time, night.
  • Fieldline: 22:16 local time, night.
  • Waylight: 18:40 local time, night.
  • Fernworks: 14:40 local time, day.
  • Gaugeworks: 00:32 local time, night.

18:00 · 4 of 6 offices in the dark · 5 routes

Install

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

$ pnpm dlx shadcn@latest add @kinetiq/night-side

Props

points
NightSidePoint[]
default defaultNightSidePoints
The offices: { id, name, lat, lon }.
routes
NightSideRoute[]
default defaultNightSideRoutes
Routes between offices by id: { from, to }.
timeOfDay
number
default 18
The hour at the prime meridian, 0 to 24; changing it sweeps the day across the globe.
arcHeight
number
default 0.45
How high the route arcs rise, 0 (hugging the ground) to 1.
dotDensity
number
default 66
Rows of dots from pole to pole, 36 to 120.
season
number
default 14
The sun's declination in degrees, −23.4 to 23.4.
tilt
number
default 16
How far the view looks down on the north, −30 to 30 degrees.
spin
number
default 5
Degrees per second of the slow turn; 0 holds it still.
momentum
number
default 0.6
How long a throw coasts, 0 (stops at once) to 1.
pulseSpeed
number
default 1
Pace of the light along the routes, 0 (held, lit) to 3.
lights
number
default 0.8
How many cities glow and how brightly, 0 to 1.
colors
NightSideColors
default —
The inks: { day, night, land, lights, routes, points } as CSS colours; tokens and fixed pigments by default.
value / defaultValue
string | null
default null
The selected office's id, brought round to face you; controlled or initial.
onValueChange
(id: string | null) => void
default —
Fires from the click or key that selected an office or cleared it.
interactive
boolean
default true
Drag, click and the keys turn the globe.
paused
boolean
default false
Holds the turn, the pulses and the day's sweep.
seed
number
default 3
Seeds the continents and the cities.
dpr
number
default 2
Cap on the canvas's device pixel ratio, at most 2.
label
string
default "Offices around the world"
The globe's accessible name; the hour and the offices in the dark are added.
className
string
default "h-60 w-full"
Sizes the box; the globe takes its smaller side.