Sploot

Component library · v1.0

Every component, in one place.

The canonical version of each building block used across splootvets.com — rendered from /styles/sploot-components.css, built on the design tokens. Pick one from the rail — or press ⌘K to search — to see it on its own; switch to a whole family, or the full page, anytime. Markup sits behind each demo’s view code chip.

Audit

Consistency report

A page-by-page audit (June 2026) found the same UI patterns built several different ways across the site. This library shows the recommended canonical version of each, with a ⚠ drift note wherever real variants exist. The headline divergences:

PatternImplemented asWays
Cardswas 7 bespoke systems — now one .s-card + modifiers (--hoverable · --featured · --bordered · --media) & slots, plus two siblings promoted to their own canonical classes (.cover-card, .why-card, task 23). Migration done (2026-07-09) — wellness-exams' last two holdouts (.cad-grid, .inc-card) are now on .s-panel--cols / .s-card.0
Steps / timelinecanonical .s-steps / .s-step (dashed coral connector). .how-steps is fully retired (task 22) — emergency-services and wellness-exams both run canonical. .stepper lives on in booking-flow-demo only, a self-contained app-mockup prototype, not a marketing page — same exception as that page's app-style buttons.0
Tabstwo intentional canonicals for two different jobs: underline .stage-tabs (ARIA tablist + fade panels, arrow-key nav) for content stages, and the segmented .s-pill-tabs pill toggle. The legacy .avail-tabs + .svc-tabs pill switchers are fully retired onto .s-pill-tabs — no live page carries them (verified 2026-07-10). Behavior in /scripts/sploot-components.js.0
Coupon / promo codecanonical .s-coupon-bar (dark-teal perforated tap-to-copy, + --compact). Rebuilt from .ci-coupon; pinned to the dark palette so it survives theme modes. Migration done (2026-07-10) — today-availability's last-holdout .avail-coupon chip now renders --compact inside its clinic cards.0
Statsone canonical .s-panel--cols stats panel, two skins: light trio (wellness-exams) and --inverse dark 4-up (about's proof strip, migrated off its bespoke divide-x grid 2026-07-10 — count-up/reveal JS stays page-local). The third "way" was .plan-savings, which is already canonical and a different job (bordered price-comparison box, not proof stats).0
Value-prop trioa stale row (verified 2026-07-10): "plain · featured · pill-badge" are three sanctioned treatments of the one canonical trio (base .s-card · --featured · hover pill badges — see Value-prop trio), not three implementations. splootrx is the only live page shipping a trio and it runs the canonical classes.0
Accent colorcoral #E07A6A + fire-opal #E25E5A — unified as the opal family (opal/100 + opal/120). Code side fully token-clean (2026-07-10): primary-care's pulse JS now sets var(--color-accent), today-availability's legacy wf-sienna aliases var(--opal-120), and reviews' avatar was a false collision (Google-palette hue, now visibly distinct). a-button-demo's pinned lab defaults are a sanctioned exception (color inputs can't take vars). The 1 remaining way is Figma: accent/primary still doesn't carry opal/100 (Phase 3).1
CSS approachWebflow utility classes (home.html) vs Tailwind (the rest)2
Service-page shellone canonical .svc-page / .svc-section shell (sploot-components.css): page tokens, heading/paragraph defaults, the 1440px section container, the split hero, and the centered .why-head. Re-extracted 2026-07-10 from the three pages' current CSS (the earlier extraction was reverted on merge; this one has the post-sweep .btn/coral/eyebrow fixes baked in) — exactly the 30 rules that were byte-identical across emergency-services, primary-care, and wellness-exams, verified pixel-neutral by computed-style probes at desktop + mobile. Near-identical cousins (per-page .hero .subhead, .acc-head/.how-head, h2 em accent colors) deliberately stay page-local. Markup contract: <main class="pc-page svc-page"> + .svc-section wrappers.0

Two of these tie back to the Figma color tokens: the accent-color split is the same drift between our CSS and Figma's accent/primary (style guide → color), and the Webflow-vs-Tailwind split is the migration still in progress.

01 · 2 components

Actions

Buttons, CTAs and store badges — the click-me layer.

Actions

Buttons & CTAs

One base — .btn — plus a variant modifier. Coral primary for the moment of conversion; teal solid or outline for secondary actions; the self-contained .btn--link for tertiary / in-flow CTAs.

</> View code
<a class="btn btn--coral">Book Now</a>
<a class="btn btn--teal">Get the App</a>
<a class="btn btn--teal-outline">Secondary</a>
<a class="btn--link">Explore →</a>

/* legacy aliases still shipping on live pages — same styles:
   .btn-coral · .btn-teal-solid · .btn-teal-outline · .btn-link */

Actions

Store badges

App Store and Google Play buttons. Apple icon stays monochrome; Google Play keeps its branded multi-color triangle. Add .store-badge--light on dark backgrounds.

02 · 2 components

Heroes

The hero utility atoms and the location hero they assemble into — parts and whole, side by side.

Hero atoms

Hero utilities

The atoms that dress a hero — a "need care?" prompt, a coral lead-in, an availability status chip, a rating badge, the carded Google-reviews badge (button-column width, per the assembled hero), a coupon card, a location pill, and the "Today's Availability" button (icon corrected 2026-07-06 to match the branded pin+paw mark shipped on splootvets.com/locations/denver — was a generic chat-bubble icon). From the Figma Hero Utilities set; every color resolves to a palette token (no hardcoded hexes).

NeedCareText

Need care ASAP?

LeadText

Call now & speak to a medical professional

AvailabilityStatus
Same-Day Appointments &
Drop-Off Available Now
RatingBadge
4.8

Highly rated by thousands of pet parents

CouponCard
AvailabilityButtonToday's Availability
Location pillVeterinarian in Denver Highlands

Hero atoms from the Figma Hero Utilities set (node 2380-53). Colors map to --color-accent (coral), --color-teal, and --mint-100.

Heroes

Location hero

The full location-page hero, assembled from the Hero Utilities atoms. Every part is a boolean you can flip on/off — the same toggles map 1:1 to component properties in Figma & Webflow. The image switches between a framed card and a full-bleed photo, and Google reviews ⇄ Rating badge are an either/or pair.

Image variant
Utilities · toggle on / off
Veterinarian in Denver Highlands

Your neighborhood Highlands vet clinic

Primary & urgent care at 3774 Julian St. Open 8am–8pm, 365 days a year. Same-day & urgent drop-off appointments available.

Same-day appointments & drop-off available now
FIRST50DEN

$50 off — new members only

4.8★★★★★9,000+ Google reviews
4.8
Highly rated by thousands of pet parents
Sploot Highlands clinic team with dogs hey, we're sploot

The assembled location hero — live on Denver Highlands and the Denver hub page (which also adds a third CTA, .hero-availbtn, for its "Today's Availability" link). Built from the Hero Utilities atoms; each toggle is one Figma/Webflow boolean prop. Surface: default is this rounded cream card; add .hero-preview--flat to drop the card and sit on the section's own flat band — one color edge-to-edge, the production city-page look (Denver uses it). Uses .btn-coral + palette tokens (no hardcoded brand hexes).

03 · 9 components

Cards & pricing

One .s-card system and its specializations — value-prop, decision, status, membership pricing, team/doctor cards, nearby locations, and the services carousel.

Cards

Cards

There is just one card — .s-card — with BEM slots (__icon, __number, __eyebrow, __title, __stat, __body, __link) and additive modifiers. Every "card" across the site — page grids, service lists, numbered steps, included-pillar grids — is this one component with different slots/modifiers.

Plain card

Just the base. Title and body, nothing else.

With icon

Icon tile (cream, teal stroke) above the title.

01

With number

Big serif number replaces the icon slot.

Adult Pets
Once a year

Annual wellness exam

Bordered

Coral edge for "act now" cards. Hovers up.

Hoverable

Add .s-card--hoverable for the scale + shadow effect.

Ring hover

Add .s-card--hover-ring — no motion; a soft coral inset ring + shadow fade in (the splootvets.com/sploot-financing treatment). Use instead of --hoverable.

</> View code
<div class="s-card">
  <div class="s-card__icon"><svg/></div>     <!-- or __number / __eyebrow + __stat -->
  <h3 class="s-card__title">Title</h3>
  <p class="s-card__body">Supporting text.</p>
</div>

/* additive modifiers */
.s-card--featured   /* dark teal */
.s-card--bordered   /* coral edge */
.s-card--center     /* center-aligned */
.s-card--hoverable  /* lift + shadow on hover */

Used everywhere cards appear — the homepage grid, primary-care, wellness-exams. Base lives in /styles/sploot-components.css; copy the markup above.

✓ Consolidated

This one section replaces what used to be five separate card demos. The bespoke .pg-card (page grid) and .inc-card (service cards) collapsed into .s-card + slots/modifiers; .cover-card and .why-card were promoted to their own canonical classes instead (task 23) — both are the real, in-use component, not drift. The old .cad-grid visit-cadence table was the same as the Stat trio — wellness-exams now renders it on that canonical component (2026-07-09).

Pharmacy

Value-prop trio (featured)

SplootRx's three-up benefit cards. The middle card is featured — dark teal, white text, coral icon — as the visual anchor. Each has a rounded icon tile (mint, or white/15 on the featured card) and a small pill badge that reveals on hover (shown here). Cards and their icon tiles lift and tilt on hover.

Vet-Approved

Prescriptions pulled directly from your pet's medical record — no calls, no delays.

Instant approvals from your vet

Delivered to You

Meds, food & essentials shipped from licensed veterinary pharmacies to your door.

Autoship available — cancel anytime

Used on splootrx. Built on .s-card--hoverable (the lift) + .s-card--featured (the dark middle card, using --color-surface-inverse/--color-text-inverse); only the icon wiggle (.rx-icon-wrap) is bespoke. The old .rx-card / .rx-card-featured classes are fully retired — live splootrx now ships this exact markup.

Status & alerts

Status card

A hero side-card pairing a pulsing green dot with an "Open now" line. Sits under service-page heroes.

Open today, 8am – 8pm

365 days a year, including weekends & holidays

Used on primary-care. Class hooks: .open-card, .pulse.

✓ Consolidated

The open-now dot now uses the canonical .pulse glow (sploot-components.css) instead of a private duplicate animation. The never-deployed .ci-status pill and the old .stat-card (which overlapped the card system's .s-card__stat slot) are retired — .pulse is the one "open" indicator site-wide.

Pricing & membership

Plan comparison (.plan-card / .plan-savings)

Membership vs. pay-as-you-go, on a dark teal band: a glassmorphic "Best Value" card (.plan-card--featured) beside a quieter default card, plus a 3-stat savings breakdown (.plan-savings) below. Promoted from about.html + financing.html (task 27) — both pages had built this independently with real drift (financing's CTA was raw Tailwind instead of the canonical .btn). The container around the cards stays page-local on purpose: about.html wraps them in a swipeable slider, financing.html in a plain grid that stacks on mobile — both are valid, and the card/savings-box visuals work in either.

No membership

Pay As You Go

Standard rates

No annual fee

Exam fee per visit, standard pricing.

  • Exam fee charged per visit
  • No commitment required

How members save on a typical year

Without SplootPack

$825

With SplootPack

$350

You save

$475+

Based on two urgent care visits and one wellness exam.

Used on about and financing. Class hooks: .plan-card (+ --featured), .plan-card__* slots, .plan-savings.

Pricing & membership

Regional pricing cards

Two-up membership plan cards keyed to a region: a city-skyline image header, an "Only $XXX/year" serif price in coral, a divider, an eligibility line, a perks checklist, and an arrow purchase link. The dark variant inverts the surface to teal; both lift on hover.

Used on membership. Class hook: .rx-card + Tailwind utilities.

⚠ Drift

This is its own .rx-card hover system, separate from the core .s-card — same lift + shadow behavior, could be unified. The price uses coral #E07A6A, but SplootPack callouts use fire-opal #E25E5A for the equivalent emphasis — both are now steps of the opal family (opal/100 + opal/120).

Pricing & membership

Price row

A baseline-aligned label/price listing row for fee and add-on tables. It owns only the flex layout and type — it must live inside a .s-panel--rows, which supplies the dividers and padding. The optional __desc stacks under the name inside a plain wrapper div, and __price--free turns the value green for anything already covered. Built on .s-price-row.

Surgery add-ons
Cold laser therapy Speeds healing and reduces inflammation and pain after surgery.
$59
Microchip Permanent ID for your pet, placed painlessly while they're under.
$70
Laparoscopic spay upgrade Minimally invasive keyhole technique — smaller incisions, faster recovery.
$500–$900+
Ligasure / electrocautery Advanced vessel-sealing for less bleeding and a smoother procedure.
Included
Exam & bloodwork fees
Exam fee — Colorado$89
Exam fee — Illinois$99
Pre-op bloodwork~$150
Exam fee — SplootPack members3 free / yr

Used on spay-neuter (add-on panel and exam-fee panel). Class hooks: .s-price-row, .s-price-row__name, .s-price-row__desc, .s-price-row__price, .s-price-row__price--free — always inside .s-panel--rows (optionally .s-panel--muted), with .s-panel__head as an optional direct-child label.

Cards & pricing

Team / doctor slider

Canonical .s-card--media cards (photo + name + title) housed in the shared .dvr-svc-slider/.dvr-svc-track carousel shell — the same shell the services carousel below uses. Scroll-snap with circular prev/next controls.

Used on location pages (Highlands "Doctors who'll know your dog by name"). Class hooks: .dvr-svc-slider/.dvr-svc-track (shared shell) + .s-card--media/.s-card--hoverable (card). Behavior: /scripts/sploot-components.js (initServicesCarousels).

✓ New 2026-07-10

Highlands' doctor cards were a static grid (no way to browse past the first row on desktop with 5+ doctors). Now a real slider — reusing the services carousel's shell instead of building new carousel JS. initServicesCarousels was generalized to read track.firstElementChild for its scroll-step width instead of hardcoding .dvr-svc-card, so any card type can now ride this shell.

Cards & pricing

Nearby locations

Horizontal, always-scrollable slider of nearby-clinic cards — one .s-card--media link per clinic (photo, name, address, hours + distance, "View clinic"); closes with a centered "see all" underline link.

Used on location pages (Highlands "other locations"). Built on .s-card--media + --hoverable — the whole card is one link, plain Tailwind utilities for the text rows.

✓ Corrected 2026-07-10

This demo previously showed a different internal structure than what's live — separate inner .ol-name/.ol-link anchors, a .ol-open pill, and no distance line. The actual live Highlands markup wraps the whole card in one link, has no open/closed pill (just plain "Open 8am–8pm · ~2 mi east" text), and always includes the distance. Demo now matches live 1:1; the unused .ol-name/.ol-address/.ol-meta/.ol-open/.ol-link CSS was removed from this page.

04 · 2 components

Locations

Page-specific location chrome — clinic info card and the embedded map. (Nearby-locations and services cards moved up to Cards & pricing, 2026-07-10 — they're card patterns, not location-specific.)

Locations

Clinic info card

The canonical location card — .s-info-card (a specialization of .s-card): an "open today" status pill (animated green dot), divided icon-rows for address / phone / hours / parking, and an .s-hours list. The dashed dark-teal tap-to-copy coupon below is the separate, reusable .s-coupon-bar.

Sploot Highlands — clinic information

Open today, 8am–8pm

Address

3774 Julian St
Denver, CO 80211

Get directions

Hours

Mon–Sun
8:00am – 8:00pm
Holidays
Open every day

365 days a year, including holidays

Parking

Free street parking on Julian St & W 38th Ave. Wheelchair-accessible entrance directly off Julian.

$50 off your first visit

New pet parents — applied at checkout

Used on location pages (e.g. Highlands); the --compact coupon bar also lives in today-availability's clinic cards (replaced the bespoke .avail-coupon chip, 2026-07-10). Class hooks: .s-info-card / .s-info-row / .s-status / .s-hours; coupon copy via /scripts/sploot-components.js (initCouponBars).

Locations

Map card

Rounded embedded Google map with a floating white "Get directions" pill anchored bottom-right (fills coral on hover). Pairs with the clinic info card in a two-column grid on location pages.

Used on location pages. Class hooks: .ci-media, .ci-map-directions.

05 · 16 components

Content & data

Section headers, rows, lists, tabs and timelines — the mid-page workhorses.

Sections & CTAs

Section header

Coral eyebrow in caps with wide letter-spacing, then a large New Spirit heading on the next line. Introduces nearly every section across the site.

Pet Parent FAQs

The stuff you're probably wondering.

</> View code
<p class="text-xs uppercase tracking-[0.18em] text-sploot-opal font-bold mb-3">
  Eyebrow Label
</p>
<h2 class="font-heading text-4xl md:text-5xl font-bold text-sploot-teal leading-tight">
  The heading goes here.
</h2>

Sections & CTAs

Section topper

The small decorative illustration that sits above a centred section header. The base .s-topper sets no width at all — it only carries display:block, height:auto, and margin: 0 auto var(--space-3), so it centres itself and self-spaces 12px off the eyebrow below. Width is the size modifier's only job, which makes it the one choice you make. Decorative by contract — always ship alt="", aria-hidden="true", and explicit width/height so it can't shift the heading beneath it while loading. --lg and --md step down at ≤640px; --sm is already small and holds its size.

Why it matters

A quick procedure that pays off for a lifetime.

.s-topper--lg · 92px → 76px

Real stories, real relief

Back to their old self in no time.

.s-topper--md · 86px → 72px

Pricing

Premium pet surgery, minus the premium price.

.s-topper--sm · 46px, no mobile step-down

Used on spay-neuter (all three sizes). Class hooks: .s-topper, .s-topper--lg, .s-topper--md, .s-topper--sm.

Content

Feature row

Two-column deep-dive: copy on one side (eyebrow, heading, body, bulleted benefits), a screen-card on the other. Alternate the order between rows for rhythm.

Booking

Booking, without the hold music.

Every Sploot clinic, every available time slot — laid out for you. Pick the service, the day, the vet. Reschedule from inside the app if plans change.

  • Wellness, urgent, dental, and surgery
  • Switch between locations on the fly
  • Calendar invite and reminder push

Booking · Bagel

Annual wellness exam

45 min · Commons Park

9:00
AM
10:30
AM
1:15
PM
3:00
PM

Data display

Checklist

A list of checkmark rows in two treatments. .s-check-row owns the glyph in both; only the wrapper changes. Divided puts hairlines between rows via .s-panel.s-panel--rows (the panel owns the dividers and padding). Gapped uses .s-check-list, which owns the reset and spacing instead. Modifiers sit on the row — --brand swaps the flat token check for the hand-drawn mint one, --inverse flips the text for a dark band — except --inline, which sits on the list and wraps rows into a horizontal run.

  • Previous medical records (if you're new to Sploot)
  • A list of any medications or supplements your pet is on
  • Notes on anything you've noticed at home — even things that seem small
  • A fresh stool sample if your vet has asked for one
  • A leash or carrier (and your pet's favorite treat doesn't hurt)
  • Pre-surgical bloodwork and a full physical exam
  • An IV catheter and fluids for the whole procedure
  • A nurse monitoring vitals from first breath to last
  • Take-home pain medication and a recovery cone
  • Prevents uterine infections (pyometra)
  • Reduces the risk of mammary cancer
  • Calmer behavior and less hormone-driven aggression
  • Board-certified surgical team
  • Same-day discharge
  • Upfront pricing, no surprises
  • Fear Free handling
  • Unlimited free exams, every day of the year
  • 20% off spays, neuters, and dental cleanings
  • Vaccines and preventives included, no add-on fees
  • Records and visit notes, always in the app
  • CareCredit and Affirm accepted at every clinic
  • Open 365 days a year, including holidays

Divided is used on wellness-exams; gapped + --brand on spay-neuter (benefit lists, CareCredit rows). --inverse and --inline are promoted but not yet on a live page. Class hooks: .s-panel.s-panel--rows, .s-check-list, .s-check-list--inline, .s-check-row, .s-check-row--brand, .s-check-row--inverse.

Data display

Panel skins

The surface skins for the divided panel. .s-panel--muted tints the fill to the paper surface — it reads on the cream canvas, and goes flush if the band underneath is already paper. .s-panel--glass is the dark translucent card for dark bands: it brings its own padding and radius, so .s-panel--sm (glass-only) tightens both. .s-panel__head is the optional uppercase label slot — it styles only as a direct child of .s-panel--rows, so it stays unstyled inside a glass panel. The fourth skin, .s-panel--inverse (flush on a dark band, no box of its own), is documented with the stat trio.

Exam & bloodwork fees
Exam fee — Colorado$89
Exam fee — Illinois$99
Pre-op bloodwork~$150
Recovery add-ons
Cold laser therapy$59
Microchip$70
Ligasure / electrocauteryIncluded

That cream band is load-bearing, not decoration. --color-surface-muted resolves to --color-paper (#FAF7F4) — the same value as this demo card's own background — so a muted panel dropped straight onto paper renders an invisible tint. The band above is the honest real-page context: spay-neuter's fee panel sits on a cream section.

Species
Location
Procedure OnlyProcedure + Pre-op Exam & Bloodwork
Without SplootPack$850$1,090
With SplootPack$640$690
Savings$210$400

Starting rates for a dog spay in Colorado. Final pricing depends on your pet's size and species — you'll get an upfront estimate at the consultation.

  • A licensed vet and a dedicated nurse monitoring your pet the whole time
  • Heart rate, blood pressure, and oxygen tracked from first breath to last
  • Warmed bedding and pain control ready before your pet wakes up

Used on spay-neuter — the fee panel (--rows + --muted + __head) and the price card (--glass). .s-panel--sm ships unused: it exists in the CSS as the tightened glass step, and this is its only rendering. Class hooks: .s-panel, .s-panel--rows, .s-panel--muted, .s-panel--glass, .s-panel--sm, .s-panel__head.

⚠ Known bug — .s-matrix

The green With SplootPack and coral Savings rows above render plain white, not tinted. .s-matrix--inverse td and .s-matrix__row--success td / --accent td have identical specificity, so the later --inverse rule wins and kills both semantic tints wherever the matrix is inverse — including live on spay-neuter's price card. The markup here is deliberately left matching the real page so it self-corrects once the tint rules are moved after the --inverse block (or scoped under it). Fix belongs to .s-matrix, not to the panel.

Content

Fine print

The muted substantiation note that sits under a savings, pricing, or promo claim — required by the messaging guide anywhere we quote a figure. .s-fineprint caps at 60ch and reads left-aligned; .s-fineprint--center centers both the text and the block itself for use under a centered CTA. There is deliberately no --inverse variant: the color flips to translucent white contextually inside .pack-card, .final-block, and .s-panel--glass, so a note dropped on a dark surface can't be left unreadable by an author who forgot the modifier.

SplootPack

Members save an average of $600+ a year*

One flat monthly fee covers three exams a year, then takes a percentage off nearly everything else your pet needs.

*Estimated average annual savings; actual savings vary by pet and services used.

Schedule a consultation

Prices apply to Denver locations only and may vary by clinic. Add-ons are subject to change based on your pet's medical needs; any additional services required during the procedure will be reflected in your final estimate.

SplootPack Membership

A whole year of wellness, covered.

  • 3 free exam visits a year ($267–$297 value)
  • 25% off spay/neuter procedures
  • 10% off bloodwork, meds, vaccines, and everything else
See all benefits

*Estimated average annual savings; actual savings vary by pet and services used.

A golden retriever resting paws on the Sploot front-desk counter while the receptionist helps a client check out

Ready to book a spay or neuter?

Same-day appointments, 365 days a year, at every Sploot clinic.

*Pricing shown is a starting estimate for Denver clinics and excludes add-ons.

  • Pre-op exam, bloodwork, and anesthesia monitoring
  • Take-home pain medication and an e-collar
  • A follow-up recheck at no extra charge

*Dog spay, Colorado pricing. Estimates only — we confirm your final quote at the pre-op consult, before anything gets scheduled.

Used on spay-neuter three times: inside the .pack-card savings claim (inverted), centered under the add-on panel's CTA, and on the light CareCredit callout — which sits on .s-split-callout--boxed, a light surface, so it stays muted. Class hooks: .s-fineprint, .s-fineprint--center, .pack-card .s-fineprint, .final-block .s-fineprint, .s-panel--glass .s-fineprint.

Data display

Decision cards (treat vs ER)

Side-by-side triage guidance: a green-accented "we can treat" list and a red-accented "go to the ER" list, each with color-matched checkmarks — helping pet parents self-route. The Checklist's sibling: same check-glyph list DNA, but split into two accent-coded cards instead of one panel. Not clickable, so no hover treatment. (Moved here from Cards & pricing, 2026-07-10 — it's triage content, not a product/pricing card.)

Sploot can treat

  • Vomiting, diarrhea, or off appetite
  • Limping, ear infections, foxtails
  • Cuts, rashes, eye irritation
  • Sudden lethargy or mild fever

Go to the ER

  • Collapse or loss of consciousness
  • Difficulty breathing
  • Heavy bleeding or major trauma
  • Suspected toxin ingestion

Used on emergency-services. Class hooks: .dec-card, .dec-list (+ .treat/.er).

Data display

Stat trio

Columns in one panel with vertical dividers. Each cell: uppercase eyebrow → large serif phrase → small subline. Stacks on mobile (3-up → single column, 4-up → 2×2). Built on .s-panel.s-panel--cols.cols-3 / .cols-4.

Puppies & Kittens
Every 3–4 weeks

Until 4 months old

Adult Pets
Once a year

Annual wellness exam

Senior Pets (7+)
Every 6 months

With routine bloodwork

The inverse variant (.s-panel--inverse): flush on a dark band — the section supplies the background, the panel drops its box and flips to white hairline dividers. Coral figures via .s-card__stat--accent. About's proof strip runs this 4-up, with its page-own count-up + reveal wiring and larger figures on top.

365

days open per year

Same-day

appointments, always

90%

of vet needs handled

4

cities and growing

Used on wellness-exams (light 3-up) and about (inverse 4-up proof strip). Class hooks: .s-panel--cols.cols-3/.cols-4, .s-panel--inverse, .s-card__stat--accent + card slots.

✓ Consolidated

About's proof-stat band (dark 4-up with count-up numbers) was the last bespoke stats row — a raw Tailwind divide-x grid. It now renders on this panel via .cols-4 + .s-panel--inverse (2026-07-10); the count-up and scroll-reveal stay page-local JS, and .plan-savings remains its own canonical component (a bordered price-comparison box, not a proof-stats row).

Data display

Comparison matrix

The canonical pricing / coverage table: tabular numerals so columns of dollars line up, semantic row tints for the member price and the saving, and a sticky first-column label that stays put while the value columns scroll. Always wrap the table in .s-matrix__scroll — it supplies the horizontal overflow and the right-edge fade; below 720px the table holds a 480px minimum width. Built on .s-matrix.

Wellness examCore vaccinesAnnual bloodwork
Without SplootPack$89$145$180
With SplootPackIncluded$131$162
You save$89$14$18

Starting rates. Final pricing varies by pet size, species, and location — you'll always get an upfront estimate before we begin.

Procedure OnlyProcedure + Pre-op Exam & Bloodwork
Without SplootPack$850$1,090
With SplootPack$640$690
Savings$210$400

Dog spay, Denver. Includes procedure, pre-op exam, and bloodwork — no hidden fees, just clear, upfront pricing.

Used on spay-neuter (inverse skin, inside the glass pricing card). Class hooks: .s-matrix__scroll, .s-matrix, .s-matrix--inverse, .s-matrix__row--success, .s-matrix__row--accent. Two gotchas worth knowing: the light skin's sticky tbody th paints itself var(--color-surface) to mask the cells sliding under it, so it only reads on a surface-colored parent — put it in an .s-panel, not straight onto paper. The inverse skin's sticky label is background: transparent, so on a narrow viewport the value cells scroll visibly through it; give the label a background if you ship a genuinely scrolling inverse table. Empty and unavailable states stay with the consumer — that's data policy, not component.

Data display

Steps timeline

Numbered process flow with a dashed coral connector between the circles. Connector hides on mobile; circles stack 2-up. Built on .s-steps / .s-step.

1

Check-in & history

A quick weigh-in and a chat about how things have been at home — appetite, energy, new behaviors.

2

Nose-to-tail exam

Your vet checks heart, lungs, eyes, ears, mouth, skin, joints, and abdomen. About 15 minutes hands-on.

3

Vaccines & diagnostics

Any boosters or in-house lab work happen in the same visit. Most bloodwork comes back same day.

4

Plan & takeaways

You leave with clear notes, refilled preventives if needed, and an upfront estimate for next steps.

Used on wellness-exams. Class hooks: .s-steps, .s-step, .s-step__num.

Data display

Tabs

ARIA tablist + panels. Active state darkens the text and adds a thick teal underline. Active panel is a two-column card (image + copy) that fades up on switch. Built on .stage-tabs / .stage-panel.

The first year, set up right.

Vaccine series, spay/neuter, training basics, and a comfortable introduction to lifelong vet visits — at your pup or kitten's pace.

The canonical reusable ARIA tab pattern. Behavior: /scripts/sploot-components.js (initStageTabs) — click + arrow/Home/End keys + roving tabindex. primary-care's "by life stage" section is a richer, page-specific variant under its own .ls-* classes — deliberately separate from this so the .stage-* names have one meaning.

Data display

Pill tabs

A segmented-control tab — the canonical home for the location .avail-tabs and services .svc-tabs pill switchers (distinct from the underline .stage-tabs above). Full WAI-ARIA tablist: arrow / Home / End keys, roving tabindex, visible focus. Two skins — --paper and --teal.

Denver clinics — 3 open today
Wellness, dental, surgery, urgent care…

Replaces today-availability .avail-tabs + services .svc-tabs. Behavior: /scripts/sploot-components.js (initPillTabs).

Data display

Filter bar & inverse pill tabs

Several labelled pill-tab controls in one wrapping row — the dark-band pricing selectors on spay-neuter. .s-filter-bar supplies only the caption and row rhythm; each group stays its own independent tablist. The base tabs, the --paper / --teal skins and the keyboard nav are at Pill tabs above — this covers the --inverse delta only. Both halves are dark-only and must stay inside .s-panel--glass: the label goes white purely via the contextual .s-panel--glass .s-filter-bar__label rule. Drop that ancestor and it falls back to --color-text-subtle — midnight-eagle at 55%, invisible on a dark band.

Species
Location
Gender

Used on spay-neuter (pricing card, paired with .s-matrix--inverse). Class hooks: .s-filter-bar, .s-filter-bar__group, .s-filter-bar__label, .s-pill-tabs--inverse, .s-pill-tab, inside a required .s-panel--glass. Base tabs, keyboard nav and disabled/focus states: Pill tabs + /scripts/sploot-components.js (initPillTabs).

Navigation

Service link rows

Horizontal link rows for secondary / "beyond the basics" services. Title + meta left, circular arrow right that fills coral on hover. Built on .beyond-link.

Used on primary-care. Class hook: .beyond-link.

Services & content

Checkmark pills

Inline mint pill badges with a check glyph — used in the About mission and pharmacy rows to call out key promises in a single line.

Same-day availability Open 365 days a year Fear Free certified

Used on about (mission + pharmacy rows). Built from Tailwind utilities.

Content

FAQ

Loaded from /styles/sploot-faq.css. Cream pill cards with a coral + that becomes when open; open state switches to white with a coral border.

Is the Sploot app free?
Yes — completely free for current Sploot clients. No subscription and no in-app fees.
Can I order prescriptions through the app?
Yes — SplootRx, our in-house pharmacy, lives inside the app. Refill an active prescription in two taps and we'll ship it to your door.
Which devices are supported?
iOS 15+ and Android 8+. Published on the App Store and Google Play.
</> View code
<link rel="stylesheet" href="/styles/sploot-faq.css">

<div class="sploot-faq">
  <details>
    <summary>Question?</summary>
    <div class="faq-answer-body">Answer.</div>
  </details>
</div>
06 · 4 components

Banners & alerts

Bands and callouts that interrupt on purpose.

Status & alerts

Critical alert

A left-bordered callout (fire-opal accent) for urgent, can't-miss guidance. The red is fixed regardless of palette — it signals urgency, so it shouldn't shift with the theme.

If your pet is collapsed, struggling to breathe, or bleeding heavily, call us now at (720) 770-8656 — don't wait for an appointment.

Used on emergency-services. Class hook: .critical-line.

Banners & misc

Marquee ticker

An infinite horizontal ticker of brand promises in serif, with a brand icon from /assets/iconography/ acting as a centered separator between each pair — not attached to either side. Pauses on hover and stops entirely under reduced-motion. The track holds two copies of the set so the loop is seamless.

Open 365 days a yearSame-day appointmentsOnline pharmacyFear Free certifiedBook in under a minute Open 365 days a yearSame-day appointmentsOnline pharmacyFear Free certifiedBook in under a minute

Used on highlands. Class hooks: .marquee, .marquee-track, .m-ico.

Banners & misc

Newsletter signup

A single-field email capture — a coral-outlined pill input with the submit button tucked inside on the right (coral, for contrast on dark footers).

Used in the homepage footer. Class hook: .newsletter-form.

Banners & misc

Referral banner

A thin, dismissible announcement bar — short message, an inline link, and a close button that removes it.

🎁 Refer a friend — you both get $25 off. Learn more

Used on home (top of page). Class hook: .referral-banner.

07 · 3 components

Social proof

Reviews, testimonials and video stories.

Social proof

Google reviews widget

A dark-teal review organism: an aggregate rating header (Google "G", 4.9, stars, review-count link) over a horizontal scroller of light mini-review cards — clamped quote, "read more", an initials avatar, a verified check, and Google attribution. Prev/next arrows flank the rail.

Booking used to mean phone tag for a week. Now I tap a reminder and Bagel's annual is on the calendar in 20 seconds. The whole team is kind and the app is genuinely useful.

Read more
MMaya R. 2 weeks ago

Reordering Pretzel's heartworm meds used to mean a phone call and a pharmacy trip. Now I tap once in SplootRx and it shows up at the door. Pricing beat Chewy too.

Read more
JJordan P. 1 month ago

Vaccine certificates pulled right up at boarding check-in — no more digging through old emails. Such a small thing but it saved my whole morning.

Read more
SSam L. 3 weeks ago

Our pup hates the vet, but the Fear Free approach here actually works. He trotted in wagging his tail. Never thought I'd say that about a vet visit.

Read more
PPriya K. 5 days ago

The vet techs texted me photos during Mochi's dental and walked me through every line on the estimate first. No surprise bills, no upsell — just clear care.

Read more
DDiego M. 1 week ago

Bear ate a sock on a Sunday and they had a same-day urgent slot when our old clinic said Tuesday. Calm, kind, and he was home by dinner.

Read more
AAisha T. 2 months ago

Switched from a big-box clinic and the difference is night and day. Upfront pricing, a care team that remembers Cooper's name, and zero waiting-room stress.

Read more
BBen H. 3 days ago

A telehealth follow-up saved me a cross-town trip for a quick incision check. Five minutes, peace of mind, and they logged it right in Luna's record.

Read more
LLena V. 6 weeks ago

Used on reviews and about. Class hooks: .cr-gwidget, .cr-grv.

⚠ Drift

Distinct from the card-grid testimonials — this is a separate dark-container review system with its own scroller + arrows. The star rating reuses fire-opal/coral; verified + Google marks are hardcoded brand blues (intentional, third-party).

Content

Testimonials

Coral five-star rating, body quote, then a small avatar + name + location/pets line. Three cards in a row at desktop.

"Booking used to mean phone tag for a week. Now I tap a reminder and Bagel's annual is on the calendar in 20 seconds."

M

Maya R.

Denver · Bagel & Mango

"Reordering Pretzel's heartworm meds used to mean a phone call and a pharmacy trip. Now I tap once in SplootRx."

J

Jordan P.

Chicago · Pretzel

"Vaccine certificates pulled up at boarding check-in — no more digging through emails."

S

Sam & Tess L.

Salt Lake City · Biscuit

Social proof

Video stories

A horizontal scroll-snapping rail of 9:14 video-testimonial cards — poster image, play disc (fills coral on hover), a topic pill (top-left) and duration badge (bottom-right), with a serif title and pet-parent avatar below. Swipe or scroll.

Urgent care1:24

"They saved Bagel's evening."

Maya R. · Denver
Senior care2:03

"Gentle with our old girl."

Jordan P. · Chicago
Wellness0:58

"Booking took 20 seconds."

Sam & Tess L. · SLC
Dental1:47

"No more dreading the vet."

Priya K. · Denver

Used on reviews. Class hooks: .cr-scroller, .cr-video-card.

⚠ Drift

A fourth horizontal-carousel implementation — alongside .dvr-svc-track (services), the testimonial slider, and the Google-reviews scroller below. Each hand-rolls its own scroll/snap markup.

08 · 6 components

App & conversion

App showcase, download CTAs and booking blocks.

Sections & CTAs

App showcase

The cross-page app section that sits above the final CTA — exactly as it ships on the homepage: a radial-teal card with a green eyebrow, a New Spirit headline (coral italic accent), copy, translucent store badges, and a fanned trio of app screenshots (a center phone device flanked by two tilted shots).

The Sploot app

Your pet's whole health,
in your pocket.

Records, reminders for vaccines, checkups and medications, easy appointment booking, and prescription refills — all your pet's care in one place.

Sploot app booking flow
Sploot app care plan
Sploot app home screen

Live on the homepage as the self-contained .sa-* block. Class hooks: .sa-card, .sa-badge, .sa-fan / .sa-phone.

Sections & CTAs

App download CTA

Dark teal rounded panel for the bottom of the app landing page. Headline + copy + store badges on the left, QR card on the right. Drives installs, not appointments.

Bring your pet's care everywhere.

Download the Sploot app and book, refill, remember — wherever the road takes you both.

App

Floating chips

The app-hero treatment — a phone mockup with notification "chips" floating around it (gentle staggered up/down drift). Each chip is a white pill with a colored icon dot and a short label. Motion respects reduced-motion.

Sploot app home screen
Refill ready
Appt confirmed
Vaccine due

Used on app. Class hooks: .float-chip (+ the .phone mockup).

Sections & CTAs

Booking CTA

Dark teal closing CTA for service pages. Centered headline with peach italic accent, supporting copy, then two canonical .btns — .btn--coral + the dark-band .btn--outline-invert — so both CTAs share one box model and stay the same size. Decorative mint blob in the corner. Built on .final-block.

Ready to meet your new vet?

Same-day appointments, 365 days a year, at every Sploot clinic. Book in under a minute or call us.

No membership required — anyone can book.

Used on primary-care, wellness-exams. Class hook: .final-block.

Sections & CTAs

SPM callout

SplootPack-red promotional band for SplootPack Membership. Left: white eyebrow → serif heading with underlined italic accent → perks (white checkmarks) → white pill CTA. Right: a photo panel — always ship an image here, as both live pages do; the opal gradient underneath is only a loading/missing-asset fallback (an empty .pack-visual renders the whole band solid red). Single column on mobile. Built on .pack-card.

SplootPack Membership

A whole year of wellness, covered.

  • 3 free exams every year
  • 10% off everything else
  • Vaccines, dental discounts, and SplootRx perks
Join SplootPack
A golden retriever resting paws on the Sploot front-desk counter while the receptionist helps a client check out

Used on primary-care and wellness-exams. Class hook: .pack-card.

Sections & CTAs

Split callout

The neutral copy + media promo — eyebrow, heading, lead, check-list, CTA and fineprint in a 1.1fr/1fr grid beside an image. .s-split-callout is bare on the section background; --boxed surfaces it as a bordered white card and rounds the image; --reverse lets the media lead. Below 1024px both collapse to one column, and --reverse resets its ordering so copy always reads first on mobile. Note the component styles no typography of its own — the consuming page supplies the heading, italic accent and lead (spay-neuter sizes the heading at 48px via .svc-page + a page rule). The demos below stand that in with token inline styles; copy them, or inherit from your page shell.

Pay over time

Paying over time with CareCredit.

We get it — timing isn't always perfect. That's why we accept CareCredit®, a healthcare credit card that lets you pay over time for any procedure over $200. Most plans include 6–18 months of no-interest financing if paid within the promo period.

  • See if you prequalify in seconds — no impact to your credit score
  • Reusable for future visits at any Sploot clinic
  • Pay over time with convenient monthly payments*
See if you prequalify

*Subject to credit approval. See carecredit.com for details.

A Sploot vet gently comforting a dog before a procedure
Before the big day

What happens before surgery.

Every spay and neuter starts with a full physical exam and pre-op bloodwork, so we know exactly how your pet's body will handle anesthesia before anything is scheduled.

  • A nose-to-tail exam with the vet performing the procedure
  • Pre-op bloodwork run in-house, usually back the same day
  • An upfront estimate — no surprises on pickup day
See how it works
A Sploot surgical team monitoring a pet during a spay procedure

Used on spay-neuter. Class hooks: .s-split-callout, .s-split-callout__copy, .s-split-callout__media, .s-split-callout--boxed, .s-split-callout--reverse. Composes .eyebrow-wf, .s-check-list, .btn, .s-fineprint.

09 · 2 components

Site chrome

The shared nav and footer — byte-identical on every page, CI-checked.

10 · 3 components

Motion & accents

Reveal-on-scroll motion and the hand-drawn accent set.

Motion

Motion

Reveal-on-scroll (subtle rise + fade) for content as you read down a page, and a staggered entrance on grids (cascading 120ms delay). Both use .reveal and the --ease-out-expo curve. See the style guide for the easing/duration tokens.

Item one
Item two
Item three
</> View code
<div class="reveal">…</div>                       /* JS adds .in when in view */
<div class="reveal" style="transition-delay:.12s">…  /* stagger via delay */

Banners & misc

Scribble underline

A hand-drawn underline that sweeps beneath an accent word — the reviews-page take on the brand's italic-underline headline accent. Drawn from the shared brand accent set and masked to the coral token, so it always tracks the palette.

⚠ Superseded

.cr-scribble is the same recipe as the canonical .s-accent-mark--underline-straight — same /assets/accents/line-straight.svg, same mask-and-tint. It survives only because reviews hasn't been migrated yet. Use Accent marks for new work; this section goes away when reviews moves over.

Pet parents love us.

Used on reviews. The stroke is the brand accent /assets/accents/line-straight.svg masked to var(--color-opal). Class hook: .cr-scribble.

Content

Accent marks

The hand-drawn brand mark laid over a headline word or figure. .s-accent-mark is the positioning box — it also sets white-space: nowrap, so a marked phrase never breaks across lines — and a modifier supplies the shape. The mark is always a masked SVG tinted with --color-accent, never a raw background: url(): every file in /assets/accents bakes its own red and none of them is the accent token.

Neutering, handled gently.

A nose-to-tail exam.

Rated 4.8 by Denver pet parents.

Vaccines and microchip, one visit.

A happier, healthier pet starts here.

Used on spay-neuter.hero-accent-word in the hero H1, .s-accent-mark--circle around the rating-badge score — and in the hero H1 on denver and denver/highlands. .hero-accent-word is the legacy alias for .s-accent-mark + .s-accent-mark--underline-curved; new work should use the canonical pair. Class hooks: .s-accent-mark, .s-accent-mark--underline-curved, .s-accent-mark--underline-straight, .s-accent-mark--circle, .s-accent-mark--sparkle, .hero-accent-word.