Merge version_2_1781391385603 into main #1

Merged
bender merged 1 commits from version_2_1781391385603 into main 2026-06-13 22:57:42 +00:00
10 changed files with 359 additions and 258 deletions

View File

@@ -1,19 +1,19 @@
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Lato:wght@300;400;700&display=swap');
@import "tailwindcss";
@import "./styles/masks.css";
@import "./styles/animations.css";
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #efebe5;
--card: #f7f2ea;
--foreground: #000000;
--primary-cta: #000000;
--primary-cta-text: #efebe5;
--secondary-cta: #ffffff;
--secondary-cta-text: #000000;
--accent: #ffffff;
--background-accent: #e1b875;
--background: #fdfbf9;
--card: #ffffff;
--foreground: #2d2d2d;
--primary-cta: #c5a085;
--primary-cta-text: #ffffff;
--secondary-cta: #f4e8e5;
--secondary-cta-text: #2d2d2d;
--accent: #f4e8e5;
--background-accent: #f4e8e5;
/* @layout/border-radius/rounded */
--radius: 1rem;
@@ -88,8 +88,8 @@
--color-background-accent: var(--background-accent);
/* Fonts */
--font-sans: 'Poppins', sans-serif;
--font-tight: "Inter Tight", sans-serif;
--font-sans: 'Lato', sans-serif;
--font-tight: 'Playfair Display', serif;
--font-mono: monospace;
/* Border Radius */

View File

@@ -1,258 +1,36 @@
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
import { Award, CheckCircle, Shield } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
// AUTO-GENERATED shell by per-section-migrate.
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
// files directly. Non-block content (wrappers, non-inlinable sections) is
// preserved inline; extracted section blocks become <XSection/> refs.
export default function HomePage() {
import React from 'react';
import HeroSection from './HomePage/sections/Hero';
import AboutSection from './HomePage/sections/About';
import ServicesSection from './HomePage/sections/Services';
import PricingSection from './HomePage/sections/Pricing';
import MetricsSection from './HomePage/sections/Metrics';
import TestimonialsSection from './HomePage/sections/Testimonials';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="Eva Bayan Kuaförü"
description="Zarafetinizi profesyonel dokunuşlarla taçlandırıyoruz. Size özel bakım ve tasarım hizmetlerimizle kendinizi yenilenmiş hissedin."
primaryButton={{
text: "WhatsApp Randevu",
href: "https://wa.me/905XXXXXXXXXX?text=Merhaba, randevu almak istiyorum.",
}}
secondaryButton={{
text: "Instagram'da İncele",
href: "https://www.instagram.com/evabayankuaforu/",
}}
imageSrc="http://img.b2bpic.net/free-photo/side-view-smiley-woman-getting-ready-wedding_23-2149722027.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Tutkuyla ve Özenle"
descriptions={[
"Eva Bayan Kuaförü olarak, saç tasarımında profesyonelliği estetikle birleştiriyoruz. Her bir müşterimiz için kişiye özel danışmanlık hizmeti sunarak, saçınıza en uygun bakımı ve stili belirliyoruz.",
"Hijyenik çalışma ortamımız, kaliteli ürünlerimiz ve deneyimli ekibimizle, güzellik salonumuzda geçirdiğiniz her anın özel ve konforlu olması için çalışıyoruz.",
]}
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesImageBento
tag="Uzmanlık Alanlarımız"
title="Hizmetlerimiz"
description="Bakımınıza dair her detayı profesyonelce ele alıyoruz."
items={[
{
title: "Saç Kesimi",
description: "Size özel tasarım kesim teknikleri.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-girl-getting-her-hair-done_23-2148108824.jpg",
},
{
title: "Boya & Ombre",
description: "Işıltılı ve doğal geçişli renkler.",
imageSrc: "http://img.b2bpic.net/free-photo/one-woman-helps-friend-with-necklace_343596-887.jpg",
},
{
title: "Tırnak Bakımı",
description: "Manikür, pedikür ve protez tırnak.",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-young-female-manicure-pink-t-shirt-with-black-gloves-black-mask-using-spray-blue_140725-24249.jpg",
},
{
title: "Gelin Saçı",
description: "En özel gününüze hazırlık.",
imageSrc: "http://img.b2bpic.net/free-photo/professional-hairdresser-styling-hair-client_23-2147769815.jpg",
},
{
title: "Fön & Şekil",
description: "Zarif günlük ve özel stil.",
imageSrc: "http://img.b2bpic.net/free-photo/woman-getting-her-hair-dyed-beauty-salon_23-2149167366.jpg",
},
{
title: "Kaş & Bıyık",
description: "Yüzünüze en yakışan dokunuş.",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-nail-care-treatment_23-2149262907.jpg",
},
{
title: "Makyaj",
description: "Özel günler için profesyonel dokunuş.",
imageSrc: "http://img.b2bpic.net/free-photo/professional-stylist-working-with-client_23-2147769765.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<ServicesSection />
<div id="pricing" data-section="pricing">
<SectionErrorBoundary name="pricing">
<PricingHighlightedCards
tag="Şeffaf Fiyatlandırma"
title="Hizmet Fiyatlarımız"
description="Kaliteli hizmete erişilebilir fiyatlarla ulaşın."
plans={[
{
tag: "Temel Bakım",
price: "250 TL+",
description: "Fön, Kaş ve temel işlemler.",
features: [
"Fön",
"Kaş-Bıyık",
"Kesim",
],
primaryButton: {
text: "Randevu Al",
href: "#contact",
},
},
{
tag: "Renklendirme",
price: "800 TL+",
description: "Boya ve renklendirme işlemleri.",
features: [
"Dip Boya",
"Tüm Boya",
"Ombre",
],
highlight: "Popüler",
primaryButton: {
text: "Randevu Al",
href: "#contact",
},
},
{
tag: "Premium",
price: "Bilgi Alın",
description: "Protez tırnak ve gelin saçı özel hizmetleri.",
features: [
"Protez Tırnak",
"Gelin Saçı",
"Özel Gün Makyajı",
],
primaryButton: {
text: "Bilgi Al",
href: "#contact",
},
},
]}
/>
</SectionErrorBoundary>
</div>
<PricingSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsIconCards
tag="Güven ve Kalite"
title="Neden Bizi Seçmelisiniz?"
description="Eva Bayan Kuaförü olarak önceliğimiz sizsiniz."
metrics={[
{
icon: CheckCircle,
title: "Mutlu Müşteri",
value: "1000+",
},
{
icon: Award,
title: "Uzman Ekip",
value: "10+ Yıl",
},
{
icon: Shield,
title: "Hijyenik Salon",
value: "%100",
},
]}
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Müşterilerimizden"
title="Ne Dediler?"
description="Mutlu müşterilerimizin yorumları."
testimonials={[
{
name: "Ayşe Yılmaz",
role: "Müşteri",
quote: "Yıllardır tek adresim, saçlarımı güvenle emanet ediyorum.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-girl-with-short-hair-red-lipstick_158538-8422.jpg",
},
{
name: "Zeynep Demir",
role: "Müşteri",
quote: "Gelin saçımı yaptırdım, harika bir iş çıkardılar.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-woman-getting-her-hair-done_23-2148108777.jpg",
},
{
name: "Elif Kaya",
role: "Müşteri",
quote: "Çok ilgili ve çok temiz bir işletme.",
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-woman-blue-dress_176420-3518.jpg",
},
{
name: "Seda Şen",
role: "Müşteri",
quote: "Ombre yaptırdım, istediğim tondan çok daha iyi oldu.",
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-young-caucasian-female-with-blonde-hair-white-suit-have-bad-day_132075-9661.jpg",
},
{
name: "Buse Tekin",
role: "Müşteri",
quote: "Tırnak bakımından çok memnun kaldım, herkese tavsiye ederim.",
imageSrc: "http://img.b2bpic.net/free-photo/studio-shot-glad-woman-white-jacket-is-posing-beige-background_291650-431.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="Sorularınız"
title="Sıkça Sorulan Sorular"
description="Merak ettiğiniz her şey burada."
items={[
{
question: "Randevu şart mı?",
answer: "Daha iyi hizmet verebilmek adına randevulu çalışıyoruz.",
},
{
question: "WhatsApp'tan randevu alınır mı?",
answer: "Evet, tüm randevu taleplerinizi WhatsApp üzerinden alıyoruz.",
},
{
question: "Hafta sonu açık mısınız?",
answer: "Evet, haftanın her günü hizmetinizdeyiz.",
},
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Randevu"
text="Yeni görünümünüz için bir adım atın. Hemen randevu oluşturun."
primaryButton={{
text: "WhatsApp'tan Randevu Al",
href: "https://wa.me/905XXXXXXXXXX?text=Merhaba, randevu almak istiyorum.",
}}
secondaryButton={{
text: "İletişime Geç",
href: "tel:+905XXXXXXXXXX",
}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,22 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "about" section.
import React from 'react';
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutTextSplit
title="Tutkuyla ve Özenle"
descriptions={[
"Eva Bayan Kuaförü olarak, saç tasarımında profesyonelliği estetikle birleştiriyoruz. Her bir müşterimiz için kişiye özel danışmanlık hizmeti sunarak, saçınıza en uygun bakımı ve stili belirliyoruz.",
"Hijyenik çalışma ortamımız, kaliteli ürünlerimiz ve deneyimli ekibimizle, güzellik salonumuzda geçirdiğiniz her anın özel ve konforlu olması için çalışıyoruz.",
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,27 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "contact" section.
import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ContactSection(): React.JSX.Element {
return (
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Randevu"
text="Yeni görünümünüz için bir adım atın. Hemen randevu oluşturun."
primaryButton={{
text: "WhatsApp'tan Randevu Al",
href: "https://wa.me/905XXXXXXXXXX?text=Merhaba, randevu almak istiyorum.",
}}
secondaryButton={{
text: "İletişime Geç",
href: "tel:+905XXXXXXXXXX",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,34 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "faq" section.
import React from 'react';
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTwoColumn
tag="Sorularınız"
title="Sıkça Sorulan Sorular"
description="Merak ettiğiniz her şey burada."
items={[
{
question: "Randevu şart mı?",
answer: "Daha iyi hizmet verebilmek adına randevulu çalışıyoruz.",
},
{
question: "WhatsApp'tan randevu alınır mı?",
answer: "Evet, tüm randevu taleplerinizi WhatsApp üzerinden alıyoruz.",
},
{
question: "Hafta sonu açık mısınız?",
answer: "Evet, haftanın her günü hizmetinizdeyiz.",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,28 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "hero" section.
import React from 'react';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="Eva Bayan Kuaförü"
description="Zarafetinizi profesyonel dokunuşlarla taçlandırıyoruz. Size özel bakım ve tasarım hizmetlerimizle kendinizi yenilenmiş hissedin."
primaryButton={{
text: "WhatsApp Randevu",
href: "https://wa.me/905XXXXXXXXXX?text=Merhaba, randevu almak istiyorum.",
}}
secondaryButton={{
text: "Instagram'da İncele",
href: "https://www.instagram.com/evabayankuaforu/",
}}
imageSrc="http://img.b2bpic.net/free-photo/side-view-smiley-woman-getting-ready-wedding_23-2149722027.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,38 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "metrics" section.
import React from 'react';
import MetricsIconCards from '@/components/sections/metrics/MetricsIconCards';
import { Award, CheckCircle, Shield } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsIconCards
tag="Güven ve Kalite"
title="Neden Bizi Seçmelisiniz?"
description="Eva Bayan Kuaförü olarak önceliğimiz sizsiniz."
metrics={[
{
icon: CheckCircle,
title: "Mutlu Müşteri",
value: "1000+",
},
{
icon: Award,
title: "Uzman Ekip",
value: "10+ Yıl",
},
{
icon: Shield,
title: "Hijyenik Salon",
value: "%100",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,65 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "pricing" section.
import React from 'react';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function PricingSection(): React.JSX.Element {
return (
<div id="pricing" data-section="pricing">
<SectionErrorBoundary name="pricing">
<PricingHighlightedCards
tag="Şeffaf Fiyatlandırma"
title="Hizmet Fiyatlarımız"
description="Kaliteli hizmete erişilebilir fiyatlarla ulaşın."
plans={[
{
tag: "Temel Bakım",
price: "250 TL+",
description: "Fön, Kaş ve temel işlemler.",
features: [
"Fön",
"Kaş-Bıyık",
"Kesim",
],
primaryButton: {
text: "Randevu Al",
href: "#contact",
},
},
{
tag: "Renklendirme",
price: "800 TL+",
description: "Boya ve renklendirme işlemleri.",
features: [
"Dip Boya",
"Tüm Boya",
"Ombre",
],
highlight: "Popüler",
primaryButton: {
text: "Randevu Al",
href: "#contact",
},
},
{
tag: "Premium",
price: "Bilgi Alın",
description: "Protez tırnak ve gelin saçı özel hizmetleri.",
features: [
"Protez Tırnak",
"Gelin Saçı",
"Özel Gün Makyajı",
],
primaryButton: {
text: "Bilgi Al",
href: "#contact",
},
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "services" section.
import React from 'react';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ServicesSection(): React.JSX.Element {
return (
<div id="services" data-section="services">
<SectionErrorBoundary name="services">
<FeaturesImageBento
tag="Uzmanlık Alanlarımız"
title="Hizmetlerimiz"
description="Bakımınıza dair her detayı profesyonelce ele alıyoruz."
items={[
{
title: "Saç Kesimi",
description: "Size özel tasarım kesim teknikleri.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-girl-getting-her-hair-done_23-2148108824.jpg",
},
{
title: "Boya & Ombre",
description: "Işıltılı ve doğal geçişli renkler.",
imageSrc: "http://img.b2bpic.net/free-photo/one-woman-helps-friend-with-necklace_343596-887.jpg",
},
{
title: "Tırnak Bakımı",
description: "Manikür, pedikür ve protez tırnak.",
imageSrc: "http://img.b2bpic.net/free-photo/front-view-young-female-manicure-pink-t-shirt-with-black-gloves-black-mask-using-spray-blue_140725-24249.jpg",
},
{
title: "Gelin Saçı",
description: "En özel gününüze hazırlık.",
imageSrc: "http://img.b2bpic.net/free-photo/professional-hairdresser-styling-hair-client_23-2147769815.jpg",
},
{
title: "Fön & Şekil",
description: "Zarif günlük ve özel stil.",
imageSrc: "http://img.b2bpic.net/free-photo/woman-getting-her-hair-dyed-beauty-salon_23-2149167366.jpg",
},
{
title: "Kaş & Bıyık",
description: "Yüzünüze en yakışan dokunuş.",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-nail-care-treatment_23-2149262907.jpg",
},
{
title: "Makyaj",
description: "Özel günler için profesyonel dokunuş.",
imageSrc: "http://img.b2bpic.net/free-photo/professional-stylist-working-with-client_23-2147769765.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,52 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "testimonials" section.
import React from 'react';
import TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Müşterilerimizden"
title="Ne Dediler?"
description="Mutlu müşterilerimizin yorumları."
testimonials={[
{
name: "Ayşe Yılmaz",
role: "Müşteri",
quote: "Yıllardır tek adresim, saçlarımı güvenle emanet ediyorum.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-girl-with-short-hair-red-lipstick_158538-8422.jpg",
},
{
name: "Zeynep Demir",
role: "Müşteri",
quote: "Gelin saçımı yaptırdım, harika bir iş çıkardılar.",
imageSrc: "http://img.b2bpic.net/free-photo/blonde-woman-getting-her-hair-done_23-2148108777.jpg",
},
{
name: "Elif Kaya",
role: "Müşteri",
quote: "Çok ilgili ve çok temiz bir işletme.",
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-woman-blue-dress_176420-3518.jpg",
},
{
name: "Seda Şen",
role: "Müşteri",
quote: "Ombre yaptırdım, istediğim tondan çok daha iyi oldu.",
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-young-caucasian-female-with-blonde-hair-white-suit-have-bad-day_132075-9661.jpg",
},
{
name: "Buse Tekin",
role: "Müşteri",
quote: "Tırnak bakımından çok memnun kaldım, herkese tavsiye ederim.",
imageSrc: "http://img.b2bpic.net/free-photo/studio-shot-glad-woman-white-jacket-is-posing-beige-background_291650-431.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}