No description
Find a file
Vadym Samoilenko 54205244ad perf: Phase 9 — mobile optimization + animations (Lighthouse 90+)
Bundle size:
- MobileNav: framer-motion → LazyMotion+domAnimation (~79KB saved on mobile)
- FeaturesBlock: remove `import * as LucideIcons` (entire icon lib), replace with emoji detector + single Star fallback

Images:
- Add `sizes` prop to all fill images (blog, events, blog-post, hero, blog-preview)
- Prevents downloading desktop-sized images on mobile

Mobile CSS (globals.css):
- font-size: 16px on body (prevents iOS Safari auto-zoom on inputs)
- scroll-behavior: smooth only under prefers-reduced-motion: no-preference
- overflow-x: hidden (no horizontal scroll on mobile)
- touch-action: manipulation on a/button (removes 300ms tap delay)
- min-height: 44px on buttons (WCAG 2.5.5 touch targets)
- Container: px-4 on mobile, px-6 on sm+ (better on 320px screens)
- scrollbar-gutter: stable (prevents CLS from scrollbar appearing)

Form inputs: text-base (16px) prevents iOS auto-zoom

Layout:
- Cache SiteSettings with unstable_cache (revalidate: 60s) — reduces Payload DB hits
- Add preconnect/dns-prefetch hints for Google Fonts, GTM, analytics, Binotel, ezy

Mobile touch targets:
- Hamburger + close buttons: w-12 h-12 (48px, up from 40px)

Animations (Framer Motion with LazyMotion):
- FadeIn.tsx: viewport-triggered fade+slide, respects prefers-reduced-motion
- StaggerContainer.tsx: stagger children on scroll-into-view
- Hero: FadeIn wrapper on content
- Features: StaggerContainer + StaggerItem on each card

GTM events:
- GTMPageEvent.tsx: reusable client component for page-level events
- /thank-you: fires `purchase` event on load
- /blog/[slug]: fires `blog_view` event with post_title + post_slug

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 17:48:18 +01:00
.claude feat: Phase 2 complete — content model, blocks, collections, globals 2026-04-02 17:52:54 +01:00
docker/postgres feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
src perf: Phase 9 — mobile optimization + animations (Lighthouse 90+) 2026-04-04 17:48:18 +01:00
.env.example feat: Phase 8 — seed, security, loading skeleton, CSP 2026-04-04 17:40:25 +01:00
.gitignore feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
.npmrc feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
.pnpmfile.cjs feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
components.json feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
CONTEXT_HANDOVER.md docs: add implementation_plan.md and CONTEXT_HANDOVER.md 2026-04-02 17:56:12 +01:00
docker-compose.yml feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
Dockerfile feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
implementation_plan.md feat: Phase 5 — Lead API, Binotel, Twenty CRM 2026-04-04 17:23:17 +01:00
next-env.d.ts feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
next.config.ts feat: Phase 8 — seed, security, loading skeleton, CSP 2026-04-04 17:40:25 +01:00
package.json fix: bug fixes + Phase 3 middleware/UTM 2026-04-04 17:09:36 +01:00
pnpm-lock.yaml feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
postcss.config.mjs fix: bug fixes + Phase 3 middleware/UTM 2026-04-04 17:09:36 +01:00
tsconfig.json feat: Фаза 1 — фундамент проєкту Shumiland 2026-04-02 14:54:13 +01:00
tsconfig.tsbuildinfo feat: Phase 6 — Ticket payment (ezy.com.ua → Monobank) 2026-04-04 17:27:22 +01:00