16 KiB
WorkRoot IT Solutions — Frontend Design Audit
Date: 2026-03-21 Auditor: frontend-specialist Scope: Full codebase design system review
Table of Contents
- Project Overview
- Design System Tokens
- Typography System
- Spacing & Layout
- Component Inventory
- Page Inventory
- Interaction Patterns
- Accessibility Assessment
- Performance Patterns
- Design Consistency Findings
- 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 gradientred-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.comandfonts.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-heighttoken —leading-relaxedused ad-hoc tracking-tightapplied 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
.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-8instead 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
/cookieswhich doesn't exist in pages - Newsletter submit is a mock (hardcoded
setTimeoutwith 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:
BreadcrumbListschemaArticleschema (for blog posts)Serviceschema (for service pages)
Issues:
- No
typeprop 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-upwith staggeredanimation-delay - Scroll counter: IntersectionObserver triggers
countUp()on stats - Carousel:
setIntervalauto-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 | <main>, <header>, <footer>, <nav>, <section> used correctly |
| ARIA labels | ✅ Present | Mobile menu, social links, nav landmarks |
aria-current="page" |
✅ Present | Active nav state |
aria-expanded |
✅ Present | Mobile hamburger button |
role="dialog" |
✅ Present | Mobile menu panel |
| Focus management | ⚠️ Partial | Modal opens but focus not trapped |
| Color contrast | ⚠️ Unknown | Not verified programmatically — text-secondary-400 on dark bg needs testing |
| Focus styles | ✅ Present | :focus-visible outline in global.css |
| Images | ⚠️ Partial | Placeholder images from Unsplash — alt text depends on implementation |
| Keyboard navigation | ✅ Mostly good | Escape closes mobile menu, resize closes on desktop |
9. Performance Patterns
| Pattern | Implementation |
|---|---|
| Font loading | display=swap |
| DNS prefetch | fonts.googleapis.com, images.unsplash.com |
| Preconnect | fonts.gstatic.com, images.unsplash.com |
| Critical CSS | Inlined in <head> via <style is:inline> |
| Lazy images | Component-based with IntersectionObserver |
| Image optimization | OptimizedImage component |
| Scroll listener | {passive: true} on scroll events |
| JS execution | <script> tags at end of page/component scope |
Issues:
- Images currently reference
images.unsplash.com(external CDN) — not optimized at build time - No
<link rel="preload">for critical above-fold images
10. Design Consistency Findings
Consistent Patterns ✅
- Section heading structure: pill tag → H2 → description paragraph
- Card pattern: icon → heading → description → features list
- CTA button placement at section ends
py-24for section vertical padding (universal)max-w-3xl mx-autofor section intro text blockstext-centerfor all section headings- Gradient hero sections with decorative blur orbs
Inconsistencies ⚠️
| Issue | Location | Severity |
|---|---|---|
emerald-* colors outside design tokens |
services.astro AI/ML card | Medium |
Footer uses raw container classes instead of .container-wrapper |
Footer.astro:41,175 | Low |
| Service sub-route links (non-existent pages) | Footer.astro:21-27 | High |
/cookies page doesn't exist |
Footer.astro:187 | Medium |
Placeholder phone number +1234567890 |
Header.astro:183 | High |
| Mock newsletter API | Footer.astro:221 | Medium |
.btn-accent defined but never used |
global.css | Low |
animate-pulse-slow / animate-pulse-slower / animate-slide-up / animate-fade-in custom keyframes |
index.astro | — Need to verify they're defined in Tailwind config (not found in tailwind.config.mjs) |
11. Issues & Recommendations
Critical Issues
-
Missing custom animation classes
animate-slide-up,animate-fade-in,animate-pulse-slow,animate-pulse-slowerare used inindex.astrobut are not defined intailwind.config.mjs. These likely fail silently (elements stayopacity-0) unless defined elsewhere. Recommendation: Add keyframe definitions totailwind.config.mjsundertheme.extend.animation/keyframes. -
Broken footer service links Footer links like
/services/web-developmentpoint to pages that don't exist, causing 404s. Recommendation: Either create sub-pages or change links to/services#web-developmentanchor links. -
Missing
/cookiespage Footer bottom bar references/cookieswhich 404s. Recommendation: Create the page or remove the link.
Medium Issues
-
Emerald green outside design system The AI/ML service uses
from-emerald-500 to-emerald-700which has no matching token in the Tailwind config. This breaks design system isolation. Recommendation: Map AI/ML to a design-token color (e.g., primary) or addemeraldas a named semantic color likeai-accent. -
Newsletter form has no backend The subscribe form uses a
setTimeoutmock. Recommendation: Integrate with an email service API (Mailchimp, ConvertKit) or document as future work. -
No testimonial carousel pause on hover Auto-advance carousel without pause on hover is a UX/accessibility issue. Recommendation: Add
mouseenter/mouseleaveevent listeners to pause/resume the interval.
Low Priority / Improvements
-
Footer container inconsistency Use
.container-wrapperutility class in Footer for consistency. -
Remove unused
.btn-accentOr use it somewhere to justify its inclusion. -
Hero typography scale
xl:text-8xl(6rem) may be too large on 1280px screens. Consider capping atxl:text-7xl. -
Missing
rel="preload"for hero content No preloaded fonts for the primary display font or hero image. Add<link rel="preload">for the Plus Jakarta Sans font weight most used. -
Hardcoded placeholder content Phone number (
+1234567890), address, email (hello@workroot.io) in BaseLayout structured data are US-based but site isworkroot.in. Verify these match real business data.
Summary Scorecard
| Category | Score | Notes |
|---|---|---|
| Color system | 8/10 | Well-defined tokens, one off-system color |
| Typography | 8/10 | Good scale, minor consistency issues |
| Component quality | 7/10 | Good interactions, some placeholders |
| Accessibility | 7/10 | Strong fundamentals, focus trap missing |
| Performance | 7/10 | Good patterns, missing preloads |
| Design consistency | 7/10 | Mostly consistent, some deviations |
| Overall | 7.3/10 | Solid foundation, production-ready with fixes |