Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e31abcaf2e | |||
| 09155f7364 | |||
| 7b62faaf5b | |||
| 5995b382c4 | |||
| 01ef266712 | |||
| d42121281f | |||
| d8c016edfd | |||
| 44e7dffcdf | |||
| eaecd8daab | |||
| 5179e62430 | |||
| b19c105024 | |||
| b3eb67652d | |||
| 0338f892b9 | |||
| 8b6898e3e4 |
@@ -1,48 +1,24 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Cormorant_Garamond } from "next/font/google";
|
import { Inter } from "next/font/google";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
import { ServiceWrapper } from "@/components/ServiceWrapper";
|
import "./styles/variables.css";
|
||||||
import Tag from "@/tag/Tag";
|
import "./styles/base.css";
|
||||||
|
|
||||||
const cormorantGaramond = Cormorant_Garamond({
|
const inter = Inter({
|
||||||
variable: "--font-cormorant-garamond", subsets: ["latin"],
|
variable: "--font-inter", subsets: ["latin"],
|
||||||
weight: ["300", "400", "500", "600", "700"],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Kazkovyy Dim - Ukrainian Banquet Restaurant Complex", description: "Authentic Ukrainian banquet venue with fireplace, traditional ethno design, and family-focused hospitality. Perfect for weddings, celebrations, and events.", keywords: "Ukrainian restaurant, banquet hall, event venue, ethno style, family dining, Kyiv", metadataBase: new URL("https://kazkovyydim.ua"),
|
title: "Kazkovyy Dim - Authentic Ukrainian Banquets & Family Dining", description: "Experience warmth, tradition, and ethno-cultural heritage at Kazkovyy Dim. Premium banquet spaces, authentic cuisine, and unforgettable celebrations."};
|
||||||
alternates: {
|
|
||||||
canonical: "https://kazkovyydim.ua"
|
|
||||||
},
|
|
||||||
openGraph: {
|
|
||||||
title: "Kazkovyy Dim - Authentic Ukrainian Banquets", description: "Experience warmth, tradition, and Ukrainian hospitality at our beautifully designed banquet complex.", url: "https://kazkovyydim.ua", siteName: "Kazkovyy Dim", images: [{
|
|
||||||
url: "https://img.b2bpic.net/free-photo/full-shot-woman-getting-warmer-by-fire_23-2149172517.jpg", alt: "Kazkovyy Dim - Warm fireplace interior"
|
|
||||||
}],
|
|
||||||
type: "website"
|
|
||||||
},
|
|
||||||
twitter: {
|
|
||||||
card: "summary_large_image", title: "Kazkovyy Dim - Ukrainian Banquet Restaurant", description: "Authentic family-owned banquet venue with ethno style and warm hospitality.", images: ["https://img.b2bpic.net/free-photo/full-shot-woman-getting-warmer-by-fire_23-2149172517.jpg"]
|
|
||||||
},
|
|
||||||
robots: {
|
|
||||||
index: true,
|
|
||||||
follow: true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
}: Readonly<{
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}>) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<html lang="en" suppressHydrationWarning>
|
<html lang="en">
|
||||||
<ServiceWrapper>
|
<body className={`${inter.variable}`}>{children}
|
||||||
<body
|
|
||||||
className={cormorantGaramond.variable}
|
|
||||||
>
|
|
||||||
<Tag />
|
|
||||||
{children}
|
|
||||||
|
|
||||||
<script
|
<script
|
||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: `
|
__html: `
|
||||||
@@ -1261,7 +1237,6 @@ export default function RootLayout({
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</body>
|
</body>
|
||||||
</ServiceWrapper>
|
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
160
src/app/page.tsx
160
src/app/page.tsx
@@ -9,9 +9,32 @@ 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 { Castle, Flame, Heart, Leaf, Quote, UtensilsCrossed } from "lucide-react";
|
import { Castle, Flame, Heart, Leaf, Quote, UtensilsCrossed, X } from "lucide-react";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
export default function KazkovyyDimPage() {
|
export default function KazkovyyDimPage() {
|
||||||
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
||||||
|
const [formData, setFormData] = useState({
|
||||||
|
name: "", email: "", phone: "", eventDate: "", guestCount: "", message: ""
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||||
|
const { name, value } = e.target;
|
||||||
|
setFormData(prev => ({
|
||||||
|
...prev,
|
||||||
|
[name]: value
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = (e: React.FormEvent) => {
|
||||||
|
e.preventDefault();
|
||||||
|
console.log("Booking form submitted:", formData);
|
||||||
|
setFormData({
|
||||||
|
name: "", email: "", phone: "", eventDate: "", guestCount: "", message: ""
|
||||||
|
});
|
||||||
|
setIsModalOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ThemeProvider
|
<ThemeProvider
|
||||||
defaultButtonVariant="elastic-effect"
|
defaultButtonVariant="elastic-effect"
|
||||||
@@ -38,7 +61,7 @@ export default function KazkovyyDimPage() {
|
|||||||
{ name: "Contacts", id: "contacts" }
|
{ name: "Contacts", id: "contacts" }
|
||||||
]}
|
]}
|
||||||
button={{
|
button={{
|
||||||
text: "Book a Table", href: "#contacts"
|
text: "Book a Table", onClick: () => setIsModalOpen(true)
|
||||||
}}
|
}}
|
||||||
navItemClassName="text-sm font-medium hover:text-primary-cta transition-colors"
|
navItemClassName="text-sm font-medium hover:text-primary-cta transition-colors"
|
||||||
buttonClassName="bg-primary-cta hover:bg-accent text-white px-6 py-2 rounded-soft transition-all"
|
buttonClassName="bg-primary-cta hover:bg-accent text-white px-6 py-2 rounded-soft transition-all"
|
||||||
@@ -63,7 +86,7 @@ export default function KazkovyyDimPage() {
|
|||||||
rating={5}
|
rating={5}
|
||||||
ratingText="Loved by families and event organizers"
|
ratingText="Loved by families and event organizers"
|
||||||
buttons={[{
|
buttons={[{
|
||||||
text: "Book a Table", href: "#contacts"
|
text: "Book a Table", onClick: () => setIsModalOpen(true)
|
||||||
}]}
|
}]}
|
||||||
tagAnimation="slide-up"
|
tagAnimation="slide-up"
|
||||||
buttonAnimation="slide-up"
|
buttonAnimation="slide-up"
|
||||||
@@ -109,7 +132,7 @@ export default function KazkovyyDimPage() {
|
|||||||
tagAnimation="slide-up"
|
tagAnimation="slide-up"
|
||||||
buttonAnimation="slide-up"
|
buttonAnimation="slide-up"
|
||||||
buttons={[{
|
buttons={[{
|
||||||
text: "Inquire About Events", href: "#contacts"
|
text: "Inquire About Events", onClick: () => setIsModalOpen(true)
|
||||||
}]}
|
}]}
|
||||||
features={[
|
features={[
|
||||||
{
|
{
|
||||||
@@ -204,7 +227,7 @@ export default function KazkovyyDimPage() {
|
|||||||
textBoxTitleClassName="text-4xl md:text-5xl font-bold text-foreground"
|
textBoxTitleClassName="text-4xl md:text-5xl font-bold text-foreground"
|
||||||
textBoxDescriptionClassName="text-lg text-foreground/80"
|
textBoxDescriptionClassName="text-lg text-foreground/80"
|
||||||
buttons={[{
|
buttons={[{
|
||||||
text: "Order Now", href: "#contacts"
|
text: "Order Now", onClick: () => setIsModalOpen(true)
|
||||||
}]}
|
}]}
|
||||||
buttonAnimation="slide-up"
|
buttonAnimation="slide-up"
|
||||||
/>
|
/>
|
||||||
@@ -315,6 +338,133 @@ export default function KazkovyyDimPage() {
|
|||||||
copyrightTextClassName="text-background/70 text-sm"
|
copyrightTextClassName="text-background/70 text-sm"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{isModalOpen && (
|
||||||
|
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
|
||||||
|
<div className="bg-card rounded-soft w-full max-w-md relative p-8">
|
||||||
|
<button
|
||||||
|
onClick={() => setIsModalOpen(false)}
|
||||||
|
className="absolute top-4 right-4 p-2 hover:bg-background rounded-soft transition-colors"
|
||||||
|
aria-label="Close modal"
|
||||||
|
>
|
||||||
|
<X className="w-6 h-6 text-foreground" />
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<h2 className="text-2xl md:text-3xl font-bold text-foreground mb-2">Book a Table</h2>
|
||||||
|
<p className="text-foreground/70 text-sm mb-6">Reserve your special moment at Kazkovyy Dim</p>
|
||||||
|
|
||||||
|
<form onSubmit={handleSubmit} className="space-y-4">
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-name" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Full Name *
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="modal-name"
|
||||||
|
type="text"
|
||||||
|
name="name"
|
||||||
|
placeholder="Your Full Name"
|
||||||
|
value={formData.name}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
required
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-email" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Email Address *
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="modal-email"
|
||||||
|
type="email"
|
||||||
|
name="email"
|
||||||
|
placeholder="your@email.com"
|
||||||
|
value={formData.email}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
required
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-phone" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Phone Number *
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="modal-phone"
|
||||||
|
type="tel"
|
||||||
|
name="phone"
|
||||||
|
placeholder="+380 (XX) XXXX-XXXX"
|
||||||
|
value={formData.phone}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
required
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-date" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Preferred Event Date
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="modal-date"
|
||||||
|
type="date"
|
||||||
|
name="eventDate"
|
||||||
|
value={formData.eventDate}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-guests" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Number of Guests
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="modal-guests"
|
||||||
|
type="number"
|
||||||
|
name="guestCount"
|
||||||
|
placeholder="Expected number of guests"
|
||||||
|
value={formData.guestCount}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="modal-message" className="block text-sm font-medium text-foreground mb-2">
|
||||||
|
Additional Details
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
id="modal-message"
|
||||||
|
name="message"
|
||||||
|
placeholder="Tell us about your event, venue preference, and any special requests..."
|
||||||
|
value={formData.message}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
rows={4}
|
||||||
|
className="w-full px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground placeholder-foreground/50 focus:outline-none focus:border-primary-cta transition-colors resize-none"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex gap-3 pt-4">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setIsModalOpen(false)}
|
||||||
|
className="flex-1 px-4 py-2 rounded-soft bg-background border border-accent/20 text-foreground hover:bg-accent/10 transition-colors"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="flex-1 px-4 py-2 rounded-soft bg-primary-cta hover:bg-accent text-white font-medium transition-colors"
|
||||||
|
>
|
||||||
|
Send Booking
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,21 +2,21 @@
|
|||||||
/* Base units */
|
/* Base units */
|
||||||
/* --vw is set by ThemeProvider */
|
/* --vw is set by ThemeProvider */
|
||||||
|
|
||||||
/* --background: #060000;;;;;;;
|
/* --background: #d4a574;;;;;;;
|
||||||
--card: #1d0d0d;;;;;;;
|
--card: #e8c4a0;;;;;;;
|
||||||
--foreground: #ffe6e6;;;;;;;
|
--foreground: #2b1810;;;;;;;
|
||||||
--primary-cta: #ff3d4a;;;;;;;
|
--primary-cta: #8b5a2b;;;;;;;
|
||||||
--secondary-cta: #1f0a0a;;;;;;;
|
--secondary-cta: #f5deb3;;;;;;;
|
||||||
--accent: #7b2d2d;;;;;;;
|
--accent: #d4a574;;;;;;;
|
||||||
--background-accent: #b8111f;;;;;;; */
|
--background-accent: #c19a6b;;;;;;; */
|
||||||
|
|
||||||
--background: #060000;;;;;;;
|
--background: #d4a574;;;;;;;
|
||||||
--card: #1d0d0d;;;;;;;
|
--card: #e8c4a0;;;;;;;
|
||||||
--foreground: #ffe6e6;;;;;;;
|
--foreground: #2b1810;;;;;;;
|
||||||
--primary-cta: #ff3d4a;;;;;;;
|
--primary-cta: #8b5a2b;;;;;;;
|
||||||
--secondary-cta: #1f0a0a;;;;;;;
|
--secondary-cta: #f5deb3;;;;;;;
|
||||||
--accent: #7b2d2d;;;;;;;
|
--accent: #d4a574;;;;;;;
|
||||||
--background-accent: #b8111f;;;;;;;
|
--background-accent: #c19a6b;;;;;;;
|
||||||
|
|
||||||
/* text sizing - set by ThemeProvider */
|
/* text sizing - set by ThemeProvider */
|
||||||
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
|
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
|
||||||
|
|||||||
Reference in New Issue
Block a user