Standards
Journey Timeline pattern
A vertical timeline of real, dated stages (rescued, foster, today) for a single dog's own detail page — the page a success-story card's storyHref links out to.
Example — a dog's own detail page
This is the composition, not just the bare timeline: a per-dog page pairs a short intro (name, status badge, summary — usually via PageHero) with JourneyTimeline for the story so far, then a foster/adopt CTA. A SuccessStoriesSection card's storyHref links straight here.
Rickey
Rickey was the shelter's longest resident with no adoption applications — now healthy, safe, and looking for his family.
Their journey so far
Rescued
July 17, 2026Found at an overcrowded shelter as the longest resident with no adoption applications. Named Rickey after baseball's greatest leadoff hitter, because every great game begins with one opportunity.
Clean Bill of Health
July 22, 2026A wellness exam confirmed he's healthy and ready for the next step — finding his family.
Today
Settling into foster care and looking for the right forever home.
Want to help write the next chapter?
Standard
- stages: JourneyTimelineStage[] — plain, site-owned array. No built-in sort/filter and no fixed stage vocabulary; labels are free text (e.g. "Rescued", "In Foster Care", "Today").
- Every field except label/description is optional — a stage without a date just omits the date line, and a stage without imageSrc/videoSrc renders text only. Early stages of a real story often don't have media yet.
- videoSrc renders a native <video controls playsInline poster={imageSrc}> instead of an image — for a real rescue-day video served from the fleet media host (`mediaUrl()`). Prefer this over a third-party embed: a prior fleet attempt at embedding Facebook video was reverted after hitting a rights-block on posts using licensed (non-original) audio.
- partnerLinks credits outside organizations named in the stage's own text (description is plain text, so it can't carry inline links). Always opens in a new tab.
- relatedLinks links out to the story behind the stage — the news post or blog entry that announced it. An href starting with / renders as a client-side link; anything else opens in a new tab. Never use partnerLinks for an internal route — it always opens a new tab, so the site would open itself in a second one.
- Renders nothing if stages is empty — no empty-state placeholder.
- Pairs with SuccessStoriesSection: that component's curated grid is the "wall," this is the detail page each card's storyHref points to — see the composed example above.
- Composing a full rescue-journeys page (teaser → list → detail): the list/teaser pages are built from `SuccessStoriesSection` (see that pattern's page for the live status-split and auto-rotating-teaser examples); each dog's own detail page renders this component.
- Component: `template/src/components/patterns/JourneyTimeline.tsx`
Template