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
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Lato ships nine weights. Here is where each one is used.
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.
- Upload the file.
- Set the options.
- 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.
BlockquoteItalic 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. AttributionCode
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.
Roles
Components use these roles rather than the colors directly, so dark mode swaps here and nowhere else.
| Role | Light | Dark |
|---|---|---|
--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.
| Token | Light | Ratio | Dark | Ratio |
|---|---|---|---|---|
--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.
Status blocksCallouts, 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.
| Variant | Job |
|---|---|
| Primary | Lime fill. The main action on the page. |
| Outline | Lime border, no fill. Sits next to a primary. |
| Secondary | Slate fill. Structural links and navigation. |
| Neutral | Grey fill. Tool bars and smaller actions. |
| Ghost | No fill or border. Inside running copy. |
There is no red button. Delete actions use neutral with a confirmation step.
The switchUsed 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.
Form controlsOne 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.
ContactSection 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.
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.
The markOne 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.
Limited. Large sizes only, never a favicon or a header mark.
Avoid.
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.
A 4px base and nine steps. Every gap on the site comes from this scale.
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.