Puzzle Snap

Geometric pieces spin in from scattered positions and snap into a mark with sparks, then the wordmark slides out beside it

Installation
$ pnpm dlx shadcn@latest add @remocn/puzzle-snap

Usage

PuzzleSnap draws its own mark: a quarter circle, a dot, a wedge and a small rounded square on a 2×2 grid. Each piece starts far off at a seeded angle, drifts in while it spins, then gets yanked onto its slot over three frames and throws a ring of six sparks. When the last piece lands the whole mark punches, then slides left while your wordmark wipes in on its right.

tsx
import { PuzzleSnap } from "@/components/remocn/puzzle-snap";
 
export const LogoSting = () => (
  <PuzzleSnap primaryColor="#E5322D" secondaryColor="#FFFFFF">
    <span
      style={{
        fontSize: 104,
        fontWeight: 800,
        letterSpacing: "-0.04em",
        color: "#FFFFFF",
      }}
    >
      remocn
    </span>
  </PuzzleSnap>
);

Pass only the wordmark as children, not a full lockup: the mark is the sting's own drawing. Without children the mark stays centered and no slide happens. The mark is 20% of the shorter side of the composition (144px at 720p), and the wordmark keeps its own size. Positions come from Remotion's seeded random(), so the same seed always renders the same frames.

Timing

At 30 fps, speed={1} and square on:

FramesMotion
0–9Pieces launch one every 3 frames and fade in over 3 frames
0–22Each piece drifts in for 10 frames with an ease-out, then snaps the last stretch in 3 frames
13, 16, 19, 22Contact frames; each throws a spark ring that lasts 8 frames
22–38The mark punches from 108% and springs back to full size
24–35The mark slides from the center to the left
26–37The wordmark wipes in from the left

With square={false} there are three pieces and everything after the last contact starts 3 frames earlier. The docs preview runs 66 frames. speed scales the timeline.

Props8

PropTypeDefault
children
ReactNode—

Wordmark revealed to the right of the assembled mark. Without it the mark settles alone in the center

square
booleantrue

Include the small square piece; false builds the mark from three pieces

seed
number3

Seeds the start angle, distance and spin of each piece

primaryColor
string"#E5322D"

Quarter circle and square

secondaryColor
string"#FFFFFF"

Dot and wedge

sparkColor
string"#FFFFFF"

Spark lines at each contact

backgroundColor
string"#111111"

Full-frame background

speed
number1

Playback multiplier

  • childrenReactNode

    Wordmark revealed to the right of the assembled mark. Without it the mark settles alone in the center

  • squareboolean

    Include the small square piece; false builds the mark from three pieces

    Defaulttrue

  • seednumber

    Seeds the start angle, distance and spin of each piece

    Default3

  • primaryColorstring

    Quarter circle and square

    Default"#E5322D"

  • secondaryColorstring

    Dot and wedge

    Default"#FFFFFF"

  • sparkColorstring

    Spark lines at each contact

    Default"#FFFFFF"

  • backgroundColorstring

    Full-frame background

    Default"#111111"

  • speednumber

    Playback multiplier

    Default1