Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a4d821411 | |||
| 9e508b3017 | |||
| 57011d2561 | |||
| 20db4ce23c | |||
| 3bcb4a8cbc | |||
| cdbffe8972 | |||
| a0b3a3a81b |
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user