A design system for the W3C Web Sustainability Guidelines
Verdant
Sustainable Defaults for the Green Web
Start with the parts teams usually add later: system fonts, a System/Light/Dark theme preference, restrained motion, and only the CSS each page uses. Verdant gives a product page or docs site those lighter defaults from the first commit.
- Initial render assets, local Brotli estimate
- 20.2 KiB
- Offline shell + worker, unique local Brotli estimate
- 30.7 KiB
- Cold first session, measured local transfer
- 51.2 KiB
- Warm repeat visit, measured local transfer
- 11.3 KiB
Measured 2026-09-23 locally over HTTP with Brotli response bodies in KiB (1024 bytes), excluding headers, then rounded up to a stable tenth for this summary. Cold includes the service worker install and its duplicate precache fetches; warm is a repeat visit with the shell already cached. Production-network transfer is unmeasured here.
How it grows
From a small token set to a whole site.
Each layer only adds the parts the previous one cannot, which keeps the finished site small.
1 · Seed
Tokens
21 colors, a 4px spacing grid, four radii and system type. Small enough to stay consistent without one-off values.
2 · Sprout
Components
Button, card, field, theme preference, switch specimen and motion — each one demonstrates a WSG behavior live instead of describing it.
3 · Sapling
Pages
A product page or docs page gets landmarks, a skip link, one focus ring, one stylesheet and two small same-origin scripts from day one.
4 · Canopy
Sites
Security headers, cache rules, an offline shell and a real 404 — the hosting checks, handled before launch.
Palette
21 colors, shown in both themes.
One token set with a light and a dark value each. System mode follows prefers-color-scheme; explicit Light and Dark choices reuse the same tokens without a second stylesheet. Both values of every token are shown side by side.
Interface
Public colors for text, controls, state, and supporting UI tones. Use the verified pairings below rather than assuming every token combination is readable.
accent
Light#2f6b4aDark#7fcfa3accent.strong
Light#234f38Dark#5fb98cpositive
Light#1f7a6cDark#5cc9b7info
Light#2b5f8eDark#8cbceawarning
Light#8a5a00Dark#f2c14ecritical
Light#c1440eDark#ff8f5efocusRing
Light#a5670aDark#e8a83eaccent.ink
Light#ffffffDark#10241aink
Light#1c1a15Dark#f1ede2ink.muted
Light#5b5548Dark#b6ae9cink.placeholder
Light#75726aDark#8d8a81border
Light#c7bda9Dark#514b3bborder.control
Light#7f735bDark#8f866fsurface.200
Light#ffffffDark#1e1c15surface.100
Light#faf8f3Dark#15140f
Illustration only
Decorative foliage and sunlight tokens. They are available for art, but not approved as default text, controls, or status meaning.
foliage.bright
Light#6fcd4fDark#86dc62foliage
Light#3ca24aDark#45ad55foliage.deep
Light#1f6a31Dark#2a7d3afoliage.mid
Light#9ed65fDark#2d6b34foliage.far
Light#cdeaaeDark#1c3a22sunlight
Light#f4b63fDark#e8a83e
Verified text pairings
Measured from the shared theme tokens at build time. These are the approved readable combinations — not every token can be mixed freely. 3 of 13 reach WCAG AAA (7:1) in both themes; every one meets AA (4.5:1), which also makes it AAA for large text. The build fails below the stated target, and AAA is reported, not required.
Body text on site canvas
inkonsurface.100Default long-form copy and labels on the page background.
Light 16.38:1 WCAG AAA · Dark 15.76:1 WCAG AAA · Target 4.5:1
Body text on raised surface
inkonsurface.200Card and field content when a component steps onto the raised surface.
Light 17.38:1 WCAG AAA · Dark 14.57:1 WCAG AAA · Target 4.5:1
Supporting text on site canvas
ink.mutedonsurface.100Secondary copy such as intros, captions and helper text.
Light 6.97:1 WCAG AA · Dark 8.36:1 WCAG AAA · Target 4.5:1
Supporting text on raised surface
ink.mutedonsurface.200Card bodies, palette tiles, hints and the bands that sit on surface-200.
Light 7.40:1 WCAG AAA · Dark 7.73:1 WCAG AAA · Target 4.5:1
Placeholder text in fields
ink.placeholderonsurface.200Example values inside inputs, which sit on the raised surface.
Light 4.80:1 WCAG AA · Dark 4.94:1 WCAG AA · Target 4.5:1
Links and accents on site canvas
accentonsurface.100Inline links, eyebrows and stat values on the page background.
Light 5.95:1 WCAG AA · Dark 9.97:1 WCAG AAA · Target 4.5:1
Links and accents on raised surface
accentonsurface.200Links and accent text inside cards and bands.
Light 6.32:1 WCAG AA · Dark 9.22:1 WCAG AAA · Target 4.5:1
Primary button label
accent.inkonaccentDefault primary action styling.
Light 6.32:1 WCAG AA · Dark 8.81:1 WCAG AAA · Target 4.5:1
Primary button label on hover
accent.inkonaccent.strongHover state for the primary action.
Light 9.35:1 WCAG AAA · Dark 6.83:1 WCAG AA · Target 4.5:1
Positive status on raised surface
positiveonsurface.200Success status inside cards, e.g. the scorecard.
Light 5.17:1 WCAG AA · Dark 8.52:1 WCAG AAA · Target 4.5:1
Info status on raised surface
infoonsurface.200Neutral guidance or sample-only notes inside cards.
Light 6.71:1 WCAG AA · Dark 8.52:1 WCAG AAA · Target 4.5:1
Warning status on raised surface
warningonsurface.200Non-blocking cautions inside cards, e.g. open items on the scorecard.
Light 5.93:1 WCAG AA · Dark 10.16:1 WCAG AAA · Target 4.5:1
Critical status on raised surface
criticalonsurface.200Errors, failures and destructive actions only.
Light 5.12:1 WCAG AA · Dark 7.58:1 WCAG AAA · Target 4.5:1
Verified functional boundaries
Borders and focus indicators target at least 3:1 non-text contrast against the surfaces they appear on.
Control border on site canvas
border.controlonsurface.100Input, secondary button and switch-track outlines on the page background.
Light 4.39:1 WCAG 3:1 non-text · Dark 5.10:1 WCAG 3:1 non-text · Target 3:1
Control border on raised surface
border.controlonsurface.200Input and secondary button outlines on the raised surface.
Light 4.66:1 WCAG 3:1 non-text · Dark 4.71:1 WCAG 3:1 non-text · Target 3:1
Focus ring on site canvas
focusRingonsurface.100Visible focus indicator against the main page background.
Light 4.35:1 WCAG 3:1 non-text · Dark 8.87:1 WCAG 3:1 non-text · Target 3:1
Focus ring on raised surface
focusRingonsurface.200Visible focus indicator inside cards and bands.
Light 4.62:1 WCAG 3:1 non-text · Dark 8.20:1 WCAG 3:1 non-text · Target 3:1
Increased contrast
When the operating system asks for more contrast (prefers-contrast: more), 11 tokens switch to stronger values in either theme, control borders thicken to 2px and the focus ring to 3px. The build checks every pairing above against stricter targets in that mode: 7:1 for text (the weakest is 7.60:1) and 4.5:1 for control borders and focus rings.
ink.muted— Light #5b5548 → #3f3a30 · Dark #b6ae9c → #d6cfbfink.placeholder— Light #75726a → #4f4b42 · Dark #8d8a81 → #bdb8abborder— Light #c7bda9 → #7f735b · Dark #514b3b → #8f866fborder.control— Light #7f735b → #4f4636 · Dark #8f866f → #b3a88efocusRing— Light #a5670a → #8a5200 · Dark #e8a83e → #ffc15aaccent— Light #2f6b4a → #245a3d · Dark #7fcfa3 → #9be0bbaccent.strong— Light #234f38 → #1a3f2c · Dark #5fb98c → #7fd0a5positive— Light #1f7a6c → #145e52 · Dark #5cc9b7 → #7fdccbinfo— Light #2b5f8e → #1f4f7a · Dark #8cbcea → #a9cff2warning— Light #8a5a00 → #6e4700 · Dark #f2c14e → #ffd57acritical— Light #c1440e → #922e08 · Dark #ff8f5e → #ffab85
Public token scope
What Verdant publishes, inherits, and keeps page-specific.
The palette above defines the supported color API. These cards document the rest of the token surface so adopters can tell reusable design tokens from Panda defaults and demo-only layout values.
Colors
Interface colors are the public text, control and status tokens. Illustration colors stay public for artwork only.
- Interface:
accent,accent.strong,positive,info,warning,critical,focusRing,accent.ink,ink,ink.muted,ink.placeholder,border,border.control,surface.200,surface.100 - Illustration only:
foliage.bright,foliage,foliage.deep,foliage.mid,foliage.far,sunlight
Spacing
Public spacing tokens follow a 4px rhythm.
1— 4px2— 8px3— 12px4— 16px6— 24px8— 32px12— 48px
Radii
Rounded corners stay on four reusable steps.
sm— 4pxmd— 8pxlg— 16pxfull— 999px
Typography
System fonts plus six public size/line-height pairs.
sans— system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serifmono— ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospacedisplayLg— 32px / 40pxdisplayMd— 24px / 32pxdisplaySm— 20px / 28pxbody— 16px / 24pxbodySm— 14px / 20pxlabel— 13px / 16px
Layout & breakpoints
Verdant keeps its public token surface small, so responsive and page-art values are called out separately here.
- Responsive rules use Panda defaults (`base`, `sm`, `md`, `lg`) because Verdant does not publish a custom breakpoint token scale.
- Hero wordmark: 56px at base and 88px from `md` upward; this is page artwork, not a reusable type token.
- Components and 404 page titles: 40px at base and 56px from `md` upward; also page-specific, not public tokens.
- The shared page wrapper is capped at 1080px for this demo site layout.
Saved evidence record
Implementation checklist for selected WSG-aligned defaults.
Verdant WSG evidence snapshot reviewed on 2026-09-22 (4 verified, 2 open). This section is generated from a saved artifact, not a live deploy audit, and it documents selected evidence rather than full WSG conformance.
Linked records: PR #18 — System/Light/Dark theme preference and its head-loaded bootstrap script, PR #19 — finalized measurements in dist/measurements.json, PR #20 — reduced-data behavior description, Evidence register (PR #26) — hosting provenance and governance
Performance & efficiency
✓ Verified
The build measures the finalized pages, stylesheet and scripts after fingerprinting and writes dist/measurements.json, which also fills the homepage numbers. Pages load one shared stylesheet plus small same-origin scripts, including the head-loaded theme bootstrap that applies a saved preference before first paint.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · WSG refs 3.2, 3.4
Scope: Repository build output: finalized, fingerprinted assets measured locally after every build. Production-network transfer is not measured here.
Tool: npm run build (Node 20 + PandaCSS 1.12.1) · Evidence link
Semantic & standards
✓ Verified
Generated pages include landmarks, a skip link, a single h1 per page, and a canonical URL. JSON-LD website metadata is emitted on the homepage only.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · WSG refs 3.2
Scope: Generated page structure and metadata for the homepage and component gallery.
Tool: npm run build (Node 20 + PandaCSS 1.12.1) · Evidence link
Sustainability-specific
✓ Verified
System, Light and Dark theme preferences share one token source with prefers-color-scheme as the no-script default, and every animation is gated on prefers-reduced-motion. Reduced-data behavior is intentionally not claimed: decorative art is inline, so there is nothing optional to skip.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · WSG refs 2.10, 3.9
Scope: Defaults shown in the generated pages and PandaCSS output.
Tool: Manual source review · Evidence link
Security & maintenance
⚠ Open
The repo includes CSP, HSTS, Permissions-Policy, nosniff, cache rules, robots.txt, and a sitemap. Maintenance commitments such as dependency cadence, browser support, releases and licensing are recorded as gaps in the evidence register, and deployed responses still depend on the platform applying these files as configured.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · WSG refs 3.2
Scope: Repository-managed static assets and configuration files, not human-reviewed governance or hosting assurances.
Tool: Manual source review · Evidence link
Linked records: Evidence register
UX & design
✓ Verified
The component gallery demonstrates labelled fields with autocomplete and inputmode, a visible focus style, no autoplay media, and system-font defaults.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · WSG refs 2.10, 3.9
Scope: Generated form, focus, theme, and motion examples in the component gallery.
Tool: npm run build (Node 20 + PandaCSS 1.12.1) · Evidence link
Hosting & infrastructure
⚠ Open
The evidence register identifies Netlify as the hosting platform from the published netlify.app origin and checked-in config. Energy provenance is not independently verified by the Green Web Foundation at the review date, and CDN compression and live-response headers need external verification; the repository cannot prove deployed infrastructure outcomes on its own.
Reviewed 2026-09-22 · W3C Web Sustainability Guidelines TR snapshot reviewed on 2026-09-22 · No WSG section claimed
Scope: Live deployment behavior outside the repository build output.
Tool: Not assessed in-repo · Evidence link
Linked records: Evidence register
The card headings follow wsg-check's scanner categories, not the WSG section structure. Status is always a word plus a symbol, never color alone, and the full record is also available as JSON.
Built with PandaCSS
Tokens in, only-what-you-use CSS out.
Verdant fits in one PandaCSS config. Build-time extraction keeps the stylesheet tied to what the page actually renders.
- Semantic tokens carry both themes;
_darkmaps to the OS preference. - Recipes for button, card, field and switch mirror the component guidelines.
- No runtime CSS-in-JS reaches the browser.
// panda.config.ts
conditions: {
dark: '@media (prefers-color-scheme: dark)',
},
theme: { extend: { semanticTokens: { colors: {
accent: { value: { base: '#2f6b4a', _dark: '#7fcfa3' } },
// …the other 20, same shape
} } } },
// No staticCss: ship only the rules pages use.Use it in your next project.
Clone the repo, copy panda.config.ts, and keep the checklist. Start with the defaults, then layer in only the styling your product needs.