Owner / HQ

TradeOS design system

The in-repo living design system. Every token + component, live β€” this is how we keep the system honest. Toggle light/dark and view-as role in the top bar.

Colour & semantic tokens

Inherited verbatim from the live Comfort Zone site so the app + website are one family. Red is rationed to one CTA + critical; gold is ratings/awards only; lilac is reserved for Kenny / proposed everywhere.

Brand Β· accent Β· gold

brand-600
#1271b9
primary
brand-700
#0f5c97
hover / HQ
brand-50
#eef6fc
info bg
accent-500
#ed2024
CTA
accent-700
#b01217
crit fg
gold-400
#e1ab2f
ratings
kenny
#7c6bd6
proposed
ink
#1a2433
text
sand
#f4f1ec
canvas

Semantic status (always colour + dot + word)

PassedCriticalSentDraftKenny drafted

Role accents (wayfinding only β€” never the CTA)

Owner / HQ
--role-hq
Area manager
--role-am
Franchisee
--role-fr
Installer
--role-in
Factory
--role-fa
Customer
--role-cu
Prospect
--role-fr

Type scale

Montserrat for display/headings, Inter for body & UI β€” the site's exact pairing.

display-xl 32/700$1.2M–1.5M MTD
h1 28/700Today’s jobs
h2 22/700Quote QE-4821
h3 18/600Roof condition
title 16/600Booking details
body 15/400Blown cellulose fills every joist cavity seamlessly.
label 13/590Ceiling area (mΒ²)
caption 12/500Saved on device Β· syncing

The warm surface ladder

RULE: one light source Β· cards lift off a deeper sand canvas. Four warm rungs, each ~+3 L*, same ~40Β° hue β€” so a card (off-white) sits ABOVE the canvas (deeper sand) instead of every panel painting flat onto one white. The contrast IS the depth.

This block sits on the raw canvas. Watch each rung step UP off it.

--canvas
#f4f1ec Β· L* ~95
--sunken
#efece6 Β· L* ~94
--surface
#fdfcfa Β· L* ~99
--raised
#ffffff Β· L* 100

Elevation ramp β€” warm single-light vs the old grey

RULE: one light source, vertical offset 2Γ— horizontal. Warm-tinted multi-layer shadows + a 1px white top-edge highlight = the 'new-car metallic paint'. Flip to the OLD flat 2-layer grey ramp so the difference is undeniable.

lit / warm
e1
e2
e3
e5

e1 hairline Β· e2 cards (the new floor) Β· e3 popovers/tiles Β· e5 modals. The warm ramp adds the top highlight + a coloured-by-light feel; the grey ramp is a flat drop-shadow smudge.

Depth helpers Β· concentric radii

RULE: rationed gloss. .tos-sheen (the ONE solid per view) Β· .tos-surface (cards) Β· .tos-lift (hover-lift tiles). Radii nest concentrically: a control (7px) inside a card (11px) inside a modal (16px).

Depth helpers (hover the lift)

sheensurfacelift ↑

Depth via gradient + warm shadow + coloured glow β€” brand hexes untouched.

Concentric radii

control 7px

modal 16 βŠƒ card 11 βŠƒ control 7 β€” inner β‰ˆ outer βˆ’ padding.

Buttons

One red CTA per view. Primary = brand blue; secondary/ghost/kenny carry the rest. The solid fills (CTA / primary) carry a faint convex sheen + gradient built from the SAME brand hex β€” depth, not a new hue (the 'poppy, like a beautiful car' finish).

State progress β€” lifecycle stepper

For ORDERED sequences (quote / job / payment), not alerts. The ramp walks the spectrum across the steps; the current step is high-contrast (filled solid + colour ring + larger), past steps filled-muted with a tick, future steps outlined-muted. The semantic StatusPill (critical/warning/success) stays for alerts; StateProgress is for 'where is it up to, what's next'.

Quote lifecycle (current: viewed)

  1. Draft
  2. Sent
  3. Viewed
  4. Accepted

Job lifecycle β€” step through it

  1. Lead
  2. Quoted
  3. Booked
  4. Done
  5. Paid

Full quote-to-aftercare lifecycle (9 steps, compact)

Draft β†’ Sent β†’ Viewed β†’ Accepted β†’ Booked β†’ Invoiced β†’ Guarantee sent β†’ Review asked β†’ 3-month follow-up. Used on the Quote Review surface; `size="sm"` keeps the 9-step rail legible.

  1. Draft
  2. Sent
  3. Viewed
  4. Accepted
  5. Booked
  6. Invoiced
  7. Guarantee sent
  8. Review asked
  9. 3-month follow-up

Follow-up / touchpoint timeline

What we've actually DONE with the customer after the quote went out β€” SMS / call / email / system events. Complements StateProgress (where it's up to) with what moved it. Each kind carries a glyph + tinted dot + word so meaning never relies on colour.

  1. SystemMon 23 Jun Β· 9:14am
    Quote sent to the customer
    β†’ Email + SMS link
  2. SMSMon 23 Jun Β· 9:15am
    SMS β€” β€œSent your ceiling quote, happy to talk it through”
    β†’ Delivered
  3. CallTue 24 Jun Β· 2:30pm
    Called Kirsty to check she got it
    β†’ No answer β€” left voicemail
  4. EmailWed 25 Jun Β· 8:02am
    Follow-up email β€” answered the downlight question
    β†’ Opened twice

Weather bar β€” 10-day forecast

A site-specific forecast strip labelled with the customer's suburb. Good ceiling-cavity days get a brand tint; the suggested day gets a ring. Mock data this slice β€” wires to a forecast API with no UI change.

10-day forecast Β· Lawntongood cavity day
  1. Mon21Β°13Β°πŸ’§80%
  2. Tue22Β°14Β°πŸ’§55%
  3. Wed23Β°14Β°πŸ’§30%good ceiling-cavity day
  4. Thu24Β°15Β°πŸ’§10%good ceiling-cavity day
  5. Fri25Β°15Β°πŸ’§5%good ceiling-cavity day
  6. Sat24Β°16Β°πŸ’§25%good ceiling-cavity day
  7. Sun22Β°15Β°πŸ’§50%
  8. Mon23Β°14Β°πŸ’§30%good ceiling-cavity day
  9. Tue25Β°15Β°πŸ’§10%good ceiling-cavity day
  10. Wed26Β°16Β°πŸ’§5%good ceiling-cavity day

Pricing-line row (the quote centrepiece)

One fully-controlled editable service line: tick to include, edit mΒ², pick an R-value (drives the multiplier), Recommended + Optional-for-customer toggles, an add-photo/video affordance, and the live ex/inc-GST. Toggle / edit it below β€” the inc-GST here is mock; on the real surface it's recomputed by the engine.

Blown cellulose β€” ceilingRecommended
inc GST$7,345$6,677 ex

FAQ / content suggester

Kenny's 'links worth adding to the cover message' list β€” a FAQ page or a YouTube video, each with WHY it fits this customer and a tick (aria-pressed toggle, never a checkbox role) to add it to the cover note.

Toggle & tile pickers

Single toggle

aria-pressed

Every picker is aria-pressed toggle buttons in a role=group β€” never role=radio/checkbox.

Multi toggle

Picture-tile (warm quote-form variant)

Status pills & fields

Job / quote states

QuotedDraft (Kenny)BookedCritical fail

Sync (offline = amber, not red)

SyncedSyncing…Sync failed

Fields

Eave-deducted measured area.

Voice-to-text fields & media upload

Every multi-line / longer text box gets a 'hold to talk' mic (Web Speech API, en-AU, push-to-talk, cancellable) β€” graceful fallback hides the mic where unsupported. Anywhere assets are captured carries an Attach: Photo / Video control (video sits alongside photo).

Mic field (hold the mic and talk)

Mirrors the website's MicInput. Hold the mic and talk instead of typing.

Attach photo / video

Attach evidence

Front-end only this slice β€” chosen files list as removable chips; the video path sits next to the photo path.

Tabs & states

Tabs have an obvious hover state (tinted pill + underline hint) as well as the selected state β€” so it reads as selectable. Use ← β†’ / Home / End to move.

Loading

Empty

No sites yet.

Error

The Kenny action card

Every Kenny output is born proposed — lilac wash, lilac rail, 'awaiting your tap'. On mount it MATERIALISES (rise + 2px→0 blur) with a one-time lilac edge-glow that lands attention then releases. The human always presses the button; reasoning is shown, not hidden.

Kenny drafted a quoteKenny drafted Β· awaiting your tap
Wallace job Β· 168 mΒ² Β· blown cellulose R3.0 + in-ceiling walls
$7,705 inc GST
Cellulose recommended Β· polyester option attached Β· 30-day validity
High confidence
Why Kenny suggests this

Priced by the deterministic engine (not by Kenny) from the eave-deducted 168 mΒ² at R3.0 + in-ceiling walls, +$2/km round-trip from Tiaro, less the $150 price-shave; removal offered as an optional add-on. Narrative grounded in the verified FAQ + claims library. Nothing sent until you approve.

Money-hold confirm

Two-phase. Approve swaps to a confirm row: press-and-hold below $2,000; type the exact amount at/above $2,000.

Under $2,000 β€” press & hold

$2,000+ β€” typed amount

Modal ↔ bottom sheet Β· offline banner

Offline / failed banners

● Sync failed β€” tap to retry. Your work is still saved on this device.

Responsive dialog

Centered modal on desktop, bottom sheet on mobile (resize the window).

Motion lab

RULE: asymmetric timing — arrivals fast+snappy (~140ms ease-out), exits slow+relaxed (~280ms). The spring is reserved for the ~10% that earns it (approve→sent). Feel each one.

Skeleton shimmer (warm 100Β° sweep)

The success button is the ONE workhorse spring β€” the SVG check draws + the circle pops. Buttons lift on hover and depress on press (the convex surface visibly sinks). Tabs (above) SLIDE their indicator; they don’t fade.

prefers-reduced-motion is a graceful path, not a kill-switch: turn it on in your OS and the Kenny card still fades (no transform/blur), the lift still elevates via shadow (no slide), and the success check is simply present β€” accessible AND still designed.

Role dashboards

RULE: 60-30-10 + role containment. One token set, six accents read together β€” each tcard carries only a 3px role top-border + one role dot, staggered entrance, tabular-nums KPIs. No paint-chart.

Owner / HQ
$1.2M–1.5M
Revenue MTD (banded) Β· 3 approvals need you
Area manager
92%
Audit coverage Β· 4 inspections due this week
Franchisee
5 jobs
Today Β· Deferred Franchise Purchase $6.0k left β†’ ~$600/wk
Installer
Next 9am
12 Bridge St Β· 148 mΒ² Β· round-trip 34 km
Factory
38 bags
Run CN-4822 Β· borax low (amber)
Customer
R5.0 βœ“
Installed 14 Jun Β· verified

CRM foundation (Slice 1)

The shared pieces the Contacts β†’ Sites β†’ Quotes spine is built on: the 3-tier breadcrumb, the privacy-band figure for the HQ deck, the per-device density toggle, and the sticky multi-select bar.

Breadcrumb (3-tier β€” collapses to β€Ή parent on mobile)

BandedFigure (exact cents β†’ privacy band for the network deck)

$100k+band
8% vs last monthRevenue MTD Β· network
$25–50kband
Cash + AR Β· network
< $10kband
3% vs last monthSmallest tenant

DensityToggle (comfortable / compact, persisted per device)

Drives table/card density on every staff surface (customer home opts out).

BulkActionToolbar (sticky N-selected bar with Undo)

0 selected