Litigation
Trial-ready from day one, with the preparation to settle on your terms.
One semantic component library, many brand skins. We design it once, then re-token it per customer. This page is the front door: what is here, how it is wired, and how to skin a new customer in three steps.
The one-paragraph version
A vertical-agnostic component library that powers every site PLW delivers. Every component reads tokens and never hardcodes a color, font, size, radius, or shadow. A "skin" is a stack of three independent layers set as attributes on one element: a palette (color), a type pairing (fonts), and a shape (radius + shadow). Set all three, drop in the customer's real brand hex, and the same markup wears their brand.
The math: 20 palettes × 11 type pairings × 5 shapes = 1,100 named combinations before a single custom color, all served by one untouched component layer. Built mobile-first, WCAG 2.1 AA, no runtime dependencies.
The whole thesis, in one widget
Every element below is a real component from the library, reading the live token contract. Tap a vertical: the palette, fonts, radius, and shadow all change at once. The markup never does.
Established 1994 · Three states
Trial-ready from day one, with the preparation to settle on your terms.
From formation to exit, a steady hand on every transaction.
The whole job, start to finish
Pick one palette, one type pairing, and one shape from the seeded sets, and set them as attributes on <html> or <body>. That is the closest starting point for the brand.
Override --color-accent with the customer's real logo hex. The --color-accent-fg on-color is picked for AA contrast automatically. Hand over a full brand guide? Override --color-fg / -bg / -surface too.
Nothing in the component layer changes. Build the page from the primitives, layout, content, and card pieces, all of which already read the contract. Done.
// 1 · Compose the skin at the root. Three attributes.
<html data-palette="champagne" data-type="playfair" data-shape="refined">
// 2 · Drop in the customer's real brand color. Nothing else moves.
<html ... style="--color-accent:#b89254">
// Full brand guide? Override the ground too:
// style="--color-accent:#b89254; --color-fg:#1b2b2a; --color-bg:#f5f2ea"
// 3 · Build with components that already read the contract.
<button class="c-btn c-btn--primary c-btn--md">Request a consultation</button>
In a Tailwind v4 project the shared skeleton (type ramp, spacing, line-heights, border widths) lives in an @theme block so utilities are generated; the three layers are runtime-swappable attribute scopes, so they sit outside @theme. See Tokens (01) for the full file with copy-paste blocks.
Every variable a component may read
Defined in tokens.css. Layer 1 (palette) sets color, layer 2 (type) sets fonts, layer 3 (shape) fills radius + shadow slots. The rest is the shared skeleton, constant across every skin.
What lives where
| File | What it is |
|---|---|
| The system (ship these) | |
| tokens.css | The contract. 20 palettes, 11 type pairings, 5 shapes, plus the shared skeleton. The only file a re-skin touches. |
| primitives.css | Button, link, badge, tag, divider, input, checkbox, radio, icon, focus ring. |
| content.css | Eyebrow, heading cluster, h1–h6, lede, body, blockquote, callout, lists. |
| layout.css | Container, section (tones/density), stack, inline, 12-col grid. |
| cards.css | Hero, feature / service / pricing / stat / testimonial cards, FAQ item. |
| sections.css | Composed sections: hero variants, services grid, case-study tease, CTA. |
| Page chrome (per-site) | |
| home.css | Site nav, hamburger drawer, section rhythm, footer, the re-skin dock. |
| templates.css | Inner-page layouts: breadcrumb, article + sidebar, contact split, team grid, timeline, comparison table, 404. |
| Behavior (vanilla JS, no deps) | |
| home.js | Mobile nav drawer + FAQ accordion for assembled pages. |
| reskin.js | The floating "Re-skin" control that retints a whole page live. |
| app.js · *.js | Per-doc-page switchers and demos (Storybook behavior only). |
Live Storybooks · skin switcher on each
Each page documents its components with a variant gallery, accessibility notes, the token contract it reads, and copyable React/TSX. A skin switcher sits at the top of every one.
The system, assembled into real sites
Whitman & Associates is a complete law-firm site in the champagne / Playfair / refined skin. Apex Roofing is the same component library re-skinned to yellow / Anton / brutalist, the thesis on one screen. Open the Whitman home and tap the floating Re-skin pill to flip the whole site live.
Keep the system honest
| Tokens drive everything | A component never hardcodes a color, font size, radius, or shadow. Every visual decision reads a var(--*). If you need a value the contract does not have, add a token, do not inline it. |
| Mobile-first | Designed at 360px and scaled up. Hit targets ≥ 44px. Test the hamburger drawer and grid collapse before shipping. |
| WCAG 2.1 AA | Visible focus rings via --color-ring. Status is never color-only. --color-accent-fg is tuned per palette; pasted accents auto-pick a readable on-color. |
| Editorial weight | Newspaper and courthouse, not SaaS gradients with floating glass. Real type, real hierarchy, generous rhythm. |
| No em-dashes in copy | Periods, commas, colons, middots. Anywhere a person reads it. |
| No runtime dependencies | Vanilla JS, no animation libraries, no megapixel heroes. Keep Lighthouse at 95+. |