DandyLine -- Motion Spec V1 -- Lock-in Session
How DandyLine Moves

Section A: motion patterns that are already canonical (locked) -- consolidated from brand-vault-renditions.html, product-seeds.html, ux-field-homepage-v3-motionmark-depth.html, and 26 inspiration library entries. Use these as the source of truth.

Section B: motion patterns that are still undefined -- 4 categories with 2-3 variants each. Click through each, pick the one that feels right, then they roll into the consolidated spec for Josh.

The throughline rule from Ashley: Nothing pops. Nothing appears stagnant. Everything floats, drifts, or pulls.

A
Locked Motion Patterns -- Reference Only
CANONICAL

These patterns are already locked across the canonical files. Hit "Replay" on any card to see it move. These are the source of truth -- everything else gets compared against them.

A1 -- Press-Spring
Homepage v3
Every tappable card. transform:scale(.97) on :active with cubic-bezier(.34,1.56,.64,1) over 150ms. Soft springy feel -- never mechanical.
A2 -- D-Ring Ripple
product-seeds.html
On every seed-orb tap. 3 concentric rings, 3-second total. Expansion pow(progress,.45), opacity pow(1-progress,1.8)*.25. Max radius 160px from tap. Three rings: gold-light full, gold 55% size, cream 78% size.
A3 -- Element Entrance (general)
Entries 018, 021, 024, 025, 026
translateY(12px) -> 0 + opacity 0 -> 1 over 350ms ease-out. When in groups: 60ms stagger between siblings. The one rule used everywhere a list, row, card, or chip first appears.
A4 -- Bottom Sheet Rise
Entries 020, 023, Held-Medium-Drawer
translateY(-100% -> 0) over 320-450ms ease-out, NO overshoot. 3 snap points: 12% (collapsed), 40% (peek, default), 85% (full). Drag follows finger 1:1. On release, snap to nearest point with 280ms ease-out.
Bottom sheet content
A5 -- Stacked-Card Lift
Entry 021 (Apple Wallet)
Tap = scale 1 -> 1.04 + translateY(-12px) + shadow builds in over 220ms. Neighbors closing the gap have a 4px overshoot bounce at the end. Reorder drag-cards tilt rotateZ(2deg) while in motion.
Grove
Personal
Legacy
Milestone
A6 -- Counter Roll-Up
Entries 020, 026
"Vegas counter but soft." Numerals roll from 0 to value -- rapid then settling. Used for stat counts, soft-brag preview lines, days-until counters. Never instant. Never overshoots.
0
A7 -- Text Reveal (first-time-only)
Entries 017, 018, 025
Letter-by-letter at 25-30ms per character, ONLY on first view. Cached as "seen" -- re-visits show fully written. Used for hero greetings, vault detail titles, bloom-view notes. Never on UI elements.
A8 -- Background Ambient Drift
Entries 018, 022
Slow ken-burns scale(1.05 -> 1.0) over 600ms on entry, then continuous subtle drift on standby. 6-second loop, no demand for attention. Background never competes with foreground content.
A9 -- Chip-Tap Gold Pulse
Held-Medium-Drawer entry
When a chip is tapped, gold radial pulse scale(1 -> 1.4) opacity .6 -> 0 over 320ms BEFORE the next surface opens. Confirms the tap registered + bridges the user across the transition.
A10 -- Downstream Terracotta Flash
Entry 023 (Stacked Settings)
When a setting is changed and it invalidates downstream choices, the affected chips briefly turn terracotta-tinted, then fade back to cream. Visceral signal of impact -- no scary modal needed.
Vault: Grove
Recipient: Mom
Bloom: 5 yrs
A11 -- Per-Vault Dot Language
brand-vault-renditions.html
Each vault has its own animated dot-pattern inside the jar at icon size. Grove orbits, Personal drifts, Milestone pulses, Legacy sways at low layer-line, Journey climbs sequentially, Roots breathes outer ring inward. Already verified live in ux-component-decisions.html.
A12 -- Calm Memory Garden Rule
HW#126
For ambient seed/dandelion content (home screen, vault interior): gentle drift = long-term memory · subtle pulse = upcoming bloom · still seed = distant future. Motion communicates time emotionally, not numerically.
Drift
long-term
Pulse
upcoming bloom
Still
distant future
A13 -- Bloom Now Ambient Pulse
POPUP-SPEC-V1 B1=D · Apr 28
When a seed enters Bloom Now lifecycle (countdown ended, ready to bloom), BOTH the orb AND its Tier 1 popup carry a synchronized ambient glow pulse. Distinct from A2 D-Ring (sharp on-tap ripple). This is a continuous CTA breathing glow — gold-lt box-shadow oscillating ~12px → ~22px over 2s ease-in-out. Loops indefinitely while in Bloom Now state. Orb + popup share the same animation phase so they breathe together (unified, not noisy). Why it exists: in B1=D anchored-depth clusters, a Bloom Now popup that's been depth-pushed BEHIND siblings still needs to call attention as actionable — the pulse pulls the user's eye to the actionable card. Distinct from A12 (2.4s ambient pulse for "upcoming bloom" general indicator) — A13 is faster (2s) and CTA-active.
Orb
Mom's letter
Bloom Now
Tier 1 Popup
B
Undefined Motions -- Pick One Per Group
DECIDE

Four motion categories that don't have a canonical pattern yet. Click any "PLAY" button to feel each variant, then click the card itself to mark your pick. Picks roll into the locked spec for Josh.

B1 -- Filter Expand (button tap reveals filter panel)

When the gardener taps "Filter," how does the filter panel come in? This is the feel of opening filters anywhere in the app -- vault chooser, search, pressed shelf.

A -- Slide-down from button
Panel drops directly below the trigger pill, fades in + slides down 12px. Fast, contextual, doesn't take over the screen.
StatusVaultSentimentMedia
B -- Bottom-sheet rise (pulled up from below)
Filters live as a bottom sheet that pulls up from the floor. Matches A4 (canonical bottom sheet rise). Most familiar gesture, big surface for many filters.
StatusVaultSentimentMedia
C -- Modal expand FROM the pill
The filter pill itself grows into a centered modal (origin = pill location). Most "magic" feel -- the pill IS the panel, just expanded. More disruptive.
StatusVaultSentimentMedia

B2 -- Popup Tier-1 -> Tier-2 Expand

When a recipient taps a minimal popup (Tier 1: glance) to see the full preview (Tier 2: 7-element anatomy). How does the expansion feel?

A -- Lift + grow in place
Tier 1 fades out as Tier 2 scales up from .6 → 1.0 with spring easing. Same anchor point, just larger. Feels like the pill itself expanded.
Mom's letter
Bloom Now
GROVE -- BLOOM NOW
from Mom
Mom's letter
voice note -- 2:14
2h 43m 18s
B -- Crossfade in same position
Tier 1 fades out, Tier 2 fades in -- same position, no movement. Calm, controlled. Feels like the layer changed without anything dramatic.
Mom's letter
Bloom Now
GROVE -- BLOOM NOW
from Mom
Mom's letter
voice note -- 2:14
2h 43m 18s
Note: Variant C (slide-up replace) was dropped per Ashley's feedback — didn't feel right. Pick between A and B.

B3 -- List Enter/Exit on Filter Change

When the gardener applies a filter, how do the items leave + arrive? Hit "Swap" to feel each variant.

A -- Fade through
Items fade out, new items fade in. Calm, no sense of direction. Doesn't communicate cause-and-effect strongly.
Day Mom turned 30
First steps
Dad's voice memo
Anniversary toast
B -- Slide horizontal (out left, in right)
Items slide left and fade out, new items slide in from the right. Direction = clear sense the list changed. Active feel.
Day Mom turned 30
First steps
Dad's voice memo
Anniversary toast
C -- Height-collapse with stagger
Items collapse vertically with a 40ms stagger. Like the list is taking a breath. New items rise into the same gap. Most "garden-like."
Day Mom turned 30
First steps
Dad's voice memo
Anniversary toast

B4 -- Vault / Jar Title Float-In

Your specific call-out: when you open a vault and the title appears, how does it float in? This rule will apply to vault titles, seed titles, section headers across the app.

A -- Drift up + fade
Title drifts up 14px while fading in over 500ms. Quiet, gentle, matches A3 (general entrance) at title scale.
Mom's Garden
B -- Type-in letter-by-letter
Title types in at ~25ms per character. Storytelling feel. Used elsewhere in the app for first-time text reveals (A7).
C -- Scale up from .96
Title scales from .96 → 1.0 while fading in over 400ms. Ambient, like the title is settling into focus rather than arriving.
Mom's Garden
0 of 4 motion decisions made