Design System
Visual language, color palette, typography, spacing, and component patterns for the Leadmetrics platform.
Implementation: Tailwind CSS v4 + shadcn/ui + CSS custom properties. Token definitions:
packages/ui/src/globals.cssTheming (dark/light mode toggle): theming.md
Brand Identity
Logo
🎁 leadmetrics- Icon: gift-box / cube icon in gold/amber (
#F5A623) - Wordmark:
leadin white (or dark),metricsin violet (#7C5CFC) - Used in: auth screens (centered), sidebar/nav (top-left)
Tagline
“Transform Your Digital Marketing Strategy” Powered by cutting-edge Agentic AI, delivering intelligent automation and real-time insights.
“Agentic AI” always rendered in amber/yellow (#FBBF24) bold.
Color Palette
Core Brand Colors
| Name | Hex | oklch | Usage |
|---|---|---|---|
| Violet (primary) | #7C5CFC | oklch(0.560 0.258 278) | Buttons, active states, links, step indicators, focus rings |
| Violet dark | #5B3FD4 | oklch(0.460 0.240 276) | Button hover, pressed state |
| Violet light | #9B7DFF | oklch(0.680 0.220 278) | Hover highlights on dark backgrounds |
| Amber (accent) | #FBBF24 | oklch(0.828 0.189 86) | ”Agentic AI” highlight, info badges |
| Gold (logo icon) | #F5A623 | oklch(0.790 0.178 72) | Logo icon fill |
Background Scale (Dark UI)
The auth and register screens use a layered dark background system. These tokens apply globally to the dark theme.
| Token | Hex | Description | Used for |
|---|---|---|---|
bg-base | #080D1A | Deepest background | Register page outer background |
bg-surface | #0D1117 | Primary surface | Auth right panel, app shell |
bg-elevated | #161B27 | Elevated surface | Cards, form panels |
bg-input | #1E2435 | Input field background | All form inputs |
bg-hover | #252D40 | Hover state on dark surfaces | List item hover, table row hover |
Semantic Color Tokens
These map to CSS custom properties consumed by shadcn/ui components.
| Token | Light value | Dark value | Usage |
|---|---|---|---|
--background | zinc-50 (#FAFAFA) | #0D1117 | Page background |
--foreground | zinc-950 | #F9FAFB | Default text |
--card | white | #161B27 | Card / panel surface |
--card-foreground | zinc-950 | #F9FAFB | Text on cards |
--primary | #7C5CFC | #7C5CFC | Primary actions |
--primary-foreground | white | white | Text on primary |
--secondary | zinc-100 | #252D40 | Secondary surfaces |
--muted | zinc-100 | #1E2435 | Muted background |
--muted-foreground | zinc-500 | #6B7280 | Placeholder / helper text |
--border | zinc-200 | #2A3347 | Borders, dividers |
--input | zinc-200 | #2A3347 | Input borders |
--ring | #7C5CFC | #7C5CFC | Focus ring |
--destructive | red-600 | red-500 | Destructive actions |
--success | emerald-600 | #22C55E | Success states |
--warning | amber-500 | #F59E0B | Warning states |
--info | blue-500 | #3B82F6 | Info states |
--agent-accent | violet-600 | #7C5CFC | AI/agent-related elements |
Left Panel Gradient (Auth Screens)
All three apps share the same left-panel gradient pattern and dot-particle overlay. The gradient values below are the implemented values (verified in code):
background: linear-gradient(
135deg,
#1a0033 0%, /* deepest purple-black */
#4c1d95 100% /* violet */
);Overlaid with 20 scattered circular dot particles (opacity 20%, variable radius 4–16px, white) using absolute-positioned divs for depth.
Per-App Auth Shell Tokens
Each app uses the shared dark surface palette plus a small per-app identity accent applied to the sidebar badge, icon, and focus ring. All other colors (backgrounds, borders, text) are identical across apps.
| App | Sidebar badge bg | Sidebar badge text | Left-panel label | Icon component |
|---|---|---|---|---|
| Dashboard | #2d1b69 | #a78bfa | dashboard | — |
DM Portal (apps/dm) | #2d1b69 | #a78bfa | dm portal | Users (Lucide) |
| Manage | #2d1b69 | #a78bfa | manage | ShieldCheck (Lucide) |
All three badges intentionally share the same violet colors — the visual distinction comes from the label text, not the badge color.
Auth Form Card Tokens (all apps)
| Element | Value |
|---|---|
| Right panel background | #0D1117 |
| Form card background | #161B27 |
| Input background | #0D1117 |
| Input border (default) | border-slate-700 (#374151) |
| Input border (focus) | border-violet-500 (#8B5CF6) |
| Submit button | linear-gradient(135deg, #7C3AED, #6D28D9) |
| Submit button disabled opacity | 70% |
| Error banner | bg-red-500/10 border border-red-500/30 text-red-400 |
Status Colors
| Status | Color | Hex |
|---|---|---|
| Active / Running | Blue | #3B82F6 |
| Completed / Connected | Green | #22C55E |
| Warning / At Risk | Amber | #F59E0B |
| Failed / Error | Red | #EF4444 |
| Pending / Draft | Gray | #6B7280 |
| Awaiting Approval | Violet | #7C5CFC |
Typography
Font Family
Primary: Inter (Google Fonts / self-hosted)
Fallback: ui-sans-serif, system-ui, -apple-system, sans-serif
font-family: 'Inter', ui-sans-serif, system-ui, sans-serif;Inter is used for all UI text — headings, body, labels, inputs, buttons.
Type Scale
| Name | Size | Weight | Line height | Usage |
|---|---|---|---|---|
| Display | 36px / 2.25rem | 700 (Bold) | 1.1 | Auth left panel headline |
| H1 | 28px / 1.75rem | 700 | 1.2 | Page headings (“Get Started Today”) |
| H2 | 22px / 1.375rem | 600 | 1.3 | Section headings (“Welcome back”, “Your contact details”) |
| H3 | 18px / 1.125rem | 600 | 1.4 | Card headings, modal titles |
| H4 | 16px / 1rem | 600 | 1.4 | Sub-section labels |
| Body-lg | 16px / 1rem | 400 | 1.5 | General body copy |
| Body | 14px / 0.875rem | 400 | 1.5 | Default UI text, descriptions |
| Body-sm | 13px / 0.8125rem | 400 | 1.5 | Helper text, hints, captions |
| Label | 14px / 0.875rem | 500 | 1.4 | Form field labels |
| Caption | 12px / 0.75rem | 400 | 1.4 | Metadata, timestamps, secondary info |
| Button | 15px / 0.9375rem | 600 | 1 | Button labels |
| Badge | 11px / 0.6875rem | 600 | 1 | Status badges, plan badges |
Letter Spacing
- Headings:
-0.01emto-0.02em(slightly tight for a polished feel) - Body:
0em(default) - Badge / uppercase labels:
0.04em - Buttons:
-0.01em
Spacing & Layout
Base Unit
4px (Tailwind default: 1 = 4px). All spacing uses multiples of 4px.
Common spacing values
| Tailwind | px | Usage |
|---|---|---|
space-1 | 4px | Tight gaps between related inline elements |
space-2 | 8px | Icon-to-label gap, chip internal padding |
space-3 | 12px | Small internal padding |
space-4 | 16px | Standard internal padding (inputs, compact cards) |
space-5 | 20px | Field spacing in forms |
space-6 | 24px | Card padding, section spacing |
space-8 | 32px | Section separation, large component padding |
space-12 | 48px | Major section breaks |
Border Radius
| Token | Size | Usage |
|---|---|---|
rounded-sm | 4px | Badges, chips, inline code |
rounded / rounded-md | 6px | Buttons (small), inputs |
rounded-lg | 8px | Standard buttons, dropdown menus |
rounded-xl | 12px | Cards, panels, modals |
rounded-2xl | 16px | Feature showcase screenshots (auth left panel) |
rounded-full | 9999px | Avatar, step circle, pill badges |
Components
Buttons
Primary Button
Violet background. Used for the main action on every screen.
┌──────────────────────────────────────────┐
│ Login → │ height: 44px
└──────────────────────────────────────────┘
bg: #7C5CFC text: white radius: 8px
hover: #5B3FD4 active: #4A32C0- Full-width within form cards on auth/register screens
- Fixed width (
min-w-[140px]) on in-app screens - Disabled state:
opacity: 70%,cursor: not-allowed - Loading state: spinner replaces arrow icon, text remains
Secondary Button
Dark outline. Used for “Back” and secondary actions.
┌────────────────────┐
│ ← Back │ height: 44px
└────────────────────┘
bg: #161B27 border: #2A3347 text: #F9FAFB
hover: #252D40Ghost Button / Link Button
No background. Used for “Forgot password?”, “Sign up →”, “Sign in” links.
Forgot password? text: #7C5CFC underline on hoverDanger Button
Red. Used for destructive actions (delete, reject, cancel subscription).
bg: #EF4444 text: white hover: #DC2626Button Sizes
| Size | Height | Padding (h) | Font size | Usage |
|---|---|---|---|---|
| sm | 32px | 12px | 13px | Compact: table actions, chip actions |
| md (default) | 40px | 16px | 14px | Most UI buttons |
| lg | 44px | 20px | 15px | Auth/register CTAs |
| xl | 52px | 24px | 16px | Landing-page hero CTAs |
Form Inputs
All inputs share the same visual treatment on dark backgrounds:
Label (14px, medium, white)
┌─────────────────────────────────────────┐
│ [icon] Placeholder text │ height: 44px
└─────────────────────────────────────────┘
Helper text (12px, gray-500, optional)| Property | Value |
|---|---|
| Background | #1E2435 |
| Border (default) | 1px solid #2A3347 |
| Border (focus) | 1px solid #7C5CFC |
| Border (error) | 1px solid #EF4444 |
| Border radius | 6px |
| Text color | #F9FAFB |
| Placeholder | #6B7280 |
| Height | 44px |
| Padding | 12px 16px |
| Focus ring | 0 0 0 3px rgba(124, 92, 252, 0.25) |
Input with Prefix Icon
┌──────────────────────────────────────────┐
│ ✉ Enter your email │
└──────────────────────────────────────────┘
Icon: 16px, color: #6B7280 (gray-500)
Icon-to-text gap: 8pxPassword Input
┌──────────────────────────────────── [👁] ┐
│ 🔒 Enter your password │
└──────────────────────────────────────────┘
Eye icon right-aligned: toggles type="password" / type="text"Input with Suffix Button (Generate)
┌──────────────────────────────── [👁] ┐ ┌─────────────┐
│ Enter password │ │ Generate │
└──────────────────────────────────────┘ └─────────────┘
Generate: sm button, violet, right of inputSelect / Dropdown
Same visual treatment as text inputs. Caret icon right-aligned.
┌─────────────────────────────────────── ▾┐
│ Select your country │
└─────────────────────────────────────────┘Error State
┌──────────────────────────────────────────┐
│ Enter your email │ border: red-500
└──────────────────────────────────────────┘
⚠ Please enter a valid email address (12px, red-400)Cards
Form Card
Used as the container for auth forms and registration wizard steps.
background: #161B27;
border: 1px solid #2A3347;
border-radius: 16px;
padding: 32px;On auth screens: max-width: 400px, centered within the right panel.
On register screens: max-width: 780px, centered on page.
Plan Card
┌──────────────────────────────┐
│ [ Popular badge (optional)] │
│ │ min-height: 340px
│ Plan Name │ padding: 24px
│ Tagline │
│ Price │
│ │
│ What's included │
│ ✓ Feature │
│ ✓ Feature │
│ │
└──────────────────────────────┘| State | Border | Background |
|---|---|---|
| Default | 1px solid #2A3347 | #161B27 |
| Selected | 2px solid #7C5CFC | #1A1B3A |
| Hover (not selected) | 1px solid #3D4860 | #1E2435 |
Selected plan shows a checkmark badge (white ✓ on violet circle) top-right.
“Popular” badge: small pill above the card, violet gradient, 11px 600 uppercase.
Toast Notifications
Toasts appear bottom-right. Auto-dismiss after 4 seconds.
Success Toast
┌────────────────────────────┐
│ ● Success │
│ Your progress has been │
│ saved │
└────────────────────────────┘
bg: #0F2A1A border-left: 4px solid #22C55E
icon: green dot title: 14px 600 green-400
body: 13px gray-300Error Toast
bg: #2A0F0F border-left: 4px solid #EF4444Info Toast / Banner (inline)
┌──────────────────────────────────────────────────┐
│ ✨ This is how your company name will appear │
│ throughout the platform │
└──────────────────────────────────────────────────┘
bg: #1C1A00 border: 1px solid #4A3500
icon: ✨ (amber) text: 13px, amber-200
border-radius: 8px padding: 12px 16pxStep Progress Bar
Used in the 4-step registration wizard.
①──────②──────③──────④Step Circle
| State | Background | Icon | Border |
|---|---|---|---|
| Future | #252D40 | Step icon (gray-400) | none |
| Active | #7C5CFC | Step icon (white) | none |
| Completed | #22C55E | ✓ checkmark (white) | none |
Circle size: 48px. Icon size: 22px.
Connector Line
| State | Color |
|---|---|
| Before active step | #22C55E (green — completed) |
| After active step | #2A3347 (dark gray — future) |
Line height: 2px. Stretches between circle edges.
Labels
Step name: 14px 600, white (active) / gray-400 (future) / white (completed)
Step subtitle: 12px 400, gray-500
Toggle Button Pair
Used for binary choices (e.g. GST selection, boolean preferences).
┌──────────────────────┐ ┌──────────────────────┐
│ Yes, I have GST │ │ ✓ No GST number │
└──────────────────────┘ └──────────────────────┘
unselected selected| State | Background | Border | Text |
|---|---|---|---|
| Unselected | #161B27 | 1px solid #2A3347 | #9CA3AF |
| Selected | #7C5CFC | 1px solid #7C5CFC | white |
| Selected (shown) | Violet bg + ✓ icon prefix |
Height: 48px. Equal width, side by side. border-radius: 8px.
Badges & Status Chips
┌──────────────┐
│ ● Active │ height: 22px padding: 4px 10px
└──────────────┘| Variant | Background | Text color | Border |
|---|---|---|---|
| Success | rgba(34,197,94,0.15) | #22C55E | 1px solid rgba(34,197,94,0.3) |
| Error | rgba(239,68,68,0.15) | #EF4444 | 1px solid rgba(239,68,68,0.3) |
| Warning | rgba(245,158,11,0.15) | #F59E0B | 1px solid rgba(245,158,11,0.3) |
| Info / Running | rgba(59,130,246,0.15) | #3B82F6 | 1px solid rgba(59,130,246,0.3) |
| Pending | rgba(107,114,128,0.15) | #9CA3AF | 1px solid rgba(107,114,128,0.3) |
| Agent | rgba(124,92,252,0.15) | #7C5CFC | 1px solid rgba(124,92,252,0.3) |
| Plan: Popular | violet gradient | white | none |
Font: 11px 600 uppercase with letter-spacing: 0.04em.
Feature Showcase Carousel (Auth Left Panel)
The left panel of auth screens shows a rotating feature carousel.
Screenshot frame:
- Dark rounded frame:
bg: #0D1117,border-radius: 16px,border: 1px solid #2A3347 - Subtle inner shadow to simulate depth
- Wave/hill SVG shape at the bottom of the screenshot area (violet, low opacity)
Carousel pagination:
- Dot indicators below the screenshot
- Active dot:
8px wide, 8px tall, rounded-full, violet - Inactive dot:
8px wide, 8px tall, rounded-full, gray-600 - Auto-advances every 4 seconds; respects
prefers-reduced-motion
Particle overlay:
- Scattered dots across the left panel background
- Sizes: 2–5px radius,
rgba(255,255,255,0.3)torgba(124,92,252,0.4) - Static (no animation) or subtle float animation if reduced-motion is off
Iconography
See icons.md for the full icon reference — every icon in use, its exact import, and every file that uses it.
Motion & Animation
Guiding principle: Purposeful, subtle. No decorative animations that don’t communicate state.
| Motion | Duration | Easing | Usage |
|---|---|---|---|
| Page transition (route change) | 200ms | ease-out | Fade + slight slide up |
| Step advance (register wizard) | 250ms | ease-in-out | Slide left + fade |
| Toast enter | 300ms | spring(bounce: 0.3) | Slide up from bottom-right |
| Toast exit | 200ms | ease-in | Fade out |
| Card hover | 150ms | ease-out | Subtle scale 1.01 + border color |
| Button press | 100ms | ease-in | Scale 0.97 |
| Dropdown open | 150ms | ease-out | Fade + scale from 0.95 to 1 |
| Spinner | continuous | linear | 360° rotation, 800ms period |
prefers-reduced-motion: All animations disabled or replaced with instant state change. Carousel auto-advance paused.
Responsive Breakpoints
Inherited from Tailwind v4 defaults, consistent with responsive-design.md.
| Breakpoint | Min width | Key layout change |
|---|---|---|
sm | 640px | Single-column to two-column for some form rows |
md | 768px | Auth left panel appears; mobile nav → sidebar |
lg | 1024px | Full 50/50 split on auth screens; sidebar always visible |
xl | 1280px | Wider register card, plan cards side-by-side |
2xl | 1536px | Max content width capped at 1400px, centered |
Dark / Light Mode
The platform defaults to dark mode (as shown in all screenshots). Light mode is available via the toggle in the app header.
Auth and registration screens are always dark — they do not respond to the light/light toggle. The feature showcase left panel is always the purple gradient regardless of mode.
In-app screens (Dashboard, DM Portal, Manage) support both modes. See theming.md for the full CSS variable definitions and the next-themes setup.
CSS Variable Quick Reference
/* Auth / Register screen specific variables */
:root {
--auth-bg: #0D1117;
--auth-bg-register: #080D1A;
--auth-card-bg: #161B27;
--auth-input-bg: #1E2435;
--auth-border: #2A3347;
--auth-accent: #7C5CFC;
--auth-accent-hover: #5B3FD4;
--auth-success: #22C55E;
--auth-panel-from: #3B0066;
--auth-panel-to: #6B21A8;
/* Typography */
--font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
/* Radii */
--radius-input: 6px;
--radius-card: 16px;
--radius-button: 8px;
}