# WorkRoot IT Solutions — Frontend Design Audit **Date:** 2026-03-21 **Auditor:** frontend-specialist **Scope:** Full codebase design system review --- ## Table of Contents 1. [Project Overview](#1-project-overview) 2. [Design System Tokens](#2-design-system-tokens) 3. [Typography System](#3-typography-system) 4. [Spacing & Layout](#4-spacing--layout) 5. [Component Inventory](#5-component-inventory) 6. [Page Inventory](#6-page-inventory) 7. [Interaction Patterns](#7-interaction-patterns) 8. [Accessibility Assessment](#8-accessibility-assessment) 9. [Performance Patterns](#9-performance-patterns) 10. [Design Consistency Findings](#10-design-consistency-findings) 11. [Issues & Recommendations](#11-issues--recommendations) --- ## 1. Project Overview **Site:** WorkRoot IT Solutions **Domain:** workroot.in **Tech Stack:** Astro (SSR), Tailwind CSS v3, TypeScript **Pages:** 10 (index, about, services, portfolio, contact, blog index, blog slug, privacy, terms, sitemap) **Components:** 5 (Header, Footer, SEO, OptimizedImage, LazyImage) **Layout:** 1 (BaseLayout) --- ## 2. Design System Tokens ### Color Palette | Token | Value | Usage | |-------|-------|-------| | `primary` | `#0891b2` (Cyan 500) | CTAs, active states, icons, highlights | | `primary-50` | `#ecfeff` | Light backgrounds, tag pills | | `primary-400` | `#22d3ee` | Gradients, hero highlights | | `primary-600` | `#0e7490` | Hover states on primary buttons | | `primary-700` | `#155e75` | Pressed states, service gradient ends | | `secondary` | `#1e293b` (Slate 800) | Body text, navbar text | | `secondary-50` | `#f8fafc` | Section alternating backgrounds | | `secondary-100` | `#f1f5f9` | Border accents, dividers | | `secondary-200` | `#e2e8f0` | Lazy image placeholders | | `secondary-400` | `#94a3b8` | Muted text, footer text | | `secondary-500` | `#64748b` | Subheadings, secondary text | | `secondary-600` | `#475569` | Service card text | | `secondary-700` | `#334155` | Mobile nav links | | `secondary-800` | `#1e293b` | Footer backgrounds, inputs | | `secondary-900` | `#0f172a` | Hero gradient, footer bg | | `accent` | `#f59e0b` (Amber 500) | Hero decorative elements, mobile service badges | | `accent-50` | `#fffbeb` | Mobile service background | | `accent-400` | `#fbbf24` | Trust badge icon | | `accent-600` | `#d97706` | Hover state for accent buttons | #### Non-System Colors Found (Issues) - `emerald-500/600/50` — used in services.astro for the AI/ML service card gradient - `red-900/300` — used in Footer newsletter error states (raw Tailwind, not system) - `green-900/300` — used in Footer newsletter success states (raw Tailwind, not system) --- ### Button System | Class | Description | States | |-------|-------------|--------| | `.btn-primary` | Solid cyan CTA | hover: `primary-600`, focus ring: `primary-400` | | `.btn-secondary` | Outlined dark button | hover: solid `secondary` bg with white text | | `.btn-accent` | Solid amber CTA | hover: `accent-600`, focus ring: `accent-400` | **Note:** `.btn-accent` is defined in global.css but not observed in use anywhere on the current pages. --- ## 3. Typography System ### Font Families | Role | Font | Weights Used | |------|------|-------------| | Primary (body/headings) | Plus Jakarta Sans | 400 (regular), 500 (medium), 600 (semibold), 700 (bold), 800 (extrabold) | | Code/Mono | JetBrains Mono | Used for `code` and `pre` elements | ### Font Loading - Loaded via Google Fonts CDN with `display=swap` - Preconnect links present for `fonts.googleapis.com` and `fonts.gstatic.com` ### Heading Scale (Observed) | Element | Size Classes | Notes | |---------|-------------|-------| | Hero H1 | `text-5xl sm:text-6xl lg:text-7xl xl:text-8xl` | `font-bold`, `tracking-tight` | | Section H2 | `text-4xl sm:text-5xl` | `font-bold` | | Card H3 | `text-xl` / `text-2xl` | `font-bold` or `font-semibold` | | Footer heading | `text-lg` | `font-semibold` | | Section tag pill | `text-sm` | `font-bold uppercase tracking-wider` | | Body/paragraph | `text-xl` / `text-lg` / `text-base` / `text-sm` | `leading-relaxed` | ### Typographic Issues - No consistent `line-height` token — `leading-relaxed` used ad-hoc - `tracking-tight` applied globally to all headings via base layer (good) - Hero H1 uses very large sizes (up to `text-8xl` = 6rem) which may be too heavy on smaller breakpoints --- ## 4. Spacing & Layout ### Container System ```css .container-wrapper { @apply mx-auto max-w-7xl px-4 sm:px-6 lg:px-8; } ``` - Max width: `1280px` (7xl) - Horizontal padding: 16px → 24px → 32px (responsive) - **Inconsistency:** Footer uses raw `max-w-7xl mx-auto px-4 sm:px-6 lg:px-8` instead of `.container-wrapper` ### Section Spacing | Pattern | Value | Usage | |---------|-------|-------| | Section vertical padding | `py-24` | Benefits, Services, How-It-Works, Stats, Testimonials | | Section heading bottom margin | `mb-20` | Consistent across most sections | | Card gap | `gap-8` | All grid layouts | | Section heading intro gap | `mb-6` | H2 to paragraph | ### Grid Patterns Used | Pattern | Where Used | |---------|-----------| | `grid-cols-1 md:grid-cols-2 lg:grid-cols-4` | Benefits cards | | `grid-cols-1 md:grid-cols-2` | Services cards | | `grid-cols-1 md:grid-cols-2 lg:grid-cols-4` | Footer columns | | `grid-cols-1 md:grid-cols-2 lg:grid-cols-4` | Stats row | | `grid-cols-1 lg:grid-cols-3` | Testimonials | --- ## 5. Component Inventory ### Header (`src/components/Header.astro`) **Type:** Fixed sticky header **Height:** `h-16` mobile / `h-20` desktop **Background:** `bg-white/95 backdrop-blur-sm` **Behavior:** Scroll shadow via JS class toggle (`.header-scrolled`) | Feature | Implementation | |---------|---------------| | Logo | "W" lettermark in cyan rounded square + "WorkRoot IT Solutions" text | | Desktop nav | Horizontal links, active state = `bg-primary-50 text-primary` + dot indicator | | Mobile nav | Slide-in panel (right drawer, `w-80`), overlay backdrop | | CTA | "Get Started" → `/contact` with arrow icon | | Hamburger | 3-line → X animation via CSS transform | | Accessibility | `aria-label`, `aria-current`, `aria-expanded`, skip-to-content link | **Issues:** - Logo is a text-only lettermark ("W") — no actual SVG or image favicon shown in header - Phone number in mobile footer is hardcoded `tel:+1234567890` (placeholder) --- ### Footer (`src/components/Footer.astro`) **Background:** `bg-secondary-900` **Layout:** 4-column grid (company info, quick links, services, newsletter) | Feature | Implementation | |---------|---------------| | Social icons | LinkedIn, Twitter, GitHub, Facebook (inline SVG) | | Newsletter | Email input + async submit with loading state | | Bottom bar | Copyright + Privacy/Terms/Cookies links | | Link animation | Arrow icon slides in on hover (CSS transition) | **Issues:** - Service links in footer point to non-existent sub-routes (e.g. `/services/web-development`) - Cookie Policy link points to `/cookies` which doesn't exist in pages - Newsletter submit is a mock (hardcoded `setTimeout` with no real API) - Uses raw padding/max-width instead of `.container-wrapper` (minor inconsistency) --- ### SEO (`src/components/SEO.astro`) Generates JSON-LD structured data blocks: - `BreadcrumbList` schema - `Article` schema (for blog posts) - `Service` schema (for service pages) **Issues:** - No `type` prop validation — relies on string matching --- ### OptimizedImage (`src/components/OptimizedImage.astro`) Image optimization wrapper. No further detail available without reading. ### LazyImage (`src/components/LazyImage.astro`) Lazy loading with intersection observer pattern and placeholder support. --- ## 6. Page Inventory ### index.astro — Home Page **Sections (in order):** | Section | Background | Key Patterns | |---------|-----------|-------------| | Hero | `bg-gradient-to-br from-secondary-900 via-secondary-800 to-primary-900` | Entrance animations, blur orbs, grid overlay | | Benefits | `bg-white` | 4-col grid, hover lift + rotate icon animation | | Services | `bg-gradient-to-b from-secondary-50 to-white` | 2-col grid with feature bullets | | How It Works | `bg-white` | 4-step numbered process, horizontal connector line | | Stats | `bg-gradient-to-r from-secondary-900 to-primary-900` | Counter animation on scroll | | Testimonials | `bg-secondary-50` | Auto-play carousel with manual dots | | FAQ | `bg-white` | Accordion with single-open behavior | | Final CTA | Dark gradient | Two CTA buttons | **Animation Strategy:** - Entry animations: `opacity-0 animate-slide-up` with staggered `animation-delay` - Scroll counter: IntersectionObserver triggers `countUp()` on stats - Carousel: `setInterval` auto-advance every 4s --- ### about.astro — About Page **Sections:** Company hero, company stats, story/mission, values, timeline, team, awards, final CTA | Notable Pattern | Detail | |-----------------|--------| | Timeline | Alternating left/right layout on desktop | | Team cards | Member photo placeholder, role, bio, social links | | Values | 6-item grid with icon + color-coded accent bars | --- ### services.astro — Services Page **Color coding** used to differentiate services: - Web Dev: Primary cyan gradient - Mobile: Accent amber gradient - AI/ML: **Emerald** (outside design system) - Cloud: Secondary slate gradient **Issues:** - Emerald color for AI/ML is outside defined design tokens --- ### portfolio.astro — Portfolio Page **Features:** Filter tabs (All/Web/Mobile/AI/Cloud), 8 project cards, case study modal --- ### contact.astro — Contact Page **Features:** Form (name, email, phone, subject, message), honeypot anti-spam, contact info cards, map placeholder --- ### blog/index.astro — Blog Listing **Features:** Category filter, blog card grid with reading time, author, tags, empty state handling --- ### blog/[...slug].astro — Blog Post **Features:** MDX content rendering, hero image, metadata display --- ### privacy.astro / terms.astro Long-form legal pages. Use BaseLayout with prose typography styles. --- ## 7. Interaction Patterns | Pattern | Implementation | Quality | |---------|---------------|---------| | Button hover | Color darken + scale on hero CTAs | ✅ Consistent | | Card hover | `hover:-translate-y-2 hover:shadow-2xl` | ✅ Used consistently | | Link hover | Color transitions `transition-colors duration-200` | ✅ Consistent | | Mobile menu | Right slide-in drawer with backdrop | ✅ Accessible | | Carousel | Auto-play with manual dot navigation | ⚠️ No pause on hover | | Accordion/FAQ | Single-open accordion | ✅ Good UX | | Form validation | Real-time HTML5 + custom JS | ✅ Good | | Counter animation | IntersectionObserver scroll trigger | ✅ Good | | Image lazy load | IntersectionObserver via component | ✅ Good | | Newsletter submit | Mock async with loading spinner | ⚠️ No real endpoint | --- ## 8. Accessibility Assessment | Aspect | Status | Notes | |--------|--------|-------| | Skip link | ✅ Present | `href="#main-content"`, `sr-only` until focused | | Semantic HTML | ✅ Good | `
`, `
`, `