First Init
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

This commit is contained in:
2026-03-21 16:46:46 +05:30
commit d402256547
216 changed files with 48375 additions and 0 deletions
@@ -0,0 +1,713 @@
# 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.*