Commit graph

46 commits

Author SHA1 Message Date
Vadym Samoilenko
f8421ed42d feat: blog posts, redesigned sections, video full-width, reviews hover pause
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Blog listing: force-dynamic SSR, new photo cards with date badge + hover animation
- Blog article: custom typography (h1-h3 styling, lists, blockquotes) without plugin
- News.tsx: fix hero image mapping (direct upload, not .image sub-field)
- Reviews.tsx: hover pauses auto-scroll, resumes on mouse leave; fix poster 404
- VideoSection: full viewport width, no container constraint
- next.config.ts: add shumi.ai-impress.com to remotePatterns (fixes 400 on blog images)
- Seed: add _status published for Payload drafts; force-posts flag; real blog photos
- Locations.tsx: per-slug fallback images (fixes all cards showing dinopark photo)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:52:08 +01:00
Vadym Samoilenko
55d25cacac fix(locations): per-slug image fallback — prevents all cards showing dinopark photo
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
When CMS locations exist but have no media (e.g. after volume rebuild), the
component now falls back to the correct figma image per slug instead of
hardcoding loc-dinopark.webp for all cards.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:31:16 +01:00
Vadym Samoilenko
2fa4040114 fix: media uploads 500 error + add video review card to Reviews
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Dockerfile: create /app/media dir with nextjs ownership before USER switch
- docker-compose.prod.yml: mount named volume shumiland-media-uploads → /app/media
- Reviews: add VideoReviewCard component with 9:16 portrait inline player
- Add review-video.mp4 (93s, 720×1280, 15MB) + poster from IMG_8336.MOV

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:17:05 +01:00
Vadym Samoilenko
9562db84e3 feat(blog): add 3 real articles + blog image placeholders to seed
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Add seed data for 3 Shumiland articles (Сезон пригод, Капсула часу, Травень)
- Create public/images/blog/ with placeholder hero images
- Full Lexical body content for each post
- Add makeLexical() helper for paragraph formatting in seed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:08:37 +01:00
Vadym Samoilenko
574b125626 fix: production UI fixes + brand color #396817 + new page backgrounds
- Replace all #223e0d → #396817 across 24 files
- Page bg: #f1fbeb (lightest green tint), BirthdayPricing: #fefaf6 (warm cream)
- Hero: raise text to z-[25] above T-Rex, reduce font clamp, narrow max-w
- PageHero: remove negative z-index that hid photo background
- GallerySlider: replace setInterval+state with rAF+pauseRef, seamless half-wrap reset
- Reviews: fix sub-pixel scroll (speed 0.3 → 1, intervalMs 16 → 20)
- BtnPrimary: gradient background orange→yellow→orange with hover scale
- Footer: add static fallback contacts (phone, address, metro, hours, Instagram, Facebook)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:04:43 +01:00
Vadym Samoilenko
d015c07f7f fix: TS non-null assertion in seed + formatting cleanup across components
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Fixes Object possibly undefined TS2532 in findOrUploadMedia (seed/route.ts:50)
that was blocking production build. All other changes are whitespace/ordering
only (Tailwind class order, SVG attribute expansion).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 13:40:23 +01:00
Vadym Samoilenko
0895f25434 feat(layout): wire CMS logo to Header and Footer with SVG fallback 2026-05-11 13:19:57 +01:00
Vadym Samoilenko
bcdd2a3a2d feat(page-hero): photo bg + overlay for liquid-glass header consistency on inner pages 2026-05-11 13:18:48 +01:00
Vadym Samoilenko
477d50fb60 fix(hero): reduce title clamp and narrow container to prevent T-Rex overlap 2026-05-11 13:18:29 +01:00
Vadym Samoilenko
8ca741bee7 feat(video): autoplay muted loop for local reels, keep YouTube click-to-play 2026-05-11 13:17:09 +01:00
Vadym Samoilenko
5b84bd9cfa fix(whyparents): grid-rows accordion (no page shift) + horizontal gallery per Figma
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:15:48 +01:00
Vadym Samoilenko
125dbc01d7 feat(locations): rebuild LocationsSlider per Figma — 694px cards, rAF scroll, ДЕТАЛЬНІШЕ button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:14:09 +01:00
Vadym Samoilenko
0afa76132a feat(reviews): StarRating component replacing static star image 2026-05-11 13:12:28 +01:00
Vadym Samoilenko
6e3d8c0ad0 fix(useAutoScroll): seamless infinite loop via half-width reset 2026-05-11 13:12:25 +01:00
Vadym Samoilenko
809601adad feat(seed): wire new CMS fields — pageHero bg, gallery, whyParents gallery, unique location images
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:11:10 +01:00
Vadym Samoilenko
2a2ca8c459 chore: canonical static fallback assets for sliders and page-hero
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:09:38 +01:00
Vadym Samoilenko
8b018ffa47 feat(cms): add hero overlays, pageHero bg, news subtitle, map group to HomePage global 2026-05-11 13:08:24 +01:00
Vadym Samoilenko
8c3e28e507 feat: transcode ShumiLand reels to web-optimized MP4+WebM for autoplay
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:06:43 +01:00
Vadym Samoilenko
75f0d6897a perf: clean up extensionless duplicates in public/images/figma
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:04:17 +01:00
Vadym Samoilenko
63af1f86e3 perf: add AVIF/WebP next image config and image optimization script
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:04:04 +01:00
Vadym Samoilenko
a0cde76789 chore: commit session-2 leftover formatting + expanded seed route
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 13:02:30 +01:00
Vadym Samoilenko
dc726c5135 feat: hero dino overlay, WhyParents auto-cycle, YouTube video support
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Hero: T-Rex (hero-bg1) and family moved to z-[20/30], rendered after
  text so dinosaur visually overlaps the title text on desktop
- WhyParents: auto-cycle accordion items every 4s; manual click resets timer
- VideoSection: detect YouTube URLs → render iframe; mp4 uses video tag
- Webp filename cleanup across section components

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 23:29:16 +01:00
Vadym Samoilenko
237bdcaf7d fix: correct location photos from Figma map and add admin reset endpoint
- Crop loc-maze/tir/playground.webp from park map illustration (correct
  Figma source for those 3 location cards; were using wrong gallery photos)
- Update seed to use new filenames + add webp MIME support
- Add ?force=locations seed param to replace existing location records
- Add /api/admin/reset-admin endpoint (requires SYNC_SECRET) to recover
  admin password without manual DB access

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 23:24:05 +01:00
Vadym Samoilenko
ab19c57d09 fix: EZY params nullish + DB migration for new collections
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Fix ZodError: EZY API returns params=null, use .nullish() instead of .optional()
- Add manual SQL migration for new collections (locations, reviews,
  birthday_packages) and schema changes (header ctaLabel/ctaHref,
  navLinks autoChildrenFrom/children, homepage sectionTitles/whyParents/
  gallery/video/birthdayIntro groups)
- Note: push:true doesn't run CLI drizzle-kit in standalone build;
  run migrations/0001_new_collections.sql manually on new environments

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 23:08:15 +01:00
Vadym Samoilenko
96dc23b74b perf: compress images to WebP (-97%) and fix slider/performance issues
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- Convert all 40+ public/images/figma assets from raw PNG/JPG to WebP at
  max 1920px, 82% quality: 397 MB → 13 MB total (96.7% reduction)
- Update all component image references to .webp
- Add 1-year Cache-Control headers for /images/* and /_next/static/*
- Fix GallerySlider initial scroll offset (first card no longer clipped by mask)
- Fix arrow2.svg missing explicit width/height (Lighthouse unsized-images)
- Hero, LocationsSlider: aspect-ratio height + seamless infinite loop (prior session)
- Add drizzle-kit to dependencies for production schema push (prior session)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:49:46 +01:00
Vadym Samoilenko
a5a9410c07 fix: enable Drizzle push:true to auto-create tables on startup
Fresh production DB has no migration files; push:true bootstraps the
schema without needing the payload migrate CLI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:18:45 +01:00
Vadym Samoilenko
78abd0382c fix: make EZY/Binotel/Resend env vars optional — app works without integrations
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:04:25 +01:00
Vadym Samoilenko
2b9a5cf640 fix: lazy-initialize Resend client to avoid missing API key error at build time
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:01:19 +01:00
Vadym Samoilenko
69a3e48dda fix: add type declaration for @payloadcms/next/css side-effect import
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:57:41 +01:00
Vadym Samoilenko
557bf5a1b5 feat: forms, analytics, footer, LocationsSlider fix
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- GroupRequestForm: full form with group type/size/date, POST /api/leads
- BirthdayBookingForm: birthday booking with package preselect from ?package=, POST /api/leads
- Leads collection: added message, groupSize, preferredDate, packageSlug fields
- GoogleAnalytics + BinotelWidget: Script-based, loaded from SiteSettings global
- layout.tsx: generateMetadata from SiteSettings, GA4 + Binotel wired
- Footer: full render — logo, nav links, contacts, socials from CMS
- LocationsSlider: BtnGradient href fixed to /kvytky?category=slug
- utm.ts: added getUtmParams() client helper

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:50:06 +01:00
Vadym Samoilenko
d5f880d631 fix: replace npx with pnpm exec in husky hook, clear shamefully-hoist from .npmrc
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:40:30 +01:00
Vadym Samoilenko
1cd20291d0 feat: wire all sections to Payload CMS + header dropdown + deploy config
- New collections: Locations, Reviews, BirthdayPackages
- New lib: getHomeData() — single cache-wrapped data fetch for homepage
- All sections now read from CMS with static fallbacks
- Header dropdown auto-populates 5 locations from Locations collection
- Seed API at /api/admin/seed creates all collections + uploads media
- docker-compose.prod.yml: replaced nginx/certbot with Traefik labels (shumi.ai-impress.com)
- Fixed image assignments: Locations 3-5 use gallery images (not news-bg)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 21:39:29 +01:00
Vadym Samoilenko
3226789bd1 feat: refactor frontend components and add PageHero
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Refactored slider components (Gallery, Locations), Hero section with data-driven approach, WhyParents layout, and frontend page layouts. Added PageHero reusable component and ignored debug screenshots/playwright runtime in .gitignore.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:41:46 +01:00
Vadym Samoilenko
86debfcdb1 fix: resolve admin crash, Hero data-driven, TS errors, lint script
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- (payload)/layout.tsx: add RootLayout + handleServerFunctions to fix
  Payload CMS admin 500 (PageConfigProvider missing outer ConfigProvider)
- Hero.tsx: make fully data-driven (null guard, dynamic title/subtitle/cta,
  backgroundImage/backgroundVideo support, javascript: href sanitization)
- Hero.test.tsx: use getAllByText for dual-layout subtitle assertions
- BtnPrimary.figma.ts, NavLink.figma.ts: fix TS2339 (TextHandle|ErrorHandle)
- package.json: replace next lint with eslint src/ (next lint removed in v16),
  add --webpack flag to dev script to avoid Turbopack instability

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 17:27:10 +01:00
Vadym Samoilenko
e644ee899a feat: update components and add useAutoScroll hook
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 16:58:34 +01:00
Vadym Samoilenko
cca4ea1d55 feat: implement full frontend — all sections, components, Figma Code Connect
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- All 8 home page sections: Hero, Locations slider, WhyParents accordion,
  Birthday pricing cards, Video, Gallery, Reviews slider, News
- UI components: NavLink, BtnPrimary, BtnGradient, BtnDetails, AccordionItem
- Layout: sticky Header (NavLink + BtnPrimary), Footer with logo
- Figma Code Connect: 5 components published (.figma.tsx + figma.config.json)
- Public assets: all Figma images and SVGs exported
- Pages: /kvytky, /lokatsii, /blog, /dni-narodzhennia, /grupovi-vidviduvannia
- Tests: Vitest unit/api suites, Playwright e2e screenshots
- Payload CMS: blocks, collections, seed data updates
- Hero negative-margin to extend behind sticky header
- Custom Tailwind breakpoints: lg=1440px, xl=1920px
- Fix ESLint config: drop FlatCompat, use eslint-config-next flat export
- Add tsconfig.tsbuildinfo, test-results/, agentdb.rvf* to .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 16:40:56 +01:00
Vadym Samoilenko
4fc2ab88dd fix: read POSTGRES_PASSWORD from .env in docker-compose.yml
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 20:24:12 +01:00
Vadym Samoilenko
e2e9ce1591 fix: add missing @tailwindcss/postcss dependency (required for Tailwind v4)
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 20:17:38 +01:00
Vadym Samoilenko
eaa200fb68 chore: add .env with project credentials (private repo)
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 19:27:37 +01:00
Vadym Samoilenko
d14d7a2cb3 chore: add create-env.sh script for dev/prod env generation
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 19:27:17 +01:00
Vadym Samoilenko
ae9a7cff11 chore: add env files to repo (private repo)
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
2026-05-09 19:21:24 +01:00
Vadym Samoilenko
9b41fa447a feat: complete backend B1-B7 — Payload CMS, ezy payments, leads, deploy
Some checks are pending
CI / Type Check (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Unit Tests (push) Waiting to run
Deploy / Build & Push Image (push) Waiting to run
Deploy / Deploy to VPS (push) Blocked by required conditions
- B1: Next.js 15 + Payload CMS 3.0 + Postgres 16, ESLint, Prettier, Husky, Vitest
- B2: 9 collections, 6 globals, 12 Page Builder blocks, access control, slugify/revalidate hooks
- B3: ezy.com.ua payments, Binotel HMAC webhook, leads API, Telegram bot, Resend email, rate limiting
- B4: Tariffs collection with ezy API sync (cron + manual), dynamic pricing source-of-truth
- B5: 13 test files covering unit libs and all API routes
- B6: Dockerfile multi-stage, docker-compose.prod.yml, nginx.conf SSL, GitHub Actions CI/CD, health endpoint
- B7: docs/admin-guide-ua.md (marketer guide), docs/deploy.md (VPS instructions), README quickstart

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 19:14:54 +01:00
Vadym Samoilenko
83fad62732 chore: remove AI tooling files from repository
Exclude .claude/, .claude-flow/, .mcp.json, CLAUDE.md from tracking.
These are local Claude Code / Ruflo configuration files and should
not be part of the project source.

Updated .gitignore to permanently ignore all AI tooling directories.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 17:31:41 +01:00
Vadym Samoilenko
32f844599e Merge remote README 2026-05-09 17:30:07 +01:00
Vadym Samoilenko
fd70c79421 Init: ruflo project setup with Claude Code configuration
- Add .gitignore (DB, secrets, runtime data excluded)
- Add CLAUDE.md with ruflo agent orchestration rules
- Add .mcp.json with ruflo MCP server config
- Add .claude/ with agents, commands, hooks, helpers, skills
- Add .claude-flow/ with swarm config, coordination store, metrics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 17:29:47 +01:00
e65b37f720 Initial commit 2026-05-09 16:27:53 +00:00