biohazard-vfx/docs/stories/1.8.hardening-performance-accessibility-seo.md
nicholai ed55376b9c
Some checks are pending
Build and Push to Docker Hub / Push Docker image to Docker Hub (push) Waiting to run
Build and Push Docker Image / build-and-push (push) Waiting to run
bmad-planning-complete
2025-09-24 10:54:01 -06:00

99 lines
3.9 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.

Status
Draft
Story
**As a** steward,
**I want** the site to be fast and accessible,
**so that** it reflects professional standards.
Acceptance Criteria
1. CLS < 0.1; LCP within target for hero pages; images lazyloaded.
2. Keyboard navigation across all interactive elements; visible focus rings.
3. Sentry breadcrumbs for nav/CTA; basic event tracking for key flows.
Tasks / Subtasks
- [ ] Establish baselines and budgets (AC: 1)
- [ ] Record current build metrics and bundle size from `next build` (note in Completion Notes)
- [ ] Define budgets: CLS < 0.1, LCP within prior baseline (or 2.5s on desktop), JS/CSS bundle growth 10%
- [ ] Font optimization (AC: 1)
- [ ] Limit loaded fonts to approved weights: Rajdhani 600/700, Kanit 400/500
- [ ] Remove unused local fonts (DM Serif, Bentham, Share) from `src/app/layout.tsx` and global CSS references
- [ ] Preload only critical fonts via `next/font/local` (display: 'swap') and avoid redundant weights
- [ ] Image and media performance (AC: 1)
- [ ] Ensure all non-hero images use lazy loading (Next/Image defaults) and appropriate sizes
- [ ] Keep hero media `priority` only where necessary to avoid over-fetching
- [ ] Audit `ImageWithFallback` to ensure it forwards width/height/priority and uses `loading="lazy"` when not priority
- [ ] Defer heavy media; use poster images and avoid auto-play with sound
- [ ] Motion and reduced-motion (AC: 2)
- [ ] Respect `prefers-reduced-motion` globally (CSS and framer-motion hooks) and in StickySplit pattern
- [ ] Avoid scrolljacking and ensure passive listeners on scroll/IO
- [ ] Keyboard and focus (AC: 2)
- [ ] Verify visible focus outlines on links, buttons, inputs (tokenized focus styles if needed)
- [ ] Ensure logical tab order with new GlobalSidebar and CommandPalette; ESC closes palette; aria attributes present
- [ ] Add skip-to-content link at top of page
- [ ] Sentry breadcrumbs and event logging (AC: 3)
- [ ] Add lightweight event util in `src/lib/telemetry.ts` to record nav clicks and primary CTAs to Sentry
- [ ] Wire into GlobalSidebar link clicks and key CTAs (e.g., Contact CTA on Projects/Process)
- [ ] SEO and IA updates (AC: 1)
- [ ] Update `src/app/sitemap.ts` to include new routes: `/process/*`, `/studio/*`
- [ ] Verify metadata titles/descriptions for new pages via `generatePageMetadata`
- [ ] Quality gates
- [ ] Lint/build pass: `npm run lint` / `npm run build`
- [ ] Re-measure CLS/LCP after changes; document in Completion Notes; ensure budget
- [ ] Confirm no new 4xx/5xx in Sentry (post-deploy checklist)
Dev Notes
- Context
- PRD Story 1.8. Focus on performance, accessibility, and observability. No schema changes.
- Sidebar is not collapsible by decision; ensure keyboard and focus handling is robust.
- Relevant Source Tree
- Fonts/Layout: `src/app/layout.tsx:1`, `src/app/globals.css:1`
- Images: `src/components/ui/ImageWithFallback.tsx`, usages across pages
- Navigation/Sidebar/Palette: `src/components/Navigation.tsx` (AdminSidebar), GlobalSidebar/CommandPalette (Story 1.2)
- Metadata/Sitemap: `src/lib/metadata.ts`, `src/app/sitemap.ts`
- Sentry: `sentry.client.config.js`, `sentry.server.config.ts`, `sentry.edge.config.ts`
Testing
- Performance
- Use `next build` output and browser DevTools (Performance tab) to spot LCP elements and layout shifts
- Verify images have correct `sizes` and lazy loading; ensure minimal CLS
- Accessibility
- Keyboard-only navigation across core pages; visible focus, skip link works
- Screen reader quick checks (headings/landmarks/labels)
- Observability
- Trigger nav/CTA clicks and confirm breadcrumbs appear in Sentry (locally verify logging calls)
Change Log
| Date | Version | Description | Author |
|------|---------|-------------|--------|
| 2025-09-24 | v1 | Initial draft from PRD Story 1.8 | Scrum Master |
Dev Agent Record
Agent Model Used
{{agent_model_name_version}}
Debug Log References
Completion Notes List
File List
QA Results