# Apex Admins — Performance & Accessibility Checklist

**Version:** 1.0  
**Date:** 2026-06-27

---

## 1. Performance Targets

| Metric | Desktop | Mobile |
|--------|---------|--------|
| Lighthouse Performance | 99+ | 95+ |
| LCP | < 2.5s | < 2.5s |
| INP | < 200ms | < 200ms |
| CLS | < 0.1 | < 0.1 |
| TTFB | < 800ms | < 800ms |
| Total page weight | < 1.5MB | < 1MB |

---

## 2. Image Optimization

- [ ] All content images via Media library with WebP + AVIF derivatives
- [ ] `<picture>` element with fallbacks
- [ ] Explicit width/height to prevent CLS
- [ ] Hero LCP image: `fetchpriority="high"`, no lazy load
- [ ] Below-fold: `loading="lazy"`
- [ ] Responsive `srcset` at 640, 1024, 1280, 1920 widths
- [ ] SVG icons inlined or sprited (no icon font)
- [ ] Max upload 2MB; admin warns above 500KB

---

## 3. CSS & Fonts

- [ ] Tailwind purge/content paths configured
- [ ] Critical above-fold CSS inlined or loaded first
- [ ] Non-critical CSS deferred
- [ ] `font-display: swap` on all fonts
- [ ] System font stack (no external font CDN required)
- [ ] No `@import` in CSS (Vite bundles)

---

## 4. JavaScript

- [ ] Vite code splitting: admin.js separate from app.js
- [ ] GSAP + ScrollTrigger loaded only on pages with animations
- [ ] Swiper loaded only on carousel sections
- [ ] Alpine.js lightweight components
- [ ] Defer/async non-critical scripts
- [ ] No jQuery
- [ ] Analytics via `sendBeacon` (non-blocking)

---

## 5. Caching

- [ ] Redis cache for settings, menus, theme CSS
- [ ] Route cache + config cache in production
- [ ] Full-page cache for anonymous GET (Phase 10)
- [ ] `Cache-Control` headers on static assets (1 year)
- [ ] ETags enabled

---

## 6. Database

- [ ] Eager loading on all list/detail pages (no N+1)
- [ ] Indexes on slug, status, published_at
- [ ] Pagination on blog, case studies, careers lists
- [ ] Scout for search (not LIKE queries on large tables)

---

## 7. Server

- [ ] OPcache enabled (PHP 8.5)
- [ ] Gzip/Brotli compression
- [ ] HTTP/2 or HTTP/3
- [ ] Queue workers for heavy tasks (images, email)
- [ ] Scheduler for sitemap regeneration

---

## 8. Accessibility (WCAG 2.2 AA)

### Perceivable
- [ ] All images have alt text (enforced in admin)
- [ ] Color contrast 4.5:1 body text, 3:1 large text
- [ ] No information conveyed by color alone
- [ ] Video captions/transcripts where applicable

### Operable
- [ ] Full keyboard navigation
- [ ] Visible focus indicators (`ring-2 ring-primary`)
- [ ] Skip to main content link
- [ ] No keyboard traps in modals (focus trap with escape close)
- [ ] Touch targets minimum 44×44px
- [ ] No autoplay media with sound

### Understandable
- [ ] `lang="en-AU"` on html
- [ ] Form labels associated with inputs
- [ ] Error messages linked via `aria-describedby`
- [ ] Consistent navigation across pages

### Robust
- [ ] Valid HTML5
- [ ] ARIA on accordion, tabs, mobile menu, modals
- [ ] `prefers-reduced-motion` disables GSAP animations

---

## 9. SEO Performance Overlap

- [ ] Server-rendered content (Blade, no CSR)
- [ ] JSON-LD in head (not blocking)
- [ ] Canonical URLs prevent duplicate content
- [ ] No render-blocking third-party scripts in head (async GTM)

---

## 10. Testing Checklist (Pre-Launch)

### Lighthouse (run on)
- [ ] Homepage
- [ ] `/hire/virtual-assistants`
- [ ] `/services/ai-specialists`
- [ ] `/blog/{sample-post}`

### Browsers
- [ ] Chrome (latest)
- [ ] Safari macOS + iOS
- [ ] Firefox (latest)
- [ ] Edge (latest)

### Devices
- [ ] iPhone SE (320px)
- [ ] iPhone 14
- [ ] iPad
- [ ] Desktop 1920px

### Tools
- [ ] axe DevTools (0 violations critical)
- [ ] WAVE browser extension
- [ ] Google PageSpeed Insights
- [ ] WebPageTest.org

---

## 11. Monitoring Post-Launch

- Google Search Console: Core Web Vitals
- Uptime monitoring (5-min ping)
- Laravel log alerts for 500 errors
- Queue failed job alerts

---

## 12. Performance Budget

| Resource | Budget |
|----------|--------|
| HTML | < 50KB |
| CSS (total) | < 80KB gzipped |
| JS (total) | < 120KB gzipped |
| LCP image | < 150KB |
| Fonts | 0KB (system stack) |
| Third-party | < 100KB (GTM/analytics async)
