iceConnect — back to top
Everything on-brand, everywhere

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.

SystemSlate & Brass
StyleMinimal, calm, confident
Version2.8
OwnericeConnect Marketing
UpdatedAugust 2026
01 · Overview

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.

01

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
02

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
03

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
04

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
05

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
06

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
07

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
08

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
09

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
10

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
02 · Colour & Type

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

Slate
Primary dark / grounds
HEX #0F172A
RGB 15, 23, 42
CMYK 64, 45, 0, 84
Pantone 5255 C
Brass
Accent — CTAs, highlights
HEX #C8A35B
RGB 200, 163, 91
CMYK 0, 18, 55, 22
Pantone 4006 C
Brass Tint
Callout & highlight panel fills
HEX #F6F3EB
RGB 246, 243, 235
CMYK 0, 1, 4, 4
Steel
Muted secondary — charts & info only
HEX #4E7CA1
RGB 78, 124, 161
CMYK 52, 23, 0, 37
Pantone 5415 C
Off-white
Page background
HEX #FAFAF8
RGB 250, 250, 248
CMYK 0, 0, 1, 2
Tint
Subtle fills / alternating bands
HEX #F1F5F9
RGB 241, 245, 249
CMYK 3, 2, 0, 2
Muted
Secondary text
HEX #64748B
RGB 100, 116, 139
CMYK 28, 17, 0, 45
Border
Hairlines & dividers
HEX #E2E8F0
RGB 226, 232, 240
CMYK 6, 3, 0, 6

Supporting colours — UI states only

Green
Success — confirmations & positive states
HEX #22C55E
RGB 34, 197, 94
CMYK 83, 0, 52, 23
Amber
Warning — caution & attention states
HEX #D97706
RGB 217, 119, 6
CMYK 0, 45, 97, 15
Red
Error — failures & destructive states
HEX #DC2626
RGB 220, 38, 38
CMYK 0, 83, 83, 14
Supporting colours are functional, not decorative. Use them only as UI status indicators — success ticks, warning banners, error messages, dashboard states — never in headings, CTAs, illustrations or backgrounds. Amber is deliberately deeper than brass, so keep the two distinct.
For print, give the CMYK/Pantone values above to the print house rather than letting software auto-convert from RGB — brass and slate shift noticeably under automatic conversion. The CMYK figures are nearest conversions, so request a physical proof for brochures and use the Pantone reference for spot-colour jobs.
03 · Colour & Type

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

60% slate & neutrals · 30% steel & supporting · 10% brass

Approved pairings

White on slate
Slate on brass
Slate on off-white
White on steel
Never set white text on brass. Brass is light — always use slate text on a brass fill, including buttons.
04 · Colour & Type

Typography

Two free Google Fonts. Install the clean static Regular & Bold files on every machine that produces assets.

Headings
Bricolage Grotesque
Aa Bb Cc Dd Ee · 0123456789
Use for titles, headlines, big numbers and hero text. Bold and expressive — never for body or small text.
Free · Google Fonts / SIL OFL
Body
DM Sans
Aa Bb Cc Dd Ee · 0123456789
Use for paragraphs, labels, captions, UI text and buttons. Clean and highly legible at every size.
Free · Google Fonts / SIL OFL
Use the plain font names. Reference the fonts as Bricolage Grotesque and DM Sans — never the optical-size variants (e.g. "DM Sans 14pt"), which break font matching across Mac and Windows.
05 · Colour & Type

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).

Display / HeroBricolage Grotesque · 54–60pt Bold · demo shown reduced
Reliable. Scalable. Secure.
Page Title (H1)Bricolage Grotesque · 30pt Bold
Managed IT Support
Section Header (H2)Bricolage Grotesque · 18–20pt Bold
Cyber Security
BodyDM Sans · 11–14pt Regular
Always running, monitored and secured by design.
Caption / LabelDM Sans · 9–10pt · tracked caps
Prepared for
07 · Logo & Imagery

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.

Every logo file is below — each size and format with its own download. Keep the colour mark on a neutral ground — slate, off-white or white — never on brass, steel or any colour fill.

Full logo — mark + wordmark

Light bgColour — light backgrounds
Colour — light backgrounds
Primary logo. Websites, apps, documents and email signatures on white or off-white. Colour mark with grey wordmark.
Dark bgColour — dark backgrounds
Colour — dark backgrounds
For slate and dark grounds — dark web sections, footers, slide covers. Colour mark with white wordmark.
Light bgMono — black
Mono — black
One-colour black version. Greyscale and single-colour print, faxes, stamps, engraving, and anywhere colour isn't available.
Dark bgMono — white
Mono — white
One-colour white version, reversed. Over photos with a slate scrim, dark merchandise and sponsor walls.

Icon only — the “C” mark

Neutral bgIcon — colour
Icon — colour
Primary mark. The “C” on its own — app and web-app UI, in-product, social profile avatars and modern favicons. Sits on any neutral ground.
Light bgIcon — mono black
Icon — mono black
Single-colour mark for watermarks, stamps and one-colour contexts on light grounds.
Dark bgIcon — mono white
Icon — mono white
Reversed mark for dark UI, slate avatars and dark grounds.

Favicon & app icons

Favicon
Favicon
Browser tab and bookmarks. SVG for modern browsers, 32/64px PNG fallback.
Apple touch icon
Apple touch icon
iOS home-screen bookmark. 180px square.
Web app icon
Web app icon
PWA and Android manifest icons.
Maskable icon
Maskable icon
PWA adaptive icon — padded safe zone so Android can crop it to any shape.

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.

08 · Logo & Imagery

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

users
Clients & teams
server
IT estate
gauge
Performance
triangle-alert
Risk
headset
Support desk
shield-half
Cyber security
scale
Compliance
app-window
Applications
cloud
Cloud services
network
Infrastructure
phone
Contact
database
Data & backup
bot
AI & automation
target
Strategy
circle-check
Included / done
chart-line
Reporting
clock-4
Response times
pound-sterling
Pricing & cost
lock
Access & security
trending-up
Growth
handshake
Partnership
map-pin
Location / onsite

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.

09 · Logo & Imagery

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.

Calm, naturally lit office interior
Calm, real workspaces
Team meeting in a boardroom, candid
Real teams, candid
Calm open-plan office with people working at a shared table
Uncluttered, breathing room
Hands typing on a laptop, shallow depth of field
Shallow depth of field
Considered detail shot of documents and charts on a desk
Considered detail shots
Uncluttered office with breathing room
Premium spaces, natural light

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.

Reference samples, not approved assets. The images above are licensed Unsplash shots shown for tone and treatment only. Licence-check anything before it ships, and use iceConnect's own commissioned photography wherever it exists.
10 · Voice & Rules

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

UseLose
keep your systems runningmaximise uptime / high availability
protect your businessendpoint threat mitigation
back up your dataimmutable backup architecture
we'll set it up for youseamless deployment & onboarding
help when you need it24/7 SLA-backed support tiers

Before & after

Before — too technical

Our proactive RMM platform leverages enterprise-grade SIEM and EDR to deliver best-in-class threat remediation across your entire estate.

After — plain & confident

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.

11 · Voice & Rules

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
12 · For Designers

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.

13 · For Designers

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

900#0F172A
800#1E293B
700#334155
500#64748B
400#94A3B8
300#CBD5E1
200#E2E8F0
100#F1F5F9
50#FAFAF8

Semantic tokens · light theme

TokenValueUse
text.primary#0F172ABody copy, headings
text.secondary#64748BSupporting / muted text
text.inverse#FFFFFFText on the opposite ground
text.on-accent#0F172ALabel on brass fills
bg.page#FAFAF8App background
bg.surface#FFFFFFCards, sheets, inputs
bg.muted#F1F5F9Subtle fills, hovers
bg.inverse#0F172AInverted panels
border.default#E2E8F0Hairlines, input borders
border.strong#CBD5E1Emphasised dividers
action.primary#C8A35BPrimary buttons, key CTAs
action.primary-hover#BC9550Primary button hover
action.primary-text#0F172ALabel on primary
action.secondary#4E7CA1Secondary buttons, info
action.secondary-text#FFFFFFLabel on secondary
focus.ring#C8A35BFocus outlines
status.success#22C55ESuccess / positive
status.warning#D97706Warning / caution
status.error#DC2626Error / destructive
status.info#4E7CA1Informational

Semantic tokens · dark theme

TokenValueUse
text.primary#F1F5F9Body copy, headings
text.secondary#94A3B8Supporting / muted text
text.inverse#0F172AText on the opposite ground
text.on-accent#0F172ALabel on brass fills
bg.page#0F172AApp background
bg.surface#1E293BCards, sheets, inputs
bg.muted#334155Subtle fills, hovers
bg.inverse#FAFAF8Inverted panels
border.default#334155Hairlines, input borders
border.strong#475569Emphasised dividers
action.primary#C8A35BPrimary buttons, key CTAs
action.primary-hover#D4B373Primary button hover
action.primary-text#0F172ALabel on primary
action.secondary#4E7CA1Secondary buttons, info
action.secondary-text#FFFFFFLabel on secondary
focus.ring#C8A35BFocus outlines
status.success#22C55ESuccess / positive
status.warning#D97706Warning / caution
status.error#DC2626Error / destructive
status.info#4E7CA1Informational

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.

StatusBackgroundBase · icon/fillText · 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
Backup completedAll systems backed up overnight.
Certificate expiringSSL renews in 7 days.
Agent offlineReconnect the monitoring agent.
Maintenance windowPatching Sunday 02:00.

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.

Light surface
All Systems Operational Certificate Expiring Agent Offline Maintenance Window
Dark surface
All Systems Operational Certificate Expiring Agent Offline Maintenance Window
Reference roles, not raw colours, in product code. A component uses action.primary, never #C8A35B — that is what lets the same code render correctly in light, dark and any future theme.
14 · For Designers

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

Steel#4E7CA1
Brass#C8A35B
Teal#4F9D8C
Plum#8C6A93
Clay#C0795B
Slate#64748B

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

#ECF2F7
#C2D5E3
#8FB1CB
#5E8BAC
#3B5F7D

Single-hue steel ramp for heatmaps, intensity and utilisation — one hue keeps it readable.

Diverging · around a midpoint

#B91C1C
#F2B8B8
#F1F5F9
#A7E3BE
#15803D

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.

Always pair colour with a second cue — a label, direct value or pattern — so charts read for colour-blind users and in greyscale print. Test sets for colour-blindness before shipping — viz-palette and ColorBrewer both flag unsafe combinations.

Applying the palette

data-viz 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]} />
15 · For Designers

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.

Display / HeroBricolage 800 · 56px / 3.5rem · LH 1.0 · -0.02em · demo shown reduced
Always on.
Title · H1Bricolage 700 · 32px / 2rem · LH 1.05 · -0.01em
Managed IT Support
Heading · H2Bricolage 700 · 22px / 1.375rem · LH 1.1
Cyber Security
Subheading · H3Bricolage 700 · 18px / 1.125rem · LH 1.25
Service desk & response
Body LargeDM Sans 400 · 18px / 1.125rem · LH 1.55
Always running, monitored and secured by design.
BodyDM Sans 400 · 16px / 1rem · LH 1.5
Always running, monitored and secured by design.
Body SmallDM Sans 400 · 14px / 0.875rem · LH 1.45
Supporting detail and helper text.
LabelDM Sans 600 · 13px · LH 1.3
Account status
CaptionDM Sans 600 · 11px · 0.12em · UPPERCASE
Prepared for
Pill / BadgeDM Sans 500 · 11px · LH 1 · status pill label (see §13)
All systems operational
Never hard-code text in dp on Android — use sp so it respects the user’s font-size setting. On iOS, map these sizes to Dynamic Type styles rather than fixed points.
16 · For Designers

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

space.2xs · 4
space.xs · 8
space.sm · 12
space.md · 16
space.lg · 24
space.xl · 32
space.2xl · 48
space.3xl · 64

Radius

sm · 6pxControls, inputs
md · 8pxButtons
lg · 12pxCards
xl · 20pxPanels
fullPills, avatars

Elevation

elevation.sm0 1px 2px · 6%
Inputs, chips
elevation.md0 4px 14px · 8%
Cards, popovers
elevation.lg0 14px 40px · 12%
Modals, sheets
In dark mode, shadows mostly disappear — separate surfaces with a 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.

basePage content, normal flow0
dropdownMenus, selects, comboboxes1000
stickySticky headers & toolbars1100
overlayModal scrim / backdrop1200
modalDialogs & sheets1300
popoverPopovers & tooltips1400
toastTransient alerts — above all1500

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.

sm · 375Phone
md · 768Tablet
lg · 1024Laptop
xl · 1440Desktop

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.

Live Recording
17 · For Developers

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.

quick-start
<!-- 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.

Fonts

font-display: swap on every face so text is never invisible while a font loads; preload only the two we use.

Photos

Serve photographs as WebP/AVIF with srcset and loading="lazy" below the fold. Logos and icons stay SVG — never rasterise the mark.

Layout stability

Always set width/height or aspect-ratio and reserve space for async content — keep CLS under 0.1.

Perceived speed

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.
Building a whole product or app? Paste the AI prompt (section 20) into your AI tool for the full ruleset, or hand engineering DESIGN.md — the prompt and tokens in one Markdown file.
18 · For Developers

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

DefaultGet started
HoverGet started
ActiveGet started
FocusGet started
DisabledGet started

Secondary & ghost

SecondaryLearn more
Secondary · hoverLearn more
GhostCancel
Ghost · hoverCancel

Sizes

SmallButton
MediumButton
LargeButton

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.

Defaultyou@company.com
Focusyou@company.com
Errornot-an-email
DisabledLocked
you@company.com We’ll only use this to send your report.
Select a band Choose a band so we can tailor your quote.
Every interactive element needs a visible focus state — a 2px 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 ticket

Empty 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!!!”
19 · For Developers

Accessibility

Non-negotiable. Every iceConnect app clears WCAG 2.2 AA. The brand palette already supports it — used in the right roles.

Colour contrast

PairingRatioVerdict
Slate on off-white / white~17.9:1AAA
White on slate~17.9:1AAA
Slate on brass (button label)~7.5:1AA
Muted #64748B on white~4.75:1AA
White on steel (button label)~4.5:1AA borderline
Steel on white (text)~4.4:1Large / UI only
Brass on white (text)~2.4:1Fails — never
Brass and steel are accents, not body-text colours on light grounds. Brass on white is ~2.4:1 — only ever use it as a fill with slate text on top. Keep body text slate or muted.

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.

20 · For Developers

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.

email-sequence
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.
review-deck
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.
social-ad
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.
case-study
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.

DESIGN.md · system prompt
Download .md
# 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.

tokens.json
Download .json
{
  "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.

theme.css
Download .css
/* ==========================================================================
   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; } }
21 · For Developers

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.

Markdown
DESIGN.md

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.md
Download
JSON
tokens.json

Machine-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.json
Download
CSS
theme.css

Ready-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.css
Download
AI index
llms.txt

An 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.txtDownload
Policy
robots.txt

The crawler & AI-access policy for this site. This is public brand material — search indexing, AI input and AI training are all explicitly permitted.

/robots.txtView
Logos
Logo library

Every 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 files
One canonical source, kept in sync automatically. tokens.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.
22 · Governance

Changelog

Every revision to this brand system is logged here. This is a living document — always link to it rather than distributing copies.

v2.8
August 2026
Accessibility, token integrity and a page-wide review sweep.
  • Semantic tokens reconciled across all sources — border.strong, dark-mode text.inverse and dark-mode action.primary-hover (now lightens to #D4B373) each had drifted; tokens.json and theme.css now 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
v2.7
August 2026
Menu rebuilt on the Client Portal's navigation system.
  • 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
v2.6
June 2026
Renamed the combined file to DESIGN.md and expanded the system into a full UI/UX source of truth.
  • The combined AI prompt + tokens file is now DESIGN.md (was iceconnect-brand.md) — the conventional name to drop into a repo as CLAUDE.md; all links, the build script and llms.txt updated
  • New design tokens: a breakpoint scale (375 / 768 / 1024 / 1440) and a named zIndex layering scale (base → toast), added to tokens.json and theme.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
v2.5
June 2026
Machine-readable sources, downloads and a developer on-ramp.
  • Published the design system as real, fetchable files — tokens.json, theme.css, the combined DESIGN.md (AI prompt + tokens in one file) and an llms.txt index — all listed in the new Brand Files & Resources section
  • Added Download buttons beside every Copy button, and JSON-LD Organization data 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
v2.4
June 2026
Footer, share preview and mobile polish.
  • 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
v2.3
June 2026
Data visualisation and navigation.
  • 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
v2.2
June 2026
Design-system layer for building apps.
  • 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
v2.1
June 2026
Colour, logo and services depth.
  • 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
v2.0
June 2026
Converted to a living HTML brand portal.
  • 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
v1.0
Earlier 2026
Initial Slate & Brass brand system.
  • 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