Digital Style Guide &
Component Library

INTRODUCTION

This style guide documents the core visual and UI patterns used across the site and other digital applications of the brand. It exists to keep design and front-end implementation consistent as the project grows, and to provide a shared reference for layout, typography, components and interaction patterns.

This is a living document. It will evolve over time as the site develops, with patterns refined, added or retired in response to real-world use and ongoing iteration.

Typography

Heading and body text styles, including semantic helpers used to keep layouts flexible while staying consistent.


1.1 Primary Typefaces

Circular Circular Circular Circular

Primary sans-serif used across UI, body copy and components.

Circular is a modern geometric sans-serif typeface characterised by clean proportions, open forms and a restrained, contemporary tone. While its construction is rooted in simple geometric shapes, subtle optical corrections ensure good legibility across both interface elements and longer passages of text.

Circular is a licensed typeface by Lineto. Usage in this project is covered by a commercial licence. See lineto.com for full family and licensing details.

Weights & styles

Circular Bold (700)

The quick brown fox jumps over the lazy dog.

Circular Bold Italic (700)

The quick brown fox jumps over the lazy dog.

Circular Medium (500)

The quick brown fox jumps over the lazy dog.

Circular Medium Italic (500)

The quick brown fox jumps over the lazy dog.

Circular Regular (400)

The quick brown fox jumps over the lazy dog.

Circular Regular Italic (400)

The quick brown fox jumps over the lazy dog.

Circular Light (300)

The quick brown fox jumps over the lazy dog.

Circular Light Italic (300)

The quick brown fox jumps over the lazy dog.

Specimen

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 £ $ ¥ % & @ # ( ) / + - = . , : ; ! ?

Font Subsets included

Latin, Latin extended

Font stack & fallbacks

font-family: "Circular", Arial, sans-serif;


1.2 USAGE

Typography values are documented using rem units, relative to the project’s root font size. The samples below describe the intended type scale and hierarchy. Responsive adjustments may apply where required, but proportions remain consistent.

HEADINGS

Oversized title h0

Hero or campaign headlines and high-impact moments. Used sparingly.

  • Font family: Circular
  • Font size: 9rem
  • Font weight: 700
  • Line height: 1.1
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="h0">…</p>
  • <h1 class="h0">…</h1>
  • <h2 class="h0">…</h2>

Page title h1

The primary title of a page or major content section

  • Font family: Circular
  • Font size: 4.8rem
  • Font weight: 700 / Bold
  • Line height: 1.15
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="h1">…</p>
  • <h1 class="h1">…</h1>
  • <h2 class="h1">…</h2>

Section title h2

Section headings that group related content within a page.

  • Font family: Circular
  • Font size: 3.6rem
  • Font weight: 700 / Bold
  • Line height: 1.25
  • Letter spacing: 0
  • Text Transform: Uppercase

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="h2">…</p>
  • <h2 class="h2">…</h2>
  • <h3 class="h2">…</h3>

Object title h3

Card titles, component headings, and sub-sections within a larger section.

  • Font family: Circular
  • Font size: 2.4rem
  • Font weight: 700 / Bold
  • Line height: 1.3
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="h3">…</p>
  • <h3 class="h3">…</h3>
  • <h4 class="h3">…</h4>

Micro title h4

Labels, small headings, metadata blocks, and UI-level titles where emphasis is needed without visual dominance.

  • Font family: Circular
  • Font size: 1.6rem
  • Font weight: 500 / Medium
  • Line height: 1.1
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="h4">…</p>
  • <h4 class="h4">…</h4>
  • <span class="h4">…</span>

Paragraphs and lists

Large paragraph text with bold, italic and links. Lorem ipsum dolor sit amet, ut habeo tibique noluisse ius, ei sea tempor docendi philosophia, ad mei ignota assueverit.

Introductory paragraphs, lead text, and short highlight statements.

  • Font family: Circular
  • Font size: 2.1rem
  • Font weight: 300 / Light
  • Line height: 1.3
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="large">…</p>
  • <div class="p large">…</div>
  • <span class="large">…</span>

Standard paragraph with bold, italic and links. Has animal habemus periculis ut, ne his unum veritus, cum nullam similique no. Quando mucius habemus sed ex. Legimus invidunt ut vix. Sale detracto maiestatis nec te.

Default body copy across editorial content and UI components.

  • Font family: Circular
  • Font size: 1.8rem
  • Font weight: 300 / Light
  • Line height: 1.3
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p>…</p>
  • <div class="p">…</div>
  • <p class="p">…</p>

Small paragraph text with bold, italic and links. Nam ne audiam luptatum abhorreant. Enim soleat rationibus eum no, harum deleniti scriptorem id sit. Ad iusto ignota usu. Ex vis saepe delectus.

Secondary notes, captions, helper text, and fine print.

  • Font family: Circular
  • Font size: 1.4rem
  • Font weight: 300 / Light
  • Line height: 1.5
  • Letter spacing: 0

To maintain semantic markup, visual sizing is applied via classes rather than relying on heading level alone.

  • <p class="small">…</p>
  • <span class="small">…</span>
  • <div class="small">…</div>
  • This is an unordered list item
  • Used where order or priority is not important
  • Items may wrap onto multiple lines if required
  • Links within list items inherit body styles

General content lists where items are related but not sequential, such as feature lists, supporting points, or grouped information.

  • Font family: Circular
  • Font size: 1.8rem
  • Font weight: 300 / Light
  • Line height: 1.5
  • Marker style: Custom bullet

Ordered list markers inherit colour and spacing from the surrounding text and should not be manually overridden.

  • <ul><li>…</li></ul>
  • <ul><li>…</li></ul>
  1. This is an ordered list item
  2. Use when sequence or priority matters
  3. Numbers automatically increment
  4. Items can include links or inline formatting

Step-by-step instructions, ranked information, or any content where the order of items conveys meaning.

  • Font family: Circular
  • Font size: 1.8rem
  • Font weight: 300 / Light
  • Line height: 1.5
  • Marker style: Numeric (default)

Ordered list markers inherit colour and spacing from the surrounding text and should not be manually overridden.

  • <ol><li>…</li></ol>

This paragraph demonstrates common inline text elements such as strong emphasis, italic emphasis, highlighted text, removed content, and inline links within body copy.
Superscript and subscript are used for footnotes and notation, such as 102, H2O, or dates e.g: Sunday 1st May.

Inline emphasis and small semantic distinctions within paragraphs, without introducing additional hierarchy.

  • Supported elements: <strong>, <em>, <mark>, <del>, <sup>, <a>

Inline elements should be used sparingly and for meaning rather than decoration.

  • <p><strong>Strong emphasis</strong> should be used to indicate importance.</p>
  • <p><em>Italic emphasis</em> is used for subtle stress or emphasis.</p>
  • <p><mark>Highlighted text</mark> can be used to draw attention to key phrases.</p>
  • <p><del>Removed content</del> may indicate corrections or deprecated information.</p>
  • <p>Sunday 1<sup>st</sup> May</p>
  • <p>H<sub>2</sub>O</p>
  • <p><a href="#">Inline links</a> appear within running text.</p>

Additional typographic elements will be documented here as they are introduced.
Planned additions include blockquotes, inline emphasis patterns, link treatments and editorial typography examples.

Colour

This section documents the core colour system used across the site, including brand, supporting and functional UI colours. Together, these tones establish hierarchy, reinforce identity and provide clear visual feedback within the interface.

Colour is applied deliberately and with restraint. Primary brand colours define structure and emphasis, secondary colours support layout and depth, and functional colours are reserved exclusively for system feedback and state.


2.1 Primary Brand Colours

The core brand palette — used most prominently across identity, layout and key brand moments.

Primary dark brand tone with a cool, muted character.

Primary text, headings, key UI elements and high-contrast surfaces.

Neutral mid-grey used to soften contrast against darker tones.

Secondary text, metadata, dividers and subdued interface elements.

Neutral white used as a clean base colour.

Primary backgrounds, content areas and contrast against dark text.

Soft off-white background tone with reduced glare.

Page backgrounds, panels and large content surfaces.


2.2 Secondary Brand Colours

Supporting tones used for contrast, depth and subtle backgrounds without overpowering the primary palette.

Strong pink accent color with high visibility.

Links, interactive elements and informational highlights.

Muted, earthy neutral with a warm undertone.

Subtle backgrounds, secondary accents and supporting UI elements.

Warm accent tone used to add contrast and depth.

Highlights, secondary actions and decorative accents.

Deeper variant of the tan accent with increased visual weight.

Hover states, emphasis accents and darker contrast moments.


2.3 Functional Colours

Context colours used for consistent UI feedback (success, error, warning, info). Aligned with Bootstrap states and WooCommerce notices.

Primary functional colour aligned with the core brand tone.

Primary buttons, links and key interactive elements.

Secondary functional colour for lower-priority actions.

Secondary buttons and supporting interface elements.

Positive feedback and confirmation state.

Success messages, confirmations and completed actions.

Error and destructive action state.

Form validation errors, destructive actions and critical alerts.

Cautionary state requiring user attention.

Warnings, notices and non-critical alerts.

Informational state with neutral emphasis

Informational messages and contextual guidance.


2.4 Colour usage notes

These guidelines outline how colour should be applied across the interface to ensure clarity, consistency and accessibility. They complement the palette definitions above and apply to all UI components and content.

Do

  • Use colour to reinforce hierarchy and meaning.
  • Pair colour with text, icons or layout to communicate state.
  • Ensure sufficient contrast between text and background colours.
  • Apply functional colours consistently for system feedback.

Don’t

  • Don’t rely on colour alone to convey important information.
  • Don’t introduce colours outside the defined palette.
  • Don’t use functional colours for decorative or branding purposes.
  • Don’t combine colours in ways that reduce legibility.

Accessibility

All colour combinations should meet the WCAG 2.1 AA contrast requirements for text and interactive elements across all states, including hover, focus and disabled.
Colour must never be the only means of conveying meaning; status, errors and feedback should always be supported by text, icons or other non-colour cues to ensure clarity for all users.

Icons

The interface uses a single, consistent icon set for navigation, actions and system feedback. Icons are used to support text labels, improve scannability and reinforce meaning — not to replace written content.

This reference shows the most commonly used icons and their default appearance. Icons should remain visually simple, align cleanly with surrounding text and be used consistently across similar interactions.

Editors can add icons in post content using a Custom HTML block. Icons should generally be paired with text labels and used consistently across similar actions.

  • Basic icon:
    <i class="bi bi-search" aria-hidden="true"></i>
  • Icon + text (recommended):
    <i class="bi bi-search me-1" aria-hidden="true"></i>Search</span>
  • Button with icon
    <a href="#" class="btn btn-primary"><i class="bi bi-search me-1" aria-hidden="true"></i>Search</span></a>
  • Sizing (Bootstrap font-size utilities):
    <i class="bi bi-star fs-5" aria-hidden="true"></i> (fs-1 … fs-6)
  • Colour (text utilities):
    <i class="bi bi-info-circle text-info" aria-hidden="true"></i>
    ( or text-primary, text-secondary, text-success, text-danger, text-warning, text-info)

Icons used throughout the interface are drawn from the Bootstrap Icons library. Using a single, shared icon set helps maintain visual consistency and reduces duplication across components and templates.

A complete reference of available icons can be found at icons.getbootstrap.com .

This icon set may be extended over time as new interface needs emerge. Where a suitable icon does not exist, custom icons may be introduced on a case-by-case basis, provided they align with the visual style and usage principles defined here.

Buttons

Button variants, sizing helpers and icon buttons. These examples reflect the project’s custom button system layered on top of Bootstrap.

Buttons provide consistent calls to action across the site. Variants signal hierarchy, sizes support different layout densities, and icon patterns improve recognition of common actions.


3.1 Button variants

Core button styles used for primary actions, supporting actions, and low-emphasis link-style actions. Micro buttons are included here for lightweight UI controls.

Primary Button        
  • Primary — main CTA per view (checkout, submit, save).
  • Secondary — supporting actions (filter, cancel, back).
  • Tertiary — lower-emphasis actions where a filled button would be too strong.
  • Link — inline or low-friction actions (secondary navigation, “learn more”).
  • Micro — compact UI controls (toggles, reveals, inline tools), not primary actions.

Always include the base .btn class alongside the button type declartion

  • <a class="btn btn-primary" href="#">Primary</a>
  • <button class="btn btn-secondary" type="button">Secondary</button>
  • <button class="btn btn-black" type="button">Tertiary</button>
  • <button class="btn btn-link" type="button">Link</button>
  • <button class="btn btn-micro" type="button">Micro</button>
  • <!-- <button class="btn btn-link inverse">Inverse link</button> -->

3.2 Button sizes

Size helpers adjust padding and type scale to match the context while maintaining consistent styling.

       
  • XL / L — hero CTAs, landing pages, prominent headers.
  • Default — standard UI actions in forms and components.
  • S / XS — dense UI (tables, cards, filters) where space is limited.
  • <button class="btn btn-primary btn-lg" type="button">…</button>
  • <button class="btn btn-primary btn-sm" type="button">…</button>
  • <button class="btn btn-primary btn-xs" type="button">…</button>

3.3 Buttons with icons

Icons reinforce meaning and improve scanning for common actions. Where clarity is required, icons should be paired with visible labels.

   
  • Use icons to support recognition of common actions (add, delete, edit, download).
  • Take care when using icons on smaller sized buttons, choose a simplified icon to ensure legibility
  • Avoid icon-only buttons in content areas unless a visible label is impractical.
  • If a button is icon-only, include an accessible label (e.g. visually hidden text).
  • <button class="btn btn-primary btn-icon" type="button"><i class="bi bi-cart-plus" aria-hidden="true"></i> Add</button>
  • <button class="btn btn-secondary" type="button"><span class="visually-hidden">Edit</span><i class="bi bi-pencil" aria-hidden="true"></i></button>

3.4 Context buttons

Context colours are used for system actions and feedback. They should remain purposeful and not replace the primary hierarchy.

     
  • Danger — destructive actions (delete, remove, irreversible changes).
  • Warning — cautionary actions (proceed with care, confirm next step).
  • Success — confirmation actions where required.
  • Info — neutral actions where primary/secondary are not appropriate.
  • <button class="btn btn-danger" type="button">Delete</button>
  • <button class="btn btn-warning" type="button">Review</button>
  • <button class="btn btn-success" type="button">Confirm</button>

3.5 Hover & focus states

Hover and focus states provide interaction feedback. Focus styles should remain visible for keyboard users and must not be removed.

Default

   

Disabled

   

Hover states are visible on pointer interaction. Focus states can be tested using keyboard navigation (Tab / Shift+Tab).

  • Hover clarifies interactivity without introducing new hierarchy.
  • Focus are clearly visible against both light and dark backgrounds.
  • Disabled buttons appear inactive and are not styled to resemble links.
  • <button class="btn btn-primary" type="button">…</button>
  • <button class="btn btn-primary" type="button" disabled>…</button>
  • <a class="btn btn-primary" href="#">…</a>

Forms

Standard form controls, validation patterns and inverted form styling. Includes examples aligned to Bootstrap and WooCommerce conventions.

Forms are presented in two visual styles — standard (light) and inverted (dark) — with an optional validation layer for forms that require structured input. The examples below show the same field set in each style so layouts and spacing remain consistent across the site.

Use validated forms for submissions that must be complete and correctly formatted (e.g. contact forms, applications, account actions). Standard forms may be used for simple filters or non-critical inputs.


5.1 Validation capabilities

Validated forms use a lightweight, bespoke validation system. Validation rules are declared on a .form-parent wrapper using data-* attributes. Errors appear beneath the field, and a summary can optionally be displayed at the top of the form when submission is attempted.

  • Requireddata-required="true"
  • Type checksdata-type="email", url, digits
  • Minimum charactersdata-minlength="6"
  • Maximum wordsdata-maxwords="20"
  • Confirm matching fieldsdata-password-confirm="field_name"
  • File validationdata-file-types="jpg,jpeg,png", data-max-size="2097152"

Validation runs as users type or change fields, and again on submit. Visual feedback is applied to the .form-parent wrapper, keeping individual inputs clean and consistent.


5.2 Form patterns

Standard Form

Default light form styling used across the site. Suitable for simple inputs and filters where inline validation is not required.

Standard forms use a simple, consistent structure: each field lives inside a .form-group, with a <label> followed by the control. Checkboxes and radios use .form-check.

<form class="form form-standard">
  <div class="form-group">
    <label>Label</label>
    <input class="form-control" type="text">
  </div>
  <div class="form-group">
    <label>Select</label>
    <select class="form-select">
      <option value="">Choose…</option>
    </select>
  </div>
  <button class="btn btn-primary">Submit</button>
</form>

Form Validation

Uses the site’s validation pattern. Errors display under each field, with an optional summary shown on submit if the form is incomplete or incorrectly formatted.

Validated forms follow the same base structure as standard forms, but add a .form-parent wrapper around each control to declare validation rules. The form itself must use the .atgs-validate class to enable validation.

Validation rules are applied using data attributes on .form-parent. Supported attributes include:

  • data-required="true" — field must contain a value
  • data-type="email" — validates email address format
  • data-type="url" — validates web addresses
  • data-type="digits" — numeric values only
  • data-minlength="6" — minimum character count
  • data-maxwords="10" — limits number of words
  • data-password-confirm="field_name" — matches another field
  • data-file-types="jpg,png,pdf" — restricts allowed file types
  • data-max-size="2097152" — maximum file size (bytes)

Validation errors are displayed inline beneath each field, with an optional summary shown at the top of the form when submission is attempted.

<form class="atgs-validate">
  <div class="atgs-form-feedback"></div>
  <div class="form-group">
    <label for="email">Email</label>
    <div class="form-parent"
         data-required="true"
         data-type="email"
         data-label="Email">
      <input id="email" class="form-control" type="email">
    </div>
  </div>
  <div class="form-group">
    <label for="password">Password</label>
    <div class="form-parent"
         data-required="true"
         data-minlength="6"
         data-label="Password">
      <input id="password" class="form-control" type="password">
    </div>
  </div>
  <button class="btn btn-primary" type="submit">Submit</button>
</form>

Inverted Form

Dark-background form styling used on darker panels or footer sections. Field types and spacing mirror the standard form.

Inverted forms are visually reversed for use on dark backgrounds. Apply .form-inverted to the <form> element to switch text, borders and controls to a light-on-dark treatment.

Field structure, spacing and behaviour remain identical to standard forms. Only the visual presentation changes.

<form class="form form-inverted">
  <div class="form-group">
    <label for="name">Name</label>
    <input id="name" class="form-control form-control-inverse" type="text">
  </div>
  <div class="form-group">
    <label for="select">Select</label>
    <select id="select" class="form-select form-control-inverse">
      <option value="">Choose…</option>
      <option>Option A</option>
    </select>
  </div>
  <button class="btn btn-primary" type="submit">Submit</button>
</form>

Inverted (Validated)

Combines inverted styling with the same validation behaviour. Feedback and error messaging remain consistent across both themes.

Inverted validated forms combine the inverted visual style with the bespoke validation system. They use the same .form-parent structure and validation attributes as standard validated forms.

Apply both .form-inverted and .atgs-validate to the form. Validation feedback, icons and messages automatically adapt for dark backgrounds.

<form class="atgs-validate form-inverted">
  <div class="atgs-form-feedback"></div>
  <div class="form-group">
    <label for="email-inv">Email</label>
    <div class="form-parent"
         data-required="true"
         data-type="email"
         data-label="Email">
      <input id="email-inv"
             class="form-control form-control-inverse"
             type="email">
    </div>
  </div>
  <button class="btn btn-primary" type="submit">Submit</button>
</form>

5.3 Compact & minimal form controls

In addition to full form layouts, the system includes a set of compact and minimal control styles designed for lightweight interactions. These are typically used where an input supports an interface action rather than representing a complete form.

Size modifiers

Reduced-size inputs are designed for dense interfaces such as filters, sort controls, table headers, and inline selectors.


Size modifiers adjust font size and vertical rhythm while preserving validation, spacing logic and accessibility. They should be used when controls need to fit comfortably into tight UI layouts.

<input class="form-control" type="text">
<input class="form-control form-control-sm" type="text">
<input class="form-control form-control-xs" type="text">

Minimal controls

Visually simplified inputs used alongside other interface elements rather than as part of a formal form.



Minimal controls are intended for secondary interactions such as newsletter sign-ups, inline search fields, and simple selectors within grids or toolbars. They should not be used for complex or high-risk data entry.

<input class="form-control form-control-minimal" type="text">
<div class="form-parent"><select class="form-select form-control-minimal">
  <option>Option one</option>
</select></div>

Media

Media elements (images and videos) are designed to be flexible, consistent and performant across all screen sizes. Images and video follow a small set of shared layout patterns so they behave predictably in different contexts — from full-width heroes to cards, galleries and editorial content.

Images automatically adapt to the device they are viewed on. Smaller image files are served to smaller screens, and larger files only where needed, helping pages load quickly without sacrificing visual quality. On upload, images are processed into a range of sizes and modern formats (including WebP) so browsers can choose the most efficient version available.

Video follows the same layout logic as images, using fixed or fluid ratios to maintain visual rhythm across layouts. Posters are used to ensure a clean, intentional appearance before playback.

Media is optimised automatically for performance. Images are resized on upload and delivered in the most appropriate size and format for each device, reducing page weight and improving load times without any manual intervention.


6.1 Image containers

The preferred pattern is .src containing an <img>. The container controls the aspect ratio and cropping; the image fills the container using object-fit: cover. This is the default for most components and CMS output.

Default image container

Styleguide
Example caption below the image.

Use .src as the standard responsive image container. Apply a ratio class on the container (e.g. .ratio-16x9) to control cropping. The nested <img> should remain clean (no inline styles) so the container governs layout consistently.

<figure>
  <div class="src ratio-16x9">
    <img src="..." srcset="..." sizes="..." alt="">
  </div>
  <figcaption>Caption text</figcaption>
</figure>

Contain variant

Styleguide
Use .contain when the full image must be visible. Useful for logos or other graphics.

Use .src.contain when cropping is not acceptable (e.g. logos, diagrams). This switches object-fit to contain.

<div class="src contain ratio-1x1">
  <img src="..." alt="">
</div>

6.2 Ratios

Ratio classes define consistent cropping across the site. Choose a ratio based on layout intent: hero/wide (16:9), editorial landscape (4:3), portrait (3:4), square (1:1), or specialised banners (27:10).

Wide / hero

Styleguide
Ratio: 16:9

Landscape

Styleguide
Ratio: 4:3

Banner / cinema

Styleguide
Ratio: 27:10

Tall / story

Styleguide
Ratio: 9:16

Portrait

Styleguide
Ratio: 3:4

Square

Styleguide
Ratio: 1:1

Apply ratio classes directly on .src (or .video-control) to enforce cropping. The ratio controls layout; the media inside fills the container.

<div class="src ratio-3x4">
  <img src="..." alt="">
</div>
<div class="video-control ratio-16x9">
  <video ...></video>
</div>
Available Rations:
  .ratio-1x1,  
  .ratio-2x3,   .ratio-3x4,   .ratio-5x6,  .ratio-9x16
  .ratio-4x3  .ratio-16x9, ration 27x10,  .ratio-3x2

6.3 Captions & banners

Captions can sit beneath media (recommended) or, where space is tight, as an overlay banner inside the container (.imagebanner.bottom). Use banners sparingly to avoid obscuring imagery.

Caption below

Styleguide
Caption beneath the image (preferred where space allows).

Overlay banner

Styleguide
Use overlay banners when a below-caption is not possible.

Prefer <figure>/<figcaption> for captions. If the layout cannot accommodate a caption below the media, use .imagebanner.bottom inside the container.

<figure>
  <div class="src ratio-16x9">
    <img src="..." alt="">
    <div class="imagebanner bottom">Optional overlay</div>
  </div>
  <figcaption>Caption text</figcaption>
</figure>

6.4 Lightbox & zoom

Images can optionally open in a lightbox overlay or use a subtle zoom affordance on hover. These behaviours are applied explicitly and should be used intentionally depending on context.

Lightbox and zoom are independent: lightbox controls interaction, while zoom is purely visual. They may be combined where appropriate.

Lightbox

Styleguide
Opens the image in an overlay without hover zoom.

Zoom

Styleguide
Adds a subtle hover zoom to indicate focus or affordance (no lightbox).

Lightbox + zoom

Styleguide
Combines both behaviours: hover zoom plus full-size viewing in a lightbox.

Use lightbox when images need to be viewed at a larger size without leaving the page. Zoom should be applied sparingly and never used as the sole indicator of interactivity.

Add .glightbox to an <a> wrapping the image to open it in a lightbox. Add .zoom to enable hover zoom (only when explicitly required). These classes can be used separately or together.

<a href="full.jpg" class="glightbox">
  <div class="src ratio-1x1">
    <img src="thumb.jpg" alt="">
  </div>
</a>
<a href="full.jpg" class="zoom">
  <div class="src ratio-1x1">
    <img src="thumb.jpg" alt="">
  </div>
</a>
<a href="full.jpg" class="glightbox zoom">
  <div class="src ratio-1x1">
    <img src="thumb.jpg" alt="">
  </div>
</a>

6.5 Video containers

Video follows the same layout rules as images, maintaining consistent ratios and cropping across layouts. Videos are wrapped in .video-control and can use the same ratio helpers.

There are two common uses:ambient video (decorative, silent, looping) and content video (user-driven playback). Choose whether controls are shown based on intent — if the video conveys meaning, it should be controllable.

Content video (with controls)

Ratio: 4:3.
Use controls when the video is the primary content, or includes audio, speech, or instructions.

Use a standard <video controls> setup when the video is the content and users should be able to pause, scrub, and manage playback. Always include a poster image for a clean first frame.

<div class="video-control ratio-16x9">
  <video
    src="video.mp4"
    poster="poster.jpg"
    controls
    playsinline>
  </video>
</div>

Ambient video (no controls)

Ratio: 16:9.
Ambient videos are silent and looping, used to provide background mood rather than core content.

Use ambient video for decorative moments (hero backgrounds, mood loops). These should be silent by default: use muted + autoplay + loop + playsinline, and omit controls. Always include a poster image as a fallback.

<div class="video-control ratio-16x9">
  <video
    src="video.mp4"
    poster="poster.jpg"
    muted
    autoplay
    loop
    playsinline>
  </video>
</div>

Embedded Media

Ratio: 4:3.
Wrap YouTube or Vimeo embed code in the same container. Playback and control options are managed via the embed settings.

Use .video-control.fluid when the layout should follow the natural size of the embedded media (rare in grid systems, more common for full-width editorial embeds).

<div class="video-control fluid">
<iframe
  src="https://www.youtube.com/embed/wyxxPTFfdi8?controls=0&modestbranding=1&rel=0&playsinline=1"
  title="YouTube video"
  allow="autoplay; encrypted-media; picture-in-picture"
  allowfullscreen>
</iframe>
</div>

Custom Play Button

Ratio: 16:9.
Use a play overlay when you want a clear “this is video” signal while maintaining brand feel, particularly in grids or card layouts.

File size & accessibility

Keep self-hosted videos lightweight. As a general guideline, videos over 20 MB should be hosted externally (e.g. YouTube or Vimeo) and embedded, rather than uploaded directly to the site. This helps reduce page weight, improves load performance, and avoids unnecessary strain on hosting resources.

Accessibility should be considered when using video. Any video that includes speech, instructions, or meaningful audio should provide captions or an accessible alternative. Avoid autoplaying videos with sound, and ensure motion does not distract from or obscure essential content.

Note on mobile behaviour: autoplay is not guaranteed on mobile devices. Browsers may prevent autoplay when the device is in low power mode, on a constrained network, or where user preferences restrict motion or data usage. For this reason, ambient videos should always degrade gracefully — showing a poster image when autoplay is blocked.

Cards

Core card patterns and layout modules used for previews, listings and content groupings.

Cards and tiles are both flexible content containers used to present images, text and actions in grids, carousels and layouts. The distinction is primarily conventional: cards are typically used for repeatable content previews (projects, posts, people), while tiles are often used for layout-led or promotional content.

In practice they are interchangeable. The choice is driven by context, visual intent and consistency within a layout. This section documents common card types first, then the shared anatomy that keeps grids scannable and stable.


7.1 Card types

In most builds, card styling is grouped by content type (e.g. .card-project, .card-news, .card-person). This keeps browsing patterns consistent and avoids one generic card drifting into lots of inconsistent layouts. Even when types differ, the underlying structure remains stable so grids still align.

Prefer card classes per content type so browsing contexts feel consistent. Even when visual styling differs, keep the core structure stable so cards align in grids.

<a class="card card-project">...</a>
<a class="card card-news">...</a>
<a class="card card-person">...</a>

7.2 Card anatomy

Most cards follow the same structure: media at the top, a title block, optional meta, a short summary, and an optional footer row. Keeping the anatomy consistent makes grids easier to scan and keeps layouts stable.

Card Anatomy

  • Media:
    Image-led by default, but can also be ambient video (silent, looping) where appropriate. Choose a ratio that suits the content and keeps the grid consistent.
  • Title:
    The primary label for scanning. Heading level can vary by context (h2h4), with an optional subtitle for secondary emphasis.
  • Meta:
    Optional supporting details that help users decide if they should click. Common examples include: date (news/events), author (blog), categories/tags (any content list), location (events/places), role (people), and price/availability (products).
  • Summary:
    A short supporting sentence or excerpt. Keep this predictable in length for clean grid rhythm — longer content should be trimmed to a set length and end with an ellipsis where needed.
  • Footer:
    Optional. Often omitted because the whole card is clickable. Use a footer CTA only when it adds clarity (e.g. “Book”, “Download”, “Watch”) or when multiple actions exist.

Keep card structure consistent within a grid. Cards are typically a single link (<a>) so the entire card is clickable. Subtitles use <small class="card-subtitle">. Footer CTAs are optional and should only be used when they add clarity.

<a href="#" class="card card-project">
  <div class="imageouter">
    <div class="src ratio-3x4"><img src="..." alt=""></div>
  </div>
  <div class="card-header">
    <h3 class="h3 m-0">
      Title
      <small class="card-subtitle">Optional subtitle</small>
    </h3>
  </div>
  <div class="card-meta">
    <span>Date</span><span>Category</span>
  </div>
  <div class="card-body">
    <p class="description small">Summary sentence…</p>
  </div>
  <div class="card-footer">
    <span class="btn btn-black btn-xs btn-card">Read more</span>
  </div>
</a>

7.3 Common card variants

Variants adjust layout behaviour (not to reinvent the pattern). Where possible, keep the same anatomy and only vary what’s required: ratio, meta placement, and hover treatment.

Variants should only change behaviour, not the underlying pattern. Keep the same overall structure and introduce a variant class only when it solves a repeatable layout need (hover treatment, CTA behaviour, or horizontal layout).

  • Hover image — add a .hoverimage element inside .imageouter to provide a second image that fades in on hover. Use when the extra image genuinely adds context (e.g. detail view, alternate crop), not as decoration.
  • Hover CTA — add .card-cta-hover when you want the button present but visually de-emphasised until hover. This works well in dense grids where repeating visible buttons would add noise. Cards remain a single link; the CTA is a visual affordance only.
  • Horizontal cards — use .card-horizontal when cards stack vertically and you want the image locked to the left with the content flowing alongside. The image container typically uses full so it fills the card height. Horizontal cards may include .hoverimage if needed.

In all variants: keep ratios consistent within a given list, keep titles and summaries to predictable lengths, and only include a footer CTA when it adds clarity (otherwise omit it because the whole card is clickable).

<!-- Hover image (secondary image fades in) -->
<a class="card card-project">
  <div class="imageouter">
    <div class="src ratio-3x4"><img src="..." alt=""></div>
    <div class="hoverimage">
      <div class="src ratio-3x4"><img src="..." alt=""></div>
    </div>
  </div>
  ...
</a>
<!-- Hover CTA (CTA appears/emphasises on hover) -->
<a class="card card-project card-cta-hover">
  ...
  <div class="card-footer">
    <span class="btn btn-primary btn-black btn-xs">Learn more</span>
  </div>
</a>
<!-- Horizontal card (image pinned left, fills height) -->
<a class="card card-horizontal">
  <div class="imageouter">
    <div class="src full"><img src="..." alt=""></div>
    <!-- optional -->
    <div class="hoverimage">
      <div class="src full"><img src="..." alt=""></div>
    </div>
  </div>
  ...
</a>

7.4 Card Usage

Cards are rarely used in isolation. They typically appear in structured collections that influence how they behave, how much content they can hold, and how predictable they need to be.

Grids
The most common context. Cards sit in a responsive grid where consistent ratios, title lengths, and summary lengths are important for visual rhythm. Grids may support filtering, sorting, or pagination, so cards should remain stable as content changes.

Carousels
Cards inside carousels are usually tighter and more image-led. Proportions may shift slightly (especially on mobile), and hover interactions should be treated carefully or avoided entirely where touch interaction is the primary input.

Lists / stacks
Horizontal cards are often used in stacked lists where vertical space is constrained. These favour clarity and scan-ability over visual impact, and typically rely less on imagery.

Tiles

Tiles are layout-led content containers used for promotions, navigation, and feature panels. They are typically more “graphic” than cards: fewer metadata fields, stronger visual emphasis, and more deliberate text placement over media.

Tiles are layout-led content containers used for promotions, navigation, and feature panels. They are typically more “graphic” than cards: fewer metadata fields, stronger visual emphasis, and more deliberate text placement over media.

Tiles can be image-led or use ambient video as a background. Where text sits directly on media, use overlays or fades to protect readability.


8.1 Tile structure

A tile is usually a single clickable container with media underneath and one or more overlay content blocks. You can place multiple .tile-content elements (e.g. headline top-left, CTA bottom-left).

Key points

  • Media-first: tiles are usually image or ambient video backgrounds.
  • Overlay text: keep copy short and scannable.
  • Multiple overlays: it’s normal to have more than one .tile-content.
  • Readability: use .overlay / .overlay-dark and fades where needed.
  • Interaction: don’t hide essential content behind hover (touch devices won’t reveal it).

Tiles are simplest when the whole tile is clickable. Use one or more .tile-content blocks to position text without forcing awkward line breaks. Protect legibility with overlays/fades when needed.

<a href="#" class="tile">
  <div class="src ratio-16x9"><img src="..." alt=""></div>
  <div class="overlay"></div>
  <div class="tile-content">Top-left</div>
  <div class="tile-content bottom">Bottom-left</div>
</a>

8.2 Placement patterns

Tiles are layout-led containers rather than rigid components. Unlike cards, they are not tied to a single anatomy or content type. A tile may act as a hero, a promotional panel, a navigation entry, or a visual divider between sections.

Text, imagery, and interaction are intentionally flexible. A tile may contain a single headline, multiple blocks of copy, a call-to-action, or no text at all. Typography, colour, and hierarchy are chosen based on the image or video behind it, not by a fixed template.

Placement is controlled by positioning patterns rather than predefined layouts. Content can be aligned to any edge or centred, layered over imagery, or split into multiple regions within the same tile. Large tiles may span the full viewport width, while smaller tiles may sit alongside others in a grid.

Default (top-left)

Styleguide

Top-left

Default placement.

Centered

Styleguide

Centered title

Use for strong promos or hero sections.
No link on the tile, only ont he CTA

CTA

Apply positioning classes on .tile-content. For readability, add .overlay/.overlay-dark or a fade (.fade-bottom/.fade-top) between media and text.

<a class="tile">
  <div class="src ratio-16x9"><img src="..." alt=""></div>
  <div class="fade-bottom"></div>
  <div class="tile-content full-width bottom">
    <h3>Title</h3>
    <p>Copy</p>
  </div>
</a>

8.3 Ambient video tiles

Tiles can use ambient video as a background (silent, looping). Treat this like “moving imagery” — overlays and fades are often required for text contrast.

 

Guidance

  • Ambient video should be muted, looping, and no-controls.
  • Always include a poster frame for graceful loading/fallback.
  • Use .overlay-dark or fades to protect readability over moving footage.
  • Don’t rely on autoplay: mobile and low-power modes may prevent autoplay.

Ambient video tiles use the same ratio helpers via .video-control. Keep them silent and looping (muted autoplay loop playsinline) and add overlays/fades to ensure text remains readable.

<a class="tile">
  <div class="video-control ratio-16x9">
    <video src="video.mp4" poster="poster.jpg" muted autoplay loop playsinline></video>
  </div>
  <div class="overlay-dark"></div>
  <div class="tile-content">Title</div>
  <div class="tile-content bottom">CTA</div>
</a>

Carousels

Carousels are used for browsing or showcasing content in a compact space. They most often contain cards, tiles, or full-bleed images.

Carousels are built with slick.js and are used to showcase images, cards, and tiles in a compact browsing format. They’re most commonly used for featured content and short collections. Slick documentation.

This section is primarily visual: it shows the most common carousel patterns and how they behave in context. In most builds we keep only a few base carousel types and adjust behaviour per instance using data-slick (e.g. autoplay speed, arrows, dots).


9.1 Mini image carousels

Mini image carousels are used for compact image clusters (landing sections, side-by-side content blocks). They are typically image-led and lightweight.

Autoplay
(5 second delay, no arrows)

Styleguide
Styleguide
Styleguide
Styleguide

Best when the carousel is decorative/supporting and does not need navigation.

Autoplay
(7 Second delay, arrows)

Styleguide
Styleguide
Styleguide
Styleguide

Use when users are expected to browse images, but the carousel remains compact.

Manual
(minimal arrows + dots)

Styleguide
Styleguide
Styleguide
Styleguide

Use when users need clearer feedback on position/progress (and the sequence matters).

Mini carousels reuse .slick-mini and are usually adjusted per instance using data-slick (autoplay, arrows, dots). For pages with multiple mini carousels, stagger autoplay speeds so they don’t all change at once.

<div class="slickouter slick-buttons-bg slick-dots-inside">
  <div class="slick slick-mini"
       data-slick='{"arrows": true, "dots": true, "autoplay": true, "autoplaySpeed": 6000}'>
    <div>...</div>
    <div>...</div>
  </div>
</div>

9.2 Card carousel (most common)

This is the default browsing pattern for projects/news/products: a full-width carousel containing cards. Cards should keep predictable ratios and summary lengths so the carousel feels stable as content changes.

Note: the number of visible slides changes responsively. For example, .slick-four shows 4 items on desktop, fewer on smaller screens (so cards remain readable). This keeps carousels usable on mobile without creating new carousel types.

Responsive behaviour (defaults)
.slick-five: 5 slides desktop → 3 on smaller desktop/tablet → 2 on mobile.
.slick-four: 4 slides desktop → 3 on smaller desktop/tablet → 2 on mobile.
.slick-three: 3 slides desktop → 2 on tablet → 1 on mobile.

These defaults are defined in the theme’s slick initialisation (so editors get predictable behaviour without needing per-carousel setup).

<div class="slickouter slick-buttons-bg">
  <div class="slick slick-four" data-slick='{"arrows": true, "autoplay": false}'>
    <div class="item item-padded-sm"><?php /* card */ ?></div>
    <div class="item item-padded-sm"><?php /* card */ ?></div>
  </div>
</div>

9.3 Tile carousel (promotional)

Tile carousels are more layout-led and promotional. Use them for highlights, campaigns, or editorial moments. Keep copy brief and ensure readability with overlays/fades where needed.

Use tile carousels for promotional/editorial content. Keep typography and overlays consistent so the carousel reads as a set. Prefer fewer words and strong contrast for readability.

<div class="slickouter slick-buttons-white slick-hover-fade">
  <div class="slick slick-three" data-slick='{"arrows": true, "autoplay": false}'>
    <div class="item">
      <a class="tile">
        <div class="src ratio-1x1"><img src="..." alt=""></div>
        <div class="fade-bottom"></div>
        <div class="tile-content full-width bottom">...</div>
      </a>
    </div>
  </div>
</div>

9.4 Carousel modifiers

Modifiers change how a carousel feels (arrow size, placement, dots, hover behaviour) without changing the content inside it. The examples below are intentionally plain so it’s easy to compare treatments.

Slick has a lot of options — we intentionally keep to a small set of modifiers so carousels remain consistent across the site, and different carousel modules can sit on the same page without feeling like separate UI systems.

Arrows: small

Default for tight carousels (cards/tiles) where UI needs to stay subtle.

Arrows: medium

Use when the carousel needs clearer navigation but is not “hero” scale.

Arrows: large

Best for full-width / near full-screen carousels where controls must be obvious.

Theme: buttons bg

Default when arrows sit over imagery and need strong contrast. Combine with size modifiers.

Theme: white arrows

Use when the carousel sits on a dark background or images are consistently dark.

Hover fade

Use when controls should stay out of the way until the user engages.

Hide previous

Occasionally useful for “forward-only” flows when the carousel isn’t infinite.

Dots

Use for simple image slideshows.

Dots & arrows

Use for complex slideshows where maximum navigation is required.


9.5 Arrow positioning

When you have spare horizontal space (especially in grids), arrows can sit outside the carousel so they don’t cover content. This is one of the most common treatments for card/thumbnail carousels.

Default (overlay)

Arrows sit over the slide content (good when space is tight).

Outside (recommended for roomy layouts)

Arrows push outward so they don’t overlap cards/tiles (common in grids).

Add modifier classes to the carousel container (.slickouter / .slick-outer) to change presentation (arrows, dots, hover, positioning). The carousel stays the same (.slick + a type like .slick-mini), and behaviour can still be tweaked with data-slick when needed.

<div class="slickouter slick-arrows-md slick-buttons-bg slick-buttons-outside slick-dots-inside slick-dots-white">
  <div class="slick slick-mini" data-slick='{"arrows": true, "dots": true, "autoplay": false}'>
    <div>Slide</div>
    <div>Slide</div>
    <div>Slide</div>
  </div>
</div>

Layout & Grid

Layout is based on a 12-column responsive grid. Most pages are built from containers, rows and columns so content remains predictable as it reflows across breakpoints.


10.1 Grid system & layout

Layout is based on Bootstrap’s 12-column grid. Most pages are built from containers, rows and columns. This section is visual: it shows how common container types behave and how columns map to the 12-column grid.

We keep this overview focused on horizontal layout (columns and gutters). Height/flex alignment is handled case-by-case in component sections (cards, tiles, forms).


10.2 Containers

Containers control page width and side padding. In our builds we typically use: .container (standard), .container-fluid (full-width with gutters), and .container-full (full-bleed, no side padding).

.container

Viewport

Standard container
Centered, padded, max-width by breakpoint.

col-6
col-6
col-4
col-4
col-4

Default for most page sections and content layouts.

.container-fluid

Viewport

Full-width (with gutters)
Spans full width but retains side padding.

col-12
col-8
col-4

Use when the section wants full width, but content still needs gutters.

.container-full

Viewport

Full-bleed (no padding)
Edge-to-edge. Useful for hero media.

col-12
col-6
col-6

Use for full-bleed image/video sections (often with inner content overlays).


10.3 Columns & responsiveness

Columns are defined in 12ths. Responsive classes (e.g. col-12 col-md-6 col-lg-4) let layouts reflow as the viewport changes. The demo below simulates that behaviour.

Simulated viewport
col-12 / md-6 / lg-4
col-12 / md-6 / lg-4
col-12 / md-6 / lg-4

As the viewport narrows, columns stack. As it widens, more columns fit per row. Aim for predictable rhythms and consistent gutters across adjacent sections.

Use .container for standard sections, .container-fluid for full-width sections with gutters, and .container-full for full-bleed media. Build layouts with the 12-column grid and responsive column classes (col-*, col-md-*, col-lg-* etc).

<div class="container">
  <div class="row">
    <div class="col-12 col-md-6 col-lg-4">...</div>
    <div class="col-12 col-md-6 col-lg-4">...</div>
    <div class="col-12 col-md-6 col-lg-4">...</div>
  </div>
</div>

Coverage & Scope

This guide documents the core components and interface patterns currently used across the site. It focuses on established, repeatable elements that support layout, content and interaction.

Not every possible pattern is included. Components are documented once they are stable, well understood, and in regular use. Other interface elements may exist elsewhere in the site or evolve over time, but are intentionally omitted here until they are considered part of the core system.

Planned additions

The following areas are expected to be documented as they are finalised or become more widely used:

  • Logos & usage
  • Cards & tiles (layout, hierarchy, media combinations)
  • Media galleries and carousels
  • Grid and layout patterns
  • Miscellaenous components (e.g accordions, popups, tooltips, etc)
  • Tables and data presentation
  • System alerts and notification states

This section will evolve over time as patterns mature and are promoted into the main body of the guide.