Tiny Planet

A seeded flat skyline bends into a tiny planet through a polar remap, then keeps turning beside a red sun

Installation
$ pnpm dlx shadcn@latest add @remocn/tiny-planet

Usage

TinyPlanet draws a seeded two-row skyline with lit windows and spires on a flat horizon, then bends it into a circle like the tiny planet effect in 360° photography. The strip is exactly as long as the planet's circumference, so it closes without a seam. While it bends the planet shrinks to fit the frame and the sun drifts up and to the right. Once closed, the planet turns at a steady rate for as long as the sequence lasts.

tsx
import { TinyPlanet } from "@/components/remocn/tiny-planet";
 
export const Hometown = () => (
  <TinyPlanet buildings={32} seed={9} sunColor="#F5B83D" />
);

buildings is the front row count (minimum 4); the back row gets 80% of that. seed changes widths, heights, spires and windows. spin is the final turning rate in degrees per frame at 30 fps, and spin={0} leaves the planet still once it closes.

Timing

At 30 fps and speed={1}:

FramesMotion
0–8The flat skyline holds
8–40The skyline bends into a planet on an ease-in-out, fastest around frame 24
26–40The spin eases in while the strip closes
40+The planet turns at spin degrees per frame for as long as the sequence lasts

length covers the bend. Give the sequence a few extra seconds if you want the turning planet to hold behind a title. speed scales the whole timeline, including the spin rate.

Props9

PropTypeDefault
buildings
number26

Buildings in the front row, minimum 4; the back row gets 80% as many

seed
number4

Seeds building widths, heights, spires and windows

spin
number0.7

Planet spin once bent, in degrees per frame at 30 fps

colors
Partial<TinyPlanetColors>{ sky: "#111111", ground: "#262626", near: "#FFFFFF", far: "#6B6B6B", window: "#111111", sun: "#E5322D" }

Sky background, ground, front and back building rows, windows and sun; merged over the defaults. The flat color props below win over it

skyColor
string"#111111"

Sky background; overrides colors.sky

sunColor
string"#E5322D"

Sun color; overrides colors.sun

buildingColor
string"#FFFFFF"

Front building row; overrides colors.near

groundColor
string"#262626"

Ground color; overrides colors.ground

speed
number1

Playback multiplier

  • buildingsnumber

    Buildings in the front row, minimum 4; the back row gets 80% as many

    Default26

  • seednumber

    Seeds building widths, heights, spires and windows

    Default4

  • spinnumber

    Planet spin once bent, in degrees per frame at 30 fps

    Default0.7

  • colorsPartial<TinyPlanetColors>

    Sky background, ground, front and back building rows, windows and sun; merged over the defaults. The flat color props below win over it

    Default{ sky: "#111111", ground: "#262626", near: "#FFFFFF", far: "#6B6B6B", window: "#111111", sun: "#E5322D" }

  • skyColorstring

    Sky background; overrides colors.sky

    Default"#111111"

  • sunColorstring

    Sun color; overrides colors.sun

    Default"#E5322D"

  • buildingColorstring

    Front building row; overrides colors.near

    Default"#FFFFFF"

  • groundColorstring

    Ground color; overrides colors.ground

    Default"#262626"

  • speednumber

    Playback multiplier

    Default1