Skip to content

Your People — Design

This document captures the visual and structural rules for the Your People rebuild. It is the single source of truth that maps the design exploration onto the production codebase (Vue 3 + Tailwind v4 + Headless UI + Iconify MDI + ApexCharts).


1. Tokens

All design tokens live in src/assets/main.css under the Tailwind v4 @theme block.

1.1 Colour

TokenHexUse
primary-500#0693E3Primary buttons, links, focus rings, active nav fill, chart accent
primary-600#047DC2Primary button hover
primary-700#036FAEPrimary text on tinted backgrounds (accent-ink)
primary-100#DDF1FEAccent-tinted surfaces (selected rows, info pills)
secondary-400#8ED1FCLight brand decoration, chart secondary series
bg#F9F9F9Page background
surface#FFFFFFCards, tables, modals, top nav
surface-3#F3F3F4Sidebar nav background, container hover, soft buttons
border#ECECEEAll hairlines, table dividers
ink / ink-2 / ink-3 / ink-4#18181B#A1A1AAText scale: heading / body-strong / body / muted
success-500#0E8A5FPaid, active, healthy
warning-500#B97A0BPending, awaiting, expiring
danger-500#C53B3BFailed, lapsed, destructive

Rules

  • Primary is the only action colour. Don't introduce a second blue.
  • Semantic colours are only for status — never for decoration.
  • secondary-400 is a brand accent for charts and illustration. Don't use it for interactive elements.

1.2 Type

Font stack: Geist (sans), Geist Mono (mono). Headings sit at font-weight: 600, body at 400/500.

RoleSize / weightTracking
Page H128px / 600-0.012em
Section title (card)13px / 600-0.005em
Body14px / 400-0.003em
Small / meta12px / 4000
Eyebrow11px / 600 uppercase0.12em
KPI value28px / 600 tabular-nums-0.02em
Mono (IDs)12px / 500 Geist Mono0

Use font-variant-numeric: tabular-nums for any number that lives in a table column or KPI tile. Use mono for member IDs (70099274), invoice IDs (INV-39281), Stripe IDs (pi_3OkLm7…), and event ticket IDs (YP-A8-2719).

1.3 Radius, shadow, spacing

  • Radii: sm 6px, md 10px, lg 14px. Tables and dropdowns use md. Pills are fully rounded.
  • Shadows: deliberately quiet. shadow-sm resting, shadow-md floating, shadow-lg hero only.
  • Spacing follows Tailwind defaults. Page padding is 36px left/right, 18px top.

2. Layout

2.1 The shell

Three regions, fixed. Sidebar (left) · Top nav (top) · Content panel (right of sidebar, below top nav).

Sidebar

  • Background: surface-3 (#F3F3F4).
  • 232px wide expanded, 64px collapsed (icon-only).
  • Active item: full primary fill (#0693E3) with white text. No left-border accent.
  • Inactive items: ink-2 text, hover background surface (white).
  • Logo at top: full lockup when expanded, square mark when collapsed.
  • Organisation card pinned to bottom.

Top nav

  • White surface, single border line below.
  • Contents only: command-centre search (left), help, notifications, signed-in user (name + role).
  • No breadcrumbs, no page actions in the top nav.
  • Signed-in user is rendered as name + role label, not an avatar circle.

Content panel

  • padding: 18px 36px 36px.
  • First child: breadcrumb row (12.5px, tight margin to page header).
  • Page header sits next: eyebrow → H1 → sub, left-aligned.
  • Page-level action buttons float in the top-right of the content panel, vertically aligned with the H1.

2.2 Breadcrumb

Pet Industry Federation / Members / Manage

Slash separator in ink-4. Trailing crumb in ink bold, earlier crumbs in ink-3.


3. Components

3.1 Buttons

VariantBackgroundTextHoverFocus ring
primaryprimary-500whiteprimary-600primary-400
secondarysurface + borderink-2surface-3primary-400
dangerdanger-500whitedanger-700danger-500

Heights: sm 28px, md 32px, lg 40px. Radius sm (6px). Icons inside buttons 14px, 6px gap.

3.2 Cards

border-radius: 10px
border:        1px solid border
background:    surface
shadow:        shadow-sm
padding:       22px (airy) / 16px (balanced) / 12px (dense)

3.3 Tables

  • Header row: surface-2 background, 11.5px / 500 uppercase 0.07em in ink-3.
  • Body rows: 44px height (balanced), border-bottom border, hover surface-2.
  • Numeric columns right-aligned with tabular-nums.
  • Strong column (the row's "label") in ink / 500. Everything else in ink-2.
  • IDs in mono and accent-ink (primary-700).
  • Status column always uses a pill, never raw text.

3.4 Pills & badges

Fully rounded, 2px / 8px padding, 11.5px / 500. A pip dot precedes the label.

PillBackgroundText
Neutralsurface-3ink-2
Positivesuccess-50success-500
Warningwarning-50warning-500
Negativedanger-50danger-500
Infoprimary-100primary-700

3.5 KPI tile

Four metrics across the top of analytical screens. Always a single row, equal width.

label              ← 12px / 500 ink-3
value  +delta      ← 28px tabular-nums + 11.5px positive/negative
sparkline          ← 30px high, primary (or danger if metric is bad)

3.6 Filter chip

Pill-shaped, 28px tall, 12px / 500. Active state: solid ink background, white text.

3.7 Forms

  • Inputs: 28–32px tall, surface-2 background, 1px border, radius-sm.
  • Labels above inputs, 11.5px / ink-3.
  • Validation messages below, 12px / danger-500.

4. States

Every list, table, and detail screen must implement the three states.

StateComponentVisual
Loading<StateSkeleton>Shimmer rectangles matching the eventual layout. Don't show a spinner over an empty screen.
Empty<StateEmpty>Centred icon + title + body + primary CTA + secondary action.
Error<StateError>Tinted banner card (danger-50 background, danger-500 border).

5. Icons

Use MDI via Iconify. Default size 1em. Sidebar 16px, button icons 14px.

vue
<Icon icon="mdi:account-multiple-outline" />
RoleIcon
Dashboardmdi:view-dashboard-outline
Membersmdi:account-multiple-outline
Eventsmdi:calendar-month-outline
Financials / Paymentsmdi:credit-card-outline
Marketingmdi:bullhorn-outline
Selections / Filtersmdi:filter-variant
Reportsmdi:chart-bar
Settingsmdi:cog-outline
Searchmdi:magnify
Notificationsmdi:bell-outline
Helpmdi:help-circle-outline
Add / Newmdi:plus
Download / Exportmdi:download-outline

6. Charts

Use ApexCharts through vue3-apexcharts. Colours primary-500 + ink-2. Grid 1px dashed border. Tooltips surface with border 1px. Line stroke 2px, area fill 12%.


7. Density

Density is a per-component prop on <AppCard> (and any future surface that adopts the same scale). It controls card padding; table row height is set on the table itself when a denser variant is needed.

DensityCard paddingTable rowDefault
airy22px52px← yes
balanced16px44px
dense12px36px

8. Mock data conventions

  • Default demo organisation: Pet Industry Federation (PIF).
  • Default user: Alex Rivera, System Administrator.
  • Money: £ prefix, 2 decimal places in tables.
  • Dates: DD MMM YY (11 May 27).
  • Member IDs: 8-digit numeric.
  • Invoice IDs: INV-NNNNN.
  • Stripe IDs: pi_…, cus_…, ch_… (15-char truncated, suffix).

9. Definitely don't

  • Don't add a second blue.
  • Don't use emoji as iconography.
  • Don't put action buttons in the top nav. They live in the content panel, inline with the H1.
  • Don't put breadcrumbs in the top nav. They live in the content panel, above the page header.
  • Don't render avatars in the top nav. Use the name + role pattern.
  • Don't introduce raw gray-* Tailwind classes — use ink-*, surface-*, border-* tokens.
  • Don't ship a list view without an empty and loading state.
  • Don't gradient-fill an icon, button, or surface.