Tested the site's main pages at mobile (390x844, iPhone 12) and tablet (768x1024, iPad) viewports using Playwright. The site is generally well-built for responsive — it uses sensible Tailwind breakpoints and the layouts scale reasonably. However, there are a few layout issues worth addressing, plus two pre-existing bugs that block the guides and blog article pages.
- File:
frontend/src/content/guides/what-to-write/sympathy-card.mdx - Issue:
matter()insrc/lib/guides.ts:27throwsYAMLExceptionparsing the frontmatter. Thedate: 2026-02-19value is being interpreted as a YAML date literal causing a block mapping parse error. The birthday card has the same format and works, so this may be caused by an invisible character or encoding issue in the file. - Fix: Quote the date value:
date: '2026-02-19'(anddateModified). Or regenerate the file to eliminate hidden characters.
- File:
frontend/src/app/(main)/blog/[slug]/page.tsx:14 - Issue:
function generateStaticParams()is not exported. Next.js requiresexport function generateStaticParams()foroutput: 'export'mode. - Fix: Add
exportkeyword:export function generateStaticParams()
- File:
frontend/src/components/home/card-showcase.tsx:57 - Current:
grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3— shows 3 cards in a 2+1 layout on tablet, leaving one card orphaned on a row by itself - Tweak: Change to
md:grid-cols-2 lg:grid-cols-3so tablet stays single-column, or show only 2 cards atsm(slice to 2 on smaller screens). Recommended: change breakpoint fromsmtomdso the 2-col grid only kicks in at 768px+ where it has more room, and uselg:grid-cols-3for desktop.
- File:
frontend/src/components/home/card-showcase.tsx:61 - Current:
aspect-[5/7]on each card image — at 390px width, each card is ~550px tall. With 3 cards stacked, users scroll through ~1800px of cards alone. - Tweak: Consider showing only 2 cards on mobile (
sampleCards.slice(0, 2)at small viewports), or reduce the aspect ratio on mobile (e.g.,aspect-[4/5] sm:aspect-[5/7]). Alternatively, switch to a horizontal scroll carousel on mobile.
- File:
frontend/src/components/home/how-it-works.tsx:71 - Current:
grid grid-cols-1 gap-8 sm:grid-cols-3— each step takes significant vertical space on mobile - Tweak: Use a more compact layout on mobile with icon and text side-by-side:
flex flex-col sm:grid sm:grid-cols-3 gap-6 sm:gap-8. Each mobile item could useflex flex-row items-start gap-4to place icon left and text right, reducing vertical footprint.
- File:
frontend/src/components/layout/footer.tsx:6 - Current:
flex items-center justify-center gap-6— on very narrow screens (< 360px) the footer items could collide - Tweak: Add
flex-wrapto the footer container. Optionally reducegap-6togap-4 sm:gap-6for tighter spacing on mobile. Could also stack vertically on mobile:flex-col sm:flex-row gap-2 sm:gap-6.
- File:
frontend/src/app/(main)/create/page.tsx/frontend/src/components/create/upload-step.tsx - Current: Content is narrow (
max-w-4xl) and centered, leaving large empty areas on tablet - Tweak: This is minor and mostly aesthetic. Could be left as-is since it works fine functionally. If desired, the upload drop zone could expand to fill more width by removing max-width constraints on tablet.
| Priority | Change | File |
|---|---|---|
| P0 - Bug | Export generateStaticParams |
blog/[slug]/page.tsx |
| P0 - Bug | Fix YAML date parsing in sympathy card | sympathy-card.mdx |
| P1 | Fix orphaned card on tablet (change sm: to md: breakpoint) |
card-showcase.tsx |
| P1 | Add flex-wrap to footer |
footer.tsx |
| P2 | Compact "How it works" on mobile | how-it-works.tsx |
| P2 | Reduce card height / count on mobile | card-showcase.tsx |
| P3 | Create page whitespace (optional) | upload-step.tsx |
pnpm devand open the site- Use browser devtools responsive mode to test at 390px, 768px, and 1024px
- Verify guides page (
/guides/what-to-write) loads without error - Verify blog article pages (
/blog/[slug]) load without error - Verify card showcase grid looks correct at all breakpoints (no orphaned cards)
- Verify footer wraps gracefully at narrow widths
pnpm typecheckandpnpm testpass