10 Commits

Author SHA1 Message Date
9e508b3017 Update src/app/page.tsx 2026-02-17 19:42:35 +00:00
57011d2561 Update src/app/layout.tsx 2026-02-17 19:42:34 +00:00
20db4ce23c Merge version_10 into main
Merge version_10 into main
2026-02-17 14:29:34 +00:00
3bcb4a8cbc Update src/app/page.tsx 2026-02-17 14:29:30 +00:00
cdbffe8972 Update src/app/layout.tsx 2026-02-17 14:29:29 +00:00
a0b3a3a81b Merge version_9 into main
Merge version_9 into main
2026-02-17 12:46:39 +00:00
1f7255ad55 Update src/app/page.tsx 2026-02-17 12:46:35 +00:00
b6942a80f6 Update src/app/layout.tsx 2026-02-17 12:46:34 +00:00
e802d56421 Merge version_8 into main
Merge version_8 into main
2026-02-17 12:43:19 +00:00
f6e6dd8d87 Merge version_8 into main
Merge version_8 into main
2026-02-17 12:40:30 +00:00
2 changed files with 120 additions and 32 deletions

View File

@@ -9,7 +9,7 @@ const inter = Inter({
}); });
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Казковий Дім - Автентичні українські бенкети та сімейні обіди", description: "Відчуйте тепло, традицію та етнокультурну спадщину в Казковому Димі. Преміум простори для бенкетів, автентична кухня та незабутні святкування." title: "Сіль Землі - Автентичні українські бенкети та сімейні обіди", description: "Відчуйте тепло, традицію та етнокультурну спадщину в Солі Землі. Преміум простори для бенкетів, автентична кухня та незабутні святкування."
}; };
export default function RootLayout({ export default function RootLayout({
@@ -413,6 +413,20 @@ export default function RootLayout({
originalContent = element.textContent; originalContent = element.textContent;
element.contentEditable = 'true'; element.contentEditable = 'true';
if (!element.dataset.webildOriginalWhiteSpace) {
const computedStyle = window.getComputedStyle(element);
element.dataset.webildOriginalWhiteSpace = computedStyle.whiteSpace;
element.dataset.webildOriginalWordWrap = computedStyle.wordWrap;
element.dataset.webildOriginalOverflowWrap = computedStyle.overflowWrap;
element.dataset.webildOriginalOverflow = computedStyle.overflow;
}
element.style.whiteSpace = 'pre-wrap';
element.style.wordWrap = 'break-word';
element.style.overflowWrap = 'break-word';
element.style.overflow = 'visible';
element.focus(); element.focus();
isEditing = true; isEditing = true;
@@ -522,6 +536,23 @@ export default function RootLayout({
element.contentEditable = 'false'; element.contentEditable = 'false';
isEditing = false; isEditing = false;
if (element.dataset.webildOriginalWhiteSpace) {
element.style.whiteSpace = element.dataset.webildOriginalWhiteSpace === 'normal' ? '' : element.dataset.webildOriginalWhiteSpace;
delete element.dataset.webildOriginalWhiteSpace;
}
if (element.dataset.webildOriginalWordWrap) {
element.style.wordWrap = element.dataset.webildOriginalWordWrap === 'normal' ? '' : element.dataset.webildOriginalWordWrap;
delete element.dataset.webildOriginalWordWrap;
}
if (element.dataset.webildOriginalOverflowWrap) {
element.style.overflowWrap = element.dataset.webildOriginalOverflowWrap === 'normal' ? '' : element.dataset.webildOriginalOverflowWrap;
delete element.dataset.webildOriginalOverflowWrap;
}
if (element.dataset.webildOriginalOverflow) {
element.style.overflow = element.dataset.webildOriginalOverflow === 'visible' ? '' : element.dataset.webildOriginalOverflow;
delete element.dataset.webildOriginalOverflow;
}
if (element.dataset.beforeInputHandler === 'true') { if (element.dataset.beforeInputHandler === 'true') {
element.removeEventListener('beforeinput', () => {}); element.removeEventListener('beforeinput', () => {});
delete element.dataset.beforeInputHandler; delete element.dataset.beforeInputHandler;
@@ -827,6 +858,9 @@ export default function RootLayout({
const handleScroll = () => { const handleScroll = () => {
if (!isActive) return; if (!isActive) return;
if (isEditing) return;
if (selectedElement) { if (selectedElement) {
makeUneditable(selectedElement, false); makeUneditable(selectedElement, false);
selectedElement.classList.remove(selectedClass); selectedElement.classList.remove(selectedClass);
@@ -1200,6 +1234,31 @@ export default function RootLayout({
window.addEventListener('scroll', handleScroll, true); window.addEventListener('scroll', handleScroll, true);
window.addEventListener('message', handleMessage, true); window.addEventListener('message', handleMessage, true);
let lastPathname = window.location.pathname;
const notifyPageChange = () => {
window.parent.postMessage({
type: 'webild-page-changed',
data: { pathname: window.location.pathname }
}, '*');
};
window.addEventListener('popstate', () => {
if (lastPathname !== window.location.pathname) {
lastPathname = window.location.pathname;
notifyPageChange();
}
}, true);
const urlCheckInterval = setInterval(() => {
if (lastPathname !== window.location.pathname) {
lastPathname = window.location.pathname;
notifyPageChange();
}
}, 500);
notifyPageChange();
window.webildCleanup = () => { window.webildCleanup = () => {
isActive = false; isActive = false;
@@ -1210,6 +1269,10 @@ export default function RootLayout({
removeHoverOverlay(); removeHoverOverlay();
removeElementTypeLabel(); removeElementTypeLabel();
if (urlCheckInterval) {
clearInterval(urlCheckInterval);
}
document.removeEventListener('mouseover', handleMouseOver, true); document.removeEventListener('mouseover', handleMouseOver, true);
document.removeEventListener('mouseout', handleMouseOut, true); document.removeEventListener('mouseout', handleMouseOut, true);
document.removeEventListener('click', handleClick, true); document.removeEventListener('click', handleClick, true);

View File

@@ -2,17 +2,18 @@
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider"; import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarLayoutFloatingInline from '@/components/navbar/NavbarLayoutFloatingInline'; import NavbarLayoutFloatingInline from '@/components/navbar/NavbarLayoutFloatingInline';
import HeroSplitDualMedia from '@/components/sections/hero/HeroSplitDualMedia'; import HeroLogoBillboardSplit from '@/components/sections/hero/HeroLogoBillboardSplit';
import TestimonialAboutCard from '@/components/sections/about/TestimonialAboutCard'; import TestimonialAboutCard from '@/components/sections/about/TestimonialAboutCard';
import FeatureCardNineteen from '@/components/sections/feature/FeatureCardNineteen'; import FeatureCardNineteen from '@/components/sections/feature/FeatureCardNineteen';
import ProductCardThree from '@/components/sections/product/ProductCardThree'; import ProductCardThree from '@/components/sections/product/ProductCardThree';
import TestimonialCardTwo from '@/components/sections/testimonial/TestimonialCardTwo'; import TestimonialCardTwo from '@/components/sections/testimonial/TestimonialCardTwo';
import ContactSplitForm from '@/components/sections/contact/ContactSplitForm'; import ContactSplitForm from '@/components/sections/contact/ContactSplitForm';
import FooterMedia from '@/components/sections/footer/FooterMedia'; import FooterMedia from '@/components/sections/footer/FooterMedia';
import FaqSplitText from '@/components/sections/faq/FaqSplitText';
import { Castle, Flame, Heart, Leaf, Quote, UtensilsCrossed, X } from "lucide-react"; import { Castle, Flame, Heart, Leaf, Quote, UtensilsCrossed, X } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
export default function KazkovyyDimPage() { export default function SilZemliPage() {
const [isModalOpen, setIsModalOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
name: "", email: "", phone: "", eventDate: "", guestCount: "", message: "" name: "", email: "", phone: "", eventDate: "", guestCount: "", message: ""
@@ -50,14 +51,13 @@ export default function KazkovyyDimPage() {
> >
<div id="nav" data-section="nav"> <div id="nav" data-section="nav">
<NavbarLayoutFloatingInline <NavbarLayoutFloatingInline
brandName="Казковий Дім" brandName="Сіль Землі"
navItems={[ navItems={[
{ name: "Філософія", id: "philosophy" }, { name: "Філософія", id: "philosophy" },
{ name: "Меню", id: "menu" }, { name: "Меню", id: "menu" },
{ name: "Бенкети", id: "banquets" }, { name: "Бенкети", id: "banquets" },
{ name: "Доставка", id: "delivery" }, { name: "Доставка", id: "delivery" },
{ name: "Блог", id: "/blog" }, { name: "FAQ", id: "faq" },
{ name: "Магазин", id: "/shop" },
{ name: "Контакти", id: "contacts" } { name: "Контакти", id: "contacts" }
]} ]}
button={{ button={{
@@ -69,31 +69,22 @@ export default function KazkovyyDimPage() {
</div> </div>
<div id="hero" data-section="hero"> <div id="hero" data-section="hero">
<HeroSplitDualMedia <HeroLogoBillboardSplit
tag="Ласкаво просимо до Казкового Дому" logoText="СІЛЬ ЗЕМЛІ"
tagIcon={Flame}
title="Автентичні українські бенкети та сімейні обіди"
description="Відчуйте тепло, традицію та етнокультурну спадщину у нашому чудово оформленому бенкетному комплексі. Від інтимних сімейних зібрань до грандіозних святкувань, ми створюємо незабутні моменти біля вогню." description="Відчуйте тепло, традицію та етнокультурну спадщину у нашому чудово оформленому бенкетному комплексі. Від інтимних сімейних зібрань до грандіозних святкувань, ми створюємо незабутні моменти біля вогню."
background={{ variant: "plain" }} background={{ variant: "plain" }}
mediaItems={[ imageSrc="https://img.b2bpic.net/free-photo/full-shot-woman-getting-warmer-by-fire_23-2149172517.jpg"
{ imageAlt="Тепло каміна в традиційному українському інтер'єрі"
imageSrc: "https://img.b2bpic.net/free-photo/full-shot-woman-getting-warmer-by-fire_23-2149172517.jpg", imageAlt: "Тепло каміна в традиційному українському інтер'єрі"
},
{
imageSrc: "https://img.b2bpic.net/free-photo/traditional-house-interior-design_23-2151050931.jpg", imageAlt: "Автентичний дерев'яний інтер'єр з етно-декором"
}
]}
rating={5}
ratingText="Улюблене місце сімей та організаторів заходів"
buttons={[{ buttons={[{
text: "Замовити стіл", onClick: () => setIsModalOpen(true) text: "Замовити стіл", onClick: () => setIsModalOpen(true)
}]} }]}
tagAnimation="slide-up" layoutOrder="default"
frameStyle="card"
buttonAnimation="slide-up" buttonAnimation="slide-up"
mediaAnimation="slide-up" mediaAnimation="slide-up"
className="py-20 lg:py-32" className="py-20 lg:py-32"
containerClassName="max-w-7xl" containerClassName="max-w-7xl"
titleClassName="text-4xl md:text-6xl font-bold text-foreground" logoClassName="text-6xl md:text-8xl font-bold text-foreground"
descriptionClassName="text-lg text-foreground/80" descriptionClassName="text-lg text-foreground/80"
buttonClassName="bg-primary-cta hover:bg-accent text-white" buttonClassName="bg-primary-cta hover:bg-accent text-white"
mediaWrapperClassName="rounded-soft overflow-hidden" mediaWrapperClassName="rounded-soft overflow-hidden"
@@ -105,7 +96,7 @@ export default function KazkovyyDimPage() {
tag="Наша спадщина" tag="Наша спадщина"
tagIcon={Leaf} tagIcon={Leaf}
title="Сімейна традиція українського гостинства" title="Сімейна традиція українського гостинства"
description="Казковий Дім втілює сутність автентичної української культури, тепла та сімейних зв'язків." description="Сіль Землі втілює сутність автентичної української культури, тепла та сімейних зв'язків."
subdescription="Кожна деталь від спеціально розроблених інтер'єрів до ретельно дібраних меню відображає нашу прихильність до збереження етнокультурних традицій." subdescription="Кожна деталь від спеціально розроблених інтер'єрів до ретельно дібраних меню відображає нашу прихильність до збереження етнокультурних традицій."
icon={Heart} icon={Heart}
imageSrc="https://img.b2bpic.net/free-photo/traditional-house-interior-design_23-2151050931.jpg" imageSrc="https://img.b2bpic.net/free-photo/traditional-house-interior-design_23-2151050931.jpg"
@@ -149,7 +140,7 @@ export default function KazkovyyDimPage() {
}, },
{ {
id: 4, id: 4,
tag: "Сім'я", title: "Дитяча кімната", subtitle: "Сімейне място", description: "Виділений безпечний простір для дітей із розвагами та заняттями. Дозволяє батькам святкувати, поки діти відпочивають у контрольованому, віковому середовищі.", imageSrc: "https://img.b2bpic.net/free-photo/beautifully-decorated-venue-interior-wedding_181624-58530.jpg", imageAlt: "Барвиста дитяча кімната з розвагами" tag: "Сім'я", title: "Дитяча кімната", subtitle: "Сімейне місце", description: "Виділений безпечний простір для дітей із розвагами та заняттями. Дозволяє батькам святкувати, поки діти відпочивають у контрольованому, віковому середовищі.", imageSrc: "https://img.b2bpic.net/free-photo/beautifully-decorated-venue-interior-wedding_181624-58530.jpg", imageAlt: "Барвиста дитяча кімната з розвагами"
}, },
{ {
id: 5, id: 5,
@@ -187,7 +178,7 @@ export default function KazkovyyDimPage() {
id: "2", name: "Вибір барів та напоїв", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/side-view-lamb-kebab-grilled-lamb-ribs-with-lettuce-tomato-greens-red-onion-grilled-corn-dried-barberry-glass-red-wine-table_141793-4982.jpg", imageAlt: "Преміум вибір для барів" id: "2", name: "Вибір барів та напоїв", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/side-view-lamb-kebab-grilled-lamb-ribs-with-lettuce-tomato-greens-red-onion-grilled-corn-dried-barberry-glass-red-wine-table_141793-4982.jpg", imageAlt: "Преміум вибір для барів"
}, },
{ {
id: "3", name: "Винна карта", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/wedding-reception-hall-with-elegant-table-setting-with-candles_181624-15206.jpg", imageAlt: "Куровивдена винна колекція" id: "3", name: "Винна карта", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/wedding-reception-hall-with-elegant-table-setting-with-candles_181624-15206.jpg", imageAlt: "Курована винна колекція"
}, },
{ {
id: "4", name: "Варіанти доставки", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/kebab-served-with-chopped-onion-piece-lemon-red-wine_140725-4164.jpg", imageAlt: "Приготовані страви для доставки" id: "4", name: "Варіанти доставки", price: "Переглянути PDF", imageSrc: "https://img.b2bpic.net/free-photo/kebab-served-with-chopped-onion-piece-lemon-red-wine_140725-4164.jpg", imageAlt: "Приготовані страви для доставки"
@@ -233,6 +224,40 @@ export default function KazkovyyDimPage() {
/> />
</div> </div>
<div id="faq" data-section="faq">
<FaqSplitText
faqs={[
{
id: "1", title: "Яка вартість оренди простору для бенкету?", content: "Вартість оренди залежить від розміру площадки, дати та тривалості заходу. Головна бенкетна зала для 80+ гостей має базову ставку, а VIP приватна кімната має преміум цінування. Зв'яжіться з нами для детального кошторису."
},
{
id: "2", title: "Чи доступна кейтеринг та послуга доставки?", content: "Так, ми пропонуємо комплексні кейтеринг послуги та доставку. Наші меню включають традиційні українські страви та посмажене на вогні м'ясо. Доставка доступна в межах міста та прилеглих районів."
},
{
id: "3", title: "Скільки людей може розместити найбільша зала?", content: "Наша головна бенкетна зала вміщує 80+ гостей, а другий поверх можна налаштувати для більших святкувань. Зв'яжіться з нами для деталей щодо максимальної кількості людей та гнучких розташувань."
},
{
id: "4", title: "Чи є детальні зони для дітей на заходах?", content: "Так, у нас є виділена дитяча кімната зі спеціальним наглядом та розвагами. Це дозволяє дорослим насолоджуватися святкуванням, поки діти знаходяться в безпечному, контрольованому середовищі."
},
{
id: "5", title: "Яких типів святкувань ви приймаєте?", content: "Ми приймаємо весілля, дні народження, ювілеї, корпоративні заходи, сімейні зібрання та інші спеціальні випадки. Кожен захід розроблюється персоналізовано, щоб відповідати вашим унікальним потребам."
},
{
id: "6", title: "Як забронювати послугу або дізнатися більше?", content: "Ви можете зв'язатися з нами через форму контакту на нашому сайті, виконавши замовлення на столик, або звернутися безпосередньо. Наша команда готова обговорити деталі вашого заходу та надати рекомендації."
}
]}
sideTitle="Часто задавані питання"
sideDescription="Все, що вам потрібно знати про святкування в Солі Землі"
useInvertedBackground={true}
faqsAnimation="slide-up"
textPosition="left"
className="py-16 lg:py-24"
containerClassName="max-w-7xl"
sideTitleClassName="text-4xl md:text-5xl font-bold text-foreground"
sideDescriptionClassName="text-lg text-foreground/80"
/>
</div>
<div id="testimonials" data-section="testimonials"> <div id="testimonials" data-section="testimonials">
<TestimonialCardTwo <TestimonialCardTwo
title="Голоси наших гостей" title="Голоси наших гостей"
@@ -245,7 +270,7 @@ export default function KazkovyyDimPage() {
animationType="slide-up" animationType="slide-up"
testimonials={[ testimonials={[
{ {
id: "1", name: "Оксана Коваленко", role: "Організаторка весілля", testimonial: "Казковий Дім втілив наші весільні мрії в реальність. Автентична атмосфера, смачна їжа та теплота персоналу зробили наш день справді чарівним. Наші гості все ще про нього говорять!", imageSrc: "https://img.b2bpic.net/free-photo/smiling-senior-businessman-sitting-stairs_1262-3109.jpg", imageAlt: "Оксана Коваленко" id: "1", name: "Оксана Коваленко", role: "Організаторка весілля", testimonial: "Сіль Землі втілила наші весільні мрії в реальність. Автентична атмосфера, смачна їжа та теплота персоналу зробили наш день справді чарівним. Наші гості все ще про нього говорять!", imageSrc: "https://img.b2bpic.net/free-photo/smiling-senior-businessman-sitting-stairs_1262-3109.jpg", imageAlt: "Оксана Коваленко"
}, },
{ {
id: "2", name: "Дмитро Петров", role: "Організатор корпоративних заходів", testimonial: "Універсальні простори та професійний сервіс зробили наше святкування компанії ідеальним. Від організації головного залу до кейтерингу все перевищило очікування. Дуже рекомендую!", imageSrc: "https://img.b2bpic.net/free-photo/black-businessman-happy-expression_1194-2533.jpg", imageAlt: "Дмитро Петров" id: "2", name: "Дмитро Петров", role: "Організатор корпоративних заходів", testimonial: "Універсальні простори та професійний сервіс зробили наше святкування компанії ідеальним. Від організації головного залу до кейтерингу все перевищило очікування. Дуже рекомендую!", imageSrc: "https://img.b2bpic.net/free-photo/black-businessman-happy-expression_1194-2533.jpg", imageAlt: "Дмитро Петров"
@@ -267,7 +292,7 @@ export default function KazkovyyDimPage() {
<div id="contacts" data-section="contacts"> <div id="contacts" data-section="contacts">
<ContactSplitForm <ContactSplitForm
title="Зв'яжіться з нами" title="Зв'яжіться з нами"
description="Готові святкувати ваш спеціальний момент у Казковому Димі? Звернітися до нашої команди, щоб обговорити ваш захід, поставити запитання чи зробити резервування. Ми тут, щоб зробити вашу зустріч незабутною." description="Готові святкувати ваш спеціальний момент у Солі Землі? Звернітися до нашої команди, щоб обговорити ваш захід, поставити запитання чи зробити резервування. Ми тут, щоб зробити вашу зустріч незабутною."
inputs={[ inputs={[
{ {
name: "name", type: "text", placeholder: "Ваше повне ім'я", required: true name: "name", type: "text", placeholder: "Ваше повне ім'я", required: true
@@ -288,7 +313,7 @@ export default function KazkovyyDimPage() {
}} }}
useInvertedBackground={false} useInvertedBackground={false}
imageSrc="https://img.b2bpic.net/free-photo/christmas-interior-decorated-with-christmas-wreath-made-fir-branches-two-armchairs-genuine-animal-fur-floor-front-electric-fireplace_132075-6151.jpg" imageSrc="https://img.b2bpic.net/free-photo/christmas-interior-decorated-with-christmas-wreath-made-fir-branches-two-armchairs-genuine-animal-fur-floor-front-electric-fireplace_132075-6151.jpg"
imageAlt="Тепла зустріч у Казковому Димі" imageAlt="Тепла зустріч у Солі Землі"
mediaAnimation="slide-up" mediaAnimation="slide-up"
mediaPosition="right" mediaPosition="right"
buttonText="Надіслати запит" buttonText="Надіслати запит"
@@ -304,8 +329,8 @@ export default function KazkovyyDimPage() {
<FooterMedia <FooterMedia
imageSrc="https://img.b2bpic.net/free-photo/young-woman-burning-fireplace-with-matchstick-home_23-2147904496.jpg" imageSrc="https://img.b2bpic.net/free-photo/young-woman-burning-fireplace-with-matchstick-home_23-2147904496.jpg"
imageAlt="Природна дерев'яна текстура фону" imageAlt="Природна дерев'яна текстура фону"
logoText="Казковий Дім" logoText="Сіль Землі"
copyrightText="© 2025 Казковий Дім. Всі права захищені. | Автентичне українське гостинство Традицією." copyrightText="© 2025 Сіль Землі. Всі права захищені. | Автентичне українське гостинство Традицією."
columns={[ columns={[
{ {
title: "Локації", items: [ title: "Локації", items: [
@@ -326,7 +351,7 @@ export default function KazkovyyDimPage() {
{ {
title: "Контакт", items: [ title: "Контакт", items: [
{ label: "Телефон: +380 (44) 123-4567", href: "tel:+380441234567" }, { label: "Телефон: +380 (44) 123-4567", href: "tel:+380441234567" },
{ label: "Пошта: info@kazkovyydim.ua", href: "mailto:info@kazkovyydim.ua" }, { label: "Пошта: info@silzemli.ua", href: "mailto:info@silzemli.ua" },
{ label: "Час роботи: Щодня 12:00 - 23:00", href: "#" }, { label: "Час роботи: Щодня 12:00 - 23:00", href: "#" },
{ label: "Адреса: Київ, Україна", href: "#" } { label: "Адреса: Київ, Україна", href: "#" }
] ]
@@ -351,7 +376,7 @@ export default function KazkovyyDimPage() {
</button> </button>
<h2 className="text-2xl md:text-3xl font-bold text-foreground mb-2">Замовити стіл</h2> <h2 className="text-2xl md:text-3xl font-bold text-foreground mb-2">Замовити стіл</h2>
<p className="text-foreground/70 text-sm mb-6">Зарезервуйте ваш спеціальний момент у Казковому Димі</p> <p className="text-foreground/70 text-sm mb-6">Зарезервуйте ваш спеціальний момент у Солі Землі</p>
<form onSubmit={handleSubmit} className="space-y-4"> <form onSubmit={handleSubmit} className="space-y-4">
<div> <div>