Files
CompanySite/.agents/frontend-specialist/DESIGN_SYSTEM.md
T
Clintchiz d402256547
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
First Init
2026-03-21 16:46:46 +05:30

714 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkRoot IT Solutions — Design System
**Version:** 1.0.0
**Last Updated:** 2026-03-21
**Stack:** Astro v4 + Tailwind CSS v3 + Plus Jakarta Sans + JetBrains Mono
---
## Table of Contents
1. [Design Principles](#1-design-principles)
2. [Color Palette](#2-color-palette)
3. [Typography Scale](#3-typography-scale)
4. [Spacing System](#4-spacing-system)
5. [Elevation & Shadows](#5-elevation--shadows)
6. [Border Radius](#6-border-radius)
7. [Animation & Motion](#7-animation--motion)
8. [Button Styles](#8-button-styles)
9. [Form Elements](#9-form-elements)
10. [Component Patterns](#10-component-patterns)
11. [Layout System](#11-layout-system)
12. [Icon System](#12-icon-system)
13. [Accessibility](#13-accessibility)
14. [Implementation Notes](#14-implementation-notes)
---
## 1. Design Principles
### Brand Identity
WorkRoot IT Solutions is a **professional B2B tech agency** targeting enterprise and startup clients. The visual language must communicate:
| Principle | Application |
|-----------|-------------|
| **Trust** | Consistent, predictable layouts; clear hierarchy |
| **Capability** | Polished micro-interactions; precise typography |
| **Innovation** | Gradient accents; modern glassmorphism-lite |
| **Clarity** | Generous whitespace; high contrast ratios |
### Design Decision Framework
1. **Mobile-first** — All breakpoints start at `sm` and scale up
2. **Performance-first** — Prefer CSS-only animations over JS
3. **Accessibility-first** — WCAG AA minimum for all interactive elements
4. **Consistency** — Use design tokens, never magic numbers
---
## 2. Color Palette
### Primary — Cyan (`#0891b2`)
The core action color. Used for CTAs, links, highlights, icon backgrounds, focus rings.
| Token | Value | Usage |
|-------|-------|-------|
| `primary-50` | `#ecfeff` | Subtle tinted backgrounds, badge backgrounds |
| `primary-100` | `#cffafe` | Hover backgrounds on light surfaces |
| `primary-200` | `#a5f3fc` | — |
| `primary-300` | `#67e8f9` | Light mode decorative elements |
| `primary-400` | `#22d3ee` | Focus rings, gradient midpoints |
| `primary-500` / DEFAULT | `#0891b2` | **Main brand color** — buttons, icons |
| `primary-600` | `#0e7490` | Button hover states |
| `primary-700` | `#155e75` | Dark text on light backgrounds |
| `primary-800` | `#164e63` | — |
| `primary-900` | `#083344` | Dark sections / hero gradient end |
### Secondary — Slate (`#1e293b`)
Neutral palette for text, backgrounds, borders. The backbone of the design.
| Token | Value | Usage |
|-------|-------|-------|
| `secondary-50` | `#f8fafc` | Page backgrounds, subtle section backgrounds |
| `secondary-100` | `#f1f5f9` | Card backgrounds, input backgrounds |
| `secondary-200` | `#e2e8f0` | Borders, dividers |
| `secondary-300` | `#cbd5e1` | Disabled states, placeholder text |
| `secondary-400` | `#94a3b8` | Muted text, icons |
| `secondary-500` | `#64748b` | Secondary text |
| `secondary-600` | `#475569` | Body text on light backgrounds |
| `secondary-700` | `#334155` | Strong body text |
| `secondary-800` / DEFAULT | `#1e293b` | **Main text color** |
| `secondary-900` | `#0f172a` | Headings, hero/CTA dark sections |
### Accent — Amber (`#f59e0b`)
Used sparingly for trust signals, testimonials, star ratings, and call-out badges.
| Token | Value | Usage |
|-------|-------|-------|
| `accent-50` | `#fffbeb` | Badge backgrounds (testimonials, stats) |
| `accent-400` | `#fbbf24` | Star ratings, gradient endpoints |
| `accent-500` / DEFAULT | `#f59e0b` | **Accent color** — stars, highlights |
| `accent-600` | `#d97706` | Accent button hover |
| `accent-700` | `#b45309` | Accent text on light backgrounds |
### Semantic Colors (Tailwind defaults)
| Purpose | Color | Token |
|---------|-------|-------|
| Error/Danger | Red 500 | `text-red-500`, `border-red-500` |
| Success | Green 500 | `bg-green-500` (toast) |
| Warning | Amber (use accent) | `text-accent-600` |
| Info | Primary | `bg-primary-50 text-primary-700` |
### Color Combinations — Key Patterns
```
Dark Hero Sections:
Background: bg-gradient-to-br from-secondary-900 via-secondary-800 to-primary-900
Text: text-white / text-secondary-200 / text-secondary-300
Badges: bg-primary-400/20 text-primary-300
Light Sections:
Background: bg-white
Alternate: bg-secondary-50 / bg-gradient-to-b from-secondary-50 to-white
Text: text-secondary-900 (headings) / text-secondary-600 (body)
Badges: bg-primary-50 text-primary-700
Cards:
Background: bg-white rounded-2xl/3xl border-2 border-secondary-100
Hover: hover:border-primary/30 hover:shadow-2xl
CTA Dark Sections:
Background: bg-gradient-to-br from-secondary-900 via-primary-900 to-primary-800
```
---
## 3. Typography Scale
### Font Families
| Role | Font | Weights | Usage |
|------|------|---------|-------|
| **Display / Body** | Plus Jakarta Sans | 200800 | All UI text, headings |
| **Monospace** | JetBrains Mono | 100800 | Code blocks, pre elements |
Load via Google Fonts:
```
https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap
```
### Type Scale
| Step | Size (Mobile) | Size (Desktop) | Weight | Use Case |
|------|--------------|----------------|--------|----------|
| **Display XL** | `text-5xl` (3rem) | `text-8xl` (6rem) | `font-bold` | Hero headlines |
| **Display LG** | `text-4xl` (2.25rem) | `text-7xl` (4.5rem) | `font-bold` | Sub-hero |
| **H1** | `text-4xl` | `text-6xl` | `font-bold` | Page titles |
| **H2** | `text-3xl` / `text-4xl` | `text-5xl` | `font-bold` | Section titles |
| **H3** | `text-2xl` | `text-2xl` | `font-bold` | Card titles |
| **H4** | `text-xl` | `text-xl` | `font-bold` / `font-semibold` | Subheadings |
| **Body LG** | `text-xl` | `text-2xl` | `font-normal` | Lead paragraphs |
| **Body** | `text-base` | `text-lg` | `font-normal` | Standard body |
| **Body SM** | `text-sm` | `text-base` | `font-normal` | Supporting text |
| **Caption** | `text-xs` | `text-sm` | `font-medium` | Labels, badges |
| **Code** | `text-sm` | `text-sm` | `font-normal` | Inline code |
### Responsive Typography Patterns
```html
<!-- Hero headline -->
<h1 class="text-5xl sm:text-6xl lg:text-7xl xl:text-8xl font-bold leading-[1.1] tracking-tight">
<!-- Section heading -->
<h2 class="text-4xl sm:text-5xl font-bold text-secondary-900">
<!-- Card heading -->
<h3 class="text-2xl font-bold text-secondary-900">
<!-- Lead paragraph -->
<p class="text-xl sm:text-2xl text-secondary-200 leading-relaxed">
<!-- Body paragraph -->
<p class="text-lg text-secondary-600 leading-relaxed">
<!-- Badge / Label -->
<span class="text-sm font-bold uppercase tracking-wider">
```
### Line Heights
| Context | Class | Value |
|---------|-------|-------|
| Headings | `leading-[1.1]` or `leading-tight` | 1.11.25 |
| Subheadings | `leading-snug` | 1.375 |
| Body | `leading-relaxed` | 1.625 |
| Long-form prose | `leading-loose` | 2 |
---
## 4. Spacing System
Tailwind default 4px base unit. Key spacing values in use:
| Scale | px | rem | Use Case |
|-------|----|-----|----------|
| 1 | 4px | 0.25rem | Micro gaps |
| 2 | 8px | 0.5rem | Icon-to-text gaps |
| 3 | 12px | 0.75rem | Tight form elements |
| 4 | 16px | 1rem | Standard gaps, padding |
| 5 | 20px | 1.25rem | — |
| 6 | 24px | 1.5rem | Section sub-gaps |
| 8 | 32px | 2rem | Card padding |
| 10 | 40px | 2.5rem | Large card padding |
| 12 | 48px | 3rem | CTA button padding |
| 16 | 64px | 4rem | — |
| 20 | 80px | 5rem | Section padding (mobile) |
| 24 | 96px | 6rem | **Standard section padding** |
### Section Padding Convention
```html
<!-- Standard section -->
<section class="py-24 bg-white">
<!-- Compact section -->
<section class="py-16 bg-secondary-50">
<!-- Hero section -->
<section class="min-h-screen py-24">
```
### Container
```html
<div class="container-wrapper">
<!-- = mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 -->
```
---
## 5. Elevation & Shadows
| Level | Class | Use Case |
|-------|-------|----------|
| 0 — Flat | none | Form inputs (unfocused) |
| 1 — Low | `shadow-sm` | Subtle card lift |
| 2 — Medium | `shadow-lg` | Icon containers, info cards |
| 3 — High | `shadow-xl` | Service cards, large icons |
| 4 — Very High | `shadow-2xl` | Card hover states, modals |
| Brand Shadow | `shadow-2xl shadow-primary/30` | Primary button hover |
### Shadow on Hover Pattern
```html
<div class="shadow-lg hover:shadow-2xl transition-all duration-500">
```
---
## 6. Border Radius
| Scale | Class | px | Use Case |
|-------|-------|----|----------|
| Small | `rounded-lg` | 8px | Form inputs, small buttons, tags |
| Medium | `rounded-xl` | 12px | Buttons, small cards |
| Large | `rounded-2xl` | 16px | Cards, panels, badges |
| XL | `rounded-3xl` | 24px | Large cards, testimonial blocks |
| Full | `rounded-full` | 9999px | Pills, avatar circles, dot indicators |
---
## 7. Animation & Motion
### Keyframes Defined in Pages
```css
/* Entrance animations (page-level) */
@keyframes slide-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes pulse-slow { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.6; } }
@keyframes pulse-slower { 0%, 100% { opacity: 0.2; } 50% { opacity: 0.4; } }
```
### Animation Classes
| Class | Duration | Use Case |
|-------|----------|----------|
| `animate-slide-up` | 0.8s | Hero text entrance |
| `animate-fade-in` | 0.8s | Scroll indicator |
| `animate-pulse-slow` | 4s loop | Decorative blobs |
| `animate-pulse-slower` | 6s loop | Secondary blobs |
| `animate-bounce` | Tailwind | Scroll indicators |
| `animate-spin` | Tailwind | Loading spinners |
### Transition Conventions
```html
<!-- Standard interactive transition -->
transition-all duration-300
<!-- Smooth card hover -->
transition-all duration-500
<!-- Color-only transition -->
transition-colors duration-200
<!-- Transform-only -->
transition-transform duration-300
```
### Stagger Pattern (hero entrance)
```html
<span class="opacity-0 animate-slide-up" style="animation-delay: 0.2s;">Line 1</span>
<span class="opacity-0 animate-slide-up" style="animation-delay: 0.4s;">Line 2</span>
```
### Reduced Motion
All animations must respect `prefers-reduced-motion`:
```css
@media (prefers-reduced-motion: reduce) {
.animate-slide-up, .animate-fade-in { animation: none; opacity: 1; }
}
```
---
## 8. Button Styles
### Button System
#### Primary (`.btn-primary`)
```
bg-primary text-white rounded-lg px-6 py-3
hover: bg-primary-600
focus: ring-2 ring-primary-400 ring-offset-2
```
**Use for:** Main CTAs, one per section maximum.
#### Secondary (`.btn-secondary`)
```
border-2 border-secondary bg-transparent text-secondary rounded-lg px-6 py-3
hover: bg-secondary text-white
focus: ring-2 ring-secondary-400 ring-offset-2
```
**Use for:** Paired with primary, less prominent actions.
#### Accent (`.btn-accent`)
```
bg-accent text-white rounded-lg px-6 py-3
hover: bg-accent-600
focus: ring-2 ring-accent-400 ring-offset-2
```
**Use for:** Highlights, promotional actions (use rarely).
#### Hero CTA (inline, large)
```html
<!-- Primary hero button -->
<a class="rounded-xl bg-gradient-to-r from-primary-500 to-primary-600 px-10 py-5 text-lg font-bold text-white
hover:shadow-2xl hover:shadow-primary/50 hover:scale-105
focus:ring-2 focus:ring-primary-400 focus:ring-offset-2 focus:ring-offset-secondary-900">
<!-- Ghost hero button (dark bg) -->
<a class="rounded-xl border-2 border-white/30 bg-white/5 backdrop-blur-sm px-10 py-5 text-lg font-bold text-white
hover:bg-white/10 hover:border-white/50">
<!-- Inverse (white button on dark bg) -->
<a class="rounded-xl bg-white px-10 py-5 text-lg font-bold text-secondary-900
hover:shadow-2xl hover:scale-105">
```
#### Button Sizes
| Size | Padding | Text | Use Case |
|------|---------|------|----------|
| SM | `px-4 py-2` | `text-sm` | Inline, compact |
| MD (default) | `px-6 py-3` | `text-base` | Standard actions |
| LG | `px-8 py-4` | `text-lg` | Section CTAs |
| XL | `px-10 py-5` | `text-lg font-bold` | Hero CTAs |
| Full | `w-full py-4 px-6` | `text-base font-semibold` | Form submit |
---
## 9. Form Elements
### Base Input Style
```html
<input class="w-full px-4 py-3 rounded-lg border border-secondary-300
focus:border-primary focus:ring-2 focus:ring-primary/20
transition-colors duration-200
text-secondary-900 placeholder-secondary-400">
```
### Error State
```html
<input class="border-red-500"> <!-- Applied via JS when invalid -->
<p class="mt-1 text-sm text-red-500 hidden" data-error="fieldname">Error message</p>
```
### Label
```html
<label class="block text-sm font-medium text-secondary-700 mb-2">
Field Name <span class="text-red-500">*</span>
</label>
```
### Select
```html
<select class="w-full px-4 py-3 rounded-lg border border-secondary-300
focus:border-primary focus:ring-2 focus:ring-primary/20
transition-colors duration-200 text-secondary-900 bg-white">
```
### Textarea
```html
<textarea class="w-full px-4 py-3 rounded-lg border border-secondary-300
focus:border-primary focus:ring-2 focus:ring-primary/20
transition-colors duration-200
text-secondary-900 placeholder-secondary-400 resize-none">
```
### Form Container
```html
<div class="bg-secondary-50 rounded-2xl p-8 lg:p-10">
```
### Submit Button (full-width)
```html
<button type="submit"
class="w-full py-4 px-6 bg-gradient-to-r from-primary to-primary-600
text-white font-semibold rounded-lg
hover:from-primary-600 hover:to-primary-700
focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2
transition-all duration-200 flex items-center justify-center gap-2">
```
---
## 10. Component Patterns
### Section Header (Reusable Pattern)
```html
<div class="text-center max-w-3xl mx-auto mb-20">
<!-- Badge / eyebrow label -->
<span class="inline-block px-4 py-2 rounded-full bg-primary-50 text-primary-700
text-sm font-bold uppercase tracking-wider mb-4">
Section Label
</span>
<!-- Heading -->
<h2 class="text-4xl sm:text-5xl font-bold text-secondary-900 mb-6">Section Title</h2>
<!-- Subheading -->
<p class="text-xl text-secondary-600">Supporting description text.</p>
</div>
```
**Badge variants:**
- Light section: `bg-primary-50 text-primary-700`
- Dark section: `bg-primary-400/20 text-primary-300`
- Accent: `bg-accent-50 text-accent-700`
### Card Patterns
#### Feature Card
```html
<div class="group relative bg-gradient-to-br from-secondary-50 to-white
rounded-2xl p-8 border border-secondary-100
hover:border-primary/30 hover:shadow-2xl
transition-all duration-500 hover:-translate-y-2">
<!-- Icon container -->
<div class="w-16 h-16 rounded-2xl bg-gradient-to-br from-primary-500 to-primary-600
flex items-center justify-center mb-6
group-hover:scale-110 group-hover:rotate-6
transition-all duration-500 shadow-lg">
<!-- SVG icon -->
</div>
<h3 class="text-2xl font-bold text-secondary-900 mb-3">Title</h3>
<p class="text-secondary-600 leading-relaxed">Description</p>
</div>
```
#### Service Card (larger)
```html
<div class="group relative bg-white rounded-3xl p-10
shadow-lg border-2 border-secondary-100
hover:border-primary-400 hover:shadow-2xl
transition-all duration-500 overflow-hidden">
```
#### Contact Info Card
```html
<div class="bg-secondary-50 rounded-xl p-6 hover:shadow-lg transition-shadow duration-300">
```
### Icon Container Sizes
| Size | Classes | Pixel Size |
|------|---------|------------|
| SM | `w-12 h-12 rounded-lg` | 48px |
| MD | `w-16 h-16 rounded-2xl` | 64px |
| LG | `w-20 h-20 rounded-2xl` | 80px |
| XL | `w-24 h-24 rounded-2xl` | 96px |
All icon containers use: `bg-gradient-to-br from-primary-500 to-primary-600 flex items-center justify-center shadow-lg`
### Section Badge / Eyebrow
```html
<!-- Light backgrounds -->
<span class="inline-block px-4 py-2 rounded-full bg-primary-50 text-primary-700
text-sm font-bold uppercase tracking-wider mb-4">
Label
</span>
<!-- Dark backgrounds -->
<span class="inline-block px-4 py-2 rounded-full bg-primary-400/20 text-primary-300
text-sm font-bold uppercase tracking-wider mb-4">
Label
</span>
```
### Toast Notification
```html
<!-- Success -->
<div class="px-6 py-4 rounded-lg shadow-lg bg-green-500 text-white flex items-center gap-3">
<!-- Error -->
<div class="px-6 py-4 rounded-lg shadow-lg bg-red-500 text-white flex items-center gap-3">
```
Positioned: `fixed bottom-4 right-4 z-50 flex flex-col gap-3`
### Avatar / Initials
```html
<div class="w-16 h-16 rounded-full bg-gradient-to-br from-primary-500 to-primary-600
flex items-center justify-center text-white font-bold text-xl shadow-lg">
AB
</div>
```
### Star Rating
```html
<div class="flex gap-1">
<svg class="w-6 h-6 text-accent-500" fill="currentColor" viewBox="0 0 20 20">
<!-- star path -->
</svg>
</div>
```
### Feature List Item
```html
<li class="flex items-center text-secondary-700">
<svg class="w-5 h-5 text-primary-500 mr-3 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<!-- checkmark path -->
</svg>
<span class="font-medium">Feature text</span>
</li>
```
### Connecting Step Line (horizontal)
```html
<!-- Only visible on lg+ screens -->
<div class="hidden lg:block absolute top-20 left-[60%] w-full h-0.5
bg-gradient-to-r from-primary-500/50 to-transparent">
</div>
```
---
## 11. Layout System
### Breakpoints (Tailwind defaults)
| Name | Min Width | Use Case |
|------|-----------|----------|
| `sm` | 640px | Mobile landscape |
| `md` | 768px | Tablets |
| `lg` | 1024px | Desktop nav shows |
| `xl` | 1280px | Wide layouts |
| `2xl` | 1536px | Ultra-wide |
### Grid Patterns
```html
<!-- 4-col features (1→2→4) -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- 2-col services (1→2) -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-6xl mx-auto">
<!-- 2-col stats, 4-col on desktop -->
<div class="grid grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Two-column with content (2/5 + 3/5 ratio) -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-16 items-start">
<!-- Footer 4-column (1→2→4) -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
```
### Max Width Containers
| Container | Class | Width | Use Case |
|-----------|-------|-------|----------|
| Standard | `max-w-7xl` | 1280px | Main content |
| Content | `max-w-5xl` | 1024px | Hero content |
| Prose | `max-w-3xl` | 768px | Section headers, descriptions |
| Narrow | `max-w-2xl` | 672px | Modal-width content |
### Section Background Alternation
```
Section 1 (Hero): dark gradient
Section 2: bg-white
Section 3: bg-gradient-to-b from-secondary-50 to-white
Section 4: dark gradient (processes, CTAs)
Section 5: bg-white
Section 6: bg-gradient-to-b from-secondary-50 to-white
```
Avoid two consecutive dark sections, or two identical background sections.
---
## 12. Icon System
All icons are **custom inline SVGs** from Heroicons v2 outline style:
- Stroke: `stroke="currentColor"` (inherits text color)
- ViewBox: `0 0 24 24`
- Stroke Width: `stroke-width="2"` (default) or `stroke-width="2.5"` (bold emphasis)
- Sizes: `w-5 h-5` (inline), `w-6 h-6` (medium), `w-8 h-8` (card icons), `w-10 h-10` (large cards)
**No icon library dependency** — all SVGs are inline for performance.
---
## 13. Accessibility
### Focus Rings
```html
<!-- Default pattern -->
focus:outline-none focus:ring-2 focus:ring-primary-400 focus:ring-offset-2
<!-- On dark backgrounds -->
focus:ring-2 focus:ring-white/50 focus:ring-offset-2 focus:ring-offset-secondary-900
```
### ARIA Patterns in Use
- `aria-current="page"` — active nav links
- `aria-expanded` — accordion/hamburger states
- `aria-label` — icon-only buttons
- `aria-hidden="true"` — decorative elements
- `aria-modal="true"` — mobile menu overlay
- `role="menubar"` / `role="menuitem"` — navigation
- `.sr-only` — screen-reader-only text
### Color Contrast Requirements
- Normal text: 4.5:1 minimum
- Large text (18px+ bold): 3:1 minimum
- Interactive states: 3:1 minimum for UI components
### Verified Contrast Pairs
| Text | Background | Ratio | Status |
|------|-----------|-------|--------|
| `secondary-800` (#1e293b) | white | ~13:1 | ✅ PASS |
| `secondary-600` (#475569) | white | ~7:1 | ✅ PASS |
| `secondary-300` (#cbd5e1) | `secondary-900` | ~4.6:1 | ✅ PASS |
| `primary-700` (#155e75) | `primary-50` | ~5.2:1 | ✅ PASS |
| white | `primary-500` (#0891b2) | ~4.6:1 | ✅ PASS |
---
## 14. Implementation Notes
### File Structure
```
src/
styles/
global.css # Base styles, CSS variables, component classes
components/
Header.astro # Sticky nav, mobile hamburger
Footer.astro # Dark footer, newsletter
SEO.astro # Meta tags + JSON-LD
OptimizedImage.astro # WebP with lazy load
LazyImage.astro # Lazy load wrapper
ui/
Badge.astro # Eyebrow/label badges [NEW]
Card.astro # Card wrapper [NEW]
SectionHeader.astro # Section header [NEW]
layouts/
BaseLayout.astro # HTML shell + Header + Footer
pages/
index.astro
about.astro
services.astro
portfolio.astro
contact.astro
tailwind.config.mjs # Extended color/font tokens
```
### Adding New Design Tokens
1. Add color values to `tailwind.config.mjs` under `theme.extend.colors`
2. Add CSS variables to `global.css` for non-Tailwind usage
3. Document in this file under the appropriate section
### When NOT to Use `@apply`
Per Tailwind v3 best practices, avoid `@apply` for:
- One-off utility combinations (write inline classes)
- Responsive variants (handle in JSX/Astro template)
**Use `@apply` only** for globally-reused component classes like `.btn-primary`, `.container-wrapper`.
### CSS Custom Properties (Available)
The following CSS variables are defined in `global.css`:
```css
--color-primary: #0891b2;
--color-primary-dark: #0e7490;
--color-secondary: #1e293b;
--color-accent: #f59e0b;
--color-surface: #f8fafc;
--color-border: #e2e8f0;
--color-text-primary: #1e293b;
--color-text-secondary: #475569;
--color-text-muted: #94a3b8;
--font-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', monospace;
--radius-sm: 0.5rem;
--radius-md: 0.75rem;
--radius-lg: 1rem;
--radius-xl: 1.5rem;
--radius-full: 9999px;
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
--transition-fast: 150ms ease;
--transition-base: 200ms ease;
--transition-slow: 300ms ease;
--transition-slower: 500ms ease;
```
---
*This document is the single source of truth for the WorkRoot IT Solutions design system. All UI decisions should reference this guide.*