Design System
Design Tokens
Complete color, spacing, shadow, and typography specifications
All design tokens extracted from the HRMSElegance prototype. Use these exact values.
| Name | HSL | Hex | Tailwind | CSS Variable |
|---|
| Primary | 205 100% 47.1% | #008CF0 | blue-500 | --primary |
| Primary Foreground | 0 0% 100% | #FFFFFF | white | --primary-foreground |
| Secondary | 233 19.4% 27.3% | #383B53 | slate-700 | --secondary |
| Secondary Foreground | 0 0% 100% | #FFFFFF | white | --secondary-foreground |
| Name | HSL | Hex | Usage | CSS Variable |
|---|
| Background | 240 14% 96% | #F2F2F7 | Main app background | --background |
| Card | 0 0% 100% | #FFFFFF | Cards, modals, popovers | --card |
| Muted | 240 5% 96% | #F4F4F5 | Muted/subtle areas | --muted |
| Accent | 240 14% 96% | #F2F2F7 | Accent backgrounds | --accent |
| Name | HSL | Hex | Tailwind | CSS Variable |
|---|
| Foreground | 0 0% 0% | #000000 | gray-900 | --foreground |
| Card Foreground | 0 0% 0% | #000000 | gray-900 | --card-foreground |
| Muted Foreground | 240 4% 46% | #8E8E93 | gray-500 | --muted-foreground |
| Status | HSL | Hex | Tailwind | CSS Variable |
|---|
| Success | 96 74.6% 43.5% | #52C41A | green-500 | --success |
| Warning | 40 95.8% 52.9% | #FAAD14 | amber-500 | --warning |
| Error | 359 100% 65.1% | #FF4D4F | red-500 | --error |
| Destructive | 359 100% 65.1% | #FF4D4F | red-500 | --destructive |
| Name | HSL | Hex | CSS Variable |
|---|
| Border | 240 5.9% 90% | #E4E4E7 | --border |
| Input | 240 5.9% 90% | #E4E4E7 | --input |
| Ring | 205 100% 47.1% | #008CF0 | --ring |
| Name | Light Mode | Dark Mode | CSS Variable |
|---|
| Sidebar BG | #FFFFFF (bg-card) | #1C1C1E | --sidebar |
| Sidebar Foreground | #000000 | #FAFAFA | --sidebar-foreground |
| Sidebar Primary | #008CF0 | #008CF0 | --sidebar-primary |
| Sidebar Accent | #383B53 | #2C2C2E | --sidebar-accent |
| Sidebar Border | #E4E4E7 | #383B53 | --sidebar-border |
| Chart | HSL | Hex | Tailwind | CSS Variable |
|---|
| Chart 1 | 205 100% 47.1% | #008CF0 | blue-500 | --chart-1 |
| Chart 2 | 96 74.6% 43.5% | #52C41A | green-500 | --chart-2 |
| Chart 3 | 40 95.8% 52.9% | #FAAD14 | amber-500 | --chart-3 |
| Chart 4 | 359 100% 65.1% | #FF4D4F | red-500 | --chart-4 |
| Chart 5 | 178 47.5% 59.2% | #5CBDBD | cyan-400 | --chart-5 |
| Name | Light Mode HSL | Dark Mode HSL | Light Hex | Dark Hex |
|---|
| Background | 240 14% 96% | 0 0% 0% | #F2F2F7 | #000000 |
| Foreground | 0 0% 0% | 0 0% 98% | #000000 | #FAFAFA |
| Card | 0 0% 100% | 240 4% 11% | #FFFFFF | #1C1C1E |
| Muted | 240 5% 96% | 240 3.7% 15.9% | #F4F4F5 | #27272A |
| Border | 240 5.9% 90% | 240 3.7% 15.9% | #E4E4E7 | #27272A |
| Purpose | Gradient Classes | Start → End |
|---|
| Employees/Primary | from-blue-500 to-blue-600 | #3B82F6 → #2563EB |
| On Leave/Warning | from-amber-400 to-orange-500 | #FBBF24 → #F97316 |
| Pending/Secondary | from-violet-500 to-purple-600 | #8B5CF6 → #9333EA |
| Open Positions/Success | from-emerald-400 to-green-500 | #34D399 → #22C55E |
| Upcoming Event | from-indigo-900 to-indigo-950 | #312E81 → #1E1B4B |
bg-gradient-to-br from-violet-500 via-purple-500 to-fuchsia-500
/* #8B5CF6 → #A855F7 → #D946EF */
| Component | Light Mode | Dark Mode |
|---|
| Content Card | shadow-lg shadow-gray-200/50 | shadow-lg shadow-black/40 |
| Stats Card | shadow-lg | shadow-lg |
| Stats Card Hover | shadow-xl | shadow-xl |
| Sidebar | shadow-2xl shadow-black/5 | shadow-2xl shadow-black/5 |
| Button Type | Shadow |
|---|
| Primary | shadow-lg shadow-primary/25 |
| Primary Hover | shadow-primary/35 |
| AI Button | shadow-xl shadow-violet-500/30 |
| AI Button Hover | shadow-2xl shadow-violet-500/40 |
| Size | CSS Variable | Tailwind | Pixels | Usage |
|---|
| Base | --radius | rounded-lg | 8px | Default buttons |
| Small | --radius-sm | rounded-md | 6px | Inputs, badges |
| Medium | --radius-md | rounded-lg | 8px | Medium elements |
| Large | --radius-lg | rounded-xl | 12px | Large buttons |
| XL | --radius-xl | rounded-2xl | 16px | Cards (required) |
| Full | - | rounded-full | 9999px | Pill buttons, avatars |
Important: Cards MUST use rounded-2xl (16px).
| Property | Value | Tailwind | Usage |
|---|
| Card Padding | 24px | p-6 | Minimum for all cards |
| Card Gap | 24px | gap-6 | Between cards |
| Section Gap | 32px | gap-8 | Between sections |
| Element | Desktop | Mobile |
|---|
| Sidebar Width | 256px (w-64) | - |
| TopBar Height | 64px (h-16) | 64px |
| Page Padding | px-8 py-6 | px-4 py-4 |
| Content Max Width | - | 100% |
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
| Level | Classes | Usage |
|---|
| H1 | text-4xl font-semibold tracking-tight | Page titles |
| H2 | text-2xl font-semibold tracking-tight | Section headings |
| H3 | text-lg font-semibold leading-none tracking-tight | Card titles |
| H4 | text-base font-semibold | Subsection headings |
| Type | Classes | Usage |
|---|
| Default | text-base text-foreground | Primary text |
| Muted | text-sm text-muted-foreground | Secondary text |
| Label | text-sm font-medium | Form labels |
| Small | text-xs text-muted-foreground | Captions |
| Element | Classes |
|---|
| Label | text-white/80 text-sm font-medium |
| Value | text-4xl font-semibold tracking-tight |
| Type | Classes | Duration |
|---|
| Default | transition-all duration-200 | 200ms |
| Hover Effects | transition-all duration-300 | 300ms |
| Color Only | transition-colors | 150ms |
| Transform Only | transition-transform | 150ms |
| Component | Effect |
|---|
| Stats Card | hover:shadow-xl hover:-translate-y-1 |
| Button | hover:scale-[1.02] active:scale-95 |
| AI Button | hover:scale-105 active:scale-95 |
// Modal/Dialog
const modalVariants = {
initial: { opacity: 0, y: 20, scale: 0.95 },
animate: { opacity: 1, y: 0, scale: 1 },
exit: { opacity: 0, y: 20, scale: 0.95 },
};
const springTransition = {
type: "spring",
damping: 25,
stiffness: 300
};
// Button entrance
const buttonVariants = {
initial: { scale: 0.8, opacity: 0 },
animate: { scale: 1, opacity: 1 },
exit: { scale: 0.8, opacity: 0 },
};
// Stats card stagger
const cardVariants = {
initial: { opacity: 0, scale: 0.8 },
animate: { opacity: 1, scale: 1 },
};
@keyframes accordion-down {
from { height: 0 }
to { height: var(--radix-accordion-content-height) }
}
@keyframes accordion-up {
from { height: var(--radix-accordion-content-height) }
to { height: 0 }
}
Use this in your code for type-safe token access:
export const designTokens = {
colors: {
primary: {
main: '#008CF0',
foreground: '#FFFFFF',
hsl: '205 100% 47.1%',
},
secondary: {
main: '#383B53',
foreground: '#FFFFFF',
hsl: '233 19.4% 27.3%',
},
background: {
main: '#F2F2F7',
card: '#FFFFFF',
muted: '#F4F4F5',
},
status: {
success: '#52C41A',
warning: '#FAAD14',
error: '#FF4D4F',
},
},
gradients: {
employees: 'from-blue-500 to-blue-600',
onLeave: 'from-amber-400 to-orange-500',
pending: 'from-violet-500 to-purple-600',
openPositions: 'from-emerald-400 to-green-500',
aiButton: 'from-violet-500 via-purple-500 to-fuchsia-500',
},
shadows: {
card: 'shadow-lg shadow-gray-200/50 dark:shadow-black/40',
statsCard: 'shadow-lg',
button: 'shadow-lg shadow-primary/25',
aiButton: 'shadow-xl shadow-violet-500/30',
},
radius: {
card: 'rounded-2xl',
button: 'rounded-lg',
pill: 'rounded-full',
input: 'rounded-md',
},
spacing: {
cardPadding: 'p-6',
cardGap: 'gap-6',
sectionGap: 'gap-8',
},
} as const;