CSS Theming Guide¶
Date: 2026-03-23
How Theming Works¶
The theming system follows a base + override pattern:
- Base CSS (
CommonV2.css) provides default styles for all components, layout, typography, and utilities shared across every client site. - Client CSS (e.g.,
AbbeyStyles.css) overrides colors, fonts, buttons, header/footer, and any component styles specific to that credit union's brand. - Culture CSS (optional, e.g.,
AbbeyStyles-cy.css) overrides language-specific styles (Welsh translations that affect layout widths, etc.).
The client stylesheet path is stored in Umbraco under the Site Style Configuration content node (siteStyleConfiguration document type), in the stylesheet property. The master layout reads this at runtime via SiteSettings.Styles.StyleSheet.
Load Order¶
CSS loads in this order in master.cshtml (later files win):
1. Bootstrap 5.3.3 ~/vendor/bootstrap/css/bootstrap.min.css
2. Bootstrap extras bootstrap-negative-margins.css, bootstrap-select.css
3. Menu style CSS ~/vendor/menu{N}/css/style.css (based on MenuStyle setting)
4. Slick slider ~/vendor/slick/slick.css + slick-theme.css
5. Font Awesome 6 Pro ~/vendor/fontawesome-pro/css/all.min.css
6. Fancybox + jQuery UI vendor CSS
7. CommonV2.css ~/content/CommonV2.css (base styles)
8. RTE.css ~/css/RTE.css
9. Block Grid CSS ~/css/umbraco-blockgrid.css
10. Grid/Home slider CSS ~/content/gridSlider.css, ~/content/homeSlider.css
11. CLIENT STYLESHEET ~/cssCreditUnion/{ClientName}Styles.css ← YOUR THEME
12. Culture CSS (if exists) ~/cssCreditUnion/{ClientName}Styles-{lang}.css
13. Google Fonts loaded via <link> from fonts.googleapis.com
Because the client stylesheet loads after CommonV2.css, any selector you define in your client file overrides the base without needing !important (as long as specificity is equal or higher).
CSS File Location and Naming¶
Directory¶
There are currently 172 client CSS files in this directory.
Naming Convention¶
Examples:
- AbbeyStyles.css
- 1stClassStyles.css
- BallycastleStyles.css
For culture-specific overrides:
Examples:
- CambrianStyles-cy.css (Welsh)
- SmartMoneyStyles-cy.css (Welsh)
The culture CSS is loaded automatically by the master layout when the page culture does not start with "en" and the file exists on disk.
CMS Configuration¶
In the Umbraco backoffice, navigate to the Site Style Configuration node and set the stylesheet property to the relative path:
The Fonts property accepts a list of Google Fonts family names (e.g., Noto+Sans:wght@400;700).
Common Sections to Override¶
Recommended File Structure¶
Use this section structure in every client CSS file for consistency:
/* ============================================
{ClientName} Credit Union Theme
============================================ */
/* --- 1.0 CSS VARIABLES (Custom Properties) --- */
:root {
--primary-color: #033a72;
--secondary-color: #549ae0;
--bg-light: #f1f1f1;
--bg-alt: #eef4f5;
--body-color: #5a5a5a;
--link-color: #033a72;
--link-hover: #004c9a;
--main-font: 'Noto Sans', sans-serif;
--heading-font: 'Noto Sans', sans-serif;
}
/* --- 2.0 GENERAL (body, links, typography) --- */
/* --- 3.0 BUTTONS --- */
/* --- 4.0 HEADINGS --- */
/* --- 5.0 HEADER & NAVIGATION --- */
/* --- 6.0 HERO / SLIDER --- */
/* --- 7.0 CONTENT COMPONENTS --- */
/* --- 8.0 FOOTER --- */
/* --- 9.0 FORMS --- */
/* --- 10.0 RESPONSIVE OVERRIDES --- */
Colors¶
Define brand colors as CSS custom properties in :root. This makes it easy to update the entire palette from one place:
:root {
--primary-color: #033a72;
--secondary-color: #549ae0;
--bg-light: #f1f1f1;
--bg-alt: #eef4f5;
--body-color: #5a5a5a;
--link-color: #033a72;
--link-hover: #004c9a;
}
body {
color: var(--body-color);
}
a {
color: var(--link-color);
}
a:hover {
color: var(--link-hover);
}
Fonts¶
Fonts are loaded via the CMS Fonts property (rendered as Google Fonts <link> tags). Reference them in your CSS:
:root {
--main-font: 'Noto Sans', sans-serif;
--heading-font: 'Noto Sans', sans-serif;
}
body {
font-family: var(--main-font);
}
h1, h2, h3, h4, h5, h6 {
font-family: var(--heading-font);
color: var(--primary-color);
font-weight: 700;
}
Buttons¶
Override the base .button and .btn styles. The base CommonV2.css defines default button appearance; your theme sets brand colors:
.button, .btn, .btn-primary,
.contactUsForm input[type="submit"],
.umbraco-forms-navigation input[type="submit"] {
background: var(--primary-color);
border: none;
border-radius: 5px;
color: white;
font-family: var(--main-font);
font-weight: 700;
padding: 10px 15px;
text-transform: uppercase;
transition: all .15s ease-out;
}
.button:hover, .btn:hover,
.btn:not(.umb-button__button, .umb-button-group__toggle, .dropdown-toggle):hover {
background: var(--link-hover);
color: white;
}
Header and Navigation¶
Override header background, logo sizing, and nav link colors:
/* Top bar */
.topBar {
background: var(--primary-color);
}
/* Main nav links */
nav a, .nav-link {
color: var(--primary-color);
font-family: var(--main-font);
}
nav a:hover, .nav-link:hover {
color: var(--secondary-color);
}
Footer¶
footer, .footer {
background: var(--primary-color);
color: white;
}
footer a {
color: rgba(255, 255, 255, 0.8);
}
footer a:hover {
color: white;
}
Bootstrap 5.3.3 Usage Rules¶
All views and client CSS must follow Bootstrap 5 conventions. Key rules:
Data Attributes¶
Always use the data-bs- prefix. Never use Bootstrap 4 data- attributes:
<!-- Correct -->
<button data-bs-toggle="modal" data-bs-target="#myModal">Open</button>
<div class="collapse" data-bs-parent="#accordion">...</div>
<div data-bs-spy="scroll" data-bs-target="#navbar" data-bs-offset="50">...</div>
<!-- WRONG — these will silently fail -->
<button data-toggle="modal" data-target="#myModal">Open</button>
Renamed CSS Classes¶
Use Bootstrap 5 class names in all new CSS and HTML:
| Do NOT use (BS4) | Use instead (BS5) |
|---|---|
ml-3, mr-3 |
ms-3, me-3 |
pl-3, pr-3 |
ps-3, pe-3 |
text-left, text-right |
text-start, text-end |
float-left, float-right |
float-start, float-end |
font-weight-bold |
fw-bold |
font-italic |
fst-italic |
sr-only |
visually-hidden |
no-gutters |
g-0 |
form-group |
mb-3 |
badge-primary |
bg-primary |
Dropped Components¶
- Jumbotron: Use
bg-light p-5 rounded-3instead ofjumbotron. - Media object: Use
d-flexwith margin utilities instead ofmedia/media-body. - Form group: Use
mb-3for spacing instead ofform-group. - Input group append/prepend: Place buttons/text directly inside
.input-groupwithout wrapper divs.
Grid System¶
Bootstrap 5 uses the same 12-column grid. The xxl breakpoint (1400px) is new:
<div class="container">
<div class="row g-3">
<div class="col-12 col-md-6 col-lg-4 col-xxl-3">...</div>
</div>
</div>
Step-by-Step: Adding a New Client Theme¶
1. Create the CSS File¶
Create a new file in the theme directory:
2. Add the Copyright Header¶
/*
--------------------
WARNING!
Copyright Progress Systems Limited.
Explicit permission is required to copy or use any documents from this website
--------------------
*/
/* {NewClient} Credit Union — {NewClient}Styles.css */
3. Define CSS Custom Properties¶
Start with the :root variables block. Get the brand colors, fonts, and key values from the client's brand guidelines:
:root {
--primary-color: #1a5c3a;
--secondary-color: #4caf50;
--bg-light: #f5f5f5;
--bg-alt: #e8f5e9;
--body-color: #333333;
--link-color: #1a5c3a;
--link-hover: #2e7d32;
--main-font: 'Open Sans', sans-serif;
}
4. Override Base Styles¶
Add overrides for body, links, headings, buttons, header, footer, and any component-specific styles. Only override what differs from CommonV2.css defaults -- do not duplicate base styles unnecessarily.
5. Configure in Umbraco¶
In the backoffice:
- Navigate to the Site Style Configuration node.
- Set the Stylesheet property to
/cssCreditUnion/{NewClient}Styles.css. - Set the Fonts property to the Google Fonts families (e.g.,
Open+Sans:wght@400;600;700). - Upload the client's Logo and Solid Logo images.
6. Add Culture CSS (If Needed)¶
If the client supports a non-English language, create:
This file is auto-detected and loaded when the page culture matches. Use it for layout adjustments caused by longer translated text, different reading direction, etc.
7. Test¶
Verify the theme at all breakpoints:
- Mobile (< 576px)
- Tablet (576px -- 991px)
- Desktop (992px -- 1399px)
- Large desktop (1400px+, the BS5 xxl breakpoint)
Check these areas: - Header/navigation colors and logo - Button colors and hover states - Heading typography - Footer styling - Form inputs and validation states - Hero/slider banner - Component cards, spotlights, accordions
Examples from Existing Themes¶
Abbey Credit Union (CSS Custom Properties approach)¶
Uses :root variables for maximum maintainability:
:root {
--dark-blue: #033a72;
--light-blue: #549ae0;
--bg1: #f1f1f1;
--bg2: #eef4f5;
--body-color: #5a5a5a;
--link-color: #033a72;
--link-hover: #004c9a;
--main-font: 'Noto Sans', sans-serif;
}
body {
color: var(--body-color);
font-family: var(--main-font);
}
a {
color: var(--light-blue);
font-weight: 700;
}
h1, h2, h3 {
color: var(--dark-blue);
font-weight: 700;
}
1st Class Credit Union (Direct values approach)¶
Older pattern using hardcoded hex values (functional but harder to maintain):
body {
color: #333;
font-family: 'Ubuntu', sans-serif;
}
a {
color: #0b91d0;
}
a:hover {
color: #23aae9;
}
Recommendation: Always use the CSS Custom Properties approach (Abbey pattern). It is easier to maintain, enables future dark-mode support, and makes brand refreshes a one-line change per color.
Responsive Design Considerations¶
Breakpoints¶
Bootstrap 5.3.3 breakpoints:
| Breakpoint | Class prefix | Min width |
|---|---|---|
| Extra small | (none) | 0 |
| Small | sm |
576px |
| Medium | md |
768px |
| Large | lg |
992px |
| Extra large | xl |
1200px |
| XXL | xxl |
1400px |
Mobile-First Approach¶
Write base styles for mobile, then add overrides for larger screens:
/* Mobile default */
.hero-title {
font-size: 1.5rem;
padding: 1rem;
}
/* Tablet and up */
@media (min-width: 768px) {
.hero-title {
font-size: 2rem;
padding: 2rem;
}
}
/* Desktop and up */
@media (min-width: 992px) {
.hero-title {
font-size: 2.5rem;
padding: 3rem;
}
}
Fluid Typography¶
Use clamp() for font sizes that scale smoothly between breakpoints:
.hero-title {
font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
}
.button {
font-size: clamp(0.5rem, 0.5rem + 2vw, 0.938rem);
}
Container Behavior¶
The master layout wraps all grid content in a .container div. The BlockGrid system uses a 4-level hierarchy:
- Row-level containers constrain content width (max-width per breakpoint).
- Breakout rows use
calc(-50vw + 50%)to extend full-width -- this requires a parent.container. - Inner per-row containers re-constrain content inside breakout rows.
Do not override .container max-widths in client CSS unless intentionally changing the site's content width.
Images¶
Use responsive image patterns:
The site uses lazySizes for lazy loading. Background images use the data-bgset attribute with responsive source sets.
Touch Targets¶
Ensure interactive elements meet minimum 44x44px touch targets on mobile: