6px 14px· all variantsvar(--r-full)· pill — no exceptions12px / 600· Poppins6px#d1fae5 / #065f46· Available, Active#fef3c7 / #92400e· At Risk, Pending#fee2e2 / #ef4444· Blocked, Overdue#dbeafe / #1d4ed8· In Progressvar(--n100) / var(--n700)· Draft, Inactivergba(109,40,217,.08)var(--purple)· #6d28d9✦· star glyph#ef4444 dot· 8px circle#a05500 dot· --rh600#10b981 dot· --successUsed in the Potential Hub matchmaking panel to show match scores across multiple criteria. Thin ring, percentage in centre, semantic colour.
Inline trend lines for KPI cards, executive summary strips, and hub widgets. Sit behind a number to show trend context.
Horizontal proportional bars for distribution data — used in the Exec Summary strip and Tango home page cards.
For initiative completion and demand health. Warm root-skin colour for ambient progress; semantic colours kick in for threshold breaches.
Split bars used in resource cards and roster tables to show allocation across a 3-month rolling window. Each segment is independently coloured by its own threshold.
Discrete segmented bars used in the demand list to show position in the lifecycle.
52 × 52pxr=204pxvar(--n100)round-90deg (12 o'clock start)11px / 800 / token colour#10b981var(--lf600)var(--rh600)var(--error)100 × 24px0 0 120 282px0.5 (background trend)#10b981 / --successvar(--error)var(--orange)6px9999px (pill)var(--n100)90px 1fr 36px8pxwidth 600ms cubic-bezier(.4,0,.2,1)6pxvar(--rs600)--success#b45309var(--error)3px3pxvar(--n200)#639922#b45309#E24B4Avar(--n100)var(--n700) / 12px / 6001px var(--n200)var(--orange-subtle)var(--orange-dark)1px var(--orange)var(--r-full)5px 14px120ms ease2px bottom border var(--orange)var(--n900) / 13px / 600var(--n500) / 13px / 5008px 16px1px var(--n200)var(--n200)var(--n700) / 9px / 70010px1px 5pxwhite1px var(--n200)var(--r-lg)var(--shadow-1)var(--s4) var(--s5)11px / 500 / var(--n500)· uppercase optional24px / 800 / var(--n900)· primary number11px / 600 / var(--success)· ▲ positive11px / 600 / var(--error)· ▼ negative11px / 500 / var(--n500)· — no changeflex, gap var(--s4)120px1 (equal width)var(--n200)· inactive segmentvar(--orange)· completed segment3px2px24px × 24pxvar(--orange)white checkmark, 10pxwhite2px var(--orange)var(--n100)2px var(--n200)12px / 700 / var(--n900)12px / 500 / var(--n400)12px / 500 / var(--n600)10px / 400 / var(--n400)flex:1 (equal distribution)center below dot80px per stagewhite1px var(--n200)1.5px var(--orange)var(--r-xl) / 16pxvar(--shadow-2)var(--s5)var(--shadow-3)15px / 700 / var(--n900)11px / 400 / var(--n500)32px heightvar(--n200) / 3px heightvar(--orange) / 3pxvar(--success)2px#fee2e2 / #b91c1cvar(--pw100) / var(--pw800)#d1fae5 / #065f4610px / 700var(--r-full)3px 9px3pxvar(--success) / #639922var(--warning) / #b45309var(--error)11px / 500 / var(--n500)10px / var(--n400).ok ≤80% · green.warn ≤100% · amber.over >100% · red.empty free period · grey1px var(--n200) border1.5px var(--error) border + error-bg1.5px var(--warning) border + warning-bg1.5px dashed var(--n200)var(--shadow-3)34px × 34px circle (table) / 40px (card)11-13px / 700turmeric -50 bg / -600 text (per person)12px / border 2px white#3B6D11 / ≤80%var(--warning) / ≤100%var(--error) / >100%rgba(239,68,68,.06)var(--error) / 9px / 700rgba(245,158,11,.08)var(--warning) / 9px / 700rgba(109,40,217,.08)var(--purple) / 9px / 7003px2px#639922var(--warning)#E24B4Avar(--n200)#1a5c1a#b45309var(--error)11px / 700success-bg / #065f46error-bg / var(--error)warning-bg / #92400ewarning-bg / #92400evar(--r-full)10px / 7003px 9px13px 16px18px 16px (shows sub-labels)5px 10px (no avatar, col borders)white1px var(--n200)var(--r-lg) / 12pxvar(--shadow-1)14px 16px#fee2e2 / text #b91c1c#dbeafe / text #1d4ed8#fef3c7 / text #92400evar(--n100) / text var(--n700)var(--r-base) / 6px10px / 700#ef4444 / 8px circle#f59e0b / 8px circle#10b981 / 8px circle13px / 600 / var(--n900)11px / 500 / var(--n600)11px / 500 / var(--n500)11px / 600 / var(--error)warning-bg / #92400esuccess-bg / #065f46n100 / var(--n600)whitevar(--n50)1px var(--n100)10px 16px2fr .8fr .8fr .7fr .6frvar(--n50)9px / 700 / var(--n500) / uppercase8px 16px1px var(--n200)13px / 600 / var(--n900)11px / 400 / var(--n500)8px circle#ef4444var(--rh600) / #a05500var(--success)22px circle8px / 700 / whiteturmeric -50 bg / -600 text11px / 500 / var(--n600)11px / 600 / var(--error)11px / 600 / var(--warning)⋮ / 16px / var(--n400)row hovervar(--n100)24 × 24px / r-6pxwhite1px var(--n200)var(--r-lg)var(--shadow-2)16px400pxvar(--shadow-3)150ms ease14px / 700 / var(--n900)10px / 600 / var(--n500) / uppercase10pxvar(--n100)var(--n700) / 11px / 600var(--r-full)3px 9px12px / 400 / var(--n700)1.653 (line-clamp)var(--n400)var(--n600) / 11px / 5001px var(--n100)var(--s3)20px circle7px / 700turmeric -50 bg / -600 textvar(--rh50)var(--rh600) / 10px / 700var(--r-full)#fafafa header · 9px 700 uppercase th · var(--n100) hover · 1px N-100 row divider · sticky header · border-collapse. No new styles are introduced — each table is a data arrangement of the same primitives.#fafafafont
9px 700 uppercasecolor
var(--n400)border-bottom
1px #e5e5e5position
sticky top:01px var(--n100)hover bg
#fafafa or orange-subtleactive left
3px #FFA426conflict left
3px #ef4444padding T1
12px 16px14px 700 #1a1a1ameta
11px var(--n400)portfolio chip
n100 bg · r-basestatus chip
semantic bg · pillavatar
26px circle gradientvar(--n50)10px / 700 / var(--n500) / uppercase.07em1px var(--n200)10px 16px11px 16px1px var(--n100)var(--orange-subtle)14px / 600 / var(--n900)var(--n100)var(--n600) / 10px / 600var(--rh600) / #a0550010px / 400 / var(--n500)11px 16px8px 16px → 8px 16px 8px 36px14px / 700 / var(--n900)13px / 500 / var(--n700)3pxvar(--orange)above — identical component11px plus SVG / var(--n200) → var(--orange) on hoverwhite1.5px var(--n200)var(--r-lg)var(--orange) bg + white checkvar(--n200) borderborder-radius: var(--r-base). Colour communicates panel type — orange (edit), blue (info), purple (AI), green (add), red (alert).13px 600 --n900. Subtitle: 11px --n400. Optional eyebrow above title for context panels (e.g. "Open Role").--r-base radius. Transparent → --n100 on hover. SVG × icon only — no text.10px 700 uppercase --n400. Fields use .dsp-field → label + input/select/prose. Focus ring: orange + 3px shadow.--orange-subtle tint with rgba(255,164,38,.25) border signals AI-filled values. cursor: default — not interactive.--n50 background. 1px --n100 top border. Right-aligned: ghost Cancel + orange primary CTA. Optional left slot for status notes or Tango nudge text.Focus on the pain — not the solution. What would happen if this demand was never addressed?
380–460pxslide
translateX(100%) → 0easing
320ms cubic(0.4,0,0.2,1)shadow
-4px 0 24px rgba(0,0,0,.08)--orangeheight
58pxicon
32px · rgba(255,255,255,.25)Tango strip
var(--purple-bg) · purple12px 700 n800Required
orange pillOptional
n100 bg n400 textfocus ring
orange + 3px shadow480px (right slide)whitevar(--r-xl)0 0 40px rgba(0,0,0,.12)80rgba(0,0,0,.3)56px0 20px1px var(--n200)15px / 700 / var(--n900)11px / 400 / var(--n500)28 × 28px / r-6pxvar(--orange-subtle)1px rgba(255,164,38,.2)var(--n800) / 11px / 6007px 20px20pxoverflow-y: auto10px / 700 / var(--n500) / uppercase1px var(--n100)var(--n50)1px var(--n200)14px 20pxvar(--orange) bg / var(--n900) texttransparent / 1.5px var(--n200) border12px / 600 / var(--n900)11px / 400 / var(--n500)white1.5px var(--n200)1.5px var(--orange) + 3px rgba shadowvar(--r-base) / 8px13px / 400 / var(--n900)┌──────────────────────────────────────────────────────────┐ │ TOP TITLE BAR │ ← Breadcrumb + context ├────────┬─────────────┬────────────────────────────────────┤ │ CAP. │ │ │ │ DOCK │ JOURNEY │ WORKSPACE │ │ │ BAR │ │ │ always │ collapsible │ The real working area. │ │ visible│ ↔ toggle │ No grids. No dashboards. │ │ │ │ Drag. Act. Solve. │ └────────┴─────────────┴────────────────────────────────────┘
48px240px56pxvar(--s5) var(--s6)50020010090801white1px var(--n200)var(--shadow-2)sticky top:0var(--n50)overflow-y: autoflex:1 / min-height:0Dismiss: overlay click, ✕ button, Esc
Scroll: panel body only
Used for: Edit, Detail, Match Panel
Dismiss: ✕ only (for confirmations)
Backdrop: rgba(0,0,0,.4)
Used for: Confirm, Create, Date picker
Dismiss: minimise button
z-index: 80 · above content
Used for: Tango / AI agent chat
Dismiss: explicit close only
Used for: Canvas view, Demand deep dive
Scroll: within modal body
This is the authoritative reference for building Trmeric UI — whether you are an engineer implementing a feature, an AI agent generating a prototype, or a contributor extending the system. These rules are not suggestions. They encode years of client feedback, demo experience, and design iteration. Deviating from them without reason creates visual drift that is costly to fix.
If a rule is ever unclear, the principle is: match what the design system renders, not what you assume. The live components in this document are the source of truth.
Every color in the system has a corresponding CSS variable defined in :root. Raw hex values are only permitted inside the :root token definitions themselves. Everywhere else — inline styles, CSS classes, JS-generated styles — you must use var(--token-name). This ensures the system can be themed and audited without hunting through the entire codebase.
color: var(--orange)background: var(--success-bg)border-color: var(--n200)color: #FFA426background: #f0fdf4border-color: #e5e5e5:root{} block is a violation. Replace it with the closest named token.Trmeric uses Poppins exclusively. The permitted font-size values are: 9px, 10px, 11px, 11.5px, 12px, 12.5px, 13px, 14px, 16px, 18px, 20px, 24px, 32px, 48px. Sizes outside this scale (e.g. 15px, 17px, 22px) must not appear in production or prototypes. Weight scale: 400 (regular), 500 (medium), 600 (semibold), 700 (bold). Weight 300 and 800 do not exist in this system.
| Use | Size | Weight | Color token |
|---|---|---|---|
| Section title (H2) | 24px | 700 | --n900 |
| Card title / H3 | 20px | 600 | --n900 |
| Field label / title | 13px | 700 | --n900 — must be heaviest in the field |
| Body / input value | 13px–14px | 400–500 | --n900 |
| Hint / helper text | 11.5px | 400 | --n600 — never --n400 |
| Caption / meta | 11px–12px | 400–500 | --n400 |
| Label / badge text | 10px | 600–700 | Semantic color |
| Section headers in panels | 9px–10px | 700 | --n400 uppercase + letter-spacing .07em |
All margins, paddings, and gaps must use the spacing token scale: --s1 (4px) through --s16 (64px). Raw pixel values like padding: 7px 11px are not permitted. The closest token must be used. Exception: internal component micro-spacing (e.g. icon alignment tweaks of 1–2px) may use raw values when no token applies.
padding: var(--s4) var(--s5)gap: var(--s3)margin-bottom: var(--s6)padding: 14px 18pxgap: 10pxmargin-bottom: 22pxSix radius tokens exist. Use the right one for the right context. Do not invent intermediate values like border-radius: 10px or 7px.
| Token | Value | When to use |
|---|---|---|
| --r-sm | 4px | Small internal elements: checkboxes, code tags, tiny badges |
| --r-md | 6px | Status chips, tags, removable chips |
| --r-base | 8px | Table containers, popover menus, tooltips, small cards |
| --r-lg | 12px | Panel sections, demand/resource cards, overlay panels |
| --r-xl | 16px | Main app cards, shell containers, floating nav |
| --r-full | 9999px | All buttons (mandatory), pill badges, search inputs, avatar frames |
--orange (#FFA426) is the Trmeric brand color. It signals interactivity, selected state, and primary actions. It is not a status color. Never use orange for urgency, warnings, or attention-getting unless it is an interactive element (CTA button, active nav item, focus ring).
The orange focus ring — box-shadow: 0 0 0 3px rgba(255,164,38,.1) — must appear on every focused input, select, and textarea. This is the system's primary accessibility affordance.
Red, green, and amber each have a single, exclusive meaning in the system. Misusing them breaks user trust — if a user sees red, they assume something is wrong. If it's decorative, that trust is damaged.
| Color | Token | Meaning | Never use for |
|---|---|---|---|
| Red | --error | Broken, at risk, overallocated, form error, conflict | Decoration, urgency that doesn't require action, categories |
| Green | --success | On track, allocated, completed, healthy | Positive sentiment that isn't a measurable status |
| Amber | --warning | At risk but not critical, needs attention soon, soft-lock | Urgency that requires immediate action (use red instead) |
| Purple | --purple | AI-powered features, Tango output, smart suggestions | Decorative accents, categories, status indicators |
| Blue | --info | Informational content, links, system messages | Primary actions (orange is primary, not blue) |
Trmeric uses a warm neutral scale. Tailwind/Slate grays (var(--n400), var(--n600), var(--n100)) make the UI feel cold and generic. Any gray used in the system must come from the --n50 through --n900 token scale only.
var(--n400) → --n400, var(--n600) → --n600, var(--n100) → --n100, var(--n200) → --n200, #475569 → --n600, #334155 → --n800.Every interactive button in the Trmeric system uses border-radius: var(--r-full). This is the single most recognizable element of the Trmeric design language. Sharp-cornered buttons or buttons with border-radius: 8px do not belong in this system. This applies to all button variants: primary, secondary, ghost, AI gradient, icon-only.
The only elements that are permitted to have non-pill radius are: cards (--r-lg), input fields (--r-base or 10px), and containers.
Every field in Trmeric is required unless explicitly marked otherwise. Showing "Required" on every field is redundant noise — it competes with the label title and adds no information the user didn't already know. The orange badge on every field creates visual clutter that dilutes the brand color's meaning.
The rule: show Optional in quiet italic (.dsp-opt / .fi-opt) only when a field is genuinely non-mandatory. Required fields carry their authority through label weight (700, --n900) alone. If a form has more Optional fields than Required, reconsider the form's scope.
.dsp shell — never a raw modalAll overlay panels in Trmeric use the .dsp shell system: .ph header + .dsp-body content area + .dsp-footer. Panels slide in from the right at 360–420px width. They are never centered modals unless the design explicitly requires a confirmation dialog.
The panel header (.ph) always contains: a colored icon block (.ph-icon), a title + subtitle stack, and a close button (.ph-close). The icon color signals the panel type — orange for creation, blue for information, green for success actions, purple for AI actions.
Three chip patterns exist and must not be interchanged:
| Variant | Class | Behavior | Use for |
|---|---|---|---|
| Status chip | .chip .chip-{state} | Read-only display | Demand status, resource state, RAID type — anywhere a value is shown, not chosen |
| Single-select chip | .fi-chip | One active at a time, orange selected state | Priority, confidence level, status change — mutually exclusive choices |
| Multi-select chip | .fi-chip.sel-multi | Toggle on/off independently, orange fill when selected | RAID types, delivery streams, skills — multiple concurrent selections |
The purple token (--purple, #8b5cf6) and the AI gradient (--gradient-ai) are exclusively reserved for Tango and AI-powered features. When a user sees purple, they know Tango is involved. Using purple for decorative purposes, category labels, or non-AI features breaks this mental model and is a critical violation.
✦ prefix character on AI action buttons, purple pill background on "Ask Tango" CTAs, purple-tinted insight boxes. All other UI must not use these elements.Tango speaks in short, specific, actionable sentences. Every insight must answer "so what?" — a number without a consequence is not an insight. Every Tango message must end with a next action or a question.
| Quality | ✓ Example | ✗ Never |
|---|---|---|
| Concise | "3 demands need your attention today." | "There are currently 3 demands in the system that may require your attention at some point today." |
| Specific | "Talvera NRIO: resource gap of 2 FTEs by March 14." | "Some demands have resource gaps." |
| Actionable | "Recommend: extend Maya Nair's allocation through Q2." | "You might want to consider looking at resource allocations." |
| Non-robotic | "Heads up: 2 milestones slip this week — both recoverable." | "As an AI, I have detected that 2 milestones may be at risk." |
Max message length in the chat panel: 3 sentences. Insight cards in the UI: 1–2 sentences. No bullet points inside a Tango bubble — use them only in dedicated insight panels.
Every Trmeric prototype is delivered as a single .html file with all CSS and JS inline. No external stylesheets, no separate JS files, no build tools. This is a deliberate constraint — it keeps prototypes shareable, demo-safe, and version-stable. The design system itself follows this rule.
<style> at top of file<script> at bottom of file.css or .js fileslocalStorage or sessionStorageEvery Trmeric file must include the Poppins font import as the first link in <head>. Never use Inter, Roboto, system-ui, or any other font. The fallback stack is: -apple-system, BlinkMacSystemFont, sans-serif — only used if Google Fonts fails to load.
<!-- Required in every Trmeric file -->
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap"
rel="stylesheet">
/* CSS body rule */
body {
font-family: 'Poppins', -apple-system, BlinkMacSystemFont, sans-serif;
}
Demo-facing screens must use realistic domain data. Placeholder text (Value, N/A, Lorem ipsum, Test User) destroys the illusion of a production system. Use data from the client context: Talvera NRIO project names, real skill labels (IoT, SAP, ML Engineer), realistic demand names, real persona names (Ashish, Roshan, Siddharth).
border-radius: 8px on a button is a violation. All buttons use var(--r-full). No exceptions for "compact" or "inline" buttons.--info) is for informational UI only. Primary actions are always orange. Secondary confirmation, info messages, and links can use blue.--n600 — visible and readable, but clearly subordinate to the label title in --n900.--orange-subtle and warm off-whites. Avoid clinical grey-heavy palettes. Trmeric should feel approachable, not sterile.border-radius: var(--r-full). This is a hard constraint, not a preference. It is the most recognizable element of Trmeric's design language.#FFA426 on white is the primary interaction signal across the platform. Active states, focus rings, primary buttons — all orange. Consistent without exception.