Vibary.ai
← Vibe Coding

Empty Map

A pin outline draws itself over a dashed street grid, drops onto its point on one soft spring, and a ring expands once and fades.

empty-statescalmminimalautomatic · finite · intermediate · ~1.4s
Variant

The animated component in this preview is rendered from the canonical file shown here. The surrounding demo shell only provides context and is not part of the copied code.

276 lines · react + motion only
import { motion, useReducedMotion } from "motion/react";

/**
 * Vibary · Empty Map
 *
 * A saved-places screen with nothing saved should still read as a map.
 * A dashed street grid fades in first, a map-pin outline draws itself,
 * the pin drops onto its point on one soft spring, a hairline ring

About this pattern

A saved-places screen with nothing saved should still read as a map, not as a failed load. Dashed streets fade in first so the pin lands on something, the pin outline draws itself via pathLength, the whole pin drops a short distance on one overdamped spring and stops dead on its point, a hairline ring expands once from the base and fades, and only then does the copy arrive — after which the block holds perfectly still. Nothing pulses or breathes afterwards: anything still moving could be mistaken for places still loading. Reduced motion keeps the arrival order and drops the travel.

Map view: the saved-places tab before the first saveTravel itinerary: an empty day waiting for its first stopProfile page: a places collection with nothing in it yetOnboarding flow: inviting a first saved place during setup

Where it shows up

Screens we drew to show where this motion usually sits. Illustrations, not captures of any product.

  • Map view

    The saved-places tab opens on the pin landing in the middle of the empty grid.

  • Set up your workspaceStep 2 of 4
    What should we call it?
    Ridgeline
    Who else is joining?
    3 invited
    Next
    Onboarding flow

    Setup invites a first save; the pin drops once the step renders.

Related patterns