Design system

Design System

Every colour, type style and section the club website is built from. Use the section library to decide what goes on a new page — anything marked Buildable can be added yourself from Pages → Add New → Flexible Page, with no developer needed.

  • 13Buildable sections
  • 12Components
  • 36Design tokens
  • 5Reference only
Start here

Building a new page

Pages are assembled from sections rather than designed from scratch. That is what keeps every page looking like the same club.

1. Create the page

Pages → Add New. In the Page Attributes box on the right, set Template to "Flexible Page".

2. Add sections

Click Add section and pick from the list. Building blocks are generic; Club sections are the ones shown below. Drag to reorder at any time.

3. Alternate the bands

Most sections have a Background choice. Alternate Plain, Cream, Champagne and Deep down the page — never two identical bands in a row.

Foundations

Colour

Greens carry the identity, lime carries the action, gold marks the moment. Everything else is surface and text.

Brand greens

The club's core identity. Primary is the workhorse — buttons, links, headings on light backgrounds. Deep is reserved for full-bleed dark bands.

Primary

--color-primary #0f5132

Buttons, links, active nav

Primary dark

--color-primary-dark #073420

Hover states

Primary deep

--color-primary-deep #042114

Dark band backgrounds

Accent navy

--color-accent #0a2540

Occasional contrast

Accents

Lime is the call-to-action colour — use it sparingly so it keeps its punch. Gold signals something premium or time-sensitive.

Lime

--color-lime #84cc16

Primary CTA buttons

Lime soft

--color-lime-soft #a3e635

Lime hover

Gold

--color-gold #c9a85c

Eyebrow rules, Next-up CTA

Gold soft

--color-gold-soft #d8be7e

Gold hover

Surfaces / bands

Every section sits on one of these. Alternating them is what gives pages their rhythm — never stack two identical bands in a row.

Plain

--color-bg #ffffff

section (no class)

Cream

--color-bg-cream #fffaf0

section.cream

Champagne

--color-bg-champagne #f5f0e6

section.champagne

Sand

--color-bg-sand #ebe6d6

Borders, dividers

Charcoal

--color-bg-charcoal #0d1219

section.deep

Text & lines

Body

--color-text #1c1f24

Default copy

Muted

--color-text-muted #5b6470

Intros, meta lines

Soft

--color-text-soft #8a929c

Timestamps, captions

Border

--color-border #e8e3d4

Card edges

Border light

--color-border-light #efeae0

Subtle dividers

Notices

Warn bg

--color-warn-bg #fef3c7

Inline notices

Warn border

--color-warn-border #f59e0b

Notice rule

Warn text

--color-warn-text #78350f

Notice copy

Foundations

Typography

Two families, strictly divided: Fraunces for every heading, Inter for everything else.

Fraunces — Tennis in the foothills

--font-display · Fraunces, Georgia, serif

All headings. Variable weight — it carries the club's character.

Inter — Tennis in the foothills

--font-body · Inter, system UI, sans-serif

Body copy, buttons, UI. Never use it for headings.

Scale

h1

Tennis in the foothills

Page titles and heroes. One per page.

h2

Four tiers. One welcoming club.

Section headings.

h3

Adult social sessions

Card titles.

h4

Friendly membership

Benefit tiles, compact cards.

p

Members play year-round on four floodlit courts, with coaching for every level from first racket to competitive league tennis.

Body copy at 1rem / 1.7 line height.

Foundations

Spacing & shape

Fixed steps, no in-between values. Consistent spacing is most of what makes a site feel considered.

Spacing

Section padding uses xl to 3xl; gaps inside components use xs to lg. Stick to the scale — don't invent one-off pixel values.

--space-xs 0.5rem
--space-sm 1rem
--space-md 1.5rem
--space-lg 2.5rem
--space-xl 4rem
--space-2xl 6rem
--space-3xl 9rem

Corner radius

--radius-sm 8px
--radius 16px
--radius-lg 24px

Elevation

--shadow-card resting card
--shadow-card-hover card on hover
--shadow-elevated modals, overlays

Layout

--max-width 1240px
--header-height 80px
Library

Components

The building blocks sections are made of. Each specimen below is live markup using the real stylesheet — expand the code if you need to hand it to a developer.

Buttons .btn, .btn--lime, .btn--gold, .btn--ghost, .btn--invert, .btn--sm

One primary action per section. Lime is the strongest — reserve it for the thing you most want clicked. Ghost is for secondary actions, invert for use on dark bands.

Default

Book a session

Lime (primary CTA)

Join the club

Gold

Register

Ghost (secondary)

Ask a question

Small

All news →
Show markup
<a class="btn" href="#0">Book a session</a>

<a class="btn btn--lime" href="#0">Join the club</a>

<a class="btn btn--gold" href="#0">Register</a>

<a class="btn btn--ghost" href="#0">Ask a question</a>

<a class="btn btn--ghost btn--sm" href="#0">All news →</a>

Eyebrow / kicker .eyebrow

The small gold-ruled label above a heading. It names the topic so the heading can be a statement rather than a label. Two or three words, sentence case.

Eyebrow

Why join KPLTC
Show markup
<span class="eyebrow">Why join KPLTC</span>

Section heading .section-heading

The standard opener for any section: eyebrow, h2, and an optional one-line intro. Centred by default.

Full

Membership

Four tiers. One welcoming club.

Join in under five minutes. The committee reviews every application.

Show markup
<div class="section-heading"><span class="eyebrow">Membership</span><h2>Four tiers. One welcoming club.</h2><p>Join in under five minutes. The committee reviews every application.</p></div>

Card & card grid .card, .card-grid, .card-grid--2, .card-grid--3, .card-grid--4, .card__meta, .card__link

The general-purpose content tile. Three across is the default and reads best; four gets tight below 1100px. Add .card--no-hover for non-clickable cards.

Three-column grid

Tuesdays · 19:00

Adult social

Relaxed doubles, all levels welcome. Just turn up.

See the schedule →

Saturdays · 10:00

Junior academy

Coached groups for ages 6–16, split by age and stage.

See the schedule →

Thursdays · 20:00

League practice

Match-standard play for our Dublin league squads.

See the schedule →

Show markup
<div class="card-grid card-grid--3"><div class="card"><p class="card__meta">Tuesdays · 19:00</p><h3>Adult social</h3><p>Relaxed doubles, all levels welcome. Just turn up.</p><p><a class="card__link" href="#0">See the schedule →</a></p></div><div class="card"><p class="card__meta">Saturdays · 10:00</p><h3>Junior academy</h3><p>Coached groups for ages 6–16, split by age and stage.</p><p><a class="card__link" href="#0">See the schedule →</a></p></div><div class="card"><p class="card__meta">Thursdays · 20:00</p><h3>League practice</h3><p>Match-standard play for our Dublin league squads.</p><p><a class="card__link" href="#0">See the schedule →</a></p></div></div>

Membership tier card .tier-cards, .tier, .tier--featured, .tier__name, .tier__price, .tier__bullets

Pricing card. Exactly one tier should carry .tier--featured — it lifts and takes the solid button while the others go ghost.

Standard + featured

Student

€95/year
  • Full court access
  • All social sessions
  • Valid student ID required
Apply
Show markup
<div class="tier-cards"><article class="tier"><h3 class="tier__name">Student</h3><div class="tier__price">€95<span class="tier__price-note">/year</span></div><ul class="tier__bullets"><li>Full court access</li><li>All social sessions</li><li>Valid student ID required</li></ul><a class="btn btn--ghost btn--sm" href="#0">Apply</a></article><article class="tier tier--featured"><h3 class="tier__name">Family</h3><div class="tier__price">€380<span class="tier__price-note">/year</span></div><ul class="tier__bullets"><li>Two adults, all children</li><li>Priority junior coaching</li><li>Four guest passes</li></ul><a class="btn btn--sm" href="#0">Apply</a></article></div>

Benefit tile .benefits, .benefit, .benefit__icon

Compact icon-led tile for short value propositions. The icon is a single emoji, set aria-hidden — the heading carries the meaning.

Benefits row

Four floodlit courts

Play year-round, book in seconds from your phone.

Friendly membership

Social tennis every week — you'll know names by your second visit.

League tennis

Six teams competing across the Dublin leagues.

Show markup
<div class="benefits"><div class="benefit"><div class="benefit__icon" aria-hidden="true">🎾</div><h4>Four floodlit courts</h4><p>Play year-round, book in seconds from your phone.</p></div><div class="benefit"><div class="benefit__icon" aria-hidden="true">🤝</div><h4>Friendly membership</h4><p>Social tennis every week — you'll know names by your second visit.</p></div><div class="benefit"><div class="benefit__icon" aria-hidden="true">🏆</div><h4>League tennis</h4><p>Six teams competing across the Dublin leagues.</p></div></div>

Testimonial .testimonial-rich, .testimonial-rich__quote, .testimonial-rich__author

Member quote with photo and joining year. Designed for the deep band — it inverts automatically there.

Quote

I joined not knowing a soul and had a regular Tuesday four within a month.
Aoife N.
Member since 2019
Show markup
<figure class="testimonial-rich"><blockquote class="testimonial-rich__quote">I joined not knowing a soul and had a regular Tuesday four within a month.</blockquote><figcaption class="testimonial-rich__author"><div><div class="testimonial-rich__author-name">Aoife N.</div><div class="testimonial-rich__author-since">Member since 2019</div></div></figcaption></figure>

Category chips .chip, .chip--social, .chip--coaching, .chip--junior, .chip--competitive, .chip--status

Small category markers used on events and news. Colour is meaning, not decoration — keep the mapping consistent.

All chips

CoachingJuniorCompetitiveMembers only

Show markup
<p style="display:flex;gap:.5rem;flex-wrap:wrap"><span class="chip chip--social">Social</span><span class="chip chip--coaching">Coaching</span><span class="chip chip--junior">Junior</span><span class="chip chip--competitive">Competitive</span><span class="chip chip--status">Members only</span></p>

Next-up banner .next-up, .next-up__pulse, .next-up__title, .next-up__cta

Live strip advertising the next scheduled event. Self-sourcing from the Events content type — it hides itself when nothing is coming up.

Banner

Show markup
<aside class="next-up"><div class="container"><span class="next-up__pulse"><span class="next-up__pulse-dot"></span>Next up at KPLTC</span><h3 class="next-up__title"><strong>Club Championship finals</strong> — Sat 6 Sep · 14:00</h3><span class="next-up__time">In 4 days · 18 of 32 spots</span><a class="btn btn--sm btn--gold next-up__cta" href="#0">Register →</a></div></aside>

FAQ item .faq__item, .faq__q, .faq__a

Question and answer pair. Used on the FAQ page; also fine inside a text section.

Q&A

Do I need my own racket?

No — we keep loan rackets at the clubhouse for anyone trying tennis for the first time.

Show markup
<div class="faq__item"><p class="faq__q">Do I need my own racket?</p><div class="faq__a"><p>No — we keep loan rackets at the clubhouse for anyone trying tennis for the first time.</p></div></div>

Form privacy note .form-note

The small line under any form that collects personal details. Rendered by kpltc_form_privacy_note() so the privacy link stays in one place — never hand-write this.

Note

We only use your email to send you club news — unsubscribe anytime. See our Privacy policy.

Show markup
<p class="form-note">We only use your email to send you club news — unsubscribe anytime. See our <a href="#0">Privacy policy</a>.</p>

Containers & reveal .container, .container--narrow, .reveal, .reveal--delay-1, .reveal--delay-2, .reveal--delay-3

Every section's inner wrapper is .container (max 1240px). Use .container--narrow for long-form reading. Add .reveal to fade an element in on scroll, and the delay modifiers to stagger a row of three.

Narrow container

Long-form copy sits in a narrower measure so lines stay readable — roughly 70 characters.

Show markup
<div class="container--narrow" style="background:var(--color-bg-cream);padding:var(--space-md);border-radius:var(--radius)"><p style="margin:0">Long-form copy sits in a narrower measure so lines stay readable — roughly 70 characters.</p></div>

Library

Section library

Everything below can be added to a Flexible Page yourself. Each preview is the actual section rendered with sample content — pick the ones you want, then add them by the name shown under "In the page builder".

Hero

Buildable

Full-bleed opener with eyebrow, headline, lede, two CTAs and optional stat row. One per page, always first.

In the page builder
Building block — Hero
Content comes from
You write it
Already used on
Home
Template
parts/hero.php

Why join (benefits grid)

Buildable

Icon-led tiles for short value propositions. Three or six reads best.

In the page builder
Club section — Why join (benefits grid)
Content comes from
You write it
Already used on
Home
Template
parts/benefits.php
Why join KPLTC

A club, not just courts

Four floodlit courts, a full coaching programme and a members' bar that actually gets used.

Four floodlit courts

Play year-round, book in seconds from your phone.

Social tennis weekly

Turn-up-and-play sessions — you'll know names by your second visit.

League teams

Six squads competing across the Dublin leagues.

Membership tiers

Buildable

Pricing cards. Mark one tier as Featured. Set the tier slug to match the Membership page so Apply preselects correctly.

In the page builder
Club section — Membership tiers
Content comes from
You write it — Apply buttons route to the application form and preselect the tier
Already used on
Home, Membership
Template
parts/tier-cards.php
Membership

Four tiers. One welcoming club.

Every application is reviewed by the committee before payment.

Student

€95/year
  • Full court access
  • All social sessions
  • Valid student ID required
Apply

Adult

€220/year
  • Full court access
  • League eligibility
  • Members' bar
Apply

Floodlight fees are charged separately at €2 per hour.

Sessions grid

Buildable

Three-across cards with a meta line for day and time. The standard way to list anything scheduled.

In the page builder
Club section — Sessions grid
Content comes from
You write it
Already used on
Home, Sessions
Template
parts/sessions-grid.php
Sessions

Tennis for every level

From first racket to league standard.

Tuesdays · 19:00

Adult social

Relaxed doubles, all levels welcome. Just turn up.

Saturdays · 10:00

Junior academy

Coached groups for ages 6–16, split by age and stage.

Thursdays · 20:00

League practice

Match-standard play for our Dublin league squads.

Coach spotlight

Buildable

Photo beside biography, credentials list and two CTAs. Pick any coach profile; leave the intro blank to use their own bio.

In the page builder
Club section — Coach spotlight
Content comes from
Coach profiles — photo, credentials and email come from the coach entry
Already used on
Home, Coaching
Template
parts/coach-spotlight.php
Head coach at KPLTC
Coaching team

Meet the head coach

James is a Tennis Ireland Level 1 qualified coach with over 10 years of playing experience and 4 years of coaching players of all ages and abilities. He is an enthusiastic, energetic and professional coach who is passionate about player development and delivering engaging, high-quality, results-focused coaching. His coaching philosophy focuses on building solid technique, improving tactical awareness, developing match confidence and helping every player reach their potential in a positive and enjoyable environment. Whether you're picking up a racket for the first time, preparing for league competition or looking to elevate your overall game, James creates sessions that are challenging, enjoyable and designed to deliver measurable improvement. James coaches regularly at KPLTC and also offers private lessons, Cardio Tennis, junior camps and adult coaching programmes through PlayTennis.ie and Cardiotennis.ie. For private lessons, Cardio Tennis, junior camps and adult coaching programmes, visit: www.playtennis.ie

  • Tennis Ireland Level 1 Qualified
  • 10+ years playing experience
  • 4+ years coaching all ages & abilities

Hello Club calendar

Buildable

Embedded live month calendar. The month heading follows the date automatically.

In the page builder
Club section — Hello Club calendar
Content comes from
Live from Hello Club — nothing to maintain
Already used on
Home, Events
Template
parts/calendar-preview.php
What's on

At the club

Sessions, friendlies and tournaments. Synced live from Hello Club.

Open full calendar →

August 2026

Friday 21 August

No events

Saturday 22 August

No events

Tuesday 25 August
Wednesday 26 August

No events

Thursday 27 August

Testimonials

Buildable

Three member quotes with photos. Best on the deep band, where it inverts automatically.

In the page builder
Club section — Testimonials
Content comes from
You write it
Already used on
Home
Template
parts/testimonials.php
Members

What our members say

I joined not knowing a soul and had a regular Tuesday four within a month.
Aoife N.
Member since 2019
The junior coaching is the reason we joined and the reason we stayed.
Declan M.
Member since 2021
Best value club in south Dublin, and the courts are never in bad nick.
Sinéad K.
Member since 2016

Latest news

Buildable

One large featured article beside two smaller ones. Add or edit articles under News and this updates itself.

In the page builder
Club section — Latest news
Content comes from
News articles — pulls the featured article plus the two most recent
Already used on
Home
Template
parts/news-grid.php
News & updates

From the club

Match reports, club announcements, junior achievements.

All news →

Newsletter signup

Buildable

Full-width signup band. Usually the last section before the footer.

In the page builder
Club section — Newsletter signup
Content comes from
You write it — submissions go to the club inbox
Already used on
Home
Template
parts/newsletter-band.php

Text block

Buildable

Heading plus rich text on any band. The general-purpose section for prose.

In the page builder
Building block — Text block
Content comes from
You write it
Already used on
Any flexible page
Template
page-flex.php

Card grid

Buildable

Two, three or four cards with optional links. Use when no club section fits.

In the page builder
Building block — Card grid
Content comes from
You write it
Already used on
Any flexible page
Template
page-flex.php

Image + text

Buildable

Image on one side, heading and rich text on the other. Alternate the image side down a page.

In the page builder
Building block — Image + text
Content comes from
You write it
Already used on
Any flexible page
Template
page-flex.php

Call to action

Buildable

Centred heading, line of copy and one button on the deep band. Close a page with it.

In the page builder
Building block — Call to action
Content comes from
You write it
Already used on
Any flexible page
Template
page-flex.php
Library

Reference only

These exist on the site but are tied to one page — usually because there is form handling or a data pipeline behind them. A developer can promote any of them into the page builder if you want them elsewhere.

Reference

Next-up banner

Live event strip. Currently wired to the home page toggle only; ask a developer if you want it on another page.

On: Home
parts/next-up.php

Reference

Contact hero with form

Split hero with the enquiry form. Bespoke to the Contact page because of the form handling behind it.

On: Contact
page-contact.php

Reference

Membership application form

The full application pipeline: tier selection, family members, proposers, consent. Not reusable — it exists once, by design.

On: Membership Application
page-membership-apply.php

Reference

History timeline

Year-by-year club history. Could be promoted to a builder section if you want it elsewhere.

On: About
page-about.php

Reference

Committee directory

Grouped contact cards for committee roles.

On: Contact
page-contact.php