Skip to content
Style guide

Elements and design system

The fonts, colors, logos, and components that westphalsolutions.com is built from, in both light and dark modes. This page also doubles as the brand guide and the working reference for current and future projects.

Lato is the core brand font for Westphal Solutions, used across our logo, digital presence, and print media. Our three secondary fonts are used only for specific functions detailed below.

Lato

The quick brown fox jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 {}[]()<>/\|!?#$%&*+=-_~^:;.,'"`

Headings, body, buttons, labels, navigation, posts, contracts, and decks. Nine weights and a full italic set, so one family covers the brand without running thin.

Lora

The quick brown fox jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 {}[]()<>/\|!?#$%&*+=-_~^:;.,'"`

Not used for headings, UI labels, or site copy. Reserved exclusively for user content, like markdown previews and generated documents.

JetBrains Mono

The quick brown fox jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 {}[]()<>/\|!?#$%&*+=-_~^:;.,'"`

Used strictly for displaying code across the site.

VT323

The quick brown fox jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 {}[]()<>/\|!?#$%&*+=-_~^:;.,'"`

A fun, retro accent used only for web games on the site.

Six heading levels, all Lato. Sizes scale with the screen, so each spec lists the desktop size first and the mobile size second.

Heading 1

Lato 900 · 56px · 40px mobile

Heading 2

Lato 900 · 48px · 36px mobile

Heading 3

Lato 900 · 40px · 30px mobile

Heading 4

Lato 700 · 32px · 26px mobile
Heading 5
Lato 700 · 28px · 22px mobile
Heading 6
Lato 700 · 20px · 18px mobile · 0.5px tracking

Lato ships nine weights. Here is where each one is used.

Black, the display weight900 · h1 to h3, section labels
Bold, for subheads and UI700 · h4 to h6, buttons, labels
Medium, links only500 · inline links
Regular, the default for body400 · body copy
Light, for pull quotes300 · pull quotes
Thin, held in reserve100 · not in use

Lato 400 at 16px, with a large and a small variant.

This is a normal paragraph at the default size, used for running text on every page, post, and guide.

This is large text at 20px, used for opening paragraphs.

This is small text, used for captions, specs, and fine print.

This text is bold. This text is italic. This is an inline link. Inline code sits in running text like this: wp_enqueue_style().

Lists

Bulleted lists for items in no particular order, numbered lists for steps that happen in sequence.

  • A bulleted item.
  • A second one, running long enough to wrap onto a second line so the indent is visible.
  1. Upload the file.
  2. Set the options.
  3. Download the result.

Highlighter

A lime band behind a word or phrase, used to mark the one thing on a page that matters most. It comes in a display size and a body size.

Display highlight

And the body-size band for running text.

Italic at 1.4em with a lime edge and a lime quote mark. The name goes in a span inside the quote.

A quote pulled out of the copy, set large enough to break the page and short enough to read in one pass. Attribution

JetBrains Mono at 14px on charcoal, with a lime edge. Code blocks stay dark in both themes.

function ws_hello() {
    return 'Hello, world';
}

Inline code sits in running text like this: get_stylesheet_directory_uri(), --ws-accent, filemtime().

The brand colors and what each one is for.

Lime #C3DD22 Accent. Fills, active states, underlines.
Slate #496D89 Structural. Never emphasis.
Black #000000 Text and headings in light.
Charcoal #1C1C1E Dark page background, code blocks.
Charcoal raised #26262A Dark surface, one step up.
Dark grey #52585B Muted copy in light.
Grey #A2AAAD Muted copy in dark, separators.
Light grey #E5E5EA Borders in light, text in dark.
White #FFFFFF Page and surface in light.

Roles

Components use these roles rather than the colors directly, so dark mode swaps here and nowhere else.

RoleLightDark
--ws-bg White Charcoal
--ws-surface White Charcoal raised
--ws-text Black Light grey
--ws-heading Black White
--ws-accent Lime Lime
--ws-border Light grey Dark grey
--ws-muted Dark grey Grey

Green for something that worked, gold for something to check, red for something that failed. Every pairing clears 4.5 to 1 in both themes.

TokenLightRatioDarkRatio
--ws-success #2C7A3F 5.30 #6FD68C 9.46
--ws-success-wash #E6F4E4 4.65 #1B3324 7.55
--ws-warning #8A6100 5.54 #F0B429 9.13
--ws-warning-wash #FBF0CE 4.87 #3A2E12 7.13
--ws-error #B01C1C 6.93 #F08A85 7.03
--ws-error-wash #FBE4E2 5.71 #3D1B1A 6.33

Wash rows are the color against its own background. Every other row is the color against the page.

Callouts, validation messages, and tool results. The status color sits on the label and the left edge, and the copy stays in normal text color.

Success

Your policy has been generated. Copy it into your site and set the effective date to the day you publish.

Check this

You selected European Union or UK visitors but no consent banner. GDPR requires consent before optional cookies are set.

Could not send

The form did not submit. Check your connection and try again.

Note

A plain note with no status color, for anything that is neither good news nor bad.

Every button uses uppercase Lato 700 at 12px with 3px tracking, a 3px radius, and a 1px border. Fills change between light and dark mode, the shape does not.

VariantJob
PrimaryLime fill. The main action on the page.
OutlineLime border, no fill. Sits next to a primary.
SecondarySlate fill. Structural links and navigation.
NeutralGrey fill. Tool bars and smaller actions.
GhostNo fill or border. Inside running copy.

There is no red button. Delete actions use neutral with a confirmation step.

Used anywhere a visitor picks one of two options. Light or dark, source or rendered, HTML or text.

The lime thumb slides between the two options. A wide variant handles longer labels.

One field component, everywhere. Contact form, tools, document generators, plugin settings. Labels sit above the field and never float, and a placeholder is never the only label a field gets.

One domain per policy. Include the protocol.

Enter a full email address.

Available.

Large variant

For marketing forms where the fields are the main event, like the contact page.

Three small labels with three different jobs. The eyebrow sits above a page title, the section label divides major sections, and the pill marks state. They are not interchangeable.

Eyebrow

Quiet category line above a page title.

Contact

Section label

The loud divider between major sections, with a lime rule that draws in on scroll. This is the workhorse for structuring a long post or guide. Every lime-ruled heading on this page is one.

Pill

Small and high contrast. Use sparingly, since a page with five pills has none. Status variants take the mark color on the matching wash.

New Published Draft Blocked

Lato 500 with a 2px lime underline. On hover the underline drops out and a lime bar rises behind the text.

A paragraph with an inline link in it, plus a second one, at a normal reading size.

One single-color SVG that takes the color of whatever it sits in. Every lockup below is the same file on a different background, with the measured contrast ratio underneath.

Primary. Use these by default.

21.00 17.01 13.69 11.09 5.48 5.48

Limited. Large sizes only, never a favicon or a header mark.

3.57 3.57

Avoid.

1.53 2.36 2.36

Logos are exempt from contrast rules, but we hold to legibility anyway. Lime on white is the one to watch, since it looks fine on a bright screen and disappears everywhere else. Grey on white is fine as a watermark behind other content.

Featured graphic

Three copies of the mark offset on a diagonal in lime, slate, and grey. For large light backgrounds like social headers, featured images, and deck covers. Not a replacement for the mark, so never the site header or a favicon.

Three values, plus a squared single edge. 3px is the default on almost everything.

2px small 3px default 999px pill 0 single edge

A 4px base and nine steps. Every gap on the site comes from this scale.

4 8 12 16 24 32 48 64 96

Everything above, running together the way it would in a post.

This is an H3 header

Running copy at the default size, with an inline link and a bold phrase carrying the emphasis. A paragraph or two of setup before the section gets into specifics.

Worth knowing

A callout sitting inside running copy, for something the reader should know before carrying on.

A subhead at H4

A second-level subhead breaking up a longer section, followed by a short list:

  • A first item.
  • A second item, long enough to wrap so the indent shows.

Inline code sits in running text like code_example_style(), with a block for anything longer than one line:

function ws_hello() {
    return 'Hello, world';
}
A pull quote sitting between two paragraphs, close to the point it belongs to. Attribution

A closing paragraph back at the default size, ending with the buttons the page was leading toward.