Replace placeholder homepage with a Zava-branded design:
- Add app/globals.css design system (CSS variables, light/dark modes,
typography, buttons, product cards, header/footer)
- Add app/layout.tsx with sticky header, nav, and 4-column footer
- Rebuild app/page.tsx with hero, feature strip, and product grid
- Add error/empty states for the products listing
- Update <title>/<description> metadata
The previous code referenced Tailwind utility classes, but Tailwind
is not installed in this repo (those classes were no-ops). This PR
commits to hand-written CSS rather than introducing a new build
dependency.
No new dependencies, no new HTTP handlers, no new DB queries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Summary
Replaces the placeholder homepage with a Zava-branded design system, header, hero, feature strip, polished product cards, and footer.
Changes
app/globals.css(new) — design tokens (CSS variables), light/dark modes, typography stack, buttons, product cards, sticky header, footer.app/layout.tsx(new) — branded sticky header (Z mark + nav + search/account/cart icons) and 4-column footer; proper<title>/<description>metadata.app/page.tsx— hero with eyebrow + display-serif headline + dual CTA + gradient visual; feature strip; product grid using semantic classes; graceful empty/error states.Why hand-written CSS (not Tailwind)
The previous code used Tailwind utility class names, but Tailwind is not in
package.json— those classes were no-ops. Rather than introduce a new build dependency for a styling pass, this PR commits to a hand-written CSS design system with BEM-ish class names. If we want to revisit this and adopt Tailwind/CSS Modules later, that's a one-paragraph ADR worth its own discussion.Security / dependency posture
db.listProductscall is unchanged.Pre-review panel feedback (acknowledged, deferred)
A panel review (architect + security) flagged a few items that are not addressed in this PR and are tracked as follow-ups:
catch {}inpage.tsxwith structured logging.export const revalidate = 60(orunstable_cache) to avoid hitting the DB on every render.href="/"links in nav/footer until real routes exist (SEO/analytics noise).<SiteHeader/>/<SiteFooter/>fromRootLayoutonce a second page variant appears.Per the panel's #1 recommendation, unrelated changes to
tsconfig.jsonandapm.lock.yamlthat were also in my working tree have been left out of this PR and will go in a separate housekeeping PR — the lockfile change in particular (dropsdeployed_file_hashesfor the secure-baseline plugin) deserves its own review.Verification
npm run dev→ HTTP 200 onhttp://localhost:3001, page renders with new styling.Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com