PKWY Collective Grip Socks are here!Shop Now

Brand

Design system reference

Every primitive that powers v2, in one place. Source of truth for tokens, typography, and components.

Color tokens

oklch values defined in lib/branding/theme.ts; exposed as CSS variables.

--brand-pink

--brand-pink-hover

--brand-pink-soft

--brand-indigo

--brand-indigo-hover

--brand-indigo-soft

--surface-0

--shelf

--text-primary

--text-secondary

--text-tertiary

--line-strong

Never embed colors inline. Use the named utilities (bg-indigo, text-pink) so theme swaps Just Work.

Typography

Component-ready class strings from lib/branding/styles.ts. Use these, not raw text-[NNpx].

hDisplay
Display heading
hPage
Page heading
hTitle
Title
hSection
Section heading
hHeading
Heading
hSub
Sub-heading
tLede
Lede paragraph for opening copy.
tBody
Body text for regular paragraphs. Comfortable line height for reading.
tQuote
“A pull quote. Reserved for the rare emphatic moment.”
tMeta
Meta text. Secondary info, dates, hints.
eyebrow
Eyebrow label
linkEyebrow

When to use each scale: hDisplay / hPage — hero headlines only; hTitle — major section dividers; hSection — subsection headers; hHeading — card / block titles; hSub — small stat values; tLede — the opening paragraph; tBody — body copy (most common); tMeta — captions, dates, hints; tQuote — rare pull quotes. Never reach for a raw text-[NNpx].

Buttons & CTAs

components/primitives.tsx · Button + bespoke pills.

Always reach for <Button> first — it handles links (href), form submits (type/formAction), onClick, and a loading state, so there is no standalone button class to drift from. Pick the variant by emphasis: primary (animated cotton-candy gradient) for the one dominant CTA on a surface; solid for everyday actions (form submit, dialog confirm, add-to-bag); outline for the secondary next to a primary; ghostfor low-emphasis / icon-adjacent actions. Hand-roll a button only for a genuine one-off the variants can't express (e.g. the pink pill below).

Eyebrows

components/primitives.tsx · Eyebrow.

Default

tertiary tone

Pink

brand pink

Indigo

brand indigo

Form primitives

components/form.tsx · Field + TextInput / Textarea / Select / Checkbox / FormError.

Dialog

components/dialog.tsx · Dialog + DialogHeader / DialogBody / DialogFooter / DialogCancel.

Brand demo

Hello from the dialog primitive

This is the meta line. Lives under the title.

Backed by native <dialog> with animated entry, autofocus, backdrop click-to-close. Use data-autofocus on a child to override the first-focusable default.

Cards & surfaces

components/primitives.tsx · SurfaceCard.

pad=sm · round=md

pad=md · round=lg

pad=lg · round=xl

Section · Shell · spacing

components/primitives.tsx · Section / Shell.

<Section pad="lg|md|sm" shelf bordered width="sm|md|lg|xl"> wraps everything in a centered <Shell>. Use shelf for the soft pink background, bordered for the hairline top border. Padding ladders:

  • pad=lgpy-24 to py-32
  • pad=mdpy-16 to py-20
  • pad=smpy-12

Product card

components/product-card.tsx · used in /shop.

PKWY Collective Grip Socks

New Drop

PKWY Collective Grip Socks

Melanated & Fair

Made for the sisters (and everybody) who show up as they are. Soft, breathable, with heart-shaped grip on the bottom: culture, community, and control in every step.

$17.99
PKWY Tea Blend

Health

PKWY Tea Blend

100% organic herbs

A gunpowder green tea blend crafted to warm the body, awaken energy, and support endurance through movement. Approx. 30 cups per bag.

$17.99

Value card

components/value-card.tsx · the 3-up trust block used on /, /about, /shop.

Instructor-curated

Every product is personally tested by our instructors.

Community first

We are a Pittsburgh studio, not a warehouse.

Wellness-driven

Chosen to support practice and recovery.

Status pills

components/pill.tsx · order + transaction statuses in the staff portal.

PendingShippedFulfilledCancelledClassPaid

Switch toggle

Used in /staff/settings stock toggles.

Component inventory

Reach for these before writing new markup.

Layout · primitives.tsx

  • Shell
  • Section
  • PageHeader
  • Heading
  • Eyebrow
  • FigureSplit
  • SurfaceCard

Actions · primitives.tsx

  • Button (primary / solid / outline / ghost)
  • ArrowRight

Forms · form.tsx

  • Field
  • TextInput (round xl / full)
  • Textarea
  • Select
  • Checkbox
  • FormError

Shared blocks

  • ValueCard · value-card.tsx
  • Pill · pill.tsx
  • Dialog · dialog.tsx
  • ProductCard · product-card.tsx
  • NewsletterForm · newsletter-form.tsx

Do · don't

Conventions enforced across the codebase.

Do

Use named color utilities

bg-indigo, text-pink, border-line-2

Don't

No inline color refs

bg-[var(--brand-indigo)], text-[#5a4fcf]

Do

Type scale presets

styles.hHeading, styles.tBody

Don't

No raw text size literals

text-[28px], tracking-[-0.01em]

Do

Parent gap for vertical rhythm

<div className="flex flex-col gap-4">

Don't

Per-element margins

mb-4 on every child

Do

Semantic <section> for logical blocks

<section aria-label="Stats">

Don't

Em-dashes in copy

· use comma / period / colon / restructure