Skip to main content
Brand ⬩ Design system

Bryn, by Civic. The system as shipped.

A bryn is a hill. From the high ground you see the whole field before you move. Every mark, token, and idiom on this page is the one civic.com renders today: the swatches paint from the live tokens, the type is the live scale, the motion is the live contract.

01 ⬩ Marks

The horizon mark, the lockup, the Civic mark

One glyph carries the brand: a figure on a hill, watching the horizon. The hill fills with the stones gradient, the brand purple family stepped from soft to tint. Figure, ridge, and horizon line take the ink of the ground they sit on.

--text
--brand

Horizon mark

symbol#horizon ⬩ 300 × 300

Inline as <use href="#horizon">, the mark inherits currentColor for figure, ridge, and horizon line, so it is brand purple in the header, ink in the footer, and white on the drench. The standalone SVG pins the same paths for places that cannot inherit page CSS.

Bryn, by Civic lockup on a light groundbryn-lockup-civic-ink.svg
Bryn, by Civic lockup on a dark groundbryn-lockup-civic.svg

Lockup

BRYN ⬩ by Civic

Glyph at 24px in brand purple, BRYN in Geist extrabold at 17px, a 1px hairline, then by Civic with Civic in medium weight. This is the header composition on every page. The SVG lockups ship with the type outlined, one drawn for light grounds and one for dark.

--text
--text

Civic mark

civic-mark.svg ⬩ currentColor

The company mark. It rides the Company menu at 18px and links to civic.com. Inline it with fill="currentColor" so it takes the ink of its surface.

Use it like this

BRYNby CivicHeader lockup, light
BRYNby CivicHeader lockup, dark
Mark in ink, light
Mark in brand, dark

Bryn delivers revenue.

Watermark, border-strong

Bryn delivers revenue.

Drench glyph, on-brand

Clear space

The unit is x, the head of the figure: one quarter of the mark's width. The mark keeps at least 1x clear on every side. The lockup keeps at least the glyph's height, 4x, clear on every side.

mark 96px ⬩ x = 24px
mark 48px ⬩ x = 12px
BRYNby Civic
glyph 24px ⬩ 4x = 24px
x = head Ø 76 / 300 box = 0.25 × mark width ⬩ lockup clear = glyph height = 4x

Sizes in use

  • 18pxCivic mark, Company menu.nav-civic__mark
  • 24pxHorizon glyph, header lockup.brand__glyph
  • 40pxFooter mark.mark
  • 180 to 340pxSection watermark, border-strong at 50%.glyph-watermark
  • 220 to 340pxDrench glyph, on-brand at 18%.drench-glyph
02 ⬩ Color

Palette D

Warm paper in the light register, deep violet-black in the dark. Three accents, each with one job. The light theme is the base; dark applies through data-bryn-theme="dark" on .bryn-site, and any band can go dark on its own with data-band="dark".

Bryn delivers revenue.

--brand

Purple is impact and brand

The delivered word renders brand purple. Buttons, the drench, the hill fill, the noun the hero lands on.

  • visit/pricing
  • signalpricing → compare
  • composite76
--signal

Teal is the caught signal

Resolution, live data, the thing Bryn saw. It lights the hit in a sparkline, the numeral in a kicker, the tick in a progress track.

watching ⬩ 00:04:35Template
--warn

Coral is the cost of waiting

The watching clock, the template flag. Sparse by design.

Light ⬩ base

Accents

  • Brand--brand#7C3AED
  • Brand hover--brand-hover#6D28D9
  • Brand soft--brand-soft#9993FF
  • Brand shade--brand-shade#3E1973
  • Brand tint--brand-tint#1E1033
  • Brand on light--brand-on-light#5B1FA8text on the ground
  • Signal--signal#2FD9C2
  • Signal soft--signal-soft#7FF0E2
  • Signal on light--signal-on-light#0C6D60text on the ground
  • Warn--warn#FF7E5F
  • Warn on light--warn-on-light#A5330Etext on the ground

Ground and ink

  • Background--bg#FAF9F5
  • Background alt--bg-alt#F3F1EA
  • Surface--surface#FFFFFF
  • Surface alt--surface-alt#F1EFE7
  • Border--border#E7E4DB
  • Border strong--border-strong#C7C2B3
  • Text--text#211B12
  • Text secondary--text-secondary#5B5541
  • Text muted--text-muted#6A6249
Dark ⬩ data-bryn-theme="dark"

Accents

  • Brand--brand#7C3AED
  • Brand hover--brand-hover#6D28D9
  • Brand soft--brand-soft#9993FF
  • Brand shade--brand-shade#3E1973
  • Brand tint--brand-tint#1E1033
  • Brand on light--brand-on-light#9993FFtext on the ground
  • Signal--signal#2FD9C2
  • Signal soft--signal-soft#7FF0E2
  • Signal on light--signal-on-light#2FD9C2text on the ground
  • Warn--warn#FF7E5F
  • Warn on light--warn-on-light#FF7E5Ftext on the ground

Ground and ink

  • Background--bg#07050E
  • Background alt--bg-alt#0C0918
  • Surface--surface#191327
  • Surface alt--surface-alt#120C20
  • Border--border#2C2444
  • Border strong--border-strong#3D3360
  • Text--text#E2E8F0
  • Text secondary--text-secondary#94A3B8
  • Text muted--text-muted#7B8794

On brand

Text on purple is white, dimmed to 90% for secondary lines. The drench adds a radial white sheen at 18% from the lower right.

--on-brand
#FFFFFF
--on-brand-dim
rgba(255, 255, 255, 0.90)
03 ⬩ Type

Geist takes stances. Geist Mono speaks for the product.

Headings and prose set in Geist. Everything the product itself says sets in Geist Mono: readouts, cites, chips, stamps, Play names, log lines. Body letter-spacing runs at -0.005em site-wide. The scale is fluid and ramps again above 90rem, so the numbers below are the 1440 landing.

Geist

Buyers send signals. Bryn delivers pipeline.

--font-sansStance, headings, prose
Geist Mono

Run #0001 ⬩ demo.follow-up ⬩ 10:02:11 → 10:06:46 UTC

--font-monoReadouts, stamps, chips, cites
  1. Display.t-54.50rem900-0.035em1.02

    Bryn.

  2. Display 4.t-43.60rem800-0.035em1.02

    Buyers send signals.

  3. Page h1.t-33.40rem700-0.025em1.15

    Bryn watches. You decide.

  4. Section h2.t-21.90rem600-0.025em1.15

    Bryn Watches, Scores, Acts, Logs

  5. Lede.t-11.20rem500-0.005em1.45

    Under 10 minutes to your first identified, scored and recorded visitor.

  6. Body.t-01.05rem400-0.005em1.60

    A rule set once: when this happens, on an account like this, do that.

  7. Small.t--10.92rem400-0.005em1.45

    Bounded writes. Only the channels the Play names.

  8. Stamp.t--20.78rem5000.08em1.45

    S3 ⬩ BOUNDED WRITES

04 ⬩ Register

Stamps, hairlines, hills

The instrument-panel voice: mono uppercase stamps at 0.08em tracking, 1px hairline seams between bands, and the hill as section punctuation. Elevation is one hairline and a soft shadow, never a heavy card.

S3 ⬩ Bounded writesscore7d

Mono stamp

card-ord ⬩ fig-stamp ⬩ pg-stamp

Uppercase Geist Mono at step -2, muted ink, a ⬩ separator, and a hairline that runs out to the right. Section ordinals, figure stamps, and metadata rows all wear it.

Composite over the weekscore ⬩ 7d

Hairline and fig panel

fig ⬩ radius-lg ⬩ shadow-sm

Surface, 1px border, 20px radius, 24px padding, the small shadow. Adjacent bands seam with a 1px hairline; a dark band swallows the seams around it.

pricing comparison repeat (7d)
5Plays ship today

Chip pill and kicker

chip-pill ⬩ kicker__num

Chips are mono at step -2 with a border-strong edge and a teal arrow. The kicker is a sans label whose numeral sets tabular in teal ink.

Start the trialSee a live run

Buttons

btn--primary ⬩ btn--ghost

Semibold at step 0, 12px by 32px padding, 11px radius, 1px press. Primary is the brand fill; ghost is transparent with a border-strong edge.

The hill set

Three pieces in light and dark: a hero atmosphere, a section divider, and an ambient texture. The divider is the cheap one; it can repeat down a long page. The signal line traces the nearest ridge in teal.

Hero atmospherehill-horizon-hero-light.svghill-horizon-hero-dark.svg
Section dividerhill-divider-light.svghill-divider-dark.svg
Ambient texturehill-texture-light.svghill-texture-dark.svg
05 ⬩ Motion

Short, eased, and once

Content enters with a 22px rise over 600ms on the rise curve, staggered in four steps. Anything that starts below the fold holds its entrance until it is 35% in view, then plays once. Under prefers-reduced-motion every duration collapses to zero and nothing moves.

Durations

  • --dur-instant80msState flips
  • --dur-fast150msHover, border, color
  • --dur-base220msSegment entrance
  • --dur-slow400msSignal bounce and ping
  • --dur-reveal600msSection reveal
  • --dur-sweep2400msSweep across a panel
  • --dur-hero-ring6500msHero ring, breathing dot

Easings

  • --easecubic-bezier(0.4, 0, 0.2, 1)Default
  • --ease-risecubic-bezier(0, 0.55, 0.45, 1)Reveal, ping
  • --ease-ringcubic-bezier(0.34, 1.56, 0.64, 1)Overshoot
  • --ease-fallcubic-bezier(0.55, 0, 1, 0.45)Exit
The reveal contract.reveal ⬩ .seg ⬩ .s1 to .s4
  1. Stamp
  2. Hold
  3. Intersect
  4. Play once
.reveal rises 22px over --dur-reveal on --ease-rise; .seg rises 10px over --dur-base. .s1 to .s4 add the staggers below.

Staggers

  • --stagger-150ms
  • --stagger-2160ms
  • --stagger-3300ms
  • --stagger-4460ms
06 ⬩ Voice

Two names, one register

  • The company is Civic. The product is Bryn, by Civic. The category is signal-based GTM: go-to-market driven by what a buyer actually does on your site and in your product.
  • Builder-native, confident, plain-spoken. Contractions are the rule. Outcomes lead; tools, mechanism, and price appear as proof of an outcome claim.
  • Punctuation is periods, commas, and colons. The ⬩ separator joins stamps and ordinals.
  • Prose takes stances in Geist. The product speaks in Geist Mono, byte-exact: Play names, readouts, log lines, chip grammar. Fit, Intent, Timing, and Composite are the score dimensions; Play is the product noun.

Bryn watches. You decide the Play. Bryn runs it.

Product h1, as shipped