Crown Design
Foundations

Radius

Crown's border-radius scale and when to use each step.

R = 2px
radius-xs
R = 4px
radius-sm
R = 6px
radius-sm-nudge
R = 8px
radius-cta-lg
R = 8px
radius-cta-md
R = 8px
radius-cta-sm
R = 8px
radius-list-grouped
R = 8px
radius-md
R = 12px
radius-md-nudge
R = 16px
radius-lg
R = 240px · full
radius-cta-r
R = 240px · full
radius-rounded

About the scale

Radius tokens give every brand a consistent corner-roundness language. Every primitive step is derived from three private dimens — base, stepdown, and stepup — so a brand can shift the entire scale by changing only those three values, and every dependent token follows. radius-md is the anchor: descend in stepdown increments to reach sm and xs, ascend in stepup increments to reach lg, and use radius-rounded for the pill end.

2radius-xs
4radius-sm
6radius-sm-nudge
85 tokens
12radius-md-nudge
16radius-lg
2402 tokens
TokenMath
radius-xsbase − 3 × stepdown
radius-smbase − 2 × stepdown
radius-sm-nudgebase − 1 × stepdown
radius-mdbase (anchor)
radius-md-nudgebase + 1 × stepup
radius-lgbase + 2 × stepup
radius-roundedpill anchor

Resolved pixel values live in the active brand — the ladder above, the corner specimens at the top, and the full token inventory below all read live from the brand selected in the header, so the numbers you see match what your application gets.

Using the scale

Pick a token by intent, not by the size it happens to be at today.

TokenUse it for
radius-xsInline chips, micro-tags, the inside corner of a focus ring on a sharp shape.
radius-smCheckboxes, small inputs, dense table cells.
radius-mdDefault for cards, inputs, dropdowns, modals, tooltips — reach here first.
radius-lgHero cards, large containers, sheets, full-bleed surfaces.
radius-roundedPills, avatars, status dots, badges that should read as fully round.

Nudge tokens — use sparingly

radius-sm-nudge (6 px) and radius-md-nudge (12 px) sit one stepdown above their base. Reach for them only when the adjacent base step feels off by exactly one increment — for example, a card whose interior is radius-md but whose outer container needs to feel slightly softer than radius-lg. Default to the base steps; nudges are a fine-tuning escape hatch, not a fourth and fifth ladder rung.

Semantic aliases

Some tokens carry semantic intent rather than a position on the scale. Prefer the alias over the primitive when the intent matches — that way, if the design system later drifts (e.g. all CTAs adopt a softer corner), only the alias moves and every CTA updates with it. Brands are free to override an alias independently of its primitive, so don't assume an alias and a primitive that happen to share a pixel value today will keep doing so.

AliasUse it for
radius-cta-smSmall primary / secondary buttons.
radius-cta-mdDefault button size.
radius-cta-lgLarge CTAs and hero buttons.
radius-cta-rPill-shaped CTAs.
radius-list-groupedThe outer corners of a grouped list (settings rows, etc.).

Live pixel values for each alias are in the full token inventory at the bottom of the page, resolved against the active brand.

Pairing with focus rings

A focus ring should trace the component's shape, not float on top of it. The ring's own radius must equal the component's radius plus the ring offset — otherwise the ring corners pinch inward (offset too small) or balloon outward (offset too large).

.button {
  border-radius: var(--crown-radius-md);
}
.button:focus-visible {
  outline: 2px solid var(--crown-color-border-focus);
  outline-offset: 2px;
  border-radius: calc(var(--crown-radius-md) + 2px);
}

Dedicated radius-focus-* tokens are not shipped yet. Until they land, derive the focus radius with calc() against the component's radius token rather than hard-coding a value — that keeps the relationship intact when the base scale changes per brand.

Applying radius in code

Every radius token is exposed as a CSS custom property under --crown-radius-* and as a Tailwind utility under rounded-*.

CSS custom properties

.card {
  border-radius: var(--crown-radius-md);
}
.pill {
  border-radius: var(--crown-radius-rounded);
}

Tailwind utilities

<div className="rounded-md">…</div>
<div className="rounded-lg">…</div>
<button className="rounded-cta-md">Save</button>
<span  className="rounded-rounded">New</span>

Per-side and per-corner

The Tailwind preset emits side and corner variants for every token. Use them when only some corners should round — e.g. a tab head, a stacked card group, or the top of a bottom sheet.

<div className="rounded-t-lg">              {/* top corners only */}
<div className="rounded-tl-md rounded-tr-md"> {/* explicit per corner */}
<div className="rounded-s-md">               {/* logical start side  */}

Resetting

Use rounded-none (or border-radius: 0) to flatten corners — for example, on the inner edge of a button group where adjacent buttons should share a seam.

Do and don't

  • Reach for the semantic alias (radius-cta-*, radius-list-grouped) before the primitive when the intent matches. It future-proofs the call site against scale drift.
  • Use radius-rounded for pills and circular shapes. It resolves to a value larger than any in-system component width, so the corners always meet.
  • Derive focus-ring radius with calc(var(--crown-radius-*) + offset) so the ring stays concentric with the component.
  • Don't mix scales inside a single component. An outer card at radius-lg with inner controls at radius-xs reads as two design systems colliding. Stay within one step.
  • Don't reach for -nudge tokens by default. They exist for narrow cases where the base step is one increment off; defaulting to them flattens the ladder.
  • Don't hard-code px values even when they match a token today. Brands override the underlying scale, and hard-coded values silently skip brand theming.

All radius tokens

The table below lists every radius token emitted by the build, including the semantic aliases.

TokenLayerKing Power lightKing Power dark
radius-cta-lg
--crown-radius-cta-lg
screen8px8px
radius-cta-md
--crown-radius-cta-md
screen8px8px
radius-cta-r
--crown-radius-cta-r
screen240px240px
radius-cta-sm
--crown-radius-cta-sm
screen8px8px
radius-lg
--crown-radius-lg
screen16px16px
radius-list-grouped
--crown-radius-list-grouped
screen8px8px
radius-md
--crown-radius-md
screen8px8px
radius-md-nudge
--crown-radius-md-nudge
screen12px12px

On this page