Brand
Guidelines
The single source of truth for what we do and how we look and sound — our services, colours, type, logo, icons and tone — across the website, landing pages, adverts, brochures, presentations and reports.
What We Do
Ten areas of expertise. Everything we deliver sits under one of them — and every piece of marketing should speak to at least one. Expand a card for the full service catalogue, written so anyone outside the business (or any AI model reading this page) understands exactly what iceConnect delivers.
IT Support
Day-to-day support that keeps people productive
View services (9)
A UK service desk, proactive monitoring and well-managed devices, so problems are fixed before they slow anyone down.
- Service Desk & Remote Support
- Onsite Support
- User Onboarding & Offboarding
- Device Setup & Deployment
- Hardware Procurement & Warranty
- IT Asset Management & Documentation
- Proactive Monitoring (RMM)
- Patch Management
- Vendor Management
Cyber Security
Protection for your people, devices and data
View services (9)
Layered defences, 24/7 detection and response, and a security-aware workforce.
- Endpoint Protection (EDR/XDR)
- Managed Detection & Response (MDR)
- Security Operations Centre (SOC)
- Email Security & Anti-Phishing
- DNS Security & Web Filtering
- MFA & Conditional Access
- Identity & Privileged Access
- Security Awareness Training
- Dark Web Monitoring
Governance, Risk & Compliance
Proving and maintaining your security posture
View services (9)
Assessments, testing and certifications that make compliance manageable.
- Vulnerability Management
- Penetration Testing
- Data Loss Prevention (DLP)
- Cyber Essentials & Plus
- GDPR & Data Protection
- Data Governance & Retention
- Risk Assessments
- Technology Audits
- Policy & Compliance Support
Microsoft 365 & Productivity
Helping your teams work better together
View services (8)
Microsoft 365 set up, secured, licensed and supported end to end.
- 365 Licensing & Optimisation
- Tenant Management
- Exchange Online
- Microsoft Teams
- SharePoint & OneDrive
- Email Migration
- Collaboration Platforms
- Productivity Training
Cloud & Infrastructure
The platforms everything runs on
View services (9)
Cloud, servers and storage designed, migrated, monitored and managed.
- Microsoft Azure & AWS
- Private & Hybrid Cloud
- Hosting & Co-Location
- Virtual Servers & Virtualisation
- Server & Storage Management
- Infrastructure Design
- Infrastructure Monitoring
- Cloud Migration
- Capacity Planning
Network & On-Premise Infrastructure
The on-site backbone that connects it all
View services (7)
Networks, Wi-Fi and firewalls that are designed, monitored and just work.
- Switching & LAN/WAN
- Wi-Fi & Guest Networks
- Managed Routers & Firewalls
- Structured Cabling
- Network Design
- Network Monitoring
- Site Surveys
Communications & Connectivity
Voice and connectivity that keep you reachable
View services (9)
Internet, telephony and contact-centre tools from one supplier.
- Business Internet & Leased Lines
- SD-WAN
- VoIP & Hosted Telephony (SIP)
- Microsoft Teams Calling
- Contact Centre
- Call Recording & Reporting
- Auto Attendants & Call Routing
- Business Mobiles & Integration
- Continuity Telephony
Backup & Business Continuity
Confidence that you can recover from anything
View services (9)
Backup, disaster recovery and continuity planning, monitored and tested.
- Microsoft 365 Backup
- Server & Endpoint Backup
- Cloud Backup
- Disaster Recovery
- Business Continuity Planning
- Recovery Testing
- Backup Monitoring & Compliance
- Ransomware Recovery
- High Availability
AI & Automation
Putting emerging technology to work for you
View services (8)
Copilot, automation and AI adopted safely and governed properly.
- Microsoft Copilot & Adoption
- AI Readiness Assessments
- AI Governance & Security
- Business Process Automation
- Workflow Automation (Power Automate)
- AI Chatbots
- Knowledge Management
- Custom AI Solutions
Strategy & Projects
Guidance and delivery for what comes next
View services (8)
vCIO strategy, roadmaps and projects delivered without drama.
- vCIO & CIO Services
- IT Roadmaps & Strategic Reviews
- Technology & Budget Planning
- Digital Transformation
- Project Delivery & Migrations
- Office Moves
- Mergers & Acquisitions Support
- Due Diligence
Brand Colours
The full palette with screen (HEX/RGB) and print (CMYK/Pantone) values together. Slate and neutrals carry the weight; brass is the single accent.
Core palette
RGB 15, 23, 42
CMYK 64, 45, 0, 84
Pantone 5255 C
RGB 200, 163, 91
CMYK 0, 18, 55, 22
Pantone 4006 C
RGB 246, 243, 235
CMYK 0, 1, 4, 4
RGB 78, 124, 161
CMYK 52, 23, 0, 37
Pantone 5415 C
RGB 250, 250, 248
CMYK 0, 0, 1, 2
RGB 241, 245, 249
CMYK 3, 2, 0, 2
RGB 100, 116, 139
CMYK 28, 17, 0, 45
RGB 226, 232, 240
CMYK 6, 3, 0, 6
Supporting colours — UI states only
RGB 34, 197, 94
CMYK 83, 0, 52, 23
RGB 217, 119, 6
CMYK 0, 45, 97, 15
RGB 220, 38, 38
CMYK 0, 83, 83, 14
Colour Usage
Let slate and neutrals dominate, steel support quietly, and brass appear sparingly — a little accent goes a long way.
The 60 / 30 / 10 rule
60% slate & neutrals · 30% steel & supporting · 10% brass
Approved pairings
Typography
Two free Google Fonts. Install the clean static Regular & Bold files on every machine that produces assets.
Type Scale
The print & deck scale, in points. Line spacing 1.2–1.3× for body, tight for headings (0.95–1.0×). Left-align everything except cover and section titles. For on-screen app sizes (px / rem / pt / sp) see Type Styles (section 15).
Logo Usage
The four-colour "C" mark with the lowercase wordmark — grey on light grounds, white on dark. Place it only on slate, off-white or white; never on brass, steel or any colour fill, as the mark's own colours bleed against them.
Approved backgrounds
Clear space & minimum size
Clear space
Keep clear space around the logo equal to the height of the "i" in iceconnect on all sides. Never let text, edges or other logos encroach.
Minimum size
Never reproduce the logo smaller than 120px wide on screen or 25mm wide in print. Below this the wordmark loses legibility. At favicon sizes (16–32px) use the simplified icon-only mark — fine detail and the magenta centre muddy at small sizes.
Logo don'ts
Logo Downloads
Every approved logo file, grouped by variant — the same image with all its sizes and formats together. SVG is the primary web format (sharp at any size, no retina variants); PNG is the fallback where SVG isn't supported; PDF and EPS are for print. Each preview sits on the background that file is built for — click any chip to download.
Full logo — mark + wordmark
Icon only — the “C” mark
Favicon & app icons
Rules for using these files
SVG first on the web
Serve SVG on live web pages. Don't serve the large PNG masters (1024px+) on the site — they exist for the asset library, app stores and print workflows only.
Neutral grounds only
The colourful mark always sits on a neutral ground — slate, off-white or white. Never on brass, steel or any colour fill.
Small sizes
At 16–32px the four-colour icon may need the simplified version — fine detail and the magenta centre can muddy. Use the dedicated favicon files, never a scaled-down lockup.
Minimum size
120px wide on screen, 25mm wide in print. Smaller than that, switch to the icon-only mark or don't use the logo at all.
Iconography
One consistent line style across everything. Icons clarify — they never decorate. Below is our standard set — every icon we use across the brand, in its Lucide line form.
Source — use Lucide
lucide.dev
Download all icons from lucide.dev. Lucide is the maintained successor to Feather — a clean, even-stroke line set with a long track record, free for commercial use (ISC licence, no attribution). Its restrained line style suits our premium, classy look and keeps every asset consistent. Stick to Lucide only; don't mix icon sets. The names under each icon below are the exact search terms on lucide.dev.
Our standard icon set
Style rules
Do
Line style only, consistent ~1.75px stroke. Slate by default. Brass only to highlight a single key icon. Match icon weight to surrounding text.
Don't
No filled/solid icons, no mixing line and fill, no multi-colour icons, no steel or supporting colours except for data and status states. Don't resize so strokes look heavier or lighter than the set.
Photography
Imagery should feel premium, professional and high-end — calm, real and considered, never stocky or busy. Six reference samples below show the look we buy and shoot to.






Art direction
Aim for
Real people and real UK workspaces over generic stock. Natural light, shallow depth of field, clean uncluttered compositions with breathing room. Cool, slightly desaturated grade that sits with slate. Where a brand tone is needed, a subtle slate overlay or brass highlight — applied lightly.
Avoid
Cheesy handshake/headset stock, harsh saturated colour, cluttered server-room clichés, heavy filters, busy backgrounds behind a logo, and any image that looks staged or low-resolution.
Tone of Voice
Our audience runs businesses — they are not IT specialists. Write in plain English, sound confident and reassuring, and never show off with jargon.
We sound like this
- Plain English a busy owner understands at a glance
- Confident and reassuring — we've got this handled
- Clear about the benefit, not the technology
- Warm and human, like a trusted advisor
- Specific and honest over vague or salesy
We never sound like this
- Stuffed with acronyms and technical terminology
- Boastful, hyped or full of superlatives
- Cold, corporate or robotic
- Patronising or assuming prior IT knowledge
- Vague — "solutions", "synergy", "best-in-class"
Word list — use / lose
| Use | Lose |
|---|---|
| keep your systems running | maximise uptime / high availability |
| protect your business | endpoint threat mitigation |
| back up your data | immutable backup architecture |
| we'll set it up for you | seamless deployment & onboarding |
| help when you need it | 24/7 SLA-backed support tiers |
Before & after
Our proactive RMM platform leverages enterprise-grade SIEM and EDR to deliver best-in-class threat remediation across your entire estate.
We watch over your computers around the clock and stop most problems before you'd ever notice them — so your team can just get on with work.
Do's & Don'ts
Do
- Let slate and white dominate; use brass sparingly
- Pair Bricolage headings with DM Sans body
- Keep generous whitespace
- Use slate text on brass buttons
- Stick to Lucide line icons
- Keep green, amber and red for UI states only
Don't
- Introduce off-brand colours or extra accents
- Set body copy in the heading font
- Crowd elements or centre body text
- Put the logo on brass or any colour
- Mix icon styles or use solid icons
- Use supporting colours decoratively
Components & Spacing
The building blocks that repeat across web, decks and documents. Buttons and their full interaction states live in Component States (section 18).
Cards
Card Title
White fill, 1px border (#E2E8F0), soft shadow, generous inner padding. The core content container.
Spacing & grid
Rhythm
8px base spacing unit; use multiples of 8 for consistent rhythm. 24px page margins on web; 0.85″ on slides.
Alignment
Align to a consistent left edge — don't centre body copy. Keep generous whitespace; let elements breathe.
Navigation
The current location is always marked with a brass indicator and slate weight; everything else stays muted until hovered or active. One primary action per bar, and icons always carry a text label — never icon-only. Hover any link to see it lift to slate. We keep the bar left-aligned — logo and links left, the single brass CTA right — so the global bar reads the same way as the left-aligned tabs, breadcrumbs and page content below it.
Design Tokens
Brand values, expressed as tokens an app can consume. Primitives are the raw palette (section 01); semantic tokens give each value a role — and the role is what stays consistent across every app, platform and theme.
Why two layers
Primitive
The raw value — slate #0F172A, brass #C8A35B. Named for what it is. Rarely referenced directly in product code.
Semantic
The role — text.primary, action.primary. Named for what it does. Components reference these, so dark mode or a re-theme is a token swap, not a find-and-replace.
Neutral ramp
Semantic tokens · light theme
| Token | Value | Use |
|---|---|---|
| text.primary | #0F172A | Body copy, headings |
| text.secondary | #64748B | Supporting / muted text |
| text.inverse | #FFFFFF | Text on the opposite ground |
| text.on-accent | #0F172A | Label on brass fills |
| bg.page | #FAFAF8 | App background |
| bg.surface | #FFFFFF | Cards, sheets, inputs |
| bg.muted | #F1F5F9 | Subtle fills, hovers |
| bg.inverse | #0F172A | Inverted panels |
| border.default | #E2E8F0 | Hairlines, input borders |
| border.strong | #CBD5E1 | Emphasised dividers |
| action.primary | #C8A35B | Primary buttons, key CTAs |
| action.primary-hover | #BC9550 | Primary button hover |
| action.primary-text | #0F172A | Label on primary |
| action.secondary | #4E7CA1 | Secondary buttons, info |
| action.secondary-text | #FFFFFF | Label on secondary |
| focus.ring | #C8A35B | Focus outlines |
| status.success | #22C55E | Success / positive |
| status.warning | #D97706 | Warning / caution |
| status.error | #DC2626 | Error / destructive |
| status.info | #4E7CA1 | Informational |
Semantic tokens · dark theme
| Token | Value | Use |
|---|---|---|
| text.primary | #F1F5F9 | Body copy, headings |
| text.secondary | #94A3B8 | Supporting / muted text |
| text.inverse | #0F172A | Text on the opposite ground |
| text.on-accent | #0F172A | Label on brass fills |
| bg.page | #0F172A | App background |
| bg.surface | #1E293B | Cards, sheets, inputs |
| bg.muted | #334155 | Subtle fills, hovers |
| bg.inverse | #FAFAF8 | Inverted panels |
| border.default | #334155 | Hairlines, input borders |
| border.strong | #475569 | Emphasised dividers |
| action.primary | #C8A35B | Primary buttons, key CTAs |
| action.primary-hover | #D4B373 | Primary button hover |
| action.primary-text | #0F172A | Label on primary |
| action.secondary | #4E7CA1 | Secondary buttons, info |
| action.secondary-text | #FFFFFF | Label on secondary |
| focus.ring | #C8A35B | Focus outlines |
| status.success | #22C55E | Success / positive |
| status.warning | #D97706 | Warning / caution |
| status.error | #DC2626 | Error / destructive |
| status.info | #4E7CA1 | Informational |
Status tokens
Each status is a set, not one colour: a tint for the background, the base for icons and fills, and a darker shade for text that clears WCAG AA. The base hues fail as text on white — use the text token for any words.
| Status | Background | Base · icon/fill | Text · AA |
|---|---|---|---|
| success | #DCFCE7 | #22C55E | #15803D · 5.0:1 |
| warning | #FEF3C7 | #D97706 | #B45309 · 5.0:1 |
| error | #FEE2E2 | #DC2626 | #B91C1C · 6.5:1 |
| info | #E8EFF5 | #4E7CA1 | #3B5F7D · 6.7:1 |
Status pills
A compact way to surface a single state inline — a glowing status dot beside a short label, inside a pill. The same tokens stay legible on light and dark surfaces, so use the set that matches the background.
action.primary, never #C8A35B — that is what lets the same code render correctly in light, dark and any future theme.Data Visualisation
Dashboards, reports and monitoring are core to what we do, so charts get their own palette. Keep series muted to match the brand, use the categorical set in order, and apply these colours through your charting library’s theme.
Categorical · distinct series
Use top-to-bottom in order — steel and brass (the brand pair) lead. Past six series, group the long tail into “Other” or rethink the chart.
Sequential · one measure, low → high
Single-hue steel ramp for heatmaps, intensity and utilisation — one hue keeps it readable.
Diverging · around a midpoint
For values over/under a target — SLA breach, capacity headroom. Status red and green anchor the ends; neutral sits at the midpoint.
Examples in use
Hover or tap any chart to preview it on a dark surface — the series colours stay put while the gridlines, axes and background flip. That is the rule for dark mode: re-theme the chrome, keep the data.
Bar
Categorical — one colour per category, in palette order.
Line
Trends over time; steel and brass lead, then teal.
Stacked area
Composition over time — how the parts make the whole.
Donut
Share of a total — keep to a handful of slices.
Grouped bar
Comparison — two series side by side (this period vs last).
Status bar
Status in a chart — healthy, warning, critical from the status tokens.
Applying the palette
// iceConnect data-viz palette
const iceChart = ['#4E7CA1','#C8A35B','#4F9D8C','#8C6A93','#C0795B','#64748B'];
const iceStatus = { success:'#22C55E', warning:'#D97706', error:'#DC2626' };
// Chart.js
new Chart(ctx, { data:{ datasets:[{ backgroundColor: iceChart }] } });
// Apache ECharts
option = { color: iceChart };
// Recharts
<Cell fill={iceChart[i % iceChart.length]} />
Type Styles
The print scale (section 05) is for decks and brochures; these are the on-screen styles in the units apps use — same two fonts. Web uses rem on a 16px base; iOS points and Android sp use the same numbers.
Spacing, Layout & Motion
The scales that give every screen the same rhythm. Spacing is built on the 8px base, with 4px as the only half-step; breakpoints, layering and motion follow the same discipline.
Spacing
Radius
Elevation
Inputs, chips
Cards, popovers
Modals, sheets
border.default hairline instead of elevation.Layering (z-index)
One z-index scale, seven named tiers — so overlapping surfaces never fight. Stay on the scale; never invent ad-hoc values like z-index: 9999. Each tier sits cleanly above the one before.
Breakpoints
Mobile-first: design for the narrowest screen, then layer enhancements up at each min-width. Four tiers carry every layout — no horizontal scroll, no fixed-px containers.
Motion
Duration
fast 120ms for hovers and toggles, base 180ms for most transitions, slow 280ms for larger surfaces like modals and drawers.
Easing & reduced motion
Standard easing cubic-bezier(.2,0,0,1) for entrances and moves; linear only for spinners. Always honour prefers-reduced-motion — drop non-essential animation to instant.
Pulse
A single named looping primitive — animation: pulse — for any "live" indicator: status dots, recording state, real-time data. A pure-CSS ring radiates outward from the dot via box-shadow spread and fades to nothing, then holds clear for a rest beat before repeating. The colour comes from whatever status the element already carries, so one token works in every state. No JavaScript. The two pills below are the same status-pill component shown in Design Tokens — here they demonstrate the motion, there the full set on light and dark.
Tokens
pulse.duration 2.4s · pulse.ease ease-out · ring grows 0 → 8px spread while fading 0.7 → 0 by 70%, then holds clear for the final 30% as a rest beat. Under prefers-reduced-motion the ring stops and the dot rests with a faint static halo.
Developer Quick-Start
Three steps to an on-brand build. Pull the fonts, the icon set and the tokens, then keep the five non-negotiables in view. Every file referenced here is downloadable from Brand Files & Resources.
Fonts & icons
The two typefaces and the one icon set every build starts from.
Fonts
Bricolage Grotesque (headings) + DM Sans (body) — both free on Google Fonts. Add the single <link> below to your <head>.
Icons
Lucide line icons only — npm i lucide-react (web) or lucide-react-native (mobile). Never mix icon sets.
Pull the design tokens
Pick the format that suits your stack — the values are identical either way.
theme.css
Ready-to-paste CSS custom properties with light and dark themes. Import once, then reference var(--ic-…).
tokens.json
W3C / Style Dictionary source — generate CSS, a Tailwind preset, and iOS & Android outputs from one file.
<!-- Fonts — one link in <head> --> <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@600;700;800&family=DM+Sans:wght@400;500;700&display=swap" rel="stylesheet"> /* Tokens — CSS route (drop-in, no build step) */ @import url("https://brand.iceconnect.com/dist/theme.css"); .btn-primary { background: var(--ic-action-primary); color: var(--ic-text-on-accent); } # Tokens — build route (Style Dictionary, Tailwind, native) curl -O https://brand.iceconnect.com/dist/tokens.json
Performance essentials
A brand is also how fast it feels. Four habits keep every page quick and stable.
font-display: swap on every face so text is never invisible while a font loads; preload only the two we use.
Serve photographs as WebP/AVIF with srcset and loading="lazy" below the fold. Logos and icons stay SVG — never rasterise the mark.
Always set width/height or aspect-ratio and reserve space for async content — keep CLS under 0.1.
Skeletons (above) for loads over ~300ms, not blocking spinners. Defer non-critical scripts; split by route.
The five non-negotiables
Get these right and anything you ship reads as iceConnect.
- Slate dominant, brass sparing — always slate text on a brass fill, never white.
- Bricolage Grotesque headings, DM Sans body — nothing else, never the heading font below 18px.
- Lucide line icons only — never emoji as icons; use the supplied logo files, never generate or redraw the logo.
- Supporting colours signal status only, always paired with an icon or text (WCAG 2.2 AA).
- Reference tokens by role, ship light and dark, and give every control a visible focus ring.
Component States
Build the core components once, with every state, and reuse them everywhere. The states each interactive element needs, shown left to right.
Primary button
Secondary & ghost
Sizes
Forms & validation
Always a visible label (never placeholder-only). Mark required fields, give helper text below the input, validate on blur, and put the error message beside the field with both an icon and words. The four field states come first, then a complete field in context.
focus.ring outline with 2px offset. Never remove outlines without replacing them.Empty & loading states
No tickets yet
When you raise a request it’ll show here with its status.
Raise your first ticketEmpty states give one clear next action, never a blank panel. For loads over ~300ms show a skeleton, not a spinner — reserve the final layout so nothing shifts (CLS). The shimmer honours prefers-reduced-motion.
Product microcopy
Write UI like this
- Buttons are verbs: “Set up monitoring”, “Download report”
- Errors say what happened and the fix: “Couldn’t save — check your connection and try again”
- Empty states give one next action: “No tickets yet — raise your first”
- Labels are plain: “Work email”
Not like this
- Vague buttons: “Submit”, “OK”, “Click here”
- Raw codes: “Error 0x80004005”
- Blank empty states with no way forward
- Jargon or shouting: “INVALID INPUT!!!”
Accessibility
Non-negotiable. Every iceConnect app clears WCAG 2.2 AA. The brand palette already supports it — used in the right roles.
Colour contrast
| Pairing | Ratio | Verdict |
|---|---|---|
| Slate on off-white / white | ~17.9:1 | AAA |
| White on slate | ~17.9:1 | AAA |
| Slate on brass (button label) | ~7.5:1 | AA |
| Muted #64748B on white | ~4.75:1 | AA |
| White on steel (button label) | ~4.5:1 | AA borderline |
| Steel on white (text) | ~4.4:1 | Large / UI only |
| Brass on white (text) | ~2.4:1 | Fails — never |
Focus, targets & more
Focus ring
A visible 2px focus.ring outline (2px offset) on every control. Keyboard users must always see where they are.
Tap targets
Minimum 44×44px on iOS, 48×48dp on Android. Pad small icons up to the minimum even if the glyph is smaller.
Don’t rely on colour
Pair every status colour with an icon or text. Success and error must be distinguishable without colour for colour-blind users.
Motion & labels
Honour prefers-reduced-motion. Label every input and icon-only button (aria-label) so screen readers can announce them.
Building with AI
Three ways to brief an AI tool for on-brand output — marketing assets (decks, pages, adverts) or product UI (components, screens, apps) — from the quickest to the most complete. Use a recipe for a single asset, the full system prompt when you want every rule in context, or the raw token files when engineering needs machine-readable values.
Recipes — paste-ready prompts
The quickest start. Copy a recipe below and give it to your AI tool along with the system prompt (below), then adjust. Each is a complete brief — role, audience persona, structure, the single CTA and the output format. Blocks show the opening lines; Expand to read the whole prompt, Copy to grab it. Swap the service, sector and CTA to retarget.
Act as a lifecycle copywriter for iceConnect. Write a 3-email onboarding sequence for a newly-signed managed-IT client. Persona: operations lead at a 30–200-staff firm — time-poor and non-technical. Sequence: (1) welcome + what happens next, (2) meet your service desk + how to raise a ticket, (3) your first 30-day review. One CTA per email; give a subject line + preview line for each. Voice: warm, plain English, benefit before tech, no jargon or hype. Short paragraphs; UK spelling; £ where relevant. Format: deliver as text, then an HTML version using DM Sans, slate text on white, with a single brass button per email.
Act as a strategy consultant. Build a 5-slide quarterly business review deck for an iceConnect client account. Arc: where we started → what we did → results (the hero number) → risks handled → what's next. One idea per slide, one chart maximum. Design: Bricolage headings, DM Sans body, left-aligned (centre only the cover); slate grounds with brass on the single key figure per slide; charts in the categorical palette, paired with labels. Numbers tabular; UK English; absolute ISO dates. Output: self-contained HTML slides importing theme.css, with keyboard navigation and a progress bar.
Act as a paid-social creative director. Produce a LinkedIn single-image ad (1200×1200) for our Backup & Business Continuity service. Audience: finance-sector ops leaders worried about ransomware. Deliver 3 concepts, each with a headline (≤7 words, outcome-led), a one-line subhead and a layout note. Keep text under 20% of the area; critical content in the central 80% safe zone. Design: slate background, one brass accent, Bricolage headline / DM Sans subhead, the iceConnect logo on a slate scrim, one Lucide icon. No emoji, no stock clichés. CTA: "Test your recovery plan". Output the HTML/CSS for each at exactly 1200×1200.
Act as a B2B content designer. Write a one-page case study for iceConnect in the classic Challenge → Solution → Results structure. Subject: a wealth-management firm we moved off ageing on-prem IT. Audience: similar finance-sector firms (the "Ambitious Scaler"). Include 3 quantified results as big Bricolage figures (brass), one client pull-quote, and a short "services used" list mapped to our ten pillars. Voice: specific and honest, benefit before tech. CTA: "Book a 20-minute IT health check". Output: a responsive HTML one-pager using theme.css tokens, light + dark, print-friendly.
The full system prompt · DESIGN.md
The complete ruleset in one paste. The block below is a readable preview; Download .md gives the self-contained DESIGN.md — the AI prompt with the full tokens.json embedded — to paste into any AI tool or drop into a repo as CLAUDE.md. The token values appear in the Design Tokens section above, so this preview doesn’t repeat them.
# iceConnect — complete brand & build system (marketing assets AND product/app UI) # Paste this entire block into Claude (or any AI tool), then describe the asset # you need. Apply EVERY rule below to ALL output, without exception. # Source of truth — latest system & downloadable assets: brand.iceconnect.com ## HOUSE STYLE Minimal, calm, confident. Slate-dominant, brass used sparingly, generous whitespace, restrained motion, plain language — a trusted advisor, not a loud vendor. NEVER use emoji as icons or decoration; Lucide line icons only. ## COMPANY iceConnect — UK Managed Service Provider (MSP). "Twenty years of innovation." We deliver IT support, cyber security, cloud, communications and AI services to small and mid-sized UK businesses. Offices: London HQ (Finchley), Chelmsford, Johannesburg. Strapline style: "Reliable. Scalable. Secure." Audience: business owners and managers — NOT IT specialists. They buy outcomes (uptime, security, predictable monthly cost), never technology for its own sake. Web www.iceconnect.com · Email hello@iceconnect.com · Tel 020 3358 0000 Support portal: support.iceconnect.com ## AUDIENCE — ICP & personas ICP firmographic: 30–200 staff, regulated/process-heavy sectors. Primary: financial services (wealth managers, insurance brokers, corporate finance, IFAs, accountancy). Secondary: dental, manufacturing, logistics. Personas (canonical set): Overwhelmed Self-Manager · Dissatisfied Customer · Post-Incident Survivor · Ambitious Scaler · Strategic Augmenter. ## SERVICES — ten pillars (use these names exactly; every asset speaks to at least one) 01 IT Support — day-to-day support that keeps people productive (service desk & remote support, onsite support, user on/offboarding, device setup & deployment, hardware procurement & warranty, asset management & documentation, proactive monitoring/RMM, patch management, vendor management) 02 Cyber Security — protection for your people, devices and data (endpoint protection EDR/XDR, managed detection & response, 24/7 SOC, email security & anti-phishing, DNS & web filtering, MFA & conditional access, identity & privileged access, awareness training, dark web monitoring) 03 Governance, Risk & Compliance — proving and maintaining security posture (vulnerability management, penetration testing, DLP, Cyber Essentials & Plus, GDPR & data protection, data governance & retention, risk assessments, technology audits, policy & compliance support) 04 Microsoft 365 & Productivity — helping teams work better together (licensing & optimisation, tenant management, Exchange Online, Teams, SharePoint & OneDrive, email migration, collaboration platforms, training) 05 Cloud & Infrastructure — the platforms everything runs on (Azure & AWS, private & hybrid cloud, hosting & co-location, virtualisation, server & storage management, infrastructure design, monitoring, cloud migration, capacity planning) 06 Network & On-Premise Infrastructure — the on-site backbone that connects it all (switching & LAN/WAN, Wi-Fi & guest networks, managed routers & firewalls, structured cabling, network design, network monitoring, site surveys) 07 Communications & Connectivity — voice and connectivity that keep you reachable (business internet & leased lines, SD-WAN, VoIP & hosted telephony/SIP, Teams Calling, contact centre, call recording & reporting, auto attendants & call routing, business mobiles, continuity telephony) 08 Backup & Business Continuity — confidence that you can recover from anything (Microsoft 365 backup, server & endpoint backup, cloud backup, disaster recovery, continuity planning, recovery testing, backup monitoring & compliance, ransomware recovery, high availability) 09 AI & Automation — putting emerging technology to work for you (Copilot & adoption, AI readiness assessments, AI governance & security, process automation, Power Automate workflows, chatbots, knowledge management, custom AI solutions) 10 Strategy & Projects — guidance and delivery for what comes next (vCIO/CIO services, IT roadmaps & strategic reviews, technology & budget planning, digital transformation, project delivery & migrations, office moves, M&A support, due diligence) ## FONTS (both free on Google Fonts) Headings: 'Bricolage Grotesque' Bold — titles, headlines, big numbers, hero only. Body: 'DM Sans' Regular/Bold — paragraphs, labels, captions, UI text, buttons. NEVER use optical-size variants (e.g. "DM Sans 14pt") — plain family names only. NEVER set body copy in Bricolage Grotesque; never use the heading font below 18pt. ## COLOURS — core (hex · RGB · CMYK · Pantone) slate #0F172A 15,23,42 64,45,0,84 Pantone 5255 C — dark grounds, body text brass #C8A35B 200,163,91 0,18,55,22 Pantone 4006 C — THE single accent: CTAs, highlights, key figures. Use sparingly. steel #4E7CA1 78,124,161 52,23,0,37 Pantone 5415 C — muted secondary: charts & info only offwhite #FAFAF8 250,250,248 — page background tint #F1F5F9 241,245,249 — subtle fills / alternating bands brasstint #F6F3EB 246,243,235 — callout & highlight panel fills muted #64748B 100,116,139 — secondary text border #E2E8F0 226,232,240 — hairlines & dividers ## COLOURS — supporting (UI status states ONLY — never decorative, ## never in headings, CTAs, illustrations or backgrounds) Each status is a SET: tint background · base (icon/fill) · text (AA on white). Never use the base hue as text — use the text shade for any words. success bg #DCFCE7 · base #22C55E · text #15803D warning bg #FEF3C7 · base #D97706 · text #B45309 (deeper than brass — never confuse) error bg #FEE2E2 · base #DC2626 · text #B91C1C info bg #E8EFF5 · base #4E7CA1 · text #3B5F7D ## COLOUR RULES 60/30/10 — 60% slate & neutrals / 30% steel & supporting / 10% brass. Approved pairings: white on slate · slate on brass · slate on off-white · white on steel. NEVER white text on brass — brass is light; always slate text on brass fills, including buttons. For print, hand the CMYK/Pantone values above to the printer — never auto-convert from RGB. ## DATA VISUALISATION (charts, dashboards, reports — decks AND product UI) Keep series muted to match the brand; apply via your charting library's theme. categorical (distinct series, use IN ORDER — steel & brass lead): #4E7CA1 steel · #C8A35B brass · #4F9D8C teal · #8C6A93 plum · #C0795B clay · #64748B slate past six series, group the tail into "Other" or rethink the chart. sequential (one measure low→high, single-hue steel — heatmaps, intensity): #ECF2F7 · #C2D5E3 · #8FB1CB · #5E8BAC · #3B5F7D diverging (around a midpoint — SLA breach, headroom; status red/green ends): #B91C1C · #F2B8B8 · #F1F5F9 (neutral midpoint) · #A7E3BE · #15803D In-chart status: success #22C55E · warning #D97706 · error #DC2626. ALWAYS pair colour with a second cue (label, value or pattern) so charts read for colour-blind users and in greyscale. Dark mode: re-theme the chrome (gridlines, axes, background) — keep the series colours fixed. ## TYPE SCALE Hero/Display 54–60pt Bricolage Bold H1 30pt Bricolage Bold H2 18–20pt Bricolage Bold Body 11–14pt DM Sans Regular Caption 9–10pt DM Sans, tracked uppercase Line-height: headings tight (0.95–1.0×); body 1.2–1.3×. Left-align everything except cover and section titles. Never centre body copy. ## LOGO — never generate, redraw or re-export it; use the supplied files only Four-colour circular "C" mark (blue/orange/lime, magenta centre) + lowercase "iceconnect" wordmark — grey wordmark on light grounds, white wordmark on dark. Files: /assets/logo/ is NOT browsable — never guess a filename. Exact paths under brand.iceconnect.com/ (SVG is the primary web format): full logo, light ground → assets/logo/svg/iceconnect-logo-light-bg.svg full logo, dark ground → assets/logo/svg/iceconnect-logo-dark-bg.svg full logo, one-colour → ...-logo-mono-black.svg (light) / ...-logo-mono-white.svg (dark) icon only ("C" mark) → assets/logo/svg/iceconnect-icon.svg (+ ...-icon-mono-black.svg / ...-icon-mono-white.svg) favicon / app icons → assets/logo/favicon/iceconnect-favicon.svg (+ -32/-64.png), assets/logo/png/apple-touch-icon.png, web-app-icon-192/512.png other formats, same base names → png/<name>-<size>.png (full 300/600/1200, icon 128/256/512/1024) · pdf/<name>.pdf · eps/<name>.eps previews & downloads → brand.iceconnect.com/#logo-downloads Place ONLY on slate, off-white or white. NEVER on brass, steel, any colour fill, or a busy photo without a slate scrim. Clear space = height of the "i" on all sides. Minimum 120px wide on screen / 25mm in print — smaller than that, use the icon-only mark (favicons at 16–32px use the simplified icon). Never stretch, recolour, rotate, add effects, or rebuild in another font. SVG is the primary web format; PNG only as fallback (favicons, social cards, some email clients). ## ICONS Lucide line icons ONLY (lucide.dev) — never filled/solid, never mixed sets, never multi-colour. ~1.75px stroke. Slate by default; brass for ONE key highlight per layout. Working set: users · server · gauge · triangle-alert · headset · shield-half · scale · app-window · cloud · network · phone · database · bot · target · circle-check · chart-line · clock-4 · pound-sterling · lock · trending-up · handshake · map-pin Pillar pairings: 01 headset · 02 shield-half · 03 scale · 04 app-window · 05 cloud · 06 network · 07 phone · 08 database · 09 bot · 10 target List bullets: small brass circle-check — not dashes, not dots. ## PHOTOGRAPHY Premium, calm, real: real people in real UK workplaces, natural light, shallow depth of field, uncluttered compositions with breathing room, cool slightly desaturated grade that sits with slate. Where a brand tone is needed: subtle slate overlay or light brass highlight. AVOID: cheesy handshake/headset stock, harsh saturated colour, server-room clichés, heavy filters, busy backgrounds behind logos, staged or low-res images. ## COMPONENTS & SPACING (exact specs: tokens.json component.* · CSS: theme.css .ic-*) Button (.ic-btn): radius 7px, DM Sans 700, padding md 11×20 / sm 8×14 / lg 14×26. Primary = brass fill + slate text (hover #BC9550, active #B89149); secondary = steel fill + white text (hover #456E8E); ghost = transparent + slate text + 1px #E2E8F0 border (hover #F1F5F9). Focus 2px brass ring, 2px offset; disabled 40% opacity. Input (.ic-field): white fill, 1px #E2E8F0 border, radius 7px, padding 10×13; focus = brass border + 3px brass-tint ring; error = red border + 3px red-tint ring; ≥44px on mobile. Card (.ic-card): white fill, 1px #E2E8F0 border, elevation.sm, radius 12, padding 24. Callout (.ic-callout): brasstint fill + 3px brass left border, radius 8, padding 16×20. 8px base spacing unit — use multiples of 8. Page margins: 24px web, 0.85in slides. Generous whitespace; align to a consistent left edge. ## VOICE — the audience runs businesses; they are NOT IT specialists Sound like: plain English a busy owner understands at a glance · confident and reassuring ("we have got this handled") · benefit before technology · warm and human, like a trusted advisor · specific and honest over vague or salesy. NEVER: acronym-stuffed, boastful or hyped, cold/corporate/robotic, patronising, or vague ("solutions", "synergy", "best-in-class"). Say this, not that: "keep your systems running" NOT "maximise uptime / high availability" "protect your business" NOT "endpoint threat mitigation" "back up your data" NOT "immutable backup architecture" "we'll set it up for you" NOT "seamless deployment & onboarding" "help when you need it" NOT "24/7 SLA-backed support tiers" Example rewrite — BAD: "Our proactive RMM platform leverages enterprise-grade SIEM and EDR to deliver best-in-class threat remediation across your entire estate." GOOD: "We watch over your computers around the clock and stop most problems before you'd ever notice them — so your team can just get on with work." ## DESIGN TOKENS (product / app UI) — reference by ROLE, never raw hex text.primary / text.secondary / text.inverse / text.on-accent bg.page / bg.surface / bg.muted / bg.inverse · border.default / border.strong action.primary (brass, slate label) / action.secondary (steel, white label) focus.ring (brass) · status.success | warning | error | info Ship light AND dark — swap the semantic layer; in dark mode separate surfaces with border.default, not shadow. Full light/dark values: brand.iceconnect.com/dist/tokens.json (CSS variables: brand.iceconnect.com/dist/theme.css). ## TYPE — screen units (alongside the print scale above) rem on a 16px base; iOS pt & Android sp use the same numbers (never hard-code dp). display 56 · title 32 · heading 22 · subheading 18 · body 16 · small 14 · caption 11 ## SPACING / RADIUS / ELEVATION / LAYERING / MOTION (apps) spacing 8px base, 4px half-step: 4 8 12 16 24 32 48 64 radius sm 6 · md 8 · lg 12 · xl 20 · full 9999 elevation sm / md / lg soft slate shadows (use borders, not shadow, in dark mode) layering z-index scale — base 0 · dropdown 1000 · sticky 1100 · overlay 1200 · modal 1300 · popover 1400 · toast 1500 (stay on the scale, never 9999) breakpoint mobile-first min-widths — sm 375 · md 768 · lg 1024 · xl 1440 motion fast 120ms · base 180ms · slow 280ms · ease cubic-bezier(.2,0,0,1) pulse 2.4s ease-out infinite — expanding box-shadow ring radiating from live status dots (colour inherits status); pure CSS, no JS always honour prefers-reduced-motion ## COMPONENT STATES (apps) Build every control with default / hover / active / focus / disabled. Primary = brass + slate label · secondary = steel + white · ghost = bordered. Brass buttons darken on hover/active but keep slate text (white fails contrast on brass): hover #BC9550, active #B89149 — on DARK surfaces hover lightens to #D4B373 instead. Steel (secondary) darkens to #456E8E on hover. Inputs show focus (brass ring) & error (red). Icons via Lucide: lucide-react (web) / lucide-react-native (mobile). Microcopy: buttons = verbs ("Set up monitoring") · errors = what happened + the fix · empty states = one clear next action. ## STATUS INDICATORS (pills, banners & live dots) Built from the supporting-colour SET (tint bg · base · AA text). Always pair the colour with an icon or text so the state reads in greyscale and for colour-blind users. Status pill — a compact single state inline: a pill (radius full) with a 1px border, a short label and a status-coloured dot. Light surfaces: white fill, hairline border, muted text. Dark surfaces: translucent white fill/border, light text. Live/real-time states use the pulse (above). E.g. "All systems operational", "Agent offline". Status banner — an inline status message: a box in the status bg tint with a matching status icon, a bold title and a line of detail, text in the status text shade. One state per banner; use in dashboards, forms and reports. Reference by role (status.success|warning|error|info), never raw hex. Ready-made CSS ships in theme.css (.ic-pill, .ic-banner--*, .ic-dot). ## NAVIGATION Current location always marked brass + slate weight; everything else muted until hovered/active. Active indicator by surface: top bar & tabs = brass underline (2px links, 3px tabs); sidebar rows & mega-menu items = brass-tint fill + a 2px brass left-edge line that follows the corner radius (inset box-shadow). One primary action per bar. Icons ALWAYS carry a text label — never icon-only. Patterns: top bar (wide), mega-menu (multi-column top-bar dropdown for deep catalogues), tabs (within a page), breadcrumb (3+ levels), sidebar (app shells ≥1024px, collapsible groups), mobile (top bar + burger overlay, bottom tabs ≤5). Keep nav placement consistent across pages; back behaviour predictable. ## FORMS & STATES Visible label per input (never placeholder-only). Mark required fields; helper text below; validate on blur; error beside the field with an icon + words + a fix. Field states: default / focus (brass ring) / error (red) / disabled. Semantic input types for the right mobile keyboard; inputs ≥44px tall. Empty state — icon + short title + one clear next action, never a blank panel. Loading — skeleton (shimmer that reserves the layout) for loads >300ms, not a spinner; keep CLS < 0.1; skeleton honours prefers-reduced-motion. ## PERFORMANCE Fonts: font-display swap; preload only the two we use. Photos: WebP/AVIF + srcset, loading="lazy" below the fold (logos/icons stay SVG — never rasterise the mark). Reserve space (width/height or aspect-ratio) to keep CLS < 0.1. Defer non-critical scripts; split by route. Mobile-first at 375/768/1024/1440. ## ACCESSIBILITY (apps — WCAG 2.2 AA, non-negotiable) visible focus ring on every control · tap targets ≥44px iOS / 48dp Android pair every status colour with an icon or text · label every input & icon-only button respect prefers-reduced-motion · brass & steel are accents, NOT text on light grounds ## PLATFORM (apps) honour native conventions (iOS HIG / Android Material / web) for layout, navigation & gestures — apply iceConnect colour, type, icons & voice on top. ## OUTPUT CHECKLIST — verify before you finish [ ] UK English spelling, £ GBP, absolute ISO dates (e.g. 2026-06-24) [ ] Slate dominant, brass sparing, slate text on every brass fill [ ] Bricolage Grotesque headings / DM Sans body — nothing else [ ] Lucide line icons only, from the working set above — never emoji as icons [ ] Logo on a neutral ground, at least 120px wide [ ] Supporting colours used for status only, with the AA text shade for any words [ ] Charts: brand palette in order, colour paired with a label/value, readable in greyscale [ ] One clear call to action per asset [ ] Every sentence understandable by a non-technical business owner [ ] Product: every token referenced by role, with light AND dark both handled [ ] Product: visible focus ring + ≥44px / 48dp tap target on every control [ ] Product: mobile-first at 375/768/1024/1440; z-index on the named scale [ ] Product: skeletons for >300ms loads; reserve space so CLS < 0.1 [ ] Icons from Lucide; logo from the supplied files, never generated
Design tokens · tokens.json
A machine-readable source in W3C / Style Dictionary format. One file generates CSS variables, a Tailwind preset, and iOS & Android outputs — so every app builds from the same values. Served live at brand.iceconnect.com/dist/tokens.json — or use the ready-made CSS at theme.css. Both are listed in Brand Files & Resources.
{
"color": {
"primitive": {
"slate": { "value": "#0F172A" },
"slate-800": { "value": "#1E293B" },
"slate-700": { "value": "#334155" },
"slate-600": { "value": "#475569" },
"slate-500": { "value": "#64748B" },
"slate-300": { "value": "#CBD5E1" },
"slate-200": { "value": "#E2E8F0" },
"slate-100": { "value": "#F1F5F9" },
"offwhite": { "value": "#FAFAF8" },
"white": { "value": "#FFFFFF" },
"brass": { "value": "#C8A35B" },
"brass-hover": { "value": "#BC9550" },
"brass-hover-dark": { "value": "#D4B373", "comment": "hover on dark surfaces LIGHTENS brass (light surfaces darken it)" },
"brass-active": { "value": "#B89149" },
"brass-tint": { "value": "#F6F3EB" },
"steel": { "value": "#4E7CA1" },
"steel-hover": { "value": "#456E8E" },
"success": { "value": "#22C55E" },
"warning": { "value": "#D97706" },
"error": { "value": "#DC2626" }
},
"semantic": {
"light": {
"text-primary": { "value": "{color.primitive.slate}" },
"text-secondary": { "value": "{color.primitive.slate-500}" },
"text-inverse": { "value": "{color.primitive.white}" },
"text-on-accent": { "value": "{color.primitive.slate}" },
"bg-page": { "value": "{color.primitive.offwhite}" },
"bg-surface": { "value": "{color.primitive.white}" },
"bg-muted": { "value": "{color.primitive.slate-100}" },
"bg-accent": { "value": "{color.primitive.brass-tint}" },
"bg-inverse": { "value": "{color.primitive.slate}" },
"border-default": { "value": "{color.primitive.slate-200}" },
"border-strong": { "value": "{color.primitive.slate-300}" },
"action-primary": { "value": "{color.primitive.brass}" },
"action-primary-hover": { "value": "{color.primitive.brass-hover}" },
"action-primary-active": { "value": "{color.primitive.brass-active}" },
"action-primary-text": { "value": "{color.primitive.slate}" },
"action-secondary": { "value": "{color.primitive.steel}" },
"action-secondary-hover": { "value": "{color.primitive.steel-hover}" },
"action-secondary-text": { "value": "{color.primitive.white}" },
"focus-ring": { "value": "{color.primitive.brass}" }
},
"dark": {
"text-primary": { "value": "{color.primitive.slate-100}" },
"text-secondary": { "value": "#94A3B8" },
"text-inverse": { "value": "{color.primitive.slate}" },
"text-on-accent": { "value": "{color.primitive.slate}" },
"bg-page": { "value": "{color.primitive.slate}" },
"bg-surface": { "value": "{color.primitive.slate-800}" },
"bg-muted": { "value": "{color.primitive.slate-700}" },
"bg-accent": { "value": "{color.primitive.slate-700}" },
"bg-inverse": { "value": "{color.primitive.offwhite}" },
"border-default": { "value": "{color.primitive.slate-700}" },
"border-strong": { "value": "{color.primitive.slate-600}" },
"action-primary": { "value": "{color.primitive.brass}" },
"action-primary-hover": { "value": "{color.primitive.brass-hover-dark}" },
"action-primary-active": { "value": "{color.primitive.brass-active}" },
"action-primary-text": { "value": "{color.primitive.slate}" },
"action-secondary": { "value": "{color.primitive.steel}" },
"action-secondary-hover": { "value": "{color.primitive.steel-hover}" },
"action-secondary-text": { "value": "{color.primitive.white}" },
"focus-ring": { "value": "{color.primitive.brass}" }
}
},
"status": {
"success": { "bg": { "value": "#DCFCE7" }, "base": { "value": "#22C55E" }, "text": { "value": "#15803D" } },
"warning": { "bg": { "value": "#FEF3C7" }, "base": { "value": "#D97706" }, "text": { "value": "#B45309" } },
"error": { "bg": { "value": "#FEE2E2" }, "base": { "value": "#DC2626" }, "text": { "value": "#B91C1C" } },
"info": { "bg": { "value": "#E8EFF5" }, "base": { "value": "#4E7CA1" }, "text": { "value": "#3B5F7D" } }
},
"chart": {
"categorical": { "value": ["#4E7CA1", "#C8A35B", "#4F9D8C", "#8C6A93", "#C0795B", "#64748B"] },
"sequential": { "value": ["#ECF2F7", "#C2D5E3", "#8FB1CB", "#5E8BAC", "#3B5F7D"] },
"diverging": { "value": ["#B91C1C", "#F2B8B8", "#F1F5F9", "#A7E3BE", "#15803D"] }
}
},
"font": {
"family": { "heading": { "value": "Bricolage Grotesque" }, "body": { "value": "DM Sans" } },
"weight": { "regular": { "value": "400" }, "medium": { "value": "500" }, "semibold": { "value": "600" }, "bold": { "value": "700" }, "extrabold": { "value": "800" } },
"size": { "display": { "value": "56px" }, "title": { "value": "32px" }, "heading": { "value": "22px" }, "subheading": { "value": "18px" }, "body": { "value": "16px" }, "small": { "value": "14px" }, "caption": { "value": "11px" } },
"lineHeight": { "display": { "value": "0.95" }, "heading": { "value": "1.0" }, "body": { "value": "1.3" } }
},
"space": { "2xs": { "value": "4px" }, "xs": { "value": "8px" }, "sm": { "value": "12px" }, "md": { "value": "16px" }, "lg": { "value": "24px" }, "xl": { "value": "32px" }, "2xl": { "value": "48px" }, "3xl": { "value": "64px" } },
"radius": { "sm": { "value": "6px" }, "md": { "value": "8px" }, "lg": { "value": "12px" }, "xl": { "value": "20px" }, "full": { "value": "9999px" } },
"breakpoint": { "sm": { "value": "375px" }, "md": { "value": "768px" }, "lg": { "value": "1024px" }, "xl": { "value": "1440px" } },
"zIndex": { "base": { "value": "0" }, "dropdown": { "value": "1000" }, "sticky": { "value": "1100" }, "overlay": { "value": "1200" }, "modal": { "value": "1300" }, "popover": { "value": "1400" }, "toast": { "value": "1500" } },
"elevation": {
"sm": { "value": "0 1px 2px rgba(15,23,42,0.06)" },
"md": { "value": "0 2px 8px rgba(15,23,42,0.08)" },
"lg": { "value": "0 8px 24px rgba(15,23,42,0.12)" }
},
"motion": {
"duration": { "fast": { "value": "120ms" }, "base": { "value": "180ms" }, "slow": { "value": "280ms" } },
"easing": { "value": "cubic-bezier(0.2,0,0,1)" },
"pulse": {
"duration": { "value": "2.4s" },
"easing": { "value": "ease-out" },
"iteration": { "value": "infinite" },
"ring": {
"start": { "spread": { "value": "0 0 0 0" }, "alpha": { "value": "0.7" } },
"end": { "spread": { "value": "0 0 0 8px" }, "alpha": { "value": "0" } },
"fadeBy":{ "value": "70%", "comment": "ring fully expanded & faded by 70% of the loop; remaining 30% is a rest beat" }
},
"comment": { "value": "Expanding box-shadow ring that radiates from a live/active status dot and fades, then rests before repeating. Colour inherits from the status the element carries. Pure CSS; honour prefers-reduced-motion." }
}
},
"component": {
"_comment": "Exact specs for the reusable brand components — the single source of truth that index.html, theme.css (.ic-* classes) and DESIGN.md spec tables all derive from. Colours reference primitives/semantics; dimensions are literal and checked against index.html by build-tokens.py.",
"button": {
"radius": { "value": "7px" },
"font-size": { "value": "14px" },
"font-weight": { "value": "700" },
"padding": { "value": "11px 20px" },
"padding-sm": { "value": "8px 14px" },
"font-size-sm": { "value": "12.5px" },
"padding-lg": { "value": "14px 26px" },
"font-size-lg": { "value": "15px" },
"focus-outline": { "value": "2px" },
"focus-offset": { "value": "2px" },
"disabled-opacity": { "value": "0.4" },
"primary": { "bg": { "value": "{color.primitive.brass}" }, "text": { "value": "{color.primitive.slate}" }, "bg-hover": { "value": "{color.primitive.brass-hover}" }, "bg-active": { "value": "{color.primitive.brass-active}" } },
"secondary": { "bg": { "value": "{color.primitive.steel}" }, "text": { "value": "{color.primitive.white}" }, "bg-hover": { "value": "{color.primitive.steel-hover}" } },
"ghost": { "bg": { "value": "transparent" }, "text": { "value": "{color.primitive.slate}" }, "border": { "value": "{color.primitive.slate-200}" }, "bg-hover": { "value": "{color.primitive.slate-100}" } }
},
"input": {
"radius": { "value": "7px" },
"padding": { "value": "10px 13px" },
"font-size": { "value": "14px" },
"min-height-touch": { "value": "44px", "comment": "minimum tap target on mobile" },
"ring-width": { "value": "3px" },
"focus-border": { "value": "{color.primitive.brass}" },
"focus-ring": { "value": "{color.primitive.brass-tint}" },
"error-border": { "value": "{color.primitive.error}" },
"error-ring": { "value": "rgba(220,38,38,0.12)" }
},
"card": {
"radius": { "value": "12px" },
"padding": { "value": "24px" },
"border-width": { "value": "1px" },
"border": { "value": "{color.primitive.slate-200}" },
"bg": { "value": "{color.primitive.white}" },
"shadow": { "value": "{elevation.sm}" }
},
"callout": {
"radius": { "value": "8px" },
"padding": { "value": "16px 20px" },
"border-left": { "value": "3px" },
"border-color": { "value": "{color.primitive.brass}" },
"bg": { "value": "{color.primitive.brass-tint}" }
},
"pill": {
"radius": { "value": "9999px" },
"padding": { "value": "9px 17px 9px 15px" },
"gap": { "value": "10px" },
"dot-size": { "value": "9px" },
"font-size": { "value": "11px" },
"font-weight": { "value": "500" }
},
"banner": {
"radius": { "value": "10px" },
"padding": { "value": "13px 15px" },
"gap": { "value": "11px" },
"font-size": { "value": "13.5px" }
},
"skeleton": {
"radius": { "value": "6px" },
"shimmer-duration": { "value": "1.4s" },
"base": { "value": "{color.primitive.slate-100}" },
"highlight": { "value": "#E9EEF3" }
},
"nav": {
"_comment": "Active-location indicator by surface — see DESIGN.md Appendix C.",
"active-line": { "value": "2px", "comment": "brass left-edge line on sidebar rows & mega-menu items; follows corner radius via inset box-shadow" },
"active-underline": { "value": "2px", "comment": "brass underline on top-bar links & tabs" },
"active-bg": { "value": "{color.primitive.brass-tint}" },
"tab-underline": { "value": "3px" }
}
}
}
Ready-made CSS · theme.css
The same tokens as drop-in CSS custom properties — light and dark themes, the live-status pulse, and component helpers (.ic-dot, .ic-pill, .ic-banner). No build step: @import it and reference var(--ic-…). This block is generated from dist/theme.css — copy or download gives the identical file.
/* ==========================================================================
iceConnect — theme.css
Ready-to-paste CSS custom properties generated from the brand design system.
Source of truth: https://brand.iceconnect.com · machine-readable: /dist/tokens.json
COUPLING: the core palette here mirrors tokens.json. If you change a brand
colour, change it in tokens.json too and run `python3 tools/build-tokens.py --check`
to confirm they still match (see tools/BUILD.md).
Drop this into any web project and reference tokens with var(--ic-...).
Light is the default; dark applies under prefers-color-scheme: dark
OR when you set data-theme="dark" on a parent element.
========================================================================== */
:root {
/* --- Primitive colours (raw values — avoid referencing directly in UI) --- */
--ic-slate: #0F172A;
--ic-slate-800: #1E293B;
--ic-slate-700: #334155;
--ic-slate-600: #475569;
--ic-slate-500: #64748B;
--ic-slate-300: #CBD5E1;
--ic-slate-200: #E2E8F0;
--ic-slate-100: #F1F5F9;
--ic-offwhite: #FAFAF8;
--ic-white: #FFFFFF;
--ic-brass: #C8A35B;
--ic-brass-hover: #BC9550; /* darken brass on hover/active; keep slate text */
--ic-brass-hover-dark: #D4B373; /* dark surfaces LIGHTEN brass on hover instead */
--ic-brass-active: #B89149;
--ic-brass-tint: #F6F3EB;
--ic-steel: #4E7CA1;
--ic-steel-hover: #456E8E; /* darken steel on secondary-button hover */
/* --- Semantic colours · light (reference THESE in UI, by role) --- */
--ic-text-primary: var(--ic-slate);
--ic-text-secondary: var(--ic-slate-500);
--ic-text-inverse: var(--ic-white);
--ic-text-on-accent: var(--ic-slate); /* slate text on brass — never white */
--ic-bg-page: var(--ic-offwhite);
--ic-bg-surface: var(--ic-white);
--ic-bg-muted: var(--ic-slate-100);
--ic-bg-accent: var(--ic-brass-tint); /* callout / highlight panel fills */
--ic-bg-inverse: var(--ic-slate);
--ic-border-default: var(--ic-slate-200);
--ic-border-strong: var(--ic-slate-300);
--ic-action-primary: var(--ic-brass);
--ic-action-primary-hover: var(--ic-brass-hover);
--ic-action-primary-active: var(--ic-brass-active);
--ic-action-secondary: var(--ic-steel);
--ic-action-secondary-hover: var(--ic-steel-hover);
--ic-focus-ring: var(--ic-brass);
/* --- Status sets · bg / base (icon, fill) / text (AA on white) --- */
--ic-success-bg: #DCFCE7; --ic-success-base: #22C55E; --ic-success-text: #15803D;
--ic-warning-bg: #FEF3C7; --ic-warning-base: #D97706; --ic-warning-text: #B45309;
--ic-error-bg: #FEE2E2; --ic-error-base: #DC2626; --ic-error-text: #B91C1C;
--ic-info-bg: #E8EFF5; --ic-info-base: #4E7CA1; --ic-info-text: #3B5F7D;
/* --- Chart palettes (use categorical IN ORDER; steel & brass lead) --- */
--ic-chart-1: #4E7CA1; /* steel */
--ic-chart-2: #C8A35B; /* brass */
--ic-chart-3: #4F9D8C; /* teal */
--ic-chart-4: #8C6A93; /* plum */
--ic-chart-5: #C0795B; /* clay */
--ic-chart-6: #64748B; /* slate */
/* --- Typography --- */
--ic-font-heading: 'Bricolage Grotesque', system-ui, sans-serif; /* headings ONLY, >=18px */
--ic-font-body: 'DM Sans', system-ui, sans-serif; /* body, UI, buttons */
--ic-weight-regular: 400;
--ic-weight-medium: 500;
--ic-weight-semibold: 600;
--ic-weight-bold: 700;
--ic-weight-extrabold: 800;
--ic-size-display: 56px;
--ic-size-title: 32px;
--ic-size-heading: 22px;
--ic-size-sub: 18px;
--ic-size-body: 16px;
--ic-size-small: 14px;
--ic-size-caption: 11px;
--ic-lh-display: 0.95;
--ic-lh-heading: 1.0;
--ic-lh-body: 1.3;
/* --- Spacing (8px base, 4px half-step) --- */
--ic-space-2xs: 4px;
--ic-space-xs: 8px;
--ic-space-sm: 12px;
--ic-space-md: 16px;
--ic-space-lg: 24px;
--ic-space-xl: 32px;
--ic-space-2xl: 48px;
--ic-space-3xl: 64px;
/* --- Radius --- */
--ic-radius-sm: 6px; /* controls, inputs */
--ic-radius-md: 8px; /* buttons */
--ic-radius-lg: 12px; /* cards */
--ic-radius-xl: 20px; /* panels */
--ic-radius-full: 9999px;
/* --- Breakpoints (mobile-first min-widths; for @media and container queries) --- */
--ic-bp-sm: 375px; /* phone */
--ic-bp-md: 768px; /* tablet */
--ic-bp-lg: 1024px; /* laptop */
--ic-bp-xl: 1440px; /* desktop */
/* --- Layering (z-index scale; stay on the scale, never ad-hoc 9999) --- */
--ic-z-base: 0; /* page content, normal flow */
--ic-z-dropdown: 1000; /* menus, selects */
--ic-z-sticky: 1100; /* sticky headers & toolbars */
--ic-z-overlay: 1200; /* modal scrim / backdrop */
--ic-z-modal: 1300; /* dialogs & sheets */
--ic-z-popover: 1400; /* popovers & tooltips */
--ic-z-toast: 1500; /* transient alerts — above all */
/* --- Elevation (soft slate shadows; use borders, not shadow, in dark mode) --- */
--ic-elevation-sm: 0 1px 2px rgba(15,23,42,0.06);
--ic-elevation-md: 0 2px 8px rgba(15,23,42,0.08);
--ic-elevation-lg: 0 8px 24px rgba(15,23,42,0.12);
/* --- Motion --- */
--ic-motion-fast: 120ms;
--ic-motion-base: 180ms;
--ic-motion-slow: 280ms;
--ic-motion-ease: cubic-bezier(0.2, 0, 0, 1);
--ic-pulse-duration: 2.4s;
--ic-pulse-ease: ease-out;
}
/* --- Semantic colours · dark ---
Swaps ONLY the semantic layer. In dark mode, separate surfaces with
border-default rather than relying on shadow. */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--ic-text-primary: var(--ic-slate-100);
--ic-text-secondary: #94A3B8;
--ic-text-inverse: var(--ic-slate); /* flips with bg-inverse — else white-on-offwhite */
--ic-bg-page: var(--ic-slate);
--ic-bg-surface: var(--ic-slate-800);
--ic-bg-muted: var(--ic-slate-700);
--ic-bg-accent: var(--ic-slate-700);
--ic-bg-inverse: var(--ic-offwhite);
--ic-border-default: var(--ic-slate-700);
--ic-border-strong: var(--ic-slate-600);
/* primary hover LIGHTENS on dark surfaces; all other action + focus
colours are intentionally unchanged in dark mode */
--ic-action-primary-hover: var(--ic-brass-hover-dark);
}
}
[data-theme="dark"] {
--ic-text-primary: var(--ic-slate-100);
--ic-text-secondary: #94A3B8;
--ic-text-inverse: var(--ic-slate);
--ic-bg-page: var(--ic-slate);
--ic-bg-surface: var(--ic-slate-800);
--ic-bg-muted: var(--ic-slate-700);
--ic-bg-accent: var(--ic-slate-700);
--ic-bg-inverse: var(--ic-offwhite);
--ic-border-default: var(--ic-slate-700);
--ic-border-strong: var(--ic-slate-600);
--ic-action-primary-hover: var(--ic-brass-hover-dark);
}
/* --- Live status pulse — pure CSS, honours reduced motion ---
Markup: <span class="ic-dot" style="--ic-gc:34,197,94"></span> (RGB triplet). */
.ic-dot {
width: 9px; height: 9px; border-radius: 50%;
background: rgb(var(--ic-gc, 34,197,94));
animation: ic-pulse var(--ic-pulse-duration) var(--ic-pulse-ease) infinite;
}
@keyframes ic-pulse {
0% { box-shadow: 0 0 0 0 rgba(var(--ic-gc, 34,197,94), 0.7); }
70%,100% { box-shadow: 0 0 0 8px rgba(var(--ic-gc, 34,197,94), 0); }
}
@media (prefers-reduced-motion: reduce) {
.ic-dot { animation: none; box-shadow: 0 0 0 3px rgba(var(--ic-gc, 34,197,94), 0.25); }
}
/* --- Status pill — compact inline state; pair with .ic-dot for "live" states ---
Markup: <span class="ic-pill"><span class="ic-dot" style="--ic-gc:34,197,94"></span>All systems operational</span>
On a dark surface, set data-theme="dark" on an ancestor for the translucent treatment. */
.ic-pill {
display: inline-flex; align-items: center; gap: 10px;
border-radius: var(--ic-radius-full);
border: 1px solid var(--ic-border-default);
background: var(--ic-bg-surface);
color: var(--ic-text-secondary);
padding: 9px 17px 9px 15px;
font: var(--ic-weight-medium) 11px/1 var(--ic-font-body);
letter-spacing: 0.01em; white-space: nowrap;
}
[data-theme="dark"] .ic-pill {
background: rgba(255,255,255,0.05);
border-color: rgba(255,255,255,0.14);
color: #94A3B8;
}
/* --- Status banner — an inline status message in its tint ---
Markup: <div class="ic-banner ic-banner--warning"><svg.../><div>…</div></div>
Always pair the colour with the icon or text (accessibility). */
.ic-banner {
display: flex; gap: 11px; align-items: flex-start;
border: 1px solid; border-radius: 10px; /* component.banner.radius — tighter than card lg(12) */
padding: 13px 15px; font: var(--ic-weight-regular) 13.5px/1.5 var(--ic-font-body);
}
.ic-banner--success { background: var(--ic-success-bg); border-color: #BBF7D0; color: var(--ic-success-text); }
.ic-banner--warning { background: var(--ic-warning-bg); border-color: #FDE68A; color: var(--ic-warning-text); }
.ic-banner--error { background: var(--ic-error-bg); border-color: #FECACA; color: var(--ic-error-text); }
.ic-banner--info { background: var(--ic-info-bg); border-color: #CFDEEA; color: var(--ic-info-text); }
/* --- Button — primary / secondary / ghost · sizes sm·md·lg · all states ---
Markup: <button class="ic-btn ic-btn--primary">Set up monitoring</button>
Slate text on brass (never white); brass darkens on hover/active. (component.button) */
.ic-btn {
display: inline-block; font-family: var(--ic-font-body); font-weight: 700;
font-size: 14px; line-height: 1; white-space: nowrap; cursor: pointer;
border: 1px solid transparent; border-radius: 7px; padding: 11px 20px;
transition: background var(--ic-motion-fast) var(--ic-motion-ease);
}
.ic-btn--sm { font-size: 12.5px; padding: 8px 14px; }
.ic-btn--lg { font-size: 15px; padding: 14px 26px; }
.ic-btn--primary { background: var(--ic-action-primary); color: var(--ic-text-on-accent); }
.ic-btn--primary:hover { background: var(--ic-action-primary-hover); }
.ic-btn--primary:active { background: var(--ic-action-primary-active); }
.ic-btn--secondary { background: var(--ic-action-secondary); color: var(--ic-white); }
.ic-btn--secondary:hover { background: var(--ic-action-secondary-hover); }
.ic-btn--ghost { background: transparent; color: var(--ic-text-primary); border-color: var(--ic-border-default); }
.ic-btn--ghost:hover { background: var(--ic-bg-muted); }
.ic-btn:focus-visible { outline: 2px solid var(--ic-focus-ring); outline-offset: 2px; }
.ic-btn[disabled], .ic-btn--disabled { opacity: 0.4; pointer-events: none; }
/* --- Input / field — default · focus · error · disabled ---
Markup: <input class="ic-field"> · add .ic-field--error for the error state.
Pair with a visible <label>; on mobile ensure the control is ≥44px tall. (component.input) */
.ic-field {
font-family: var(--ic-font-body); font-size: 14px; color: var(--ic-text-primary);
background: var(--ic-bg-surface); border: 1px solid var(--ic-border-default);
border-radius: 7px; padding: 10px 13px;
}
.ic-field:focus, .ic-field--focus {
outline: none; border-color: var(--ic-focus-ring);
box-shadow: 0 0 0 3px var(--ic-bg-accent);
}
.ic-field--error { border-color: var(--ic-error-base); box-shadow: 0 0 0 3px rgba(220,38,38,0.12); }
.ic-field[disabled], .ic-field--disabled { background: var(--ic-bg-muted); color: var(--ic-text-secondary); }
/* --- Card — the core content container (component.card) --- */
.ic-card {
background: var(--ic-bg-surface); border: 1px solid var(--ic-border-default);
border-radius: 12px; padding: 24px; box-shadow: var(--ic-elevation-sm);
}
/* --- Callout — brass-tint panel with a brass left border (component.callout) --- */
.ic-callout {
background: var(--ic-bg-accent); border-left: 3px solid var(--ic-action-primary);
border-radius: 8px; padding: 16px 20px; color: var(--ic-text-primary);
}
/* --- Skeleton — shimmer placeholder for loads >300ms; reserves layout (component.skeleton) ---
Markup: <div class="ic-skeleton" style="height:12px;width:70%"></div> */
.ic-skeleton {
background: linear-gradient(90deg, var(--ic-bg-muted) 25%, #E9EEF3 37%, var(--ic-bg-muted) 63%);
background-size: 400% 100%; border-radius: 6px;
animation: ic-shimmer 1.4s ease infinite;
}
@keyframes ic-shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }
@media (prefers-reduced-motion: reduce) { .ic-skeleton { animation: none; } }
Brand Files & Resources
Every downloadable source this system publishes, in one place — for humans and for AI. Each lives at a stable brand.iceconnect.com/dist/… URL — the same files the Copy/Download buttons elsewhere on this page hand you.
Two ways to use them. Link to the live URL (use Copy URL) — always current, ideal for prototypes, AI prompts and quick experiments. Or download a copy into your project — pinned and dependency-free, best for production builds and CI; re-pull when the brand updates. The /dist/ files are served with permissive CORS, so cross-origin fetch() and @import work too.
The complete brand & build system as one paste-ready file: the AI system prompt plus the design tokens. Drop into an AI tool, or into a repo as CLAUDE.md / AGENTS.md / .cursorrules.
/dist/DESIGN.mdMachine-readable design tokens in W3C / Style Dictionary format — colours, type, spacing, radius, elevation and motion. One source for CSS, Tailwind, iOS and Android.
/dist/tokens.jsonReady-to-paste CSS custom properties generated from the tokens, with light and dark themes plus the live-status pulse. Import and reference var(--ic-…).
/dist/theme.cssAn index for AI assistants (the emerging llms.txt convention) pointing to every brand source above, with the key facts inline. Lives at the site root.
/llms.txtDownloadThe crawler & AI-access policy for this site. This is public brand material — search indexing, AI input and AI training are all explicitly permitted.
/robots.txtViewEvery approved logo file — SVG (primary), PNG, PDF, EPS, favicons and app icons, in colour, mono and icon-only variants, each with its own download.
§07 · Logo DownloadsView filestokens.json is the source of truth. The token block shown in Design Tokens and the copy inside DESIGN.md are generated from it by a small build script (build-tokens.py) — so they can never drift. Editing a token? Change tokens.json only, then run python3 tools/build-tokens.py; the generated blocks are marked “do not edit by hand.” Full rules for humans and AI agents are in tools/BUILD.md. If anything ever disagrees with tokens.json, the file wins — tell marketing [at] iceconnect.com.Changelog
Every revision to this brand system is logged here. This is a living document — always link to it rather than distributing copies.
- Semantic tokens reconciled across all sources —
border.strong, dark-modetext.inverseand dark-modeaction.primary-hover(now lightens to#D4B373) each had drifted;tokens.jsonandtheme.cssnow carry the full semantic set the page documents - Accessibility pass — skip link, proper
<main>landmark, decorative icons hidden from screen readers, and keyboard/touch access for the chart previews and resource tooltips - Fixed the skeleton-loading demo (rendered invisible), the 60/30/10 bar clipping on phones, and anchor jumps landing flush against (or under) the top bar
- Photography now self-hosted as WebP with explicit dimensions — no third-party image requests — plus a sitemap, tidier company data for search engines, and dead styles removed
- The sidebar now matches the menu on portal.iceconnect.com — full-bleed rows with a brass current-section bar, hairline-divided collapsible groups, and a Lucide icon on every row in place of the old section numbers
- Menu and content now centre together within 1440px so the rail floats beside the reading column, and the rail carries the same contact routes as the footer (web, email, tap-to-call)
- The Home row is replaced by a floating back-to-top button, and the menu loads collapsed — a group opens, and its row highlights, only when you reach that section
- The rail becomes a drawer at 1100px (the portal's own breakpoint), which also cleared a horizontal scrollbar on narrow laptops; mobile keeps 44px touch rows and a full-width header and footer
DESIGN.md and expanded the system into a full UI/UX source of truth.
- The combined AI prompt + tokens file is now
DESIGN.md(wasiceconnect-brand.md) — the conventional name to drop into a repo asCLAUDE.md; all links, the build script andllms.txtupdated - New design tokens: a
breakpointscale (375 / 768 / 1024 / 1440) and a namedzIndexlayering scale (base → toast), added totokens.jsonandtheme.css - New on-page guidance: navigation patterns (top bar, tabs, breadcrumb, sidebar, mobile), forms & validation, empty & loading states, layering and breakpoints, performance essentials, and a named house style
- Section 20 now ships four expert, paste-ready AI recipes (email sequence, review deck, social ad, case study); removed the duplicate button demo in section 12 and merged the input states into Forms & validation
- Published the design system as real, fetchable files —
tokens.json,theme.css, the combinedDESIGN.md(AI prompt + tokens in one file) and anllms.txtindex — all listed in the new Brand Files & Resources section - Added Download buttons beside every Copy button, and JSON-LD
Organizationdata plus a canonical link so search engines and AI assistants can extract the brand directly - New Developer Quick-Start at the top of For Developers; copy now works over
file://and insecure origins; repeated styles and the nav chevron consolidated
- Footer rebuilt as a single full-width column — contact details (web, email, tap-to-call phone) sit under the brand note with Lucide icons, and the company no., VAT and registered address each get their own line
- Favicon wired from the asset library, plus a 1200×630 Open Graph / Twitter share card so links preview properly on WhatsApp, email and Slack
- Mobile fixes — the use/lose word list is now a table, the chart dark-mode preview works on tap, and the menu no longer repeats the logo
- New Data Visualisation section — categorical, sequential and diverging chart palettes with worked SVG examples and a hover/tap dark-mode preview
- Status colours formalised as accessible sets (tint, base, AA-passing text); tokens.json extended with the status and chart palettes
- Navigation reorganised into seven collapsible categories with a Home link, section labels matched to their category, and a versioned script added to defeat stale caching
- Design Tokens — primitive to semantic, with full light and dark themes and a neutral ramp
- Type styles in px/rem/pt/sp, plus spacing, radius, elevation and motion scales, component states and WCAG AA accessibility guidance
- An app-focused AI paste block and a tokens.json source for Style Dictionary; sections reordered into a logical flow and the AI blocks merged into one
- Palette restructured — green, amber and red moved to Supporting Colours (UI states only), CMYK/Pantone merged in, and brass tint formalised
- Full 22-icon Lucide working set and photography reference samples added
- New What We Do section with the full service catalogue, reflected in the AI token block
- Logo Downloads wired to all 48 live asset files; master logo adopted throughout and the portal made self-contained for external partners
- Rebuilt the static guidelines as a single-page HTML portal with sticky and mobile navigation
- Added iconography (Lucide), photography direction, tone of voice with a use/lose word list, and logo minimum-size and don't rules
- Added print colour (CMYK) guidance for brochures and corrected contact details throughout
- Colour palette, 60/30/10 rule and pairings
- Typography: Bricolage Grotesque + DM Sans, with type scale
- Logo usage and approved backgrounds
- Components, spacing, do's & don'ts and AI token block