makeLexical moved to module scope and applied to locations.shortDesc,
home-page subtitle/whyParents/birthdayIntro/news, dinosaur-page
descriptions; seed-legal.mjs wraps legal texts for jsonb columns.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
shortDesc is richText since 0021 but /lokatsii and the home Locations section
still rendered it as a string (object-as-React-child crash once data exists).
payload-types.ts and payload-generated-schema.ts were stale since the
conversion commits.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Migrations 0020/0021/0022 converted textarea columns to jsonb with USING NULL,
discarding all existing content. Restore values from the 2026-06-10 pre-webp
backup, wrapped as Lexical editor state. Idempotent (IS NULL guard). Three
birthday package items created after the backup got new placeholder copy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0021 failed on dinosaur_page_why_visit_items, dyvolis_page_why_visit_items,
locations_why_visit_items because those columns had NOT NULL constraints
(from Payload required: true). Drop constraint first, then change type to jsonb.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers: group_visits_page, dinosaur_page, dyvolis_page, tickets_page, home_page,
birthday_page, locations, legal_pages child tables and their _v version tables.
All blocks are idempotent (check data_type IN varchar/text before altering).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add src/fields/richText.ts: standardEditor (all defaultFeatures) and blogEditor
(defaultFeatures + UploadFeature for media + EXPERIMENTAL_TableFeature)
- Apply standardEditor to ThankYouPage, CheckoutPage, GroupVisitsPage, Tariffs, Locations
- Apply blogEditor to BlogPosts — editors can now insert images inline via Upload button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change heroDescription, featureText, bottomText fields from textarea to richText (Lexical)
in GroupVisitsPage global so admins can format paragraphs and bold text in admin UI
- Render rich text fields with <RichText> component on the frontend
- Migration: ALTER varchar → jsonb for the three fields; UPDATE header cta_href and
birthday_page_pricing_packages cta_href from /kvytky to /payments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously filtered only categoryTag==='dyno'; EZY returns 'zone'
for Динопарк. Mirrors the same pattern already used in DyvoLisTickets.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- /payments now serves the main ticket catalog (was /kvytky)
- /checkout serves the legacy single-tariff checkout form
- All /kvytky references updated across components, layout, lib, seed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Hide img overlay on .playing so video is visible when playing
- Add controls on play click
- When no poster: show video directly with preload=metadata (native first frame)
- why-grid left col 704px → minmax(0,500px) so video column gets more space
- video-card: flex fills available width, absolute positioning for img/video stack
- aspect-ratio 9:16 for portrait video
- Strip absolute origin from video/poster src (fixes cert error from shumi.ai-impress.com)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Background-image on the element is always behind content — no overlay div
needed. card-pattern-arcs.svg (360×360 arc circles, #70b030 strokes)
is visible on dark green without opacity tricks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PageHero: swap opaque green fill for subtle black gradient so hero photo shows through
- Locations cards: add card-wave-green.svg pattern on top of solid green bg
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On mobile (< 768px) the stacked cards had rotated/offset transforms
that were clipped by the overflow-hidden container. Now mid/back cards
are hidden (opacity 0) and the front card renders flat — no clipping.
Desktop stack layout is unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move hero title plate to the bottom of the photo so faces stay visible
- Admin can now set hero title/subtitle size (px) and font
(Montserrat/Poppins/Inter); mobile scales via clamp()
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PNG sources re-encoded losslessly, oversized JPGs at q92:
22 files, 13.6MB -> 4.5MB. JPGs that would grow after
re-encoding are kept as-is. References updated; originals
kept on disk since CMS rows may still point at them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On narrow screens the cover-cropped hero photo lands under the
heading text, making it unreadable. Add a light gradient overlay
behind the text at <=640px.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Container now full-width with overflow-hidden on mobile; cards fill container.
Fixed w-[520px] was overflowing 360px viewport by 160px.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add checkbox field to control whether a location card appears on /lokatsii.
Default true so existing entries remain visible. Filter added to getLocations query.
Migration 20260610_140000 adds show_on_lokatsii boolean column with DEFAULT true.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- beforeChange hook: when ezy_id changes, fetch tariff from ezy API,
populate last_synced_name/price/at; throw if ezy_id not found
- POST /api/tariffs/[id]/sync-ezy: re-sync a specific tariff on demand
- SyncEzyButton: custom Payload UI field component with loading/ok/error states
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Field was readOnly in UI but protected by access control already.
Removing readOnly lets admins clear ezy_id when a tariff isn't in ezy yet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
buildComboCards now uses ezy tariffs as primary source when available.
Static cards are only used for descriptions and as fallback when ezy is down.
This removes test/placeholder cards and fixes mismatched prices from CMS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
At Docker build time Next.js renders /kvytky statically before the server
starts, so getTariffs() gets empty array. KvytkyTicketsClient now fetches
/api/tickets/tariffs on mount when serverTariffs is empty.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- revalidatePath + kvytky page: use http://localhost:3000 for server-to-self
fetches (was using NEXT_PUBLIC_SITE_URL with self-signed HTTPS → Node rejected cert)
- Footer: strip hostname from Payload media URL (same fix as Header)
- DyvoLisTickets: show zone ticket named 'Диво' for individual dyvolis tickets
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Header: strip hostname from Payload media URL in resolveLogoUrl (was showing IP)
- DyvoLisTickets: prefer 'dyvolis' category over 'dyno' for single tickets
- DyvoLisWhyVisit: narrow accordion (628→480px), remove video max-w cap
- migration 0017: seed 3 extra birthday package items (rows 4-6) so CMS block is editable
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ALTER TABLE home_page + _home_page_v to add the new varchar column
for the Google review URL field added to sectionTitles group.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add googleReviewUrl text field to HomePage.sectionTitles group so editors
can update the Google review link without a deploy. Falls back to the
hardcoded URL when the field is empty.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Copy original lossless PNG to public/images/locations/ as hero bg fallback
(bypasses Payload WebP compression entirely when CMS has no image)
- Fallback heroBgUrl to static PNG so the banner always renders
- Raise Media collection WebP quality: 82→88 (mobile/tablet), 85→92 (original+desktop)
Future re-uploads will have noticeably better quality
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Terminates HTTPS on port 443 with self-signed cert, redirects :80 to HTTPS.
Required for Payload admin CSRF (browsers only send Sec-Fetch-Site in secure context).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace hardcoded video-only VideoSlider with SideSlider that accepts
any images array. If CMS sideGallery images exist, show them without
the play button; otherwise fall back to static video thumbnail with
play button as before.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Allow editors to upload custom background pattern images for the birthday
section cards (green cards and featured orange card) from the CMS admin.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>