7 Commits

Author SHA1 Message Date
4a4d821411 Merge version_11 into main
Merge version_11 into main
2026-02-17 19:42:39 +00:00
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
2 changed files with 109 additions and 21 deletions

View File

@@ -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);
@@ -1240,4 +1303,4 @@ export default function RootLayout({
</body> </body>
</html> </html>
); );
} }

View File

@@ -2,13 +2,14 @@
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";
@@ -56,8 +57,7 @@ export default function SilZemliPage() {
{ 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 SilZemliPage() {
</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"
@@ -233,6 +224,40 @@ export default function SilZemliPage() {
/> />
</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="Голоси наших гостей"
@@ -467,4 +492,4 @@ export default function SilZemliPage() {
)} )}
</ThemeProvider> </ThemeProvider>
); );
} }