This site runs on its own small design system.

Tokens, a type ramp, and a handful of patterns, documented here as living examples rendered by the same stylesheet that renders every page.

Brand

Christina Dobi monogram
Monogramon light
Christina Dobi monogram, white
Monogramon brand ink

Wordmark

Christina Dobi

wordmark · bold 26px in $color-brand-ink · anchors the header on every page

The biggest brand moment is the homepage hero: full-screen video under an 85% $color-brand-ink overlay, with the white monogram and wordmark reversed out. Everything in the hero is large type, which keeps it readable over any video frame.

Color

$color-brand#2EB7FC · decorative
$color-brand-ink#1b76bc · 4.8:1
$color-brand-deep#14588d · 7.5:1
$color-text#323E59 · 10.7:1
$color-body#6b6b6b · 5.3:1
$color-muted#767676 · 4.5:1
$color-band-light#F5F3F8
$color-border#e8e8e8

Each project on the work page carries one color, shown in its tile overlay. Every one holds white tile text at 4.5:1 or better.

Survey Tool · Design System#1b76bc
Zebbly#7457a1
Recruiting App#2f6cb3
GLG Homepage#c9423f
Gibbs Tuff · Lightburn#c2560a
Maps of Imaginary Places#7f5aa0
Auction Ninja#3E4A73

Type

Heading one

h1 · Source Sans Pro · normal · 2.441em / 3.052em

Heading two carries the statements

h2 · bold · 1.953em / 2.441em · used with .subhead for page openers

Heading three for article sections

h3 · normal · 1.563em / 1.953em

Heading four titles cards and list items

h4 · normal · 1.25em / 1.333em

Section headline

h4.headline · uppercase with eyebrow tracking · labels a homepage or style-guide section

The subhead is the standfirst under a statement.

.subhead · weight 100 · 24px

Eyebrow label

eyebrow pattern · 13px bold caps · 0.12em tracking · accent -ink color

Body copy is Source Sans Pro light at 18px ($type-body-size) with 1.6 line height, in $color-body gray. Links pick up the brand ink blue, and emphasis uses the navy text color.

p · weight 200 · 18px / 1.6 · $type-body-size

Spacing

$space-xs · 10px
$space-sm · 15px
$space-md · 30px
$space-lg · 45px
$space-xl · 65px

Landing sections breathe at $space-lg, opening to $space-xl on wider screens (section-rhythm mixin).

Layout

Pages sit on a 12-column grid. Long-form content lives in a centered 9-column reading measure; back links and headers align to the container edge. Sections alternate between three full-bleed bands:

$color-surface · primary content
$color-band-light · alternating sections, screenshot bands
$color-brand-ink · contact band with white text; CTAs keep bright $color-brand with navy
work pages alternate content sections with full-bleed $color-band-light screenshot bands

Patterns

Accent card

.accent-card component (card.scss) · white surface, 4px $color-brand top border, $shadow-card · one accent color only

Engineering

Building robust, maintainable products from the ground up.

Product Innovation

Turning ideas and opportunities into products.

Featured work section

title + chip, intro, sub-items over rounded media panels tinted with the project accent (10% mix)

Zebbly Live Product

Wishlists with context

Lists carry sizes, interests, and notes.

Zebbly wishlist panel example

Portfolio tile

4:3 image, accent bar with title revealed on hover

Back link

eyebrow style in $color-brand-ink · nudges left on hover · tops every detail page, aligned to the container edge

← Back to work

Call to action

.ed-cta · bright $color-brand pill, bold navy label · inverts to navy on hover

Let’s Talk

Highlight band

.container-highlight · full-bleed $color-brand-ink band with white text (4.8:1)

Say Hello

Full-width brand moments: the contact band, the Instagram section.

Links

A default link is $color-brand-ink blue, deepening on hover.

a · $color-brand-ink · hover $color-brand-deep · underlined when inside running text

A more link leads somewhere →

.ed-more-link · bold, with a trailing arrow · section footers

Motion

Content enters with a fade.

.fadeInUp / .fadeIn · 1s ease, 0.2s delay · statements and page openers only

Everything interactive answers in 0.15s ease: cards lift their shadow, tiles reveal their accent bar, the back link nudges left, the CTA deepens. Motion confirms, it never decorates.

Motion is optional: when the visitor prefers reduced motion, entrance fades are skipped and the hero video starts paused. The video always carries its own pause control.

Imagery

Portfolio tiles are 4:3 (1600×1200) screenshots or product art. Work pages show full-width screenshots on $color-band-light bands, up to 1000px wide. Featured panels crop tall screenshots at a 16px-radius edge, top-aligned, over a 10% accent tint. Photos get an 8px radius.

Accessibility

The system is built to WCAG 2.1 Level AA. The rules below are part of the design language, not an overlay on top of it.

Contrast

Every text color meets a 4.5:1 contrast ratio on the surfaces it appears on, including $color-band-light and the accent tints. $color-body (5.3:1) and $color-muted (4.5:1) are the lightest grays allowed for copy. $color-brand-ink is the single text blue, holding 4.8:1 on white; the bright $color-brand survives as fills that carry navy text, never white. Accent colors used as text swap to their -ink variants.

tokens.scss documents the measured ratio next to each color

Keyboard

A skip link jumps to the main landmark, every page uses one <main>, and all interactive elements show a 3px $color-brand-ink focus ring. Hover-revealed content, like the portfolio tile overlay, also reveals on focus.

:focus outline · 3px $color-brand-ink · 2px offset · never removed

Motion

The hero video has a visible pause control and respects prefers-reduced-motion, which also disables entrance animations.

Images and icons

Every content image carries descriptive alt text; images that repeat adjacent text use empty alt. Icon-only links carry aria-labels and hide their glyphs from screen readers.

Links

Links inside running text are underlined, never distinguished by color alone.

Voice

Sentence case everywhere, including headlines; only section labels are uppercase. Statements are short, first-person claims: "I build thoughtful products that make complex things feel simple." Never an em dash; reach for a comma, a colon, or a middot. Middots separate inline lists: Product · Frontend · UX. Plain words over jargon.

The system lives in _sass/tokens.scss, _sass/patterns.scss, and shared components like _sass/card.scss.

Say Hello

You can reach me by email, I'd love to hear from you.