Aspects

Every value below comes from src/design/aspects.ts. Change a value there and it changes everywhere it is used — that is the guarantee this page exists to demonstrate.

Design system groups

The kit ships 34 aspect groups. A site can declare which of them it has actually adopted as its own design system — an adopted group is a decision this site made; an inherited group is the kit's own default, still merged into every page's CSS, but not something this site chose. Every value below still renders — this only changes what it claims to be.

  • coloradopted
  • fontadopted
  • typeadopted
  • pageadopted
  • radiusadopted
  • revealadopted
  • motionadopted
  • buttonadopted
  • controladopted
  • textadopted
  • spaceadopted
  • screenadopted
  • gapadopted
  • borderadopted
  • stackadopted
  • caseadopted
  • pairsadopted
  • focusadopted
  • mediaadopted
  • cardadopted
  • gridadopted
  • paneladopted
  • carouseladopted
  • focusRingadopted
  • zIndexadopted
  • navadopted
  • heroadopted
  • heroPanelsadopted
  • entranceadopted
  • logoadopted
  • announcementadopted
  • footeradopted
  • setsadopted
  • viewportadopted

Coloradopted

  • color.accent#3b5bdb
  • color.accentOnDark#3b5bdb
  • color.ink#14161a
  • color.paper#ffffff
  • color.error#b91c1c
  • color.inkMuted#4a5058
  • color.rule#878d95
  • color.scrim#000000

Color pairs

Color is never used loose — every foreground/background combination is a named pair, measured against the WCAG contrast formula. AA is the level this framework requires; AAA is a stricter, optional bar shown for information only. The ratio a pair must clear comes from its use field — text needs more contrast than a UI border, so the same measured ratio can pass one pair and fail another.

A WCAG contrast issue never stops a local build — it warns, so a genuine violation is visible without blocking someone mid-design. The deploy gate is the check that matters: it still blocks a WCAG failure, and only a human can override it, deliberately and on purpose — see STANDARDS.md#accessibility.

Ag
Pair
body
Use
text
Measured ratio
18.11:1, #14161a on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.
Ag
Pair
cta-solid
Use
text
Measured ratio
5.67:1, #ffffff on #3b5bdb — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Fails WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

FAILS AAA — informational Passes AA. Nothing to fix — AAA is a stricter, optional bar.

Ag
Pair
hero-over
Use
large-text
Measured ratio
21:1, #ffffff on #000000 — use: large-text requires 3:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 3:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 4.5:1.
Ag
Pair
hero-under
Use
large-text
Measured ratio
18.11:1, #14161a on #ffffff — use: large-text requires 3:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 3:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 4.5:1.
Ag
Pair
invert
Use
text
Measured ratio
18.11:1, #ffffff on #14161a — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.
Ag
Pair
link
Use
text
Measured ratio
5.67:1, #3b5bdb on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Fails WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

FAILS AAA — informational Passes AA. Nothing to fix — AAA is a stricter, optional bar.

Ag
Pair
form-error
Use
text
Measured ratio
6.47:1, #b91c1c on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Fails WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

FAILS AAA — informational Passes AA. Nothing to fix — AAA is a stricter, optional bar.

Ag
Pair
muted
Use
text
Measured ratio
8.14:1, #4a5058 on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.
Ag
Pair
edge
Use
ui
Measured ratio
3.35:1, #878d95 on #ffffff — use: ui requires 3:1
AA
Passes WCAG 1.4.11 Non-text Contrast, which requires 3:1.
AAA
Not applicable — use: ui has no AAA threshold.
Ag
Pair
logo
Use
text
Measured ratio
18.11:1, #14161a on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Passes WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

Failure states (demonstration)

The real palette above has no failing pair to show, and adding one there would ship a genuine violation just to prove a point. These two rows are fabricated fixture data — never part of any site's palette — kept here so the failing states stay visible on every build.

Ag
Pair
demo-fails-aa
Use
text
Measured ratio
3.03:1, #949494 on #ffffff — use: text requires 4.5:1
AA
Fails WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Fails WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

FAILS AA — violation This pair ships with a real contrast violation. Recorded with a signed exemption: Demonstration fixture, not a real pair — shows what a signed AA exemption looks like.

Demonstration fixture — fabricated colors, not part of this site’s palette.

Ag
Pair
demo-fails-aaa
Use
text
Measured ratio
5.74:1, #666666 on #ffffff — use: text requires 4.5:1
AA
Passes WCAG 1.4.3 Contrast (Minimum), which requires 4.5:1.
AAA
Fails WCAG 1.4.6 Contrast (Enhanced), which requires 7:1.

FAILS AAA — informational Passes AA. Nothing to fix — AAA is a stricter, optional bar.

Demonstration fixture — fabricated colors, not part of this site’s palette.

Named setsadopted

A named set is a value picked by key, not the job-based role color holds — a keyed palette or a line-weight family a page reaches by name (crystal.ruby), rather than a role it fills. The kit ships none: this is a place for a site to put its own. Contrast is measured only for a set that declares a pairWith background and a use — a member with no declared pairing, or one that is not itself a solid color, says so rather than guessing.

No named sets declared.

Voice

Voice is a named, per-site value like a color or a type size, and it sits here for the same reason: a change request has to land in one place. It cascades per field, so a section can be warmer without restating the person or the word choices.

No voice set. Add one to src/content/pages/_section.yml — see STYLE-GUIDE.md#voice.

Typeadopted

font.body — Inter Variable, falling back to 'Inter Fallback', system-ui, sans-serif inherited

Body copy renders in the body font at its real size, constrained to the site's measure.

font.heading — Fraunces Variable, falling back to 'Fraunces Fallback', Georgia, serif inherited

Kitchen gardens built for the way you cook

font.display — Fraunces Variable, falling back to 'Fraunces Fallback', Georgia, serif inherited

The quick brown fox jumps over the lazy dog.

font.ui — Inter Variable, falling back to 'Inter Fallback', system-ui, sans-serif inherited

The quick brown fox jumps over the lazy dog.

font.mono — ui-monospace, falling back to 'SF Mono', Menlo, Consolas, monospace inherited

The quick brown fox jumps over the lazy dog.

Heading stack

The most frequently broken thing in a design system — see STANDARDS.md#the-heading-stack. Every gap below is measured off the real rendered DOM, not copied from the aspect value.

Eyebrow + subheading

Services

Kitchen gardens

Built for the way you cook

Body copy begins here, the anchor every gap above is measured against.

    eyebrow · upper — heading · sentence — subheading · sentence

    Eyebrow only

    Services

    Kitchen gardens

    Body copy begins here, the anchor every gap above is measured against.

      eyebrow · upper — heading · sentence — subheading · sentence

      Subheading only

      Kitchen gardens

      Built for the way you cook

      Body copy begins here, the anchor every gap above is measured against.

        eyebrow · upper — heading · sentence — subheading · sentence

        Neither

        Kitchen gardens

        Body copy begins here, the anchor every gap above is measured against.

          eyebrow · upper — heading · sentence — subheading · sentence

          Spacingspace: adoptedstack: adopted

          • space.section6rem
          • space.heroStartclamp(2rem, 10vw, 9rem)
          • space.heroEnd4rem
          • space.kickerStart8rem
          • space.pageEnd5rem
          • space.flushEnd3rem
          • stack.eyebrowToHeading0.5rem
          • stack.headingToSubheading0.75rem
          • stack.headingToBody1.5rem
          • stack.subheadingToBody1rem
          • stack.headingToBlock3rem
          • stack.displayTrim0em

          Radii & motionradius: adoptedmotion: adopted

          • radius.sm4px
          • radius.lg16px
          • motion.hover150ms ease
          • motion.panel620ms cubic-bezier(0.19, 0.86, 0.24, 1)
          • motion.swap260ms
          • motion.zoomIn600ms
          • motion.zoomOut400ms
          • motion.zoomScale1.07

          Breakpointsadopted

          Named rather than numeric, because the name is what gets said out loud.

          NameValue
          sm40rem
          md48rem
          lg64rem
          xl80rem