Design system.

Logo, color, type, space, motion and components for Invitebase. Every value on this page is read from @invitebase/design at build time: 160 tokens, no screenshots.

Color.

Graphite ground, iron panels, porcelain text. Patina is the one signal: the primary action or an earned success. Each swatch lists its role tokens and its contrast against Porcelain and Graphite text, computed at build time.

Palette

  • Graphite #202529 · marketing.color.graphite

    Page ground, terminal surface, primary-button ink. Also <meta name="theme-color">.

    Roles: background.pagetext.on-lighttext.on-primarytext.on-steelborder.focus-on-lightaction.primary-inkaction.primary-wipeaction.solid-on-lightselection.text

    Porcelain text
    14.22:1 AA Pass Large Pass
    Graphite text
    1.00:1 AA Fail Large Fail
  • Porcelain #F2F6F8 · marketing.color.porcelain

    Primary text on dark; light product/form surface; wordmark letters.

    Roles: background.lighttext.primary

    Porcelain text
    1.00:1 AA Fail Large Fail
    Graphite text
    14.22:1 AA Pass Large Pass
  • Iron fabric #2E3337 · marketing.color.iron-fabric

    Grouping surface (hero, cards, callouts) and the default section hairline.

    Roles: background.panelborder.default

    Porcelain text
    11.74:1 AA Pass Large Pass
    Graphite text
    1.21:1 AA Fail Large Fail
  • Patina #ABB557 · marketing.color.patina

    The Signal. Primary conversion action and earned success only.

    Roles: text.successaction.primarystatus.success

    Porcelain text
    2.04:1 AA Fail Large Fail
    Graphite text
    6.98:1 AA Pass Large Pass
  • Steel support #8696A3 · marketing.color.steel-support

    Secondary actions, labels, interactive borders, neutral states, selection.

    Roles: background.steeltext.supportingborder.interactiveaction.secondary-borderaction.secondary-wipeaction.steelstatus.pendingselection.background

    Porcelain text
    2.80:1 AA Fail Large Fail
    Graphite text
    5.08:1 AA Pass Large Pass
  • Copper #BE7D5C · marketing.color.copper

    Brand mark colour; editorial accent; meaningful intermediate state.

    Roles: text.accentaction.copperstatus.withheld

    Porcelain text
    3.08:1 AA Fail Large Pass
    Graphite text
    4.62:1 AA Pass Large Pass
  • Content muted #B5C1CA · marketing.color.content-muted

    Readable secondary prose on dark surfaces.

    Roles: text.secondary

    Porcelain text
    1.69:1 AA Fail Large Fail
    Graphite text
    8.43:1 AA Pass Large Pass
  • Divider #536069 · marketing.color.divider

    Quiet separation inside iron cards and lists.

    Roles: border.divider

    Porcelain text
    5.95:1 AA Pass Large Pass
    Graphite text
    2.39:1 AA Fail Large Fail
  • White #FFFFFF · marketing.color.white

    Auth inputs and OAuth buttons on porcelain (auth.css).

    Roles: background.input

    Porcelain text
    1.09:1 AA Fail Large Fail
    Graphite text
    15.46:1 AA Pass Large Pass
  • Slate ink #56646E · marketing.color.slate-ink

    Muted text inside light (porcelain) demo cards. Used in journey.css and product.css.

    Roles: text.on-light-muted

    Porcelain text
    5.61:1 AA Pass Large Pass
    Graphite text
    2.54:1 AA Fail Large Fail
  • Mist line #CBD5DA · marketing.color.mist-line

    Hairlines inside light demo cards. Used in journey.css and product.css.

    Roles: border.on-light

    Porcelain text
    1.37:1 AA Fail Large Fail
    Graphite text
    10.36:1 AA Pass Large Pass
  • Iron hover #353D42 · marketing.color.iron-hover

    Hover background for linked content cards. Used in motion.css.

    Roles: background.panel-hover

    Porcelain text
    10.18:1 AA Pass Large Pass
    Graphite text
    1.40:1 AA Fail Large Fail
  • Error ink #813323 · marketing.color.error-ink

    Auth error text. Used in auth.css.

    Roles: status.error-ink

    Porcelain text
    7.94:1 AA Pass Large Pass
    Graphite text
    1.79:1 AA Fail Large Fail
  • Error edge #A64535 · marketing.color.error-edge

    Auth error left border (3px). Used in auth.css.

    Roles: status.error-edge

    Porcelain text
    5.48:1 AA Pass Large Pass
    Graphite text
    2.59:1 AA Fail Large Fail
  • Error wash #F9E9E5 · marketing.color.error-wash

    Auth error background. Used in auth.css.

    Roles: status.error-wash

    Porcelain text
    1.08:1 AA Fail Large Fail
    Graphite text
    13.12:1 AA Pass Large Pass

Text roles on their surfaces

AA needs 4.5:1 for normal text and 3:1 for large text (24px, or 18.66px bold). Pairs come from the role tokens: text.on-* on its surface, other text roles on the page and panel backgrounds. Samples are pictures of the pairing; the result is written out beside each one.

Text roleSurface roleSampleRatioAA normalAA large
text.primaryPorcelain background.pageGraphite 14.22:1 Pass Pass
text.primaryPorcelain background.panelIron fabric 11.74:1 Pass Pass
text.secondaryContent muted background.pageGraphite 8.43:1 Pass Pass
text.secondaryContent muted background.panelIron fabric 6.96:1 Pass Pass
text.supportingSteel support background.pageGraphite 5.08:1 Pass Pass
text.supportingSteel support background.panelIron fabric 4.20:1 Fail Pass
text.accentCopper background.pageGraphite 4.62:1 Pass Pass
text.accentCopper background.panelIron fabric 3.82:1 Fail Pass
text.successPatina background.pageGraphite 6.98:1 Pass Pass
text.successPatina background.panelIron fabric 5.76:1 Pass Pass
text.on-lightGraphite background.lightPorcelain 14.22:1 Pass Pass
text.on-light-mutedSlate ink background.lightPorcelain 5.61:1 Pass Pass
text.on-primaryGraphite action.primaryPatina 6.98:1 Pass Pass
text.on-steelGraphite background.steelSteel support 5.08:1 Pass Pass
text.on-steelGraphite action.steelSteel support 5.08:1 Pass Pass
status.error-inkError ink status.error-washError wash 7.33:1 Pass Pass

Typography.

PP Editorial New for headlines, PP Neue Montreal for explanation, prices and emphasis, and one mono treatment for labels and buttons. Every specimen below is set from its token. PP Neue Montreal and PP Editorial New are licensed Pangram Pangram fonts; the docs and dashboard use PP Neue Montreal only, never Editorial New.

Families

  • PP Neue Montreal
    Token
    marketing.font.sans
    Stack
    'PP Neue Montreal', 'PP Neue Montreal Fallback', 'PP Neue Montreal Fallback Android', ui-sans-serif, system-ui, sans-serif
    Weights
    400, 500, 600, 700 (Extrabold cut)
    Axes
    —
    Used by
    heading, subsection, card-title, lede, body, prose, body-sm, supporting, price, emphasis
  • PP Editorial New
    Token
    marketing.font.display
    Stack
    'PP Editorial New', 'PP Editorial New Fallback', 'PP Editorial New Fallback Android', Georgia, serif
    Weights
    400
    Axes
    —
    Used by
    hero, display, page-title, h2, h3
  • JetBrains Mono
    Token
    marketing.font.mono
    Stack
    'JetBrains Mono', ui-monospace, monospace
    Weights
    700
    Axes
    —
    Used by
    mono, label, eyebrow, nav, button, legal, code

Type roles

  • Hero marketing.typography.hero
    Family
    PP Editorial New
    Size
    clamp(68px, min(8.333vw, 13svh), 180px) fontSize.hero
    Line height
    0.86
    Tracking
    -0.03em
    Weight
    400
    Axes
    wght 400

    Referrals, verified.

  • Display marketing.typography.display
    Family
    PP Editorial New
    Size
    clamp(56px, 32.23px + 6.095vw, 120px) fontSize.display
    Line height
    0.9
    Tracking
    -0.03em
    Weight
    400
    Axes
    wght 400

    Referrals, verified.

  • Page title marketing.typography.page-title
    Family
    PP Editorial New
    Size
    clamp(56px, 32.23px + 6.095vw, 120px) fontSize.display
    Line height
    0.9
    Tracking
    -0.03em
    Weight
    400
    Axes
    wght 400

    Referrals, verified.

  • H2 marketing.typography.h2
    Family
    PP Editorial New
    Size
    clamp(48px, 31.66px + 4.190vw, 92px) fontSize.h2
    Line height
    0.9
    Tracking
    -0.03em
    Weight
    400
    Axes
    wght 400

    Referrals, verified.

  • H3 marketing.typography.h3
    Family
    PP Editorial New
    Size
    clamp(40px, 28.49px + 2.952vw, 71px) fontSize.heading
    Line height
    0.95
    Tracking
    -0.03em
    Weight
    400
    Axes
    wght 400

    Referrals, verified.

  • Heading marketing.typography.heading
    Family
    PP Neue Montreal
    Size
    clamp(40px, 28.49px + 2.952vw, 71px) fontSize.heading
    Line height
    1.02
    Tracking
    -0.02em
    Weight
    400
    Axes
    wght 400

    Rewards land only when a referral qualifies.

  • Subsection marketing.typography.subsection
    Family
    PP Neue Montreal
    Size
    clamp(30px, 23.31px + 1.714vw, 48px) fontSize.subsection
    Line height
    1.05
    Tracking
    -0.025em
    Weight
    400
    Axes
    wght 400

    Rewards land only when a referral qualifies.

  • Card title marketing.typography.card-title
    Family
    PP Neue Montreal
    Size
    clamp(26px, 22.66px + 0.857vw, 35px) fontSize.card-title
    Line height
    1.1
    Tracking
    -0.02em
    Weight
    400
    Axes
    wght 400

    Rewards land only when a referral qualifies.

  • Lede marketing.typography.lede
    Family
    PP Neue Montreal
    Size
    clamp(18px, 16.51px + 0.381vw, 22px) fontSize.lede
    Line height
    1.35
    Tracking
    normal
    Weight
    500
    Axes
    wght 500

    Rewards land only when a referral qualifies.

  • Body marketing.typography.body
    Family
    PP Neue Montreal
    Size
    clamp(16px, 14.89px + 0.286vw, 19px) fontSize.body
    Line height
    1.4
    Tracking
    normal
    Weight
    500
    Axes
    wght 500

    Rewards land only when a referral qualifies.

  • Prose marketing.typography.prose
    Family
    PP Neue Montreal
    Size
    clamp(16px, 14.89px + 0.286vw, 19px) fontSize.body
    Line height
    1.6
    Tracking
    normal
    Weight
    500
    Axes
    wght 500

    Rewards land only when a referral qualifies.

  • Body sm marketing.typography.body-sm
    Family
    PP Neue Montreal
    Size
    clamp(15px, 14.63px + 0.095vw, 16px) fontSize.body-sm
    Line height
    1.4
    Tracking
    normal
    Weight
    500
    Axes
    wght 500

    Rewards land only when a referral qualifies.

  • Supporting marketing.typography.supporting
    Family
    PP Neue Montreal
    Size
    13px fontSize.supporting
    Line height
    1.5
    Tracking
    0em
    Weight
    400
    Axes
    wght 400

    Rewards land only when a referral qualifies.

  • Price marketing.typography.price
    Family
    PP Neue Montreal
    Size
    clamp(60px, 51.09px + 2.286vw, 84px) fontSize.price
    Line height
    1
    Tracking
    -0.06em
    Weight
    700
    Axes
    wght 700

    Rewards land only when a referral qualifies.

  • Emphasis marketing.typography.emphasis
    Family
    PP Neue Montreal
    Size
    clamp(29px, 24.91px + 1.048vw, 40px) fontSize.emphasis
    Line height
    0.95
    Tracking
    -0.04em
    Weight
    600
    Axes
    wght 600

    Rewards land only when a referral qualifies.

  • Mono marketing.typography.mono
    Family
    JetBrains Mono
    Size
    Inherited
    Line height
    Inherited
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Label marketing.typography.label
    Family
    JetBrains Mono
    Size
    12px fontSize.mono-md
    Line height
    1.4
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Eyebrow marketing.typography.eyebrow
    Family
    JetBrains Mono
    Size
    11px fontSize.mono-sm
    Line height
    1.4
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Nav marketing.typography.nav
    Family
    JetBrains Mono
    Size
    11px fontSize.mono-sm
    Line height
    1.3
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Button marketing.typography.button
    Family
    JetBrains Mono
    Size
    12px fontSize.mono-md
    Line height
    1.5
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Legal marketing.typography.legal
    Family
    JetBrains Mono
    Size
    10px fontSize.mono-xs
    Line height
    1.6
    Tracking
    0.05em
    Weight
    700
    Case
    uppercase
    Axes
    wght 700

    Payout queued

  • Code marketing.typography.code
    Family
    JetBrains Mono
    Size
    14px fontSize.mono-xl
    Line height
    1.6
    Tracking
    0.05em
    Weight
    700
    Case
    none
    Axes
    wght 700

    Payout queued

Size scale

  • mono-xs10px
  • mono-sm11px
  • mono-md12px
  • mono-lg13px
  • mono-xl14px
  • supporting13px
  • body-smclamp(15px, 14.63px + 0.095vw, 16px)
  • bodyclamp(16px, 14.89px + 0.286vw, 19px)
  • ledeclamp(18px, 16.51px + 0.381vw, 22px)
  • card-titleclamp(26px, 22.66px + 0.857vw, 35px)
  • emphasisclamp(29px, 24.91px + 1.048vw, 40px)
  • subsectionclamp(30px, 23.31px + 1.714vw, 48px)
  • headingclamp(40px, 28.49px + 2.952vw, 71px)
  • priceclamp(60px, 51.09px + 2.286vw, 84px)
  • h2clamp(48px, 31.66px + 4.190vw, 92px)
  • displayclamp(56px, 32.23px + 6.095vw, 120px)
  • heroclamp(68px, min(8.333vw, 13svh), 180px)

Weights

  • regular400
  • medium500
  • semibold600
  • bold700 · Extrabold cut

Spacing & radius.

Every region sits in a 1px section box, 8px apart, with 3px corners. Controls are square. The only shadows are the two below.

Spacing

  • page16px Outer page gutter (8px below 768px, see page-mobile).
  • panel8px Gap between every section box, card and plan.
  • page-mobile8px
  • sectionclamp(32px, 5vw, 72px) Vertical rhythm of secondary sections.
  • heading-copy24px
  • mobile-section24px Mobile inline gutter inside section boxes.
  • mobile-heading-copy24px
  • inset36px Recurring desktop inline padding inside section boxes (home, pricing, footer).

Sizes

  • control-min44px Minimum tap target (DESIGN_SYSTEM.md).
  • button-height54px MotionLink min-height; padding 17px 20px; label/arrow gap 24px.
  • input-height48px Auth inputs; submit 49px.
  • page-min320px
  • content-max1440px .content-shell max width (content.css).
  • prose-max960px
  • lede-max760px

Radius

  • panel3pxSection boxes, panels, cards, masthead.
  • control0pxButtons and inputs are square.

Borders

  • hairline1px
  • focus2pxoutline: 2px solid currentColor; outline-offset 5px (global), 3px in home/FAQ, -4px in header.
  • error3px

Shadows

  • floating0px 12px 28px 0px rgb(0 0 0 / 0.24)scroll-header.css
  • mockup0px 12px 30px 0px rgb(32 37 41 / 0.1)appearance.css (light preview frames).

Breakpoints

  • phone600px
  • mobile700pxMobile gutters/type tokens switch on.
  • tablet800pxStacks masthead, two-column layouts, FAQ.
  • laptop1200px
  • desktop1440pxPaper reference width; above 1441px layouts scale fluidly.
  • phone-small375pxShared responsive set (INV-326). Small phone (iPhone SE / mini class).
  • phone-max430pxShared responsive set. Current phones run 390-430px; use max-width 430px for phone rules.
  • tablet-portrait768pxShared responsive set. max-width 767px is phone and small tablet; min-width 768px is tablet and up.
  • tablet-landscape1024pxShared responsive set. Tablet landscape / small laptop.
  • desktop-min1280pxShared responsive set. Desktop layouts start here; a tablet/phone pass must not change anything at or above it.

Motion.

Motion confirms an action or reveals content; it never carries meaning on its own. Every animation has a reduced-motion equivalent.

Each dot travels for 850ms (marketing.motion.duration.entrance) on its own curve. Your system asks for reduced motion, so the dots jump to the end.

  • wipe marketing.motion.easing.wipe
    CSS
    cubic-bezier(0.76, 0, 0.24, 1)

    Button wipe (motion.css).

  • gsap-out marketing.motion.easing.gsap-out
    CSS
    cubic-bezier(0.25, 1, 0.5, 1)
    GSAP
    power3.out

    Entrances and reveals. GSAP uses the named ease power3.out ($extensions.invitebase.gsap); the value is its standard cubic-bezier equivalent (easeOutQuart) for CSS.

  • gsap-in-out marketing.motion.easing.gsap-in-out
    CSS
    cubic-bezier(0.76, 0, 0.24, 1)
    GSAP
    power3.inOut

    Scripted button wipe (0.48s). GSAP uses the named ease power3.inOut ($extensions.invitebase.gsap); the value is its standard cubic-bezier equivalent (easeInOutQuart), the same curve as the CSS wipe.

Durations

  • press140ms Button press scale to 0.98 (GSAP power2.out).
  • hover200ms Colour transitions (footer links, FAQ summary).
  • lift300ms Card hover lift translateY(-4px).
  • wipe450ms CSS button wipe; GSAP uses 0.48s power3.inOut.
  • reveal750ms Scroll reveal (y 22px, stagger 0.08s, start 'top 88%').
  • entrance850ms Hero entrance (y 24px, stagger 0.1s).

Other motion tokens

  • smooth-scroll0.12Lenis lerp; anchors offset -96px; disabled for reduced motion.

Components.

The site's own components in each state. Each state grid is a static picture: it is inert, so it doesn't trap keyboard focus. Use the live example under each grid to try the real thing. States the system doesn't define are marked as not defined.

Buttons

MotionLink: a square mono label with a wipe and a cap-height arrow. primary is the one patina action per view; secondary is the outline treatment.

Start free Start free
Primary · defaultSquare, mono label, cap-height arrow.
Start free Start free
Primary · hoverFill wipes up; the arrow exits and re-enters.
Start free Start free
Primary · focusSame wipe as hover, plus the focus outline.
Start free Start free
Primary · activePresses to 0.98 scale.
Primary · disabledNative disabled button at 60% opacity.
Primary · loadingDisabled, with a pending label and aria-busy.
Start free Start free

That didn't send. Try again.

Primary · errorButton stays usable; the message sits below it.
Start free Start free
Secondary · defaultSquare, mono label, cap-height arrow.
Start free Start free
Secondary · hoverFill wipes up; the arrow exits and re-enters.
Start free Start free
Secondary · focusSame wipe as hover, plus the focus outline.
Start free Start free
Secondary · activePresses to 0.98 scale.
Secondary · disabledNative disabled button at 60% opacity.
Secondary · loadingDisabled, with a pending label and aria-busy.
Start free Start free

That didn't send. Try again.

Secondary · errorButton stays usable; the message sits below it.

Inputs

Native fields on a light surface, as on sign-in and sign-up: square, steel border, graphite focus ring.

Input · defaultSteel border on white.
Input · hoverNo hover treatment: same as default.
Input · focusGraphite border and 2px graphite ring.
Input · activeFocused while typing.
Input · disabledBrowser default; no system style yet.
Not defined
Input · loadingFields have no loading state; the submit button carries it.

Enter a full email address.

Input · errorMessage below the field; the border does not change.

Cards

Linked content cards on iron with a divider border. On hover they lift 4px onto iron-hover.

Guide Fraud checks Read
Card · defaultIron, divider border, 3px corners.
Guide Fraud checks Read
Card · hoverSteel border, iron-hover fill, lifts 4px.
Guide Fraud checks Read
Card · focusSteel border and focus outline; no lift.
Guide Fraud checks Read
Card · activeNo pressed treatment: same as hover.
Not defined
Card · disabledCards are links; there is no disabled card.
Not defined
Card · loadingNo skeleton card in the system.
Not defined
Card · errorNo error card in the system.

Badges

Status badges from the product demos. They aren't interactive, so hover, focus, active and disabled don't apply.

Passed
Badge · defaultPatina: an earned success.
Not interactive
Badge · hoverDoes not apply.
Not interactive
Badge · focusDoes not apply.
Not interactive
Badge · activeDoes not apply.
Not interactive
Badge · disabledDoes not apply.
Pending
Badge · loadingSteel tint: in progress.
Not defined
Badge · errorNo failure badge yet.

Navigation

The compact grid header: mono labels in framed cells, iron fill on hover, and dropdown triggers that gain an underline while their menu is open. The footer below is the other navigation pattern, live on this page.

Nav item · defaultPorcelain mono label in a 1px iron-fabric cell.
Nav item · hoverIron fill with porcelain text: 11.74:1, passes AA.
Nav item · focusSame fill as hover, 2px outline inset 4px.
Nav item · activeOpen menu trigger: iron fill, 2px porcelain underline, caret flipped.
Not defined
Nav item · disabledNav items are never disabled.
Not defined
Nav item · loadingDoes not apply.
Not defined
Nav item · errorDoes not apply.

Panels

Section boxes frame every region. Iron panels group content. The error panel is the only error surface in the system.

Section box

Graphite, 1px iron border, 3px corners.

Panel · default
Iron panel

Iron fill with a divider border for heroes, cards and callouts.

Panel · grouped

Error panel: error ink on error wash with a 3px error edge.

Panel · errorPanels have no hover, focus, active, disabled or loading state.

Do's & don'ts.

Short rules that keep pages consistent. The contrast numbers here are computed from the tokens, so they update when the palette does.

Do

  • Put every region in a 1px iron section box, 8px apart, with 3px corners.
  • Use one patina element per view: the primary action or an earned success.
  • Put Graphite text on Patina fills (6.98:1).
  • Put Graphite text on Steel support fills (5.08:1).
  • Put Graphite text on Copper fills (4.62:1).
  • Use content-muted for small secondary text on iron.
  • Write mono labels in uppercase and pair them with the cap-height arrow.
  • Keep controls at least 44px tall and let button groups wrap.
  • Give every animation a reduced-motion equivalent.

Don't

  • Don't put Porcelain text on Patina: 2.04:1 fails AA at any size.
  • Don't put Porcelain text on Steel support: 2.80:1 fails AA at any size.
  • Don't put Porcelain text on Copper: 3.08:1 fails AA for normal text.
  • Don't set body-size Steel support text on Iron fabric (text.supporting on background.panel): 4.20:1. It passes for large text only.
  • Don't set body-size Copper text on Iron fabric (text.accent on background.panel): 3.82:1. It passes for large text only.
  • Don't add gradients, glows or shadows beyond the shadow tokens.
  • Don't round buttons or inputs, or use pill shapes.
  • Don't use patina for decoration, idle states or tabs.
  • Copper is reserved for sign-up and sales CTAs (header SIGN UP, Enterprise). Don't use it for general actions, and don't put it in a button group next to the patina primary.
  • Don't recolor, retype or stretch the logo.