@aws505/sheetsite 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -40
- package/dist/components/index.js +823 -72
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +808 -72
- package/dist/components/index.mjs.map +1 -1
- package/dist/index.js +194 -74
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +184 -74
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/index.ts +12 -0
- package/src/components/layout/Footer.tsx +4 -4
- package/src/components/layout/Header.tsx +4 -4
- package/src/components/sections/BeforeAfter.tsx +345 -0
- package/src/components/sections/FAQ.tsx +5 -3
- package/src/components/sections/Gallery.tsx +104 -4
- package/src/components/sections/Hours.tsx +5 -3
- package/src/components/sections/Menu.tsx +312 -0
- package/src/components/sections/Services.tsx +5 -3
- package/src/components/sections/Testimonials.tsx +3 -1
- package/src/components/sections/TrustBadges.tsx +283 -0
- package/src/components/ui/AnimatedSection.tsx +136 -0
package/dist/index.mjs
CHANGED
|
@@ -3746,10 +3746,10 @@ function Icon({ name, ...props }) {
|
|
|
3746
3746
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
3747
3747
|
var defaultNavigation = [
|
|
3748
3748
|
{ label: "Home", href: "/" },
|
|
3749
|
-
{ label: "Services", href: "
|
|
3750
|
-
{ label: "
|
|
3751
|
-
{ label: "
|
|
3752
|
-
{ label: "
|
|
3749
|
+
{ label: "Services", href: "/#services" },
|
|
3750
|
+
{ label: "Hours", href: "/#hours" },
|
|
3751
|
+
{ label: "Reviews", href: "/#reviews" },
|
|
3752
|
+
{ label: "FAQ", href: "/#faq" }
|
|
3753
3753
|
];
|
|
3754
3754
|
function Header({
|
|
3755
3755
|
business,
|
|
@@ -3842,10 +3842,10 @@ function Header({
|
|
|
3842
3842
|
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
3843
3843
|
var defaultQuickLinks = [
|
|
3844
3844
|
{ label: "Home", href: "/" },
|
|
3845
|
-
{ label: "Services", href: "
|
|
3846
|
-
{ label: "
|
|
3847
|
-
{ label: "
|
|
3848
|
-
{ label: "
|
|
3845
|
+
{ label: "Services", href: "/#services" },
|
|
3846
|
+
{ label: "Hours", href: "/#hours" },
|
|
3847
|
+
{ label: "Reviews", href: "/#reviews" },
|
|
3848
|
+
{ label: "FAQ", href: "/#faq" }
|
|
3849
3849
|
];
|
|
3850
3850
|
var dayNames = {
|
|
3851
3851
|
monday: "Mon",
|
|
@@ -4159,7 +4159,8 @@ function Services({
|
|
|
4159
4159
|
showIcons = true,
|
|
4160
4160
|
variant = "cards",
|
|
4161
4161
|
limit,
|
|
4162
|
-
className = ""
|
|
4162
|
+
className = "",
|
|
4163
|
+
id = "services"
|
|
4163
4164
|
}) {
|
|
4164
4165
|
const displayedServices = limit ? services.slice(0, limit) : services;
|
|
4165
4166
|
const gridCols = {
|
|
@@ -4168,7 +4169,7 @@ function Services({
|
|
|
4168
4169
|
4: "md:grid-cols-2 lg:grid-cols-4"
|
|
4169
4170
|
};
|
|
4170
4171
|
if (variant === "list") {
|
|
4171
|
-
return /* @__PURE__ */ jsx5("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4172
|
+
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4172
4173
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
4173
4174
|
/* @__PURE__ */ jsx5("div", { className: "max-w-3xl mx-auto divide-y divide-gray-200", children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
4174
4175
|
ServiceListItem,
|
|
@@ -4182,7 +4183,7 @@ function Services({
|
|
|
4182
4183
|
] }) });
|
|
4183
4184
|
}
|
|
4184
4185
|
if (variant === "minimal") {
|
|
4185
|
-
return /* @__PURE__ */ jsx5("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4186
|
+
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4186
4187
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
4187
4188
|
/* @__PURE__ */ jsx5("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
4188
4189
|
ServiceMinimalCard,
|
|
@@ -4194,7 +4195,7 @@ function Services({
|
|
|
4194
4195
|
)) })
|
|
4195
4196
|
] }) });
|
|
4196
4197
|
}
|
|
4197
|
-
return /* @__PURE__ */ jsx5("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4198
|
+
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
4198
4199
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
4199
4200
|
/* @__PURE__ */ jsx5("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
4200
4201
|
ServiceCard,
|
|
@@ -4268,7 +4269,8 @@ function Testimonials({
|
|
|
4268
4269
|
showRatings = true,
|
|
4269
4270
|
variant = "cards",
|
|
4270
4271
|
limit,
|
|
4271
|
-
className = ""
|
|
4272
|
+
className = "",
|
|
4273
|
+
id = "reviews"
|
|
4272
4274
|
}) {
|
|
4273
4275
|
const displayedTestimonials = limit ? testimonials.slice(0, limit) : testimonials;
|
|
4274
4276
|
const gridCols = {
|
|
@@ -4276,7 +4278,7 @@ function Testimonials({
|
|
|
4276
4278
|
2: "md:grid-cols-2 max-w-4xl mx-auto",
|
|
4277
4279
|
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
4278
4280
|
};
|
|
4279
|
-
return /* @__PURE__ */ jsx6("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs6("div", { className: "container mx-auto px-4", children: [
|
|
4281
|
+
return /* @__PURE__ */ jsx6("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs6("div", { className: "container mx-auto px-4", children: [
|
|
4280
4282
|
/* @__PURE__ */ jsxs6("div", { className: "text-center mb-12", children: [
|
|
4281
4283
|
/* @__PURE__ */ jsx6("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4282
4284
|
subtitle && /* @__PURE__ */ jsx6("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
@@ -4379,7 +4381,8 @@ function FAQ({
|
|
|
4379
4381
|
variant = "accordion",
|
|
4380
4382
|
defaultOpen = 0,
|
|
4381
4383
|
allowMultiple = false,
|
|
4382
|
-
className = ""
|
|
4384
|
+
className = "",
|
|
4385
|
+
id = "faq"
|
|
4383
4386
|
}) {
|
|
4384
4387
|
const initialOpen = Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen];
|
|
4385
4388
|
const [openItems, setOpenItems] = useState2(initialOpen);
|
|
@@ -4395,18 +4398,18 @@ function FAQ({
|
|
|
4395
4398
|
}
|
|
4396
4399
|
};
|
|
4397
4400
|
if (variant === "cards") {
|
|
4398
|
-
return /* @__PURE__ */ jsx7("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4401
|
+
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4399
4402
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
4400
4403
|
/* @__PURE__ */ jsx7("div", { className: "grid md:grid-cols-2 gap-6 max-w-4xl mx-auto", children: items.map((item) => /* @__PURE__ */ jsx7(FAQCard, { item }, item.id || item.question)) })
|
|
4401
4404
|
] }) });
|
|
4402
4405
|
}
|
|
4403
4406
|
if (variant === "simple") {
|
|
4404
|
-
return /* @__PURE__ */ jsx7("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4407
|
+
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4405
4408
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
4406
4409
|
/* @__PURE__ */ jsx7("div", { className: "max-w-3xl mx-auto space-y-8", children: items.map((item) => /* @__PURE__ */ jsx7(FAQSimple, { item }, item.id || item.question)) })
|
|
4407
4410
|
] }) });
|
|
4408
4411
|
}
|
|
4409
|
-
return /* @__PURE__ */ jsx7("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4412
|
+
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
4410
4413
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
4411
4414
|
/* @__PURE__ */ jsx7("div", { className: "max-w-3xl mx-auto", children: items.map((item, index) => /* @__PURE__ */ jsx7(
|
|
4412
4415
|
FAQAccordionItem,
|
|
@@ -4503,14 +4506,15 @@ function Hours({
|
|
|
4503
4506
|
highlightToday = true,
|
|
4504
4507
|
variant = "card",
|
|
4505
4508
|
timezone,
|
|
4506
|
-
className = ""
|
|
4509
|
+
className = "",
|
|
4510
|
+
id = "hours"
|
|
4507
4511
|
}) {
|
|
4508
4512
|
const todayDay = getTodayDay(timezone);
|
|
4509
4513
|
const sortedHours = [...hours].sort(
|
|
4510
4514
|
(a, b) => dayOrder.indexOf(a.day) - dayOrder.indexOf(b.day)
|
|
4511
4515
|
);
|
|
4512
4516
|
if (variant === "inline") {
|
|
4513
|
-
return /* @__PURE__ */ jsx8("div", { className: `flex flex-wrap gap-4 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ jsx8(
|
|
4517
|
+
return /* @__PURE__ */ jsx8("div", { id, className: `flex flex-wrap gap-4 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ jsx8(
|
|
4514
4518
|
HoursInlineItem,
|
|
4515
4519
|
{
|
|
4516
4520
|
entry,
|
|
@@ -4520,7 +4524,7 @@ function Hours({
|
|
|
4520
4524
|
)) });
|
|
4521
4525
|
}
|
|
4522
4526
|
if (variant === "minimal") {
|
|
4523
|
-
return /* @__PURE__ */ jsx8("div", { className: `space-y-1 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ jsx8(
|
|
4527
|
+
return /* @__PURE__ */ jsx8("div", { id, className: `space-y-1 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ jsx8(
|
|
4524
4528
|
HoursMinimalItem,
|
|
4525
4529
|
{
|
|
4526
4530
|
entry,
|
|
@@ -4529,7 +4533,7 @@ function Hours({
|
|
|
4529
4533
|
entry.day
|
|
4530
4534
|
)) });
|
|
4531
4535
|
}
|
|
4532
|
-
return /* @__PURE__ */ jsxs8("div", { className: `bg-white rounded-lg shadow p-6 ${className}`, children: [
|
|
4536
|
+
return /* @__PURE__ */ jsxs8("div", { id, className: `bg-white rounded-lg shadow p-6 ${className}`, children: [
|
|
4533
4537
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center mb-4", children: [
|
|
4534
4538
|
/* @__PURE__ */ jsx8(ClockIcon, { size: 24, className: "text-primary-600 mr-2" }),
|
|
4535
4539
|
/* @__PURE__ */ jsx8("h3", { className: "text-xl font-semibold text-gray-900", children: title })
|
|
@@ -4617,53 +4621,155 @@ function Gallery({
|
|
|
4617
4621
|
columns = 3,
|
|
4618
4622
|
variant = "grid",
|
|
4619
4623
|
showCaptions = true,
|
|
4624
|
+
enableLightbox = true,
|
|
4620
4625
|
limit,
|
|
4621
|
-
className = ""
|
|
4626
|
+
className = "",
|
|
4627
|
+
id = "gallery"
|
|
4622
4628
|
}) {
|
|
4623
4629
|
const displayedItems = limit ? items.slice(0, limit) : items;
|
|
4624
4630
|
const [failedImages, setFailedImages] = useState3(/* @__PURE__ */ new Set());
|
|
4625
|
-
const
|
|
4626
|
-
|
|
4631
|
+
const [lightboxIndex, setLightboxIndex] = useState3(null);
|
|
4632
|
+
const handleImageError = (id2) => {
|
|
4633
|
+
setFailedImages((prev) => new Set(prev).add(id2));
|
|
4627
4634
|
};
|
|
4628
4635
|
const gridCols = {
|
|
4629
4636
|
2: "grid-cols-1 sm:grid-cols-2",
|
|
4630
4637
|
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
4631
4638
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
|
|
4632
4639
|
};
|
|
4633
|
-
|
|
4634
|
-
(
|
|
4635
|
-
|
|
4636
|
-
|
|
4640
|
+
const openLightbox = (index) => {
|
|
4641
|
+
if (enableLightbox) {
|
|
4642
|
+
setLightboxIndex(index);
|
|
4643
|
+
}
|
|
4644
|
+
};
|
|
4645
|
+
const closeLightbox = () => setLightboxIndex(null);
|
|
4646
|
+
const goToPrevious = () => {
|
|
4647
|
+
if (lightboxIndex !== null) {
|
|
4648
|
+
setLightboxIndex(lightboxIndex === 0 ? displayedItems.length - 1 : lightboxIndex - 1);
|
|
4649
|
+
}
|
|
4650
|
+
};
|
|
4651
|
+
const goToNext = () => {
|
|
4652
|
+
if (lightboxIndex !== null) {
|
|
4653
|
+
setLightboxIndex(lightboxIndex === displayedItems.length - 1 ? 0 : lightboxIndex + 1);
|
|
4654
|
+
}
|
|
4655
|
+
};
|
|
4656
|
+
return /* @__PURE__ */ jsxs9("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: [
|
|
4657
|
+
/* @__PURE__ */ jsxs9("div", { className: "container mx-auto px-4", children: [
|
|
4658
|
+
(title || subtitle) && /* @__PURE__ */ jsxs9("div", { className: "text-center mb-12", children: [
|
|
4659
|
+
title && /* @__PURE__ */ jsx9("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4660
|
+
subtitle && /* @__PURE__ */ jsx9("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
4661
|
+
] }),
|
|
4662
|
+
/* @__PURE__ */ jsx9("div", { className: `grid gap-4 ${gridCols[columns]}`, children: displayedItems.map((item, index) => {
|
|
4663
|
+
const itemId = item.id || item.imageUrl;
|
|
4664
|
+
const hasFailed = failedImages.has(itemId);
|
|
4665
|
+
return /* @__PURE__ */ jsx9(
|
|
4666
|
+
"div",
|
|
4667
|
+
{
|
|
4668
|
+
className: `group relative aspect-square overflow-hidden rounded-lg bg-gray-100 ${enableLightbox ? "cursor-pointer" : ""}`,
|
|
4669
|
+
onClick: () => openLightbox(index),
|
|
4670
|
+
role: enableLightbox ? "button" : void 0,
|
|
4671
|
+
tabIndex: enableLightbox ? 0 : void 0,
|
|
4672
|
+
onKeyDown: enableLightbox ? (e) => e.key === "Enter" && openLightbox(index) : void 0,
|
|
4673
|
+
children: hasFailed ? /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 flex items-center justify-center text-gray-400", children: /* @__PURE__ */ jsx9("span", { children: "Image unavailable" }) }) : /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
4674
|
+
/* @__PURE__ */ jsx9(
|
|
4675
|
+
"img",
|
|
4676
|
+
{
|
|
4677
|
+
src: item.imageUrl,
|
|
4678
|
+
alt: item.alt || "",
|
|
4679
|
+
loading: "lazy",
|
|
4680
|
+
className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",
|
|
4681
|
+
onError: () => handleImageError(itemId)
|
|
4682
|
+
}
|
|
4683
|
+
),
|
|
4684
|
+
enableLightbox && /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 bg-black/30 opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-center justify-center", children: /* @__PURE__ */ jsx9("svg", { className: "w-10 h-10 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx9("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v3m0 0v3m0-3h3m-3 0H7" }) }) }),
|
|
4685
|
+
showCaptions && item.caption && !enableLightbox && /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 bg-gradient-to-t from-black/60 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300", children: /* @__PURE__ */ jsx9("div", { className: "absolute bottom-0 left-0 right-0 p-4", children: /* @__PURE__ */ jsx9("p", { className: "text-white text-sm", children: item.caption }) }) })
|
|
4686
|
+
] })
|
|
4687
|
+
},
|
|
4688
|
+
itemId
|
|
4689
|
+
);
|
|
4690
|
+
}) })
|
|
4637
4691
|
] }),
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4692
|
+
enableLightbox && lightboxIndex !== null && /* @__PURE__ */ jsxs9(
|
|
4693
|
+
"div",
|
|
4694
|
+
{
|
|
4695
|
+
className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center",
|
|
4696
|
+
onClick: closeLightbox,
|
|
4697
|
+
children: [
|
|
4698
|
+
/* @__PURE__ */ jsx9(
|
|
4699
|
+
"button",
|
|
4700
|
+
{
|
|
4701
|
+
onClick: closeLightbox,
|
|
4702
|
+
className: "absolute top-4 right-4 text-white hover:text-gray-300 transition-colors z-10",
|
|
4703
|
+
"aria-label": "Close lightbox",
|
|
4704
|
+
children: /* @__PURE__ */ jsx9("svg", { className: "w-8 h-8", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx9("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
4705
|
+
}
|
|
4706
|
+
),
|
|
4707
|
+
/* @__PURE__ */ jsx9(
|
|
4708
|
+
"button",
|
|
4709
|
+
{
|
|
4710
|
+
onClick: (e) => {
|
|
4711
|
+
e.stopPropagation();
|
|
4712
|
+
goToPrevious();
|
|
4713
|
+
},
|
|
4714
|
+
className: "absolute left-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4715
|
+
"aria-label": "Previous image",
|
|
4716
|
+
children: /* @__PURE__ */ jsx9("svg", { className: "w-10 h-10", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx9("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
4717
|
+
}
|
|
4718
|
+
),
|
|
4719
|
+
/* @__PURE__ */ jsx9(
|
|
4720
|
+
"button",
|
|
4721
|
+
{
|
|
4722
|
+
onClick: (e) => {
|
|
4723
|
+
e.stopPropagation();
|
|
4724
|
+
goToNext();
|
|
4725
|
+
},
|
|
4726
|
+
className: "absolute right-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4727
|
+
"aria-label": "Next image",
|
|
4728
|
+
children: /* @__PURE__ */ jsx9("svg", { className: "w-10 h-10", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx9("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
4729
|
+
}
|
|
4730
|
+
),
|
|
4731
|
+
/* @__PURE__ */ jsxs9(
|
|
4732
|
+
"div",
|
|
4733
|
+
{
|
|
4734
|
+
className: "max-w-5xl max-h-[85vh] mx-4",
|
|
4735
|
+
onClick: (e) => e.stopPropagation(),
|
|
4736
|
+
children: [
|
|
4737
|
+
/* @__PURE__ */ jsx9(
|
|
4738
|
+
"img",
|
|
4739
|
+
{
|
|
4740
|
+
src: displayedItems[lightboxIndex].imageUrl,
|
|
4741
|
+
alt: displayedItems[lightboxIndex].alt || "",
|
|
4742
|
+
className: "max-w-full max-h-[85vh] object-contain"
|
|
4743
|
+
}
|
|
4744
|
+
),
|
|
4745
|
+
showCaptions && displayedItems[lightboxIndex].caption && /* @__PURE__ */ jsx9("p", { className: "text-white text-center mt-4 text-lg", children: displayedItems[lightboxIndex].caption })
|
|
4746
|
+
]
|
|
4747
|
+
}
|
|
4748
|
+
),
|
|
4749
|
+
/* @__PURE__ */ jsxs9("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white text-sm", children: [
|
|
4750
|
+
lightboxIndex + 1,
|
|
4751
|
+
" / ",
|
|
4752
|
+
displayedItems.length
|
|
4657
4753
|
] })
|
|
4658
|
-
|
|
4659
|
-
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
] }) });
|
|
4754
|
+
]
|
|
4755
|
+
}
|
|
4756
|
+
)
|
|
4757
|
+
] });
|
|
4663
4758
|
}
|
|
4664
4759
|
|
|
4760
|
+
// src/components/sections/Menu.tsx
|
|
4761
|
+
import { useState as useState4 } from "react";
|
|
4762
|
+
import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
4763
|
+
|
|
4764
|
+
// src/components/sections/TrustBadges.tsx
|
|
4765
|
+
import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
4766
|
+
|
|
4767
|
+
// src/components/sections/BeforeAfter.tsx
|
|
4768
|
+
import { useState as useState5, useRef, useCallback } from "react";
|
|
4769
|
+
import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
4770
|
+
|
|
4665
4771
|
// src/components/ui/Button.tsx
|
|
4666
|
-
import { Fragment as Fragment2, jsx as
|
|
4772
|
+
import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
4667
4773
|
function getButtonClasses(props) {
|
|
4668
4774
|
const { variant = "primary", size = "md", fullWidth, disabled } = props;
|
|
4669
4775
|
const baseClasses = [
|
|
@@ -4705,16 +4811,16 @@ function Button({
|
|
|
4705
4811
|
...props
|
|
4706
4812
|
}) {
|
|
4707
4813
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
|
|
4708
|
-
return /* @__PURE__ */
|
|
4814
|
+
return /* @__PURE__ */ jsx13(
|
|
4709
4815
|
"button",
|
|
4710
4816
|
{
|
|
4711
4817
|
className: `${classes} ${className}`,
|
|
4712
4818
|
disabled: disabled || loading,
|
|
4713
4819
|
...props,
|
|
4714
|
-
children: loading ? /* @__PURE__ */
|
|
4715
|
-
leftIcon && /* @__PURE__ */
|
|
4820
|
+
children: loading ? /* @__PURE__ */ jsx13(LoadingSpinner, { size }) : /* @__PURE__ */ jsxs13(Fragment2, { children: [
|
|
4821
|
+
leftIcon && /* @__PURE__ */ jsx13("span", { className: "mr-2", children: leftIcon }),
|
|
4716
4822
|
children,
|
|
4717
|
-
rightIcon && /* @__PURE__ */
|
|
4823
|
+
rightIcon && /* @__PURE__ */ jsx13("span", { className: "ml-2", children: rightIcon })
|
|
4718
4824
|
] })
|
|
4719
4825
|
}
|
|
4720
4826
|
);
|
|
@@ -4725,7 +4831,7 @@ function LoadingSpinner({ size }) {
|
|
|
4725
4831
|
md: "w-5 h-5",
|
|
4726
4832
|
lg: "w-6 h-6"
|
|
4727
4833
|
};
|
|
4728
|
-
return /* @__PURE__ */
|
|
4834
|
+
return /* @__PURE__ */ jsxs13(
|
|
4729
4835
|
"svg",
|
|
4730
4836
|
{
|
|
4731
4837
|
className: `animate-spin ${sizeClasses[size || "md"]}`,
|
|
@@ -4733,7 +4839,7 @@ function LoadingSpinner({ size }) {
|
|
|
4733
4839
|
fill: "none",
|
|
4734
4840
|
viewBox: "0 0 24 24",
|
|
4735
4841
|
children: [
|
|
4736
|
-
/* @__PURE__ */
|
|
4842
|
+
/* @__PURE__ */ jsx13(
|
|
4737
4843
|
"circle",
|
|
4738
4844
|
{
|
|
4739
4845
|
className: "opacity-25",
|
|
@@ -4744,7 +4850,7 @@ function LoadingSpinner({ size }) {
|
|
|
4744
4850
|
strokeWidth: "4"
|
|
4745
4851
|
}
|
|
4746
4852
|
),
|
|
4747
|
-
/* @__PURE__ */
|
|
4853
|
+
/* @__PURE__ */ jsx13(
|
|
4748
4854
|
"path",
|
|
4749
4855
|
{
|
|
4750
4856
|
className: "opacity-75",
|
|
@@ -4767,15 +4873,15 @@ function ButtonLink({
|
|
|
4767
4873
|
...props
|
|
4768
4874
|
}) {
|
|
4769
4875
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
|
|
4770
|
-
return /* @__PURE__ */
|
|
4771
|
-
leftIcon && /* @__PURE__ */
|
|
4876
|
+
return /* @__PURE__ */ jsxs13("a", { className: `${classes} ${className}`, ...props, children: [
|
|
4877
|
+
leftIcon && /* @__PURE__ */ jsx13("span", { className: "mr-2", children: leftIcon }),
|
|
4772
4878
|
children,
|
|
4773
|
-
rightIcon && /* @__PURE__ */
|
|
4879
|
+
rightIcon && /* @__PURE__ */ jsx13("span", { className: "ml-2", children: rightIcon })
|
|
4774
4880
|
] });
|
|
4775
4881
|
}
|
|
4776
4882
|
|
|
4777
4883
|
// src/components/ui/Card.tsx
|
|
4778
|
-
import { jsx as
|
|
4884
|
+
import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
4779
4885
|
function getCardClasses(props) {
|
|
4780
4886
|
const { variant = "default", padding = "md", hover = false } = props;
|
|
4781
4887
|
const baseClasses = ["rounded-lg", "overflow-hidden"];
|
|
@@ -4808,7 +4914,7 @@ function Card({
|
|
|
4808
4914
|
...props
|
|
4809
4915
|
}) {
|
|
4810
4916
|
const classes = getCardClasses({ variant, padding, hover });
|
|
4811
|
-
return /* @__PURE__ */
|
|
4917
|
+
return /* @__PURE__ */ jsx14("div", { className: `${classes} ${className}`, ...props, children });
|
|
4812
4918
|
}
|
|
4813
4919
|
function CardHeader({
|
|
4814
4920
|
title,
|
|
@@ -4818,13 +4924,13 @@ function CardHeader({
|
|
|
4818
4924
|
className = "",
|
|
4819
4925
|
...props
|
|
4820
4926
|
}) {
|
|
4821
|
-
return /* @__PURE__ */
|
|
4822
|
-
/* @__PURE__ */
|
|
4823
|
-
title && /* @__PURE__ */
|
|
4824
|
-
subtitle && /* @__PURE__ */
|
|
4927
|
+
return /* @__PURE__ */ jsxs14("div", { className: `flex items-start justify-between ${className}`, ...props, children: [
|
|
4928
|
+
/* @__PURE__ */ jsxs14("div", { children: [
|
|
4929
|
+
title && /* @__PURE__ */ jsx14("h3", { className: "text-lg font-semibold text-gray-900", children: title }),
|
|
4930
|
+
subtitle && /* @__PURE__ */ jsx14("p", { className: "mt-1 text-sm text-gray-500", children: subtitle }),
|
|
4825
4931
|
children
|
|
4826
4932
|
] }),
|
|
4827
|
-
action && /* @__PURE__ */
|
|
4933
|
+
action && /* @__PURE__ */ jsx14("div", { className: "flex-shrink-0 ml-4", children: action })
|
|
4828
4934
|
] });
|
|
4829
4935
|
}
|
|
4830
4936
|
function CardBody({
|
|
@@ -4832,14 +4938,14 @@ function CardBody({
|
|
|
4832
4938
|
className = "",
|
|
4833
4939
|
...props
|
|
4834
4940
|
}) {
|
|
4835
|
-
return /* @__PURE__ */
|
|
4941
|
+
return /* @__PURE__ */ jsx14("div", { className: `mt-4 ${className}`, ...props, children });
|
|
4836
4942
|
}
|
|
4837
4943
|
function CardFooter({
|
|
4838
4944
|
children,
|
|
4839
4945
|
className = "",
|
|
4840
4946
|
...props
|
|
4841
4947
|
}) {
|
|
4842
|
-
return /* @__PURE__ */
|
|
4948
|
+
return /* @__PURE__ */ jsx14("div", { className: `mt-4 pt-4 border-t border-gray-100 ${className}`, ...props, children });
|
|
4843
4949
|
}
|
|
4844
4950
|
function CardImage({
|
|
4845
4951
|
aspectRatio = "video",
|
|
@@ -4853,7 +4959,7 @@ function CardImage({
|
|
|
4853
4959
|
wide: "aspect-[2/1]",
|
|
4854
4960
|
auto: ""
|
|
4855
4961
|
};
|
|
4856
|
-
return /* @__PURE__ */
|
|
4962
|
+
return /* @__PURE__ */ jsx14("div", { className: `-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`, children: /* @__PURE__ */ jsx14(
|
|
4857
4963
|
"img",
|
|
4858
4964
|
{
|
|
4859
4965
|
className: `w-full h-full object-cover ${className}`,
|
|
@@ -4863,6 +4969,10 @@ function CardImage({
|
|
|
4863
4969
|
) });
|
|
4864
4970
|
}
|
|
4865
4971
|
|
|
4972
|
+
// src/components/ui/AnimatedSection.tsx
|
|
4973
|
+
import React6, { useEffect, useRef as useRef2, useState as useState6 } from "react";
|
|
4974
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
4975
|
+
|
|
4866
4976
|
// src/seo/index.ts
|
|
4867
4977
|
function generateMetadata(business, pageTitle, pageDescription, options = {}) {
|
|
4868
4978
|
const { titleTemplate = "%s", baseUrl } = options;
|