diff --git a/media/blog-sezon-prigod-vdkrito-shumiland-na-vdng-zaproshu-u-svt-de-ozhivayut-dinozavri-ta-kazki.webp b/media/blog-sezon-prigod-vdkrito-shumiland-na-vdng-zaproshu-u-svt-de-ozhivayut-dinozavri-ta-kazki.webp new file mode 100644 index 0000000..134b281 Binary files /dev/null and b/media/blog-sezon-prigod-vdkrito-shumiland-na-vdng-zaproshu-u-svt-de-ozhivayut-dinozavri-ta-kazki.webp differ diff --git a/media/blog-traven-u-shumlend-msyats-prigod-dlya-vs-rodini.webp b/media/blog-traven-u-shumlend-msyats-prigod-dlya-vs-rodini.webp new file mode 100644 index 0000000..7593184 Binary files /dev/null and b/media/blog-traven-u-shumlend-msyats-prigod-dlya-vs-rodini.webp differ diff --git a/media/blog-u-shumlend-zaklali-kapsulu-chasu.webp b/media/blog-u-shumlend-zaklali-kapsulu-chasu.webp new file mode 100644 index 0000000..621bf4d Binary files /dev/null and b/media/blog-u-shumlend-zaklali-kapsulu-chasu.webp differ diff --git a/public/images/figma/081e52b5-d35a-41d2-b506-a9d751b0b563.png b/public/images/figma/081e52b5-d35a-41d2-b506-a9d751b0b563.png index 4ef4fe3..65bf8d1 100644 Binary files a/public/images/figma/081e52b5-d35a-41d2-b506-a9d751b0b563.png and b/public/images/figma/081e52b5-d35a-41d2-b506-a9d751b0b563.png differ diff --git a/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.jpg b/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.jpg index cea3953..1396893 100644 Binary files a/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.jpg and b/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.jpg differ diff --git a/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.webp b/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.webp index 226d4e5..22b5866 100644 Binary files a/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.webp and b/public/images/figma/109f13b4-25f9-4f94-a06d-77421ff2b4fe.webp differ diff --git a/public/images/figma/17d78753-cec3-40ca-a1fc-4125c2b79eff.png b/public/images/figma/17d78753-cec3-40ca-a1fc-4125c2b79eff.png index b02a349..7929019 100644 Binary files a/public/images/figma/17d78753-cec3-40ca-a1fc-4125c2b79eff.png and b/public/images/figma/17d78753-cec3-40ca-a1fc-4125c2b79eff.png differ diff --git a/public/images/figma/2936ec5e-4f99-441e-9bf2-34f23c283170.jpg b/public/images/figma/2936ec5e-4f99-441e-9bf2-34f23c283170.jpg index 67e43f4..93ea1e3 100644 Binary files a/public/images/figma/2936ec5e-4f99-441e-9bf2-34f23c283170.jpg and b/public/images/figma/2936ec5e-4f99-441e-9bf2-34f23c283170.jpg differ diff --git a/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.jpg b/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.jpg index 403ab2a..038a8d5 100644 Binary files a/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.jpg and b/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.jpg differ diff --git a/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.webp b/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.webp index 33b457a..e59a2c6 100644 Binary files a/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.webp and b/public/images/figma/2c6a3e5e-7346-4c3e-b8a0-fae1facb87ad.webp differ diff --git a/public/images/figma/455670b9-c89a-4bea-81fe-5a4d93b25483.png b/public/images/figma/455670b9-c89a-4bea-81fe-5a4d93b25483.png index 8e91cca..a6a1b78 100644 Binary files a/public/images/figma/455670b9-c89a-4bea-81fe-5a4d93b25483.png and b/public/images/figma/455670b9-c89a-4bea-81fe-5a4d93b25483.png differ diff --git a/public/images/figma/58218f84-457d-4ff5-8d4e-2ace40b45568.png b/public/images/figma/58218f84-457d-4ff5-8d4e-2ace40b45568.png index ddf8fe2..3157bed 100644 Binary files a/public/images/figma/58218f84-457d-4ff5-8d4e-2ace40b45568.png and b/public/images/figma/58218f84-457d-4ff5-8d4e-2ace40b45568.png differ diff --git a/public/images/figma/640999e1-7096-4623-bf96-12bb8ef62ffc.png b/public/images/figma/640999e1-7096-4623-bf96-12bb8ef62ffc.png index 4d33264..5cd8e5d 100644 Binary files a/public/images/figma/640999e1-7096-4623-bf96-12bb8ef62ffc.png and b/public/images/figma/640999e1-7096-4623-bf96-12bb8ef62ffc.png differ diff --git a/public/images/figma/7a2627b2-b6ce-4325-a0b1-fbc3393aca4c.png b/public/images/figma/7a2627b2-b6ce-4325-a0b1-fbc3393aca4c.png index a51e19e..4773100 100644 Binary files a/public/images/figma/7a2627b2-b6ce-4325-a0b1-fbc3393aca4c.png and b/public/images/figma/7a2627b2-b6ce-4325-a0b1-fbc3393aca4c.png differ diff --git a/public/images/figma/908a8aab-6129-4d7d-b7ac-c43b6fa60044.png b/public/images/figma/908a8aab-6129-4d7d-b7ac-c43b6fa60044.png index 1ed577a..06104aa 100644 Binary files a/public/images/figma/908a8aab-6129-4d7d-b7ac-c43b6fa60044.png and b/public/images/figma/908a8aab-6129-4d7d-b7ac-c43b6fa60044.png differ diff --git a/public/images/figma/abacda18-57c7-441d-9313-c70d22c6f0f0.png b/public/images/figma/abacda18-57c7-441d-9313-c70d22c6f0f0.png index 9bbb574..c52b713 100644 Binary files a/public/images/figma/abacda18-57c7-441d-9313-c70d22c6f0f0.png and b/public/images/figma/abacda18-57c7-441d-9313-c70d22c6f0f0.png differ diff --git a/public/images/figma/ac7f3a5e-0e66-4971-bccc-89901a7c314d.png b/public/images/figma/ac7f3a5e-0e66-4971-bccc-89901a7c314d.png index 158f852..269b1ff 100644 Binary files a/public/images/figma/ac7f3a5e-0e66-4971-bccc-89901a7c314d.png and b/public/images/figma/ac7f3a5e-0e66-4971-bccc-89901a7c314d.png differ diff --git a/public/images/figma/birthday-altanka.jpg b/public/images/figma/birthday-altanka.jpg deleted file mode 100644 index 404dfd8..0000000 Binary files a/public/images/figma/birthday-altanka.jpg and /dev/null differ diff --git a/public/images/figma/birthday-animators.jpg b/public/images/figma/birthday-animators.jpg index 2900cce..8752d50 100644 Binary files a/public/images/figma/birthday-animators.jpg and b/public/images/figma/birthday-animators.jpg differ diff --git a/public/images/figma/birthday-aquagrim.jpg b/public/images/figma/birthday-aquagrim.jpg index 0e22c2c..a207fe9 100644 Binary files a/public/images/figma/birthday-aquagrim.jpg and b/public/images/figma/birthday-aquagrim.jpg differ diff --git a/public/images/figma/birthday-dinopark.jpg b/public/images/figma/birthday-dinopark.jpg index e48ce06..e16118b 100644 Binary files a/public/images/figma/birthday-dinopark.jpg and b/public/images/figma/birthday-dinopark.jpg differ diff --git a/public/images/figma/birthday-dyvolis.jpg b/public/images/figma/birthday-dyvolis.jpg index c399733..0bffe00 100644 Binary files a/public/images/figma/birthday-dyvolis.jpg and b/public/images/figma/birthday-dyvolis.jpg differ diff --git a/public/images/figma/birthday-hero-bg.jpg b/public/images/figma/birthday-hero-bg.jpg index 54d242c..972fc98 100644 Binary files a/public/images/figma/birthday-hero-bg.jpg and b/public/images/figma/birthday-hero-bg.jpg differ diff --git a/public/images/figma/birthday-labyrinth.jpg b/public/images/figma/birthday-labyrinth.jpg index a17699c..aec0aa8 100644 Binary files a/public/images/figma/birthday-labyrinth.jpg and b/public/images/figma/birthday-labyrinth.jpg differ diff --git a/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.png b/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.png index e762eef..62fe078 100644 Binary files a/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.png and b/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.png differ diff --git a/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.webp b/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.webp index 2a63a1d..3ecd268 100644 Binary files a/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.webp and b/public/images/figma/c3053789-6cd0-4dda-9774-d4ae4bc400e1.webp differ diff --git a/public/images/figma/dino-oviraptor.png b/public/images/figma/dino-oviraptor.png index bd2ff43..01a743f 100644 Binary files a/public/images/figma/dino-oviraptor.png and b/public/images/figma/dino-oviraptor.png differ diff --git a/public/images/figma/dino-pterodactyl.png b/public/images/figma/dino-pterodactyl.png index c9e02ea..2ef0aae 100644 Binary files a/public/images/figma/dino-pterodactyl.png and b/public/images/figma/dino-pterodactyl.png differ diff --git a/public/images/figma/dino-trex2.png b/public/images/figma/dino-trex2.png index a7fee7e..cc83cbc 100644 Binary files a/public/images/figma/dino-trex2.png and b/public/images/figma/dino-trex2.png differ diff --git a/public/images/figma/dino-trex3.png b/public/images/figma/dino-trex3.png index 1b3c1b9..3e4b27d 100644 Binary files a/public/images/figma/dino-trex3.png and b/public/images/figma/dino-trex3.png differ diff --git a/public/images/figma/dino-triceratops.png b/public/images/figma/dino-triceratops.png index b63e006..59b5353 100644 Binary files a/public/images/figma/dino-triceratops.png and b/public/images/figma/dino-triceratops.png differ diff --git a/public/images/figma/dyno-attraction.png b/public/images/figma/dyno-attraction.png index bfcdf97..f21e814 100644 Binary files a/public/images/figma/dyno-attraction.png and b/public/images/figma/dyno-attraction.png differ diff --git a/public/images/figma/dyno-attraction.webp b/public/images/figma/dyno-attraction.webp index 4f4fb2a..5b1dab7 100644 Binary files a/public/images/figma/dyno-attraction.webp and b/public/images/figma/dyno-attraction.webp differ diff --git a/public/images/figma/dyno-gallery-1.jpg b/public/images/figma/dyno-gallery-1.jpg index b02a349..af87dae 100644 Binary files a/public/images/figma/dyno-gallery-1.jpg and b/public/images/figma/dyno-gallery-1.jpg differ diff --git a/public/images/figma/dyno-gallery-2.jpg b/public/images/figma/dyno-gallery-2.jpg index 9be042b..77c2465 100644 Binary files a/public/images/figma/dyno-gallery-2.jpg and b/public/images/figma/dyno-gallery-2.jpg differ diff --git a/public/images/figma/dyno-gallery-2.webp b/public/images/figma/dyno-gallery-2.webp index fb2ac68..f3c1e07 100644 Binary files a/public/images/figma/dyno-gallery-2.webp and b/public/images/figma/dyno-gallery-2.webp differ diff --git a/public/images/figma/dyno-gallery-3.jpg b/public/images/figma/dyno-gallery-3.jpg index 3bb7786..f5c5c5a 100644 Binary files a/public/images/figma/dyno-gallery-3.jpg and b/public/images/figma/dyno-gallery-3.jpg differ diff --git a/public/images/figma/dyno-gallery-3.webp b/public/images/figma/dyno-gallery-3.webp index 9a075d4..ebfd201 100644 Binary files a/public/images/figma/dyno-gallery-3.webp and b/public/images/figma/dyno-gallery-3.webp differ diff --git a/public/images/figma/dyno-gallery-4.jpg b/public/images/figma/dyno-gallery-4.jpg index 0a4a4ea..ce8a07f 100644 Binary files a/public/images/figma/dyno-gallery-4.jpg and b/public/images/figma/dyno-gallery-4.jpg differ diff --git a/public/images/figma/dyno-gallery-4.webp b/public/images/figma/dyno-gallery-4.webp index 23a53e8..c398135 100644 Binary files a/public/images/figma/dyno-gallery-4.webp and b/public/images/figma/dyno-gallery-4.webp differ diff --git a/public/images/figma/dyno-hero-combined.png b/public/images/figma/dyno-hero-combined.png index bca0486..0db74b1 100644 Binary files a/public/images/figma/dyno-hero-combined.png and b/public/images/figma/dyno-hero-combined.png differ diff --git a/public/images/figma/dyno-hero-combined.webp b/public/images/figma/dyno-hero-combined.webp index a14c457..dc2a4a6 100644 Binary files a/public/images/figma/dyno-hero-combined.webp and b/public/images/figma/dyno-hero-combined.webp differ diff --git a/public/images/figma/dyno-hero.webp b/public/images/figma/dyno-hero.webp index 4cf7eef..d5938ce 100644 Binary files a/public/images/figma/dyno-hero.webp and b/public/images/figma/dyno-hero.webp differ diff --git a/public/images/figma/dyno-video-poster.png b/public/images/figma/dyno-video-poster.png index 404dfd8..3f7660f 100644 Binary files a/public/images/figma/dyno-video-poster.png and b/public/images/figma/dyno-video-poster.png differ diff --git a/public/images/figma/dyno-wheel/triceratops.png b/public/images/figma/dyno-wheel/triceratops.png index b63e006..59b5353 100644 Binary files a/public/images/figma/dyno-wheel/triceratops.png and b/public/images/figma/dyno-wheel/triceratops.png differ diff --git a/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.png b/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.png index e6935c8..976e332 100644 Binary files a/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.png and b/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.png differ diff --git a/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.webp b/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.webp index cbab9f9..809d13f 100644 Binary files a/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.webp and b/public/images/figma/e42d6611-82e6-47b0-9d84-271f9810ab1a.webp differ diff --git a/public/images/figma/e9a8cee6-6ee5-4c74-b270-1c133a762c0a.png b/public/images/figma/e9a8cee6-6ee5-4c74-b270-1c133a762c0a.png index dcf46cd..e796e98 100644 Binary files a/public/images/figma/e9a8cee6-6ee5-4c74-b270-1c133a762c0a.png and b/public/images/figma/e9a8cee6-6ee5-4c74-b270-1c133a762c0a.png differ diff --git a/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.png b/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.png index 3bb7786..fc30131 100644 Binary files a/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.png and b/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.png differ diff --git a/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.webp b/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.webp index 9a075d4..ebfd201 100644 Binary files a/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.webp and b/public/images/figma/f4e2bff2-754c-460c-baba-baa95521bfc9.webp differ diff --git a/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.png b/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.png index ebd8f3f..844f57a 100644 Binary files a/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.png and b/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.png differ diff --git a/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.webp b/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.webp index 4e561ad..e82b311 100644 Binary files a/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.webp and b/public/images/figma/f5d32fc0-8ea7-4fd1-b193-819d6aa1a68e.webp differ diff --git a/public/images/figma/gallery-2.png b/public/images/figma/gallery-2.png index ebd8f3f..844f57a 100644 Binary files a/public/images/figma/gallery-2.png and b/public/images/figma/gallery-2.png differ diff --git a/public/images/figma/gallery-4.png b/public/images/figma/gallery-4.png index b02a349..7929019 100644 Binary files a/public/images/figma/gallery-4.png and b/public/images/figma/gallery-4.png differ diff --git a/public/images/figma/gallery-6.png b/public/images/figma/gallery-6.png index e762eef..62fe078 100644 Binary files a/public/images/figma/gallery-6.png and b/public/images/figma/gallery-6.png differ diff --git a/public/images/figma/gallery-7.png b/public/images/figma/gallery-7.png index 3bb7786..fc30131 100644 Binary files a/public/images/figma/gallery-7.png and b/public/images/figma/gallery-7.png differ diff --git a/public/images/figma/gallery-8.png b/public/images/figma/gallery-8.png index 1ed577a..06104aa 100644 Binary files a/public/images/figma/gallery-8.png and b/public/images/figma/gallery-8.png differ diff --git a/public/images/figma/gallery-shumi-3.jpg b/public/images/figma/gallery-shumi-3.jpg index 113cc3f..dbd59ca 100644 Binary files a/public/images/figma/gallery-shumi-3.jpg and b/public/images/figma/gallery-shumi-3.jpg differ diff --git a/public/images/figma/gallery-shumi-3.webp b/public/images/figma/gallery-shumi-3.webp index 7adf622..7a4b2d7 100644 Binary files a/public/images/figma/gallery-shumi-3.webp and b/public/images/figma/gallery-shumi-3.webp differ diff --git a/public/images/figma/gallery-shumi-5.jpg b/public/images/figma/gallery-shumi-5.jpg index cbccb3f..b578919 100644 Binary files a/public/images/figma/gallery-shumi-5.jpg and b/public/images/figma/gallery-shumi-5.jpg differ diff --git a/public/images/figma/group-amenity-1.jpg b/public/images/figma/group-amenity-1.jpg index 9fc048d..43bfc88 100644 Binary files a/public/images/figma/group-amenity-1.jpg and b/public/images/figma/group-amenity-1.jpg differ diff --git a/public/images/figma/group-amenity-2.jpg b/public/images/figma/group-amenity-2.jpg index cea3953..1396893 100644 Binary files a/public/images/figma/group-amenity-2.jpg and b/public/images/figma/group-amenity-2.jpg differ diff --git a/public/images/figma/group-banner-1.jpg b/public/images/figma/group-banner-1.jpg index e6935c8..495142f 100644 Binary files a/public/images/figma/group-banner-1.jpg and b/public/images/figma/group-banner-1.jpg differ diff --git a/public/images/figma/group-banner-2.jpg b/public/images/figma/group-banner-2.jpg index 951b41d..5c1cff6 100644 Binary files a/public/images/figma/group-banner-2.jpg and b/public/images/figma/group-banner-2.jpg differ diff --git a/public/images/figma/group-bottom-1.jpg b/public/images/figma/group-bottom-1.jpg index dcaa832..895b586 100644 Binary files a/public/images/figma/group-bottom-1.jpg and b/public/images/figma/group-bottom-1.jpg differ diff --git a/public/images/figma/group-bottom-2.jpg b/public/images/figma/group-bottom-2.jpg index 3088db2..3408eaa 100644 Binary files a/public/images/figma/group-bottom-2.jpg and b/public/images/figma/group-bottom-2.jpg differ diff --git a/public/images/figma/group-hero-bg.jpg b/public/images/figma/group-hero-bg.jpg index 12ff1b0..15edffe 100644 Binary files a/public/images/figma/group-hero-bg.jpg and b/public/images/figma/group-hero-bg.jpg differ diff --git a/public/images/figma/group/amenity-1.webp b/public/images/figma/group/amenity-1.webp new file mode 100644 index 0000000..ee69f8f Binary files /dev/null and b/public/images/figma/group/amenity-1.webp differ diff --git a/public/images/figma/group/amenity-2.webp b/public/images/figma/group/amenity-2.webp new file mode 100644 index 0000000..7ed2987 Binary files /dev/null and b/public/images/figma/group/amenity-2.webp differ diff --git a/public/images/figma/group/amenity-4.webp b/public/images/figma/group/amenity-4.webp new file mode 100644 index 0000000..c4964cd Binary files /dev/null and b/public/images/figma/group/amenity-4.webp differ diff --git a/public/images/figma/group/bottom-1.webp b/public/images/figma/group/bottom-1.webp new file mode 100644 index 0000000..5d5733d Binary files /dev/null and b/public/images/figma/group/bottom-1.webp differ diff --git a/public/images/figma/group/bottom-2.webp b/public/images/figma/group/bottom-2.webp new file mode 100644 index 0000000..2feae3a Binary files /dev/null and b/public/images/figma/group/bottom-2.webp differ diff --git a/public/images/figma/group/feature-1.webp b/public/images/figma/group/feature-1.webp new file mode 100644 index 0000000..fdb8782 Binary files /dev/null and b/public/images/figma/group/feature-1.webp differ diff --git a/public/images/figma/group/feature-2.webp b/public/images/figma/group/feature-2.webp new file mode 100644 index 0000000..1cc16f9 Binary files /dev/null and b/public/images/figma/group/feature-2.webp differ diff --git a/public/images/figma/group/hero.webp b/public/images/figma/group/hero.webp new file mode 100644 index 0000000..9d465e2 Binary files /dev/null and b/public/images/figma/group/hero.webp differ diff --git a/public/images/figma/hero-bg-family.png b/public/images/figma/hero-bg-family.png index 4d33264..5cd8e5d 100644 Binary files a/public/images/figma/hero-bg-family.png and b/public/images/figma/hero-bg-family.png differ diff --git a/public/images/figma/hero-bg-new.jpg b/public/images/figma/hero-bg-new.jpg index bdc4bbe..67d92c6 100644 Binary files a/public/images/figma/hero-bg-new.jpg and b/public/images/figma/hero-bg-new.jpg differ diff --git a/public/images/figma/hero-bg1.png b/public/images/figma/hero-bg1.png index 4ef4fe3..65bf8d1 100644 Binary files a/public/images/figma/hero-bg1.png and b/public/images/figma/hero-bg1.png differ diff --git a/public/images/figma/hero-bg2-v2.webp b/public/images/figma/hero-bg2-v2.webp index d8f8c69..1f6b76f 100644 Binary files a/public/images/figma/hero-bg2-v2.webp and b/public/images/figma/hero-bg2-v2.webp differ diff --git a/public/images/figma/hero-bg2.png b/public/images/figma/hero-bg2.png index df1ddcb..79708d2 100644 Binary files a/public/images/figma/hero-bg2.png and b/public/images/figma/hero-bg2.png differ diff --git a/public/images/figma/hero-bg2.webp b/public/images/figma/hero-bg2.webp index d8f8c69..1f6b76f 100644 Binary files a/public/images/figma/hero-bg2.webp and b/public/images/figma/hero-bg2.webp differ diff --git a/public/images/figma/hero-slide-1.jpg b/public/images/figma/hero-slide-1.jpg index 8322d58..8ebf929 100644 Binary files a/public/images/figma/hero-slide-1.jpg and b/public/images/figma/hero-slide-1.jpg differ diff --git a/public/images/figma/hero-slide-1.webp b/public/images/figma/hero-slide-1.webp index 20375bd..25166be 100644 Binary files a/public/images/figma/hero-slide-1.webp and b/public/images/figma/hero-slide-1.webp differ diff --git a/public/images/figma/hero-slide-2.jpg b/public/images/figma/hero-slide-2.jpg index 9ea0a63..679e02a 100644 Binary files a/public/images/figma/hero-slide-2.jpg and b/public/images/figma/hero-slide-2.jpg differ diff --git a/public/images/figma/hero-slide-2.webp b/public/images/figma/hero-slide-2.webp index 7863df6..9a97ec1 100644 Binary files a/public/images/figma/hero-slide-2.webp and b/public/images/figma/hero-slide-2.webp differ diff --git a/public/images/figma/hero-slide-3.jpg b/public/images/figma/hero-slide-3.jpg index 075ffd3..05fc20b 100644 Binary files a/public/images/figma/hero-slide-3.jpg and b/public/images/figma/hero-slide-3.jpg differ diff --git a/public/images/figma/hero-slide-3.webp b/public/images/figma/hero-slide-3.webp index 7372c32..cd4c5a9 100644 Binary files a/public/images/figma/hero-slide-3.webp and b/public/images/figma/hero-slide-3.webp differ diff --git a/public/images/figma/hero-slide-4.jpg b/public/images/figma/hero-slide-4.jpg index 341b81d..90afce5 100644 Binary files a/public/images/figma/hero-slide-4.jpg and b/public/images/figma/hero-slide-4.jpg differ diff --git a/public/images/figma/hero-slide-4.webp b/public/images/figma/hero-slide-4.webp index 59b3f46..5508763 100644 Binary files a/public/images/figma/hero-slide-4.webp and b/public/images/figma/hero-slide-4.webp differ diff --git a/public/images/figma/hero-slide-5.jpg b/public/images/figma/hero-slide-5.jpg index 9355852..1e91912 100644 Binary files a/public/images/figma/hero-slide-5.jpg and b/public/images/figma/hero-slide-5.jpg differ diff --git a/public/images/figma/hero-slide-5.webp b/public/images/figma/hero-slide-5.webp index 3abd64d..f287981 100644 Binary files a/public/images/figma/hero-slide-5.webp and b/public/images/figma/hero-slide-5.webp differ diff --git a/public/images/figma/hero-slide-6.jpg b/public/images/figma/hero-slide-6.jpg index 2b4a160..0ef40ed 100644 Binary files a/public/images/figma/hero-slide-6.jpg and b/public/images/figma/hero-slide-6.jpg differ diff --git a/public/images/figma/hero-slide-6.webp b/public/images/figma/hero-slide-6.webp index e95ac35..e6ab69f 100644 Binary files a/public/images/figma/hero-slide-6.webp and b/public/images/figma/hero-slide-6.webp differ diff --git a/public/images/figma/kvytky-hero-bg.jpg b/public/images/figma/kvytky-hero-bg.jpg deleted file mode 100644 index 7dc7c02..0000000 Binary files a/public/images/figma/kvytky-hero-bg.jpg and /dev/null differ diff --git a/public/images/figma/kvytky-hero-bg.png b/public/images/figma/kvytky-hero-bg.png new file mode 100644 index 0000000..252a5dd Binary files /dev/null and b/public/images/figma/kvytky-hero-bg.png differ diff --git a/public/images/figma/loc-dinopark-v2.webp b/public/images/figma/loc-dinopark-v2.webp index 4532532..690a70d 100644 Binary files a/public/images/figma/loc-dinopark-v2.webp and b/public/images/figma/loc-dinopark-v2.webp differ diff --git a/public/images/figma/loc-dinopark.jpg b/public/images/figma/loc-dinopark.jpg index 403ab2a..038a8d5 100644 Binary files a/public/images/figma/loc-dinopark.jpg and b/public/images/figma/loc-dinopark.jpg differ diff --git a/public/images/figma/loc-dinopark.webp b/public/images/figma/loc-dinopark.webp index 4532532..690a70d 100644 Binary files a/public/images/figma/loc-dinopark.webp and b/public/images/figma/loc-dinopark.webp differ diff --git a/public/images/figma/loc-divo-lis-v2.webp b/public/images/figma/loc-divo-lis-v2.webp index 3fdd455..1cf616a 100644 Binary files a/public/images/figma/loc-divo-lis-v2.webp and b/public/images/figma/loc-divo-lis-v2.webp differ diff --git a/public/images/figma/loc-divo-lis.png b/public/images/figma/loc-divo-lis.png index e6935c8..976e332 100644 Binary files a/public/images/figma/loc-divo-lis.png and b/public/images/figma/loc-divo-lis.png differ diff --git a/public/images/figma/loc-divo-lis.webp b/public/images/figma/loc-divo-lis.webp index 3fdd455..1cf616a 100644 Binary files a/public/images/figma/loc-divo-lis.webp and b/public/images/figma/loc-divo-lis.webp differ diff --git a/public/images/figma/loc-map.jpg b/public/images/figma/loc-map.jpg index cea3953..1396893 100644 Binary files a/public/images/figma/loc-map.jpg and b/public/images/figma/loc-map.jpg differ diff --git a/public/images/figma/loc-map.webp b/public/images/figma/loc-map.webp index 226d4e5..22b5866 100644 Binary files a/public/images/figma/loc-map.webp and b/public/images/figma/loc-map.webp differ diff --git a/public/images/figma/loc-maze-new.jpg b/public/images/figma/loc-maze-new.jpg index 098cea9..bbe822e 100644 Binary files a/public/images/figma/loc-maze-new.jpg and b/public/images/figma/loc-maze-new.jpg differ diff --git a/public/images/figma/loc-maze-v2.webp b/public/images/figma/loc-maze-v2.webp index 86d51ad..4dba40b 100644 Binary files a/public/images/figma/loc-maze-v2.webp and b/public/images/figma/loc-maze-v2.webp differ diff --git a/public/images/figma/loc-maze.webp b/public/images/figma/loc-maze.webp index 86d51ad..4dba40b 100644 Binary files a/public/images/figma/loc-maze.webp and b/public/images/figma/loc-maze.webp differ diff --git a/public/images/figma/loc-playground-new.jpg b/public/images/figma/loc-playground-new.jpg index 58357d4..d66d01b 100644 Binary files a/public/images/figma/loc-playground-new.jpg and b/public/images/figma/loc-playground-new.jpg differ diff --git a/public/images/figma/loc-playground-v2.webp b/public/images/figma/loc-playground-v2.webp index e0165fe..b558804 100644 Binary files a/public/images/figma/loc-playground-v2.webp and b/public/images/figma/loc-playground-v2.webp differ diff --git a/public/images/figma/loc-playground.webp b/public/images/figma/loc-playground.webp index e0165fe..b558804 100644 Binary files a/public/images/figma/loc-playground.webp and b/public/images/figma/loc-playground.webp differ diff --git a/public/images/figma/loc-tir-v2.webp b/public/images/figma/loc-tir-v2.webp index 285ace1..694f7e4 100644 Binary files a/public/images/figma/loc-tir-v2.webp and b/public/images/figma/loc-tir-v2.webp differ diff --git a/public/images/figma/loc-tir.webp b/public/images/figma/loc-tir.webp index 285ace1..694f7e4 100644 Binary files a/public/images/figma/loc-tir.webp and b/public/images/figma/loc-tir.webp differ diff --git a/public/images/figma/news-bg2.png b/public/images/figma/news-bg2.png index 25efcb5..ef1b4af 100644 Binary files a/public/images/figma/news-bg2.png and b/public/images/figma/news-bg2.png differ diff --git a/public/images/figma/news-bg3.jpg b/public/images/figma/news-bg3.jpg index 67e43f4..93ea1e3 100644 Binary files a/public/images/figma/news-bg3.jpg and b/public/images/figma/news-bg3.jpg differ diff --git a/public/images/figma/news-bg4.png b/public/images/figma/news-bg4.png index dcf46cd..e796e98 100644 Binary files a/public/images/figma/news-bg4.png and b/public/images/figma/news-bg4.png differ diff --git a/public/images/figma/news-bg5.png b/public/images/figma/news-bg5.png index 2900cce..2e4ffc9 100644 Binary files a/public/images/figma/news-bg5.png and b/public/images/figma/news-bg5.png differ diff --git a/public/images/figma/news-bg6.png b/public/images/figma/news-bg6.png index 9bbb574..c52b713 100644 Binary files a/public/images/figma/news-bg6.png and b/public/images/figma/news-bg6.png differ diff --git a/public/images/figma/news-real-1.jpg b/public/images/figma/news-real-1.jpg index dcf46cd..0ea0003 100644 Binary files a/public/images/figma/news-real-1.jpg and b/public/images/figma/news-real-1.jpg differ diff --git a/public/images/figma/news-real-2.jpg b/public/images/figma/news-real-2.jpg index 2900cce..8752d50 100644 Binary files a/public/images/figma/news-real-2.jpg and b/public/images/figma/news-real-2.jpg differ diff --git a/public/images/figma/news-real-3.jpg b/public/images/figma/news-real-3.jpg index 9bbb574..a86a2aa 100644 Binary files a/public/images/figma/news-real-3.jpg and b/public/images/figma/news-real-3.jpg differ diff --git a/public/images/figma/review-avatar-bg.jpg b/public/images/figma/review-avatar-bg.jpg index 5fa63c9..175d281 100644 Binary files a/public/images/figma/review-avatar-bg.jpg and b/public/images/figma/review-avatar-bg.jpg differ diff --git a/public/images/figma/ticket-dynarodeo.jpg b/public/images/figma/ticket-dynarodeo.jpg index bfcdf97..3ce7573 100644 Binary files a/public/images/figma/ticket-dynarodeo.jpg and b/public/images/figma/ticket-dynarodeo.jpg differ diff --git a/public/images/figma/ticket-icons/age.svg b/public/images/figma/ticket-icons/age.svg new file mode 100644 index 0000000..55b5d3b --- /dev/null +++ b/public/images/figma/ticket-icons/age.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/clock.svg b/public/images/figma/ticket-icons/clock.svg new file mode 100644 index 0000000..c324c55 --- /dev/null +++ b/public/images/figma/ticket-icons/clock.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/graduation.svg b/public/images/figma/ticket-icons/graduation.svg new file mode 100644 index 0000000..69802f8 --- /dev/null +++ b/public/images/figma/ticket-icons/graduation.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/person.svg b/public/images/figma/ticket-icons/person.svg new file mode 100644 index 0000000..5662e3b --- /dev/null +++ b/public/images/figma/ticket-icons/person.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/rainbow.svg b/public/images/figma/ticket-icons/rainbow.svg new file mode 100644 index 0000000..a075182 --- /dev/null +++ b/public/images/figma/ticket-icons/rainbow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/send.svg b/public/images/figma/ticket-icons/send.svg new file mode 100644 index 0000000..924157e --- /dev/null +++ b/public/images/figma/ticket-icons/send.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/target.svg b/public/images/figma/ticket-icons/target.svg new file mode 100644 index 0000000..37d4682 --- /dev/null +++ b/public/images/figma/ticket-icons/target.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/vr.svg b/public/images/figma/ticket-icons/vr.svg new file mode 100644 index 0000000..ad5948d --- /dev/null +++ b/public/images/figma/ticket-icons/vr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/ticket-icons/wrench.svg b/public/images/figma/ticket-icons/wrench.svg new file mode 100644 index 0000000..cfe2cc9 --- /dev/null +++ b/public/images/figma/ticket-icons/wrench.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/figma/tickets/avtomistechko.jpg b/public/images/figma/tickets/avtomistechko.jpg new file mode 100644 index 0000000..9f7d9d8 Binary files /dev/null and b/public/images/figma/tickets/avtomistechko.jpg differ diff --git a/public/images/figma/tickets/dyno-sitky.png b/public/images/figma/tickets/dyno-sitky.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/dyno-sitky.png differ diff --git a/public/images/figma/tickets/dynopark.jpg b/public/images/figma/tickets/dynopark.jpg new file mode 100644 index 0000000..c07cf51 Binary files /dev/null and b/public/images/figma/tickets/dynopark.jpg differ diff --git a/public/images/figma/tickets/dynorodeo.png b/public/images/figma/tickets/dynorodeo.png new file mode 100644 index 0000000..f21e814 Binary files /dev/null and b/public/images/figma/tickets/dynorodeo.png differ diff --git a/public/images/figma/tickets/dyvo-sitky.png b/public/images/figma/tickets/dyvo-sitky.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/dyvo-sitky.png differ diff --git a/public/images/figma/tickets/dyvolis.jpg b/public/images/figma/tickets/dyvolis.jpg new file mode 100644 index 0000000..1a8ed1e Binary files /dev/null and b/public/images/figma/tickets/dyvolis.jpg differ diff --git a/public/images/figma/tickets/dzerkalnyi-labirynt.jpg b/public/images/figma/tickets/dzerkalnyi-labirynt.jpg new file mode 100644 index 0000000..b386edc Binary files /dev/null and b/public/images/figma/tickets/dzerkalnyi-labirynt.jpg differ diff --git a/public/images/figma/tickets/ekskavatory.jpg b/public/images/figma/tickets/ekskavatory.jpg new file mode 100644 index 0000000..3fa8033 Binary files /dev/null and b/public/images/figma/tickets/ekskavatory.jpg differ diff --git a/public/images/figma/tickets/ekskursiia-v-zoni-dynozavriv.png b/public/images/figma/tickets/ekskursiia-v-zoni-dynozavriv.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/ekskursiia-v-zoni-dynozavriv.png differ diff --git a/public/images/figma/tickets/ihrovi-avtomat.png b/public/images/figma/tickets/ihrovi-avtomat.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/ihrovi-avtomat.png differ diff --git a/public/images/figma/tickets/klasychna-karusel.jpg b/public/images/figma/tickets/klasychna-karusel.jpg new file mode 100644 index 0000000..1f2fff3 Binary files /dev/null and b/public/images/figma/tickets/klasychna-karusel.jpg differ diff --git a/public/images/figma/tickets/koshyky.png b/public/images/figma/tickets/koshyky.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/koshyky.png differ diff --git a/public/images/figma/tickets/platni-paleontolohichni-rozkopky.png b/public/images/figma/tickets/platni-paleontolohichni-rozkopky.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/platni-paleontolohichni-rozkopky.png differ diff --git a/public/images/figma/tickets/potiah.jpg b/public/images/figma/tickets/potiah.jpg new file mode 100644 index 0000000..2f894d2 Binary files /dev/null and b/public/images/figma/tickets/potiah.jpg differ diff --git a/public/images/figma/tickets/safari-polit-slonyky.jpg b/public/images/figma/tickets/safari-polit-slonyky.jpg new file mode 100644 index 0000000..df96315 Binary files /dev/null and b/public/images/figma/tickets/safari-polit-slonyky.jpg differ diff --git a/public/images/figma/tickets/shumi-avtodrom.jpg b/public/images/figma/tickets/shumi-avtodrom.jpg new file mode 100644 index 0000000..8464e65 Binary files /dev/null and b/public/images/figma/tickets/shumi-avtodrom.jpg differ diff --git a/public/images/figma/tickets/shumi-hoidalky.jpg b/public/images/figma/tickets/shumi-hoidalky.jpg new file mode 100644 index 0000000..b8397a9 Binary files /dev/null and b/public/images/figma/tickets/shumi-hoidalky.jpg differ diff --git a/public/images/figma/tickets/tiubinh-spusk.png b/public/images/figma/tickets/tiubinh-spusk.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/tiubinh-spusk.png differ diff --git a/public/images/figma/tickets/tyr-pryzovyi.jpg b/public/images/figma/tickets/tyr-pryzovyi.jpg new file mode 100644 index 0000000..1a2dc97 Binary files /dev/null and b/public/images/figma/tickets/tyr-pryzovyi.jpg differ diff --git a/public/images/figma/tickets/tyr-zvychainyi.jpg b/public/images/figma/tickets/tyr-zvychainyi.jpg new file mode 100644 index 0000000..356332e Binary files /dev/null and b/public/images/figma/tickets/tyr-zvychainyi.jpg differ diff --git a/public/images/figma/tickets/vr-virtualna-realnist.jpg b/public/images/figma/tickets/vr-virtualna-realnist.jpg new file mode 100644 index 0000000..1a8ed1e Binary files /dev/null and b/public/images/figma/tickets/vr-virtualna-realnist.jpg differ diff --git a/public/images/figma/tickets/xd-kinoteatr.png b/public/images/figma/tickets/xd-kinoteatr.png new file mode 100644 index 0000000..0e22c2c Binary files /dev/null and b/public/images/figma/tickets/xd-kinoteatr.png differ diff --git a/public/images/figma/trex-hero-blue.png b/public/images/figma/trex-hero-blue.png index 81b1b24..37a92ed 100644 Binary files a/public/images/figma/trex-hero-blue.png and b/public/images/figma/trex-hero-blue.png differ diff --git a/public/images/figma/video-poster-new.jpg b/public/images/figma/video-poster-new.jpg index ef61f02..e5d2344 100644 Binary files a/public/images/figma/video-poster-new.jpg and b/public/images/figma/video-poster-new.jpg differ diff --git a/public/images/figma/video-preview.png b/public/images/figma/video-preview.png index 8e91cca..a6a1b78 100644 Binary files a/public/images/figma/video-preview.png and b/public/images/figma/video-preview.png differ diff --git a/public/images/figma/video-section-bg.jpg b/public/images/figma/video-section-bg.jpg index 8e91cca..f3ffcaa 100644 Binary files a/public/images/figma/video-section-bg.jpg and b/public/images/figma/video-section-bg.jpg differ diff --git a/public/images/figma/why-parents-1.png b/public/images/figma/why-parents-1.png index ddf8fe2..3157bed 100644 Binary files a/public/images/figma/why-parents-1.png and b/public/images/figma/why-parents-1.png differ diff --git a/public/images/figma/why-parents-2.png b/public/images/figma/why-parents-2.png index 158f852..269b1ff 100644 Binary files a/public/images/figma/why-parents-2.png and b/public/images/figma/why-parents-2.png differ diff --git a/public/images/figma/why-parents-3.png b/public/images/figma/why-parents-3.png index a51e19e..4773100 100644 Binary files a/public/images/figma/why-parents-3.png and b/public/images/figma/why-parents-3.png differ diff --git a/public/images/figma/why-parents-4.png b/public/images/figma/why-parents-4.png index 8e8274c..ee98b94 100644 Binary files a/public/images/figma/why-parents-4.png and b/public/images/figma/why-parents-4.png differ diff --git a/public/images/figma/why-parents-video-new.jpg b/public/images/figma/why-parents-video-new.jpg index 404dfd8..bec621c 100644 Binary files a/public/images/figma/why-parents-video-new.jpg and b/public/images/figma/why-parents-video-new.jpg differ diff --git a/src/app/(frontend)/blog/page.tsx b/src/app/(frontend)/blog/page.tsx index 9686215..d0d33bc 100644 --- a/src/app/(frontend)/blog/page.tsx +++ b/src/app/(frontend)/blog/page.tsx @@ -90,7 +90,7 @@ export default async function BlogPage() {
{post.hero?.url ? ( {post.hero.alt { } } +interface PackageCardData { + title: string + description: string + imageUrl: string | null + ctaLabel: string + ctaHref?: string +} + +function PackageCard({ item }: { item: PackageCardData }) { + return ( +
+
+ {item.imageUrl ? ( + // eslint-disable-next-line @next/next/no-img-element + {item.title} + ) : ( + + )} +
+
+

+ {item.title} +

+

+ {item.description} +

+
+ + + {item.ctaLabel} + + + + + +
+ ) +} + +interface TicketCardData { + label: string + price: string + note?: string + ctaLabel?: string + ctaHref?: string +} + +function TicketCard({ ticket }: { ticket: TicketCardData }) { + return ( +
+
+

+ {ticket.label} +

+
+

+ {ticket.price} +

+ {ticket.note && ( +

+ {ticket.note} +

+ )} +
+ + {ticket.ctaLabel ?? 'Купити квиток'} + +
+ ) +} + export default async function BirthdayPage() { const pageData = await getBirthdayPageData() - const d = pageData as any + const d = pageData as Record | null - const heroTitle = d?.heroTitle ?? 'ДЕНЬ НАРОДЖЕННЯ У ШУМІЛЕНДІ ПІД КЛЮЧ' + const heroTitle = (d?.heroTitle as string) ?? 'День народження у Шуміленді під ключ' + const heroBg = mediaUrl(d?.heroImage as Media | undefined) ?? '/images/figma/birthday-hero-bg.jpg' const heroSubtitle = - d?.heroSubtitle ?? - 'Будьте повноцінними гостями на дні народження вашої дитини. Залиште нам усі турботи про організацію. Ваш єдиний обовʼязок — відпочивати, святкувати, фотографуватися та насолоджуватися моментами.' - const heroCta = d?.heroCta ?? 'Забронювати пригоду' + (d?.heroSubtitle as string) ?? + 'Будьте головними гостями на дні народження вашої дитини. Залиште нам усі турботи про організацію. Ваш єдиний обов’язок — відпочивати, святкувати, фотографуватися та насолоджуватися моментом.' - const packageSectionTitle = d?.packageSectionTitle ?? 'ЩО ВХОДИТЬ У ПАКЕТ СВЯТА' - const packageSectionSubtitle = - d?.packageSectionSubtitle ?? 'Єдиний квиток для іменинника та 15-ти гостей' - const packageItems: { - title: string - description: string - imageUrl: string | null - ctaLabel: string - ctaHref?: string - }[] = ( - d?.packageItems ?? [ - { - title: 'ДинопаркArk', - description: 'Справжні динозаври в натуральну величину', - ctaLabel: 'Замовити', - }, - { - title: 'ДивоЛіс', - description: 'Казкові топіарні фігури улюблених персонажів', - ctaLabel: 'Замовити', - }, - { - title: 'Дзеркальний Лабіринт', - description: 'Весела гра для дітей та дорослих', - ctaLabel: 'Замовити', - }, - { - title: 'Костюмованих ведучих', - description: 'Аніматори в яскравих костюмах проведуть свято', - ctaLabel: 'Замовити', - }, - { - title: 'Аквагрим', - description: 'Конкурси, ігри та розваги для всіх гостей', - ctaLabel: 'Замовити', - }, - { - title: 'Затишну альтанку', - description: 'Власна зона відпочинку для вашої родини', - ctaLabel: 'Замовити', - }, - ] - ).map((item: any) => ({ - title: item.title, - description: item.description, - imageUrl: mediaUrl(item.image), - ctaLabel: item.ctaLabel ?? 'Замовити', - ctaHref: item.ctaHref, - })) + const packageSectionTitle = (d?.packageSectionTitle as string) ?? 'Що входить у пакет свята' - const whyTitle = d?.whyTitle ?? 'Чому варто відвідати ДивоЛіс' - const whyItems = d?.whyItems ?? [ - { - title: 'Свято під ключ', - description: - 'Ми беремо на себе всі деталі: аніматорів, конкурси, прикраси та окрему зону для вашої родини.', - }, - { - title: 'Простір для дітей і дорослих', - description: 'Шуміленд — це 7 локацій, де кожен знайде щось для себе.', - }, - { - title: 'Незабутні фото та спогади', - description: 'Унікальні декорації та щира радість дітей — ідеальний фон для фотографій.', - }, + const cmsPackageItems = Array.isArray(d?.packageItems) + ? (d?.packageItems as Array>) + : [] + // Use CMS items only when an editor has uploaded real photos; otherwise use + // the Figma-matching fallback content (which ships with photos + exact copy). + const cmsHasPhotos = cmsPackageItems.some( + (i) => typeof i.image === 'string' || mediaUrl(i.image as Media | undefined) + ) + const toCard = (item: Record): PackageCardData => ({ + title: item.title as string, + description: item.description as string, + imageUrl: + typeof item.image === 'string' ? item.image : mediaUrl(item.image as Media | undefined), + ctaLabel: (item.ctaLabel as string) ?? 'Замовити', + ctaHref: item.ctaHref as string | undefined, + }) + const primaryItems: PackageCardData[] = + cmsHasPhotos && cmsPackageItems.length >= 3 + ? cmsPackageItems.slice(0, 3).map(toCard) + : FALLBACK_PACKAGE_ITEMS.map(toCard) + const extraItems: PackageCardData[] = + cmsHasPhotos && cmsPackageItems.length >= 6 + ? cmsPackageItems.slice(3, 6).map(toCard) + : FALLBACK_EXTRA_ITEMS.map(toCard) + + const whyTitle = (d?.whyTitle as string) ?? 'Чому варто святкувати у Шуміленді' + const whyItems = Array.isArray(d?.whyItems) + ? (d?.whyItems as typeof FALLBACK_WHY_ITEMS) + : FALLBACK_WHY_ITEMS + const whyVideos = Array.isArray(d?.whyVideos) + ? (d?.whyVideos as Array>) + : [] + + const workingHours = (d?.workingHours as string) ?? 'пʼятниця-субота-неділя з 11:00 до 20:00' + + const pricingSectionTitle = (d?.pricingSectionTitle as string) ?? 'Вартість квитків:' + const pricingPackages: TicketCardData[] = Array.isArray(d?.pricingPackages) + ? (d?.pricingPackages as TicketCardData[]) + : [ + { label: '3 дитини', price: '1500 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, + { label: '4 дитини', price: '1800 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, + { label: '5 дітей', price: '2000 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, + { + label: '>5 дітей', + price: '400 грн', + note: 'особа', + ctaLabel: 'Купити квиток', + ctaHref: '/kvytky', + }, + ] + + const entranceSectionTitle = + (d?.entranceSectionTitle as string) ?? 'Вхід на локації (для інших дітей):' + const entrancePrices: TicketCardData[] = Array.isArray(d?.entrancePrices) + ? (d?.entrancePrices as TicketCardData[]) + : [ + { label: 'Вхід на локації (для інших дітей):', price: '600 грн', ctaHref: '/kvytky' }, + { label: 'Дино Парк', price: '300 грн', ctaHref: '/kvytky' }, + { label: 'Диво Ліс', price: '250 грн', ctaHref: '/kvytky' }, + { label: 'Дзеркальний Лабіринт', price: '160 грн', ctaHref: '/kvytky' }, + ] + + // freeInclusions is a comma-separated string in the CMS (or array fallback) + const FREE_FALLBACK = [ + 'Діти до 3 років', + 'Діти з інвалідністю до 18 років', + 'УБД (за наявності посвідчення)', + 'Діти-сироти', ] - const whyVideos = d?.whyVideos ?? [] + const freeInclusions: string[] = Array.isArray(d?.freeInclusions) + ? (d?.freeInclusions as string[]) + : typeof d?.freeInclusions === 'string' && (d?.freeInclusions as string).trim() + ? (d?.freeInclusions as string) + .split(',') + .map((s) => s.trim()) + .filter(Boolean) + : FREE_FALLBACK - const workingHours = d?.workingHours ?? "п'ятниця-субота-неділя з 11:00 до 20:00" + const entertainmentSectionTitle = + (d?.entertainmentSectionTitle as string) ?? 'Розважальна програма:' + const entertainmentPackages: TicketCardData[] = Array.isArray(d?.entertainmentPackages) + ? (d?.entertainmentPackages as TicketCardData[]) + : [ + { + label: 'Тривалість 1 год', + price: '3000 грн', + ctaLabel: 'Замовити', + ctaHref: '#order-form', + }, + { + label: 'Тривалість 1,5 год', + price: '4500 грн', + ctaLabel: 'Замовити', + ctaHref: '#order-form', + }, + { + label: 'Тривалість 2 год', + price: '6000 грн', + ctaLabel: 'Замовити', + ctaHref: '#order-form', + }, + ] - const pricingSectionTitle = d?.pricingSectionTitle ?? 'ВАРТІСТЬ КВИТКІВ:' - const pricingPackages = d?.pricingPackages ?? [ - { label: 'Стандарт', price: '1 500 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, - { label: '+ 4 дитини', price: '1 800 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, - { label: '+ 4 дорослих', price: '2 000 грн', ctaLabel: 'Купити квиток', ctaHref: '/kvytky' }, - { - label: 'Додатково', - price: '400 грн', - note: 'особа', - ctaLabel: 'Купити квиток', - ctaHref: '/kvytky', - }, - ] - - const entranceSectionTitle = d?.entranceSectionTitle ?? 'Вхід на локації (для інших дітей):' - const entrancePrices = d?.entrancePrices ?? [ - { - label: 'Вхід на локації для інших дітей', - price: '600 грн', - ctaLabel: 'Забронювати пригоду', - ctaHref: '#order-form', - }, - { - label: 'ДиноПарк', - price: '300 грн', - ctaLabel: 'Забронювати пригоду', - ctaHref: '#order-form', - }, - { label: 'Диволіс', price: '250 грн', ctaLabel: 'Забронювати пригоду', ctaHref: '#order-form' }, - { - label: 'Дзеркальний Лабіринт', - price: '160 грн', - ctaLabel: 'Забронювати пригоду', - ctaHref: '#order-form', - }, - ] - - const freeInclusions = - d?.freeInclusions ?? - 'Діти до 3 років, Діти з іменинником до 18 років, VIP (за наявності запрошення), Діти-сироти' - - const entertainmentSectionTitle = d?.entertainmentSectionTitle ?? 'Розважальна програма:' - const entertainmentPackages = d?.entertainmentPackages ?? [ - { label: 'Тривалість 1 год', price: '3 000 грн', ctaLabel: 'Замовити', ctaHref: '#order-form' }, - { - label: 'Тривалість 1.5 год', - price: '4 500 грн', - ctaLabel: 'Замовити', - ctaHref: '#order-form', - }, - { label: 'Тривалість 2 год', price: '6 000 грн', ctaLabel: 'Замовити', ctaHref: '#order-form' }, - ] - - const formTitle = d?.formTitle ?? 'Замовити святкування' + const formTitle = (d?.formTitle as string) ?? 'Замовити святкування' const formSubtitle = - d?.formSubtitle ?? "Залиште заявку і наш менеджер зв'яжеться з вами протягом 30 хвилин" + (d?.formSubtitle as string) ?? + "Залиште заявку і наш менеджер зв'яжеться з вами протягом 30 хвилин" return ( -
+
+ {/* ── 1. HERO ─────────────────────────────────────────────────────── */}
-
- {/* ── 2. ЩО ВХОДИТЬ У ПАКЕТ СВЯТА ───────────────────────────────── */} -
+ {/* ── 2. SUBTITLE BAND ───────────────────────────────────────────── */} +
-

- {packageSectionTitle} -

-

- {packageSectionSubtitle} + {heroSubtitle}

-
- {packageItems.map((item) => ( -
- {item.imageUrl ? ( - {item.title} - ) : ( - +
+
+ + {/* ── 3. ЩО ВХОДИТЬ У ПАКЕТ СВЯТА ───────────────────────────────── */} +
+
+
+

+ {packageSectionTitle} +

+

+ Одна локація — три унікальні світи для іменинника + та його друзів. +

+
+ +
+ {primaryItems.map((item) => ( + ))}
- {/* Mobile scroll */} -
- {packageItems.map((item) => ( -
- {item.imageUrl ? ( - {item.title} - ) : ( - + +

+ Також можна додатково замовити: +

+ +
+ {extraItems.map((item) => ( + ))}
- {/* ── 3. ЧОМУ ВАРТО ─────────────────────────────────────────────── */} + {/* ── 4. ЧОМУ ВАРТО ─────────────────────────────────────────────── */} ({ title: i.title, description: i.description }))} + items={whyItems.map((i) => ({ title: i.title, description: i.description }))} reviewVideos={ whyVideos.length > 0 - ? whyVideos.map((v: any) => ({ - src: v.src, - poster: v.poster ?? null, - label: v.label ?? null, + ? whyVideos.map((v) => ({ + src: v.src as string, + poster: (v.poster as string) ?? null, + label: (v.label as string) ?? null, })) : undefined } /> - {/* ── 4. WORKING HOURS ──────────────────────────────────────────── */} -
-
-

- ЧАС РОБОТИ -

-

- {workingHours} -

-
-
- - {/* ── 5. PRICING ────────────────────────────────────────────────── */} -
-
-

- {pricingSectionTitle} -

- - {/* Main packages grid */} -
- {pricingPackages.map((pkg: any) => ( -
-

- {pkg.label} -

-

- {pkg.price} -

- {pkg.note && ( -

- {pkg.note} -

- )} - - {pkg.ctaLabel ?? 'Купити квиток'} - -
- ))} -
- - {/* Entrance prices */} -

- {entranceSectionTitle} -

-
- {entrancePrices.map((item: any) => ( - - ))} -
- - {/* Free inclusions */} - {freeInclusions && ( -

- Безкоштовно: {freeInclusions} -

- )} - - {/* Entertainment packages */} -

- {entertainmentSectionTitle} -

-
- {entertainmentPackages.map((pkg: any) => ( -
-

- {pkg.label} -

-

- {pkg.price} -

- - {pkg.ctaLabel ?? 'Замовити'} - -
- ))} -
-
-
- - {/* ── 6. ORDER FORM ─────────────────────────────────────────────── */} -
+ {/* ── ORDER FORM ─────────────────────────────────────────────── */} +

diff --git a/src/app/(frontend)/grupovi-vidviduvannia/page.tsx b/src/app/(frontend)/grupovi-vidviduvannia/page.tsx index 1bf8327..62dcd3b 100644 --- a/src/app/(frontend)/grupovi-vidviduvannia/page.tsx +++ b/src/app/(frontend)/grupovi-vidviduvannia/page.tsx @@ -4,7 +4,8 @@ import configPromise from '@payload-config' import { GroupRequestForm } from '@/components/forms/GroupRequestForm' import { FormBlock, type FormData as FormBlockData } from '@/components/forms/FormBlock' import { RefreshRouteOnSave } from '@/components/cms/RefreshRouteOnSave' -import { PayloadImage } from '@/components/ui/PayloadImage' +import { JsonLd } from '@/components/seo/JsonLd' +import { groupVisitsPageJsonLd } from '@/lib/structuredData' import type { Media } from '@/payload-types' export const revalidate = 60 @@ -33,87 +34,131 @@ function mediaUrl(m: number | Media | null | undefined): string | null { return (m as Media).url ?? null } +// Figma assets exported via get_screenshot, stored locally. +// TODO: move these photos to CMS (group-visits-page global) once upload fields exist. +const FIGMA = { + hero: '/images/figma/group/hero.webp', + featureA: '/images/figma/group/feature-1.webp', + featureB: '/images/figma/group/feature-2.webp', + bottomA: '/images/figma/group/bottom-1.webp', + bottomB: '/images/figma/group/bottom-2.webp', + amenity1: '/images/figma/group/amenity-1.webp', + amenity2: '/images/figma/group/amenity-2.webp', + amenity3: null as string | null, // "NO PHOTO" placeholder in Figma + amenity4: '/images/figma/group/amenity-4.webp', +} + +const FONT_MONT = { fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' } +const ORANGE_GRADIENT = 'linear-gradient(90deg, #f28b4a 0%, #fdcf54 47%, #f28d4b 100%)' + export default async function GroupVisitsPage() { const data = await getGroupVisitsData() - const d = data as any + const d = data as Record | null - const heroTitle = d?.heroTitle ?? 'Групові відвідування' - const heroSubtitle = - d?.heroSubtitle ?? - 'Спеціальні умови для організованих груп. Мінімум 10 осіб — максимум вражень.' + const heroTitle = (d?.heroTitle as string) ?? 'ГРУПОВІ ВІЗИТИ' + // TODO: move to CMS + const heroSubtitle = (d?.heroSubtitle as string) ?? 'Спеціальна пропозиція для садочків та шкіл' const heroDescription = - d?.heroDescription ?? + (d?.heroDescription as string) ?? 'Шукаєте ідеальне місце для групового виїзду класу чи садочка? Або яскраву локацію для фотосесії? Хочете, щоб дитячий випускний альбом був дійсно унікальним? Запрошуємо провести цей захопливий і незабутній день на казковій локації.' - const heroCta = d?.heroCta ?? 'Забронювати пригоду' + const heroCta = (d?.heroCta as string) ?? 'Забронювати пригоду' const featureText = - d?.featureText ?? - 'На дітлах чекає подорож ДинопарКом та ДивоЛісом. Це активне дозвілля на свіжому повітрі та справжні казкові пригоди, де кожен стане героєм власної історії.' - const featureImages: string[] = (d?.featureImages ?? []) - .map((i: any) => mediaUrl(i.image)) - .filter(Boolean) + (d?.featureText as string) ?? + 'На дітлахів чекає подорож ДиноПарком та ДивоЛісом. Це активне дозвілля на свіжому повітрі та справжні казкові пригоди, де кожен стане героєм власної історії.' + const featureImages: string[] = ((d?.featureImages as { image: unknown }[]) ?? []) + .map((i) => mediaUrl(i.image as never)) + .filter((u): u is string => Boolean(u)) + const featureA = featureImages[0] ?? FIGMA.featureA + const featureB = featureImages[1] ?? FIGMA.featureB - const amenitiesTitle = d?.amenitiesTitle ?? 'Ми подбали про затишок і комфорт' - const amenities: { label: string; imageUrl: string | null }[] = ( - d?.amenities ?? [ - { label: '2 локації без обмежень у часі' }, - { label: 'Вбиральні та кафе на території' }, - { label: 'Укриття поруч' }, - { label: 'Огороджено забором, є охорона' }, - ] - ).map((a: any) => ({ label: a.label, imageUrl: mediaUrl(a.image) })) + const amenitiesTitle = (d?.amenitiesTitle as string) ?? 'Ми подбали про затишок і комфорт' + // TODO: move amenity labels/images to CMS + const amenities: { label: React.ReactNode; imageUrl: string | null }[] = [ + { + label: ( + <> + 2 локації +
+ без обмежень у часі + + ), + imageUrl: FIGMA.amenity1, + }, + { + label: ( + <> + Вбиральня та кафе +
+ на території + + ), + imageUrl: FIGMA.amenity2, + }, + { label: 'Укриття поруч', imageUrl: FIGMA.amenity3 }, + { + label: ( + <> + Огороджено забором, +
є охорона + + ), + imageUrl: FIGMA.amenity4, + }, + ] - const workingHours = d?.workingHours ?? "п'ятниця-субота-неділя з 11:00 до 20:00" - const price = d?.price ?? '350 грн' - const priceLabel = d?.priceLabel ?? 'особа' - const priceNote = d?.priceNote ?? 'Вхід для двох дорослих, що супроводжують дітей, безкоштовний.' - const priceMinPeople = d?.priceMinPeople ?? 'Пропозиція для груп від 10 людей' - const priceCta = d?.priceCta ?? 'Купити квиток' + const workingHoursTitle = (d?.workingHoursTitle as string) ?? 'Час роботи' + const workingHours = (d?.workingHours as string) ?? 'пʼятниця-субота-неділя з 11:00 до 20:00' + + const priceTitle = (d?.priceTitle as string) ?? 'Вартість групового візиту:' + const priceBadge = (d?.priceBadge as string) ?? 'Спеціальна ціна для груп' + const price = (d?.price as string) ?? '350 грн' + const priceLabel = (d?.priceLabel as string) ?? 'особа' + const priceNote = + (d?.priceNote as string) ?? 'Вхід для двох дорослих, що супроводжують дітей, безкоштовний.' + const priceMinPeople = (d?.priceMinPeople as string) ?? 'Пропозиція діє для груп від 10 людей' + const priceCta = (d?.priceCta as string) ?? 'Купити квиток' const priceDescription = - d?.priceDescription ?? - 'У вартість входить відвідування Динопарку та ДивоЛісу.\nЧас перебування на локаціях необмежений.' + (d?.priceDescription as string) ?? + 'У вартість входить відвідування ДиноПарку та ДивоЛісу.\nЧас перебування на локаціях необмежений.' const bottomText = - d?.bottomText ?? - 'Хочете перетворити візит на справжню маленьку експедицію з розповідями або замовити екскурсію з розповідями про динозаврів? Ми залюбки це організуємо! Телефонуйте нам — і ми все підготуємо та розрахуємо індивідуально для вашої групи.' - const bottomImages: string[] = (d?.bottomImages ?? []) - .map((i: any) => mediaUrl(i.image)) - .filter(Boolean) + (d?.bottomText as string) ?? + 'Хочете перетворити візит на справжню маленьку експедицію з розкопками або замовити екскурсію з розповідями про динозаврів? Ми залюбки це організуємо! Телефонуйте нам — і ми все підготуємо та розрахуємо індивідуально для вашої групи.' + const bottomImages: string[] = ((d?.bottomImages as { image: unknown }[]) ?? []) + .map((i) => mediaUrl(i.image as never)) + .filter((u): u is string => Boolean(u)) + const bottomA = bottomImages[0] ?? FIGMA.bottomA + const bottomB = bottomImages[1] ?? FIGMA.bottomB - const formTitle = d?.formTitle ?? 'Подати заявку на групове відвідування' + const formTitle = (d?.formTitle as string) ?? 'Подати заявку на групове відвідування' const formSubtitle = - d?.formSubtitle ?? + (d?.formSubtitle as string) ?? 'Вкажіть кількість учасників та бажану дату — менеджер зателефонує і погодить деталі.' - const FONT_MONT = { fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' } + const dForm = (d?.form as unknown) ?? null return ( -
+
+ {/* 1. Hero */}
-
-

+

{heroTitle}

-

+

{heroSubtitle}

@@ -121,215 +166,102 @@ export default async function GroupVisitsPage() {
{/* 2. Green description band */} -
-
-

- {heroDescription} -

+
+
+

{heroDescription}

{heroCta}
- {/* 3. Two-column feature block */} -
-
-

+ {/* 3. Feature banner — text + overlapping photos */} +

+
+

{featureText}

-
- {featureImages.length >= 2 ? ( - <> +
+ + +
+
+
+ + {/* 4. Amenities grid 2x2 */} +
+

+ {amenitiesTitle} +

+
+ {amenities.map((item, i) => ( +
+ {item.imageUrl ? ( - - - ) : ( - <> -
-
- - )} -
+ ) : ( +
+ NO PHOTO +
+ )} +

+ {item.label} +

+
+ ))}
- {/* 4. Amenity cards grid */} -
-
-

- {amenitiesTitle} -

-
- {amenities.map((item) => ( -
- {item.imageUrl ? ( - {item.label} - ) : ( -
- )} -

- {item.label} -

-
- ))} -
-
-
- - {/* 5. Working hours banner */} -
-

- ЧАС РОБОТИ -

-

- {workingHours} -

-
- - {/* 6. Pricing section */} -
-
-

- ВАРТІСТЬ ГРУПОВОГО ВІЗИТУ: -

-
-

- СПЕЦІАЛЬНА ЦІНА ДЛЯ ГРУП -

-

- {price} -

-

- {priceLabel} -

-

- {priceNote} -

-

- {priceMinPeople} -

- - {priceCta} - -
-

- {priceDescription.split('\n').map((line, i) => ( - - {line} - {i < priceDescription.split('\n').length - 1 &&
} -
- ))} -

-
-
- - {/* 7. Bottom two-column block */} -
-
-

+ {/* Bottom banner — text + overlapping photos */} +

+
+

{bottomText}

-
- {bottomImages.length >= 2 ? ( - <> - - - - ) : ( - <> -
-
- - )} +
+ +
- {/* 8. Order form */} -
-
-

- {formTitle} -

-

- {formSubtitle} -

- {data?.form && typeof data.form === 'object' ? ( - - ) : ( - - )} + {/* 8. Order form — styled like the birthday page (green wave-pattern section) */} +
+
+
+

{formTitle}

+

{formSubtitle}

+ {dForm && typeof dForm === 'object' ? ( + + ) : ( + + )} +
diff --git a/src/app/(frontend)/kvytky/page.tsx b/src/app/(frontend)/kvytky/page.tsx index e5e8a22..f2bc1d2 100644 --- a/src/app/(frontend)/kvytky/page.tsx +++ b/src/app/(frontend)/kvytky/page.tsx @@ -2,25 +2,18 @@ import type { Metadata } from 'next' import { getPayload } from 'payload' import configPromise from '@payload-config' -import { getSiteSettings } from '@/lib/getSiteSettings' import { RefreshRouteOnSave } from '@/components/cms/RefreshRouteOnSave' -import { KvytkyTicketsClient } from '@/components/sections/KvytkyTicketsClient' -import { BirthdayPricing } from '@/components/sections/BirthdayPricing' -import type { BirthdayPackageCMS } from '@/types/globals' +import { KvytkyTicketsClient, type Tariff } from '@/components/sections/KvytkyTicketsClient' +import { ComboTickets, type ComboCardData } from '@/components/sections/ComboTickets' +import type { Media, TicketsPage } from '@/payload-types' export const revalidate = 60 const FONT_MONT = { fontFamily: 'var(--font-montserrat, Montserrat), sans-serif' } -const FONT_INTER = { fontFamily: 'var(--font-inter, Inter), sans-serif' } -interface Tariff { - id: number - name: string - price: number - categoryTag: string - sort: number - icon?: string | null - stale?: boolean +function mediaUrl(m: number | Media | null | undefined): string | null { + if (!m || typeof m === 'number') return null + return m.url ?? null } async function getTariffs() { @@ -34,29 +27,15 @@ async function getTariffs() { } } -async function getPageData() { +async function getPageData(): Promise { try { const payload = await getPayload({ config: configPromise }) - return await payload.findGlobal({ slug: 'tickets-page', depth: 0 }) + return (await payload.findGlobal({ slug: 'tickets-page', depth: 1 })) as TicketsPage } catch { return null } } -async function getBirthdayPackages() { - try { - const payload = await getPayload({ config: configPromise }) - const result = await payload.find({ - collection: 'birthday-packages', - sort: 'sort', - limit: 10, - }) - return result.docs as unknown as BirthdayPackageCMS[] - } catch { - return [] as BirthdayPackageCMS[] - } -} - export async function generateMetadata(): Promise { const pageData = await getPageData() return { @@ -68,28 +47,22 @@ export async function generateMetadata(): Promise { } export default async function TicketsPage() { - const [tariffData, pageData, birthdayPackages, siteSettings] = await Promise.all([ - getTariffs(), - getPageData(), - getBirthdayPackages(), - getSiteSettings(), - ]) + const [tariffData, pageData] = await Promise.all([getTariffs(), getPageData()]) const tariffs = tariffData?.tariffs ?? [] const hasWarning = !!tariffData?.warning - const categoryLabelsMap = Object.fromEntries( - (siteSettings.tariffCategoryLabels ?? []).map(({ key, label }) => [key, label]) - ) - - const heroTitle = pageData?.heroTitle ?? 'Купити квитки' + const heroTitle = pageData?.heroTitle ?? 'Купити квиток' const heroSubtitle = pageData?.heroSubtitle ?? 'Оберіть квиток та придбайте онлайн — без черги на касі' + const heroImg = mediaUrl(pageData?.heroImage) ?? '/images/figma/kvytky-hero-bg.png' + + const comboCards = buildComboCards(pageData, tariffs) return (
{/* ── HERO ── */} - + {/* ── WORKING HOURS BANNER ── */}
@@ -103,10 +76,10 @@ export default async function TicketsPage() { className="text-[20px] font-bold text-[#272727] uppercase lg:text-[32px]" style={FONT_MONT} > - Час роботи + {pageData?.workingHoursTitle ?? 'Час роботи'}

- пʼятниця-субота-неділя з 11:00 до 20:00 + {pageData?.workingHoursText ?? 'пʼятниця-субота-неділя з 11:00 до 20:00'}

@@ -120,20 +93,23 @@ export default async function TicketsPage() {
)} - {/* ── COMBO TICKETS SECTION ── */} - + {/* ── COMBO TICKETS (slider) ── */} + - {/* ── BIRTHDAY PACKAGES ── */} - 0 ? birthdayPackages : undefined} - title={pageData?.sectionTitleBirthday ?? 'День Народження в Шуміленді'} + {/* ── TICKETS CATALOG (tabs + cart) ── */} + - {/* ── INDIVIDUAL TICKETS (CLIENT component for cart interactivity) ── */} - - {/* ── BENEFITS & CONDITIONS ── */} - +
@@ -143,14 +119,18 @@ export default async function TicketsPage() { // ───────────────────────────────────────────── // HERO SECTION // ───────────────────────────────────────────── -function HeroSection({ title, subtitle }: { title: string; subtitle: string }) { +function HeroSection({ + title, + subtitle, + image, +}: { + title: string + subtitle: string + image: string +}) { return (
- +

t.categoryTag === 'combo') - const cards = - comboFromApi.length > 0 - ? comboFromApi.map((t, i) => ({ - id: String(t.id), - name: t.name, - subtitle: null as string | null, - price: `${t.price} ₴`, - description: '', - featured: i === 1, - badge: i === 1 ? 'Найпопулярніший' : (null as string | null), - locations: ['Динопарк', 'Топіарні фігури', 'Дзеркальний лабіринт'], +const parsePrice = (s: string): number => Number(String(s).replace(/[^\d]/g, '')) || 0 + +function buildComboCards(pageData: TicketsPage | null, tariffs: Tariff[]): ComboCardData[] { + const cms = pageData?.comboCards + const cards: ComboCardData[] = + !cms || cms.length === 0 + ? COMBO_CARDS_STATIC + : cms.map((c, i) => ({ + id: c.id ?? `combo-${i}`, + tariffId: `combo-${i}`, + priceValue: parsePrice(c.price), + name: c.name, + subtitle: c.subtitle ?? null, + price: c.price, + description: c.description ?? '', + featured: !!c.featured, + badge: c.badge ?? null, + locations: (c.locations ?? []).map((l) => l.text).filter(Boolean) as string[], })) - : COMBO_CARDS_STATIC - return ( -
-
-

- Комбо-квитки -

-
- {cards.map((card) => ( - - ))} -
-
-
- ) -} + // Match combo cards to live combo tariffs (by ascending price) to get a real + // cart tariffId + current price for the cart/checkout flow. + const apiCombos = tariffs + .filter((t) => t.categoryTag === 'combo') + .sort((a, b) => a.price - b.price) + if (apiCombos.length === 0) return cards -interface ComboCardData { - name: string - subtitle: string | null - price: string - description: string - featured: boolean - badge: string | null - locations: string[] -} - -function ComboCard({ card }: { card: ComboCardData }) { - const { name, subtitle, price, description, featured, badge, locations } = card - return ( -
- {/* Badge desktop */} - {featured && badge && ( -
- {badge} -
- )} - {/* Badge mobile */} - {featured && badge && ( -
- {badge} -
- )} - -
- {/* Header: name + divider + price */} -
-

- {name} - {subtitle && ( - <> -
- {subtitle} - - )} -

-
-

- {price} -

-
- - {/* Description */} - {description && ( -

- {description} -

- )} - - {/* Locations list */} -
-

- Включає 3 локації: -

-
    - {locations.map((loc) => ( -
  • - - - {loc} - -
  • - ))} -
-
-
-
- ) + const sorted = [...cards].sort((a, b) => a.priceValue - b.priceValue) + const overrides = new Map() + sorted.forEach((card, i) => { + const api = apiCombos[i] + if (api) + overrides.set(card.id, { + tariffId: String(api.id), + priceValue: api.price, + price: `${api.price} ₴`, + }) + }) + return cards.map((c) => ({ ...c, ...(overrides.get(c.id) ?? {}) })) } // ───────────────────────────────────────────── // BENEFITS & CONDITIONS SECTION // ───────────────────────────────────────────── - const FREE_ENTRY_ITEMS = [ 'Діти військовослужбовців', 'Діти до 3-х років включно', @@ -433,7 +294,16 @@ function BenefitItem({ text }: { text: string }) { ) } -function BenefitsSection() { +function BenefitsSection({ pageData }: { pageData: TicketsPage | null }) { + const freeItems = + pageData?.freeEntryItems && pageData.freeEntryItems.length > 0 + ? pageData.freeEntryItems.map((i) => i.text).filter(Boolean) + : FREE_ENTRY_ITEMS + const discountItems = + pageData?.discountsItems && pageData.discountsItems.length > 0 + ? pageData.discountsItems.map((i) => i.text).filter(Boolean) + : DISCOUNT_ITEMS + return (
@@ -441,7 +311,7 @@ function BenefitsSection() { className="mb-[60px] text-[24px] font-bold text-[#272727] uppercase lg:text-[32px]" style={FONT_MONT} > - Пільги та умови + {pageData?.benefitsSectionTitle ?? 'Пільги та умови'}

@@ -457,19 +327,19 @@ function BenefitsSection() { className="text-[20px] leading-[1.5] font-bold text-[#272727] lg:text-[24px]" style={FONT_MONT} > - Вхід безкоштовний + {pageData?.freeEntryTitle ?? 'Вхід безкоштовний'}

- 0 грн + {pageData?.freeEntryBadge ?? '0 грн'}
- {FREE_ENTRY_ITEMS.map((item) => ( + {freeItems.map((item) => ( ))}
@@ -486,19 +356,19 @@ function BenefitsSection() { className="text-[20px] leading-[1.5] font-bold text-[#272727] lg:text-[24px]" style={FONT_MONT} > - Спеціальні знижки + {pageData?.discountsTitle ?? 'Спеціальні знижки'}

- -30% + {pageData?.discountsBadge ?? '-30%'}
- {DISCOUNT_ITEMS.map((item) => ( + {discountItems.map((item) => ( ))}
@@ -511,9 +381,8 @@ function BenefitsSection() { className="text-center text-[16px] leading-[1.5] font-normal text-[#272727] lg:text-[20px]" style={FONT_MONT} > - *Знижки та пільги поширюються виключно на індивідуальне відвідування 3 основних - локацій (Динопарк, Зона топіарних фігур, Дзеркальний лабіринт) та не сумуються з - тарифами категорії «КОМБО». + {pageData?.benefitsFootnote ?? + '*Знижки та пільги поширюються виключно на індивідуальне відвідування 3 основних локацій (Динопарк, Зона топіарних фігур, Дзеркальний лабіринт) та не сумуються з тарифами категорії «КОМБО».'}

diff --git a/src/app/(frontend)/lokatsii/page.tsx b/src/app/(frontend)/lokatsii/page.tsx index 3efa6cf..04eec94 100644 --- a/src/app/(frontend)/lokatsii/page.tsx +++ b/src/app/(frontend)/lokatsii/page.tsx @@ -3,6 +3,8 @@ import Link from 'next/link' import { getPayload } from 'payload' import configPromise from '@payload-config' import { PageHero } from '@/components/ui/PageHero' +import { JsonLd } from '@/components/seo/JsonLd' +import { locationsPageJsonLd } from '@/lib/structuredData' import type { LocationCMS, Media } from '@/types/globals' export const revalidate = 60 @@ -46,6 +48,13 @@ const FALLBACK_IMAGES: Record = { const COLORS = ['#396817', '#2d5414', '#1a3009', '#2a5a12', '#1d4710'] +// Only ДиноПарк та Диво Ліс мають окрему сторінку локації — лише на них показуємо «Детальніше». +const DETAIL_HREF: Record = { + dynopark: '/lokatsii/dynozavry', + dynozavry: '/lokatsii/dynozavry', + dyvolis: '/lokatsii/dyvolis', +} + async function getLocations(): Promise { try { const payload = await getPayload({ config: configPromise }) @@ -66,6 +75,7 @@ export default async function LocationsPage() { return (
+
- {loc.showDetailPage && ( + {DETAIL_HREF[slug] && ( diff --git a/src/app/(frontend)/page.tsx b/src/app/(frontend)/page.tsx index a4818a6..878e5e8 100644 --- a/src/app/(frontend)/page.tsx +++ b/src/app/(frontend)/page.tsx @@ -1,13 +1,14 @@ import { Hero } from '@/components/sections/Hero' import { Locations } from '@/components/sections/Locations' import { WhyParents } from '@/components/sections/WhyParents' -import { BirthdayPricing } from '@/components/sections/BirthdayPricing' import { VideoSection } from '@/components/sections/VideoSection' import { Gallery } from '@/components/sections/Gallery' import { Reviews } from '@/components/sections/Reviews' import { News } from '@/components/sections/News' import { getHomeData } from '@/lib/getHomeData' import { RefreshRouteOnSave } from '@/components/cms/RefreshRouteOnSave' +import { JsonLd } from '@/components/seo/JsonLd' +import { homePageJsonLd } from '@/lib/structuredData' import type { HomePageHero } from '@/types/globals' export const revalidate = 60 @@ -20,13 +21,14 @@ const STATIC_HERO: NonNullable = { } export default async function HomePage() { - const { home, locations, reviews, birthdayPackages } = await getHomeData() + const { home, locations, reviews } = await getHomeData() const heroData = home?.hero const hero = heroData?.title ? heroData : STATIC_HERO return (
+ - - {/* Dark overlay */} + {/* Soft overlay for legibility */}