Quick reference for building on this blueprint. Generated from Site Settings, so the tables below are always current.
Where the styling actually lives
| What | Where |
|---|---|
| Colours, fonts, button shape | Elementor → Site Settings (Global Colors, Global Fonts, Theme Style) |
| Every custom rule | Site Settings → Custom CSS — one block, generated by kit-css.php |
| Nothing | There is no stylesheet. Do not add one. |
Re-running kit-css.php overwrites Custom CSS entirely. Edit the script, not the box. Colours and fonts merge in place; button shape controls are seed-once, so a choice made in the UI survives.
Button classes
Put these in the widget’s Advanced → CSS Classes. A button carries no styling of its own — look, size and width come from the class; shape and type come from Site Settings.
| Class | Does |
|---|---|
btn-solid |
Secondary fill, white text, Primary on hover |
btn-outline-dark |
Transparent, white text/border → Primary Light. For DARK backgrounds |
btn-outline-light |
Transparent, Secondary text/border → Primary. For LIGHT backgrounds |
btn-light |
White fill, Primary text → Secondary |
btn-sm |
Smaller: 10/20 padding. Combine with a look |
btn-pair |
Two buttons split a row evenly, stack full width under 767px |
Those six are the only ones. Any other name falls back to the Theme Style default and looks like it worked while hover does nothing. Border radius is one value: Site Settings → Buttons → Border Radius.
Other classes
| Class | Goes on | Does |
|---|---|---|
media-frame |
image widget | Locks 3:2. Add --wide 16:9, --square 1:1, --tall 4:5 |
site-header |
header root container | Anchors the mobile dropdown to the bar’s bottom edge |
site-nav |
the Mega Menu widget | Desktop nav on one line, plus the whole mobile menu card |
#nav-cta |
a menu item, as its CSS ID | Turns that item into a pill button. Leave it off = no CTA |
header-overlay |
header root container | Transparent header sitting over the block beneath |
header-sticky |
header root container | Pins on scroll, logo shrinks, shadow appears |
form-on-dark |
container holding a form | White labels + outlined submit, for a form on a dark band |
Type ladder
Applied per widget — there are no automatic h1–h6 styles inside Elementor.
| Style | Family | Size |
|---|---|---|
| Primary | Figtree | — |
| Secondary | Figtree | — |
| Text | Figtree | — |
| Accent | Figtree | — |
| Display | Figtree | 48px / 34 mob |
| Heading 1 | Figtree | 40px / 30 mob |
| Heading 2 | Figtree | 32px / 26 mob |
| Heading 3 | Figtree | 24px |
| Heading 4 | Figtree | 20px |
| Intro | Figtree | 18px |
| Body | Poppins | 16px |
| Caption | Figtree | 14px |
| Eyebrow | Figtree | 12px |
| Menu | Figtree | 16px |
| Form Label | Figtree | 16px |
| Form Input | Poppins | 16px |
| Form Button | Figtree | 12px |
| Button | Figtree | 12px |
Colours
| Name | id | Hex |
|---|---|---|
| Primary | primary |
#115A8E |
| Secondary | secondary |
#2780BA |
| Text | text |
#727475 |
| Accent | accent |
#563166 |
| Primary Dark | primdark |
#0C4470 |
| Primary Light | primlite |
#9ACEF0 |
| Secondary Dark | secdark |
#1E6494 |
| Accent Dark | accentdark |
#3E2349 |
| Accent Light | accentlite |
#FAEFFF |
| Ink | ink |
#252B20 |
| Muted | muted |
#8B8D8E |
| Line | line |
#E8E8E8 |
| Surface | surface |
#F7F7F7 |
| White | white |
#FFFFFF |
| Form Field | formfield |
#F7F7F7 |
| Form Text | formtext |
#252B20 |
| Form Accent | formaccent |
#2780BA |
| Form Button | formbtn |
#2780BA |
| Form Button Hover | formbtnhov |
#115A8E |
Content typography — the part that is not Elementor
A blog post’s body, or any plugin output, is not built from widgets. Those fall back to a layer in Custom CSS that reads the same Global Fonts:
| Tag | Follows |
|---|---|
| h1 / h2 / h3 / h4 | Heading 1 / 2 / 3 / 4 |
| h5 / h6 | Intro / Caption |
| p, li, blockquote | Body (blockquote uses Intro) |
| links in content | Primary → Secondary, underlined |
Change a Global Font and this follows automatically. Elementor cannot bind a Theme Style typography field to a Global Font, so the rules read the CSS variables instead. Proven not to touch any block: 0 of 241 headings moved.
Tuning things — sizes, spacing, the sticky header
Elementor → Site Settings → Custom CSS. Scroll to the very bottom. The last thing in the box is:
/* ==== YOUR SETTINGS — safe to edit. Kept when the CSS above is regenerated ====
:root {
/* --nav-gutter: 12px; inset from the screen edge */
/* --sticky-logo-h: 44px; logo height when the header is pinned */
...
}
/* ==== END YOUR SETTINGS ==== */
Uncomment a line, change the number, Update. That is the whole job. Everything is listed there with its default and a note on what it does, so you never need to find the rule it belongs to.
Everything above that block is generated and gets overwritten whenever the CSS is rebuilt. This block is lifted out first and put back, so your changes survive. It also sits last, which is why it wins.
What you can tune there: the mobile menu card (inset, radius, row padding, CTA gap, how much screen an open menu leaves) · the pinned header (logo height desktop and mobile, bar padding, CTA padding) · the overlay header pull-up · the gap between a form’s last field and its submit · btn-sm padding · which ladder step drives each content heading.
Colours, fonts and button shape are not here — those are proper fields in Global Colors, Global Fonts and Theme Style.
Spacing
| Desktop | Tablet | Mobile | |
|---|---|---|---|
| Horizontal gutter | 40px | 50px | 24px |
Set padding_tablet explicitly on every block. Tablet is its own breakpoint, not something that inherits — and its gutter is wider than desktop.
The library
51 blocks, in build order: Site · Hero · Page Header · Content · Ping Pong · Image + Text · Cards · Process · Proof · FAQ · Media · Location · Resources · Blog · CTA · Form.
See them all on Block Library Review. Buttons on Button Styles.
Edit blocks on the review page, then they get captured back into the saved templates. Do not delete the dark label strips above each block — that is how the split works.
Theme Builder
Three headers, three footers, a 404. Only one per slot has display conditions; the rest are dormant alternatives. To swap, move the condition — Elementor rejects two headers both set to Entire Site.
A theme template is a copy of its block, not a reference. Editing the block does not update it.
Leave these alone
| Thing | Why |
|---|---|
sb-marker sb-<number> |
The label strip above each block on the review page. Delete one and that block merges into the one above |
sb-category |
The category dividers on the review page |
| Theme Style → Buttons → Padding | Clearing it silently drops every button to Elementor’s smaller default. Should read 14 / 32 |
Delete this page, Block Library Review and Button Styles before handing a site to a client.