@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.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __esm = (fn, res) => function __init() {
|
|
7
9
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
@@ -18,6 +20,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
20
|
}
|
|
19
21
|
return to;
|
|
20
22
|
};
|
|
23
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
24
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
25
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
26
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
27
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
28
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
29
|
+
mod
|
|
30
|
+
));
|
|
21
31
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
32
|
|
|
23
33
|
// src/theme/colors.ts
|
|
@@ -3893,10 +3903,10 @@ function Icon({ name, ...props }) {
|
|
|
3893
3903
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3894
3904
|
var defaultNavigation = [
|
|
3895
3905
|
{ label: "Home", href: "/" },
|
|
3896
|
-
{ label: "Services", href: "
|
|
3897
|
-
{ label: "
|
|
3898
|
-
{ label: "
|
|
3899
|
-
{ label: "
|
|
3906
|
+
{ label: "Services", href: "/#services" },
|
|
3907
|
+
{ label: "Hours", href: "/#hours" },
|
|
3908
|
+
{ label: "Reviews", href: "/#reviews" },
|
|
3909
|
+
{ label: "FAQ", href: "/#faq" }
|
|
3900
3910
|
];
|
|
3901
3911
|
function Header({
|
|
3902
3912
|
business,
|
|
@@ -3989,10 +3999,10 @@ function Header({
|
|
|
3989
3999
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
3990
4000
|
var defaultQuickLinks = [
|
|
3991
4001
|
{ label: "Home", href: "/" },
|
|
3992
|
-
{ label: "Services", href: "
|
|
3993
|
-
{ label: "
|
|
3994
|
-
{ label: "
|
|
3995
|
-
{ label: "
|
|
4002
|
+
{ label: "Services", href: "/#services" },
|
|
4003
|
+
{ label: "Hours", href: "/#hours" },
|
|
4004
|
+
{ label: "Reviews", href: "/#reviews" },
|
|
4005
|
+
{ label: "FAQ", href: "/#faq" }
|
|
3996
4006
|
];
|
|
3997
4007
|
var dayNames = {
|
|
3998
4008
|
monday: "Mon",
|
|
@@ -4306,7 +4316,8 @@ function Services({
|
|
|
4306
4316
|
showIcons = true,
|
|
4307
4317
|
variant = "cards",
|
|
4308
4318
|
limit,
|
|
4309
|
-
className = ""
|
|
4319
|
+
className = "",
|
|
4320
|
+
id = "services"
|
|
4310
4321
|
}) {
|
|
4311
4322
|
const displayedServices = limit ? services.slice(0, limit) : services;
|
|
4312
4323
|
const gridCols = {
|
|
@@ -4315,7 +4326,7 @@ function Services({
|
|
|
4315
4326
|
4: "md:grid-cols-2 lg:grid-cols-4"
|
|
4316
4327
|
};
|
|
4317
4328
|
if (variant === "list") {
|
|
4318
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4329
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4319
4330
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4320
4331
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "max-w-3xl mx-auto divide-y divide-gray-200", children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4321
4332
|
ServiceListItem,
|
|
@@ -4329,7 +4340,7 @@ function Services({
|
|
|
4329
4340
|
] }) });
|
|
4330
4341
|
}
|
|
4331
4342
|
if (variant === "minimal") {
|
|
4332
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4343
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4333
4344
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4334
4345
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4335
4346
|
ServiceMinimalCard,
|
|
@@ -4341,7 +4352,7 @@ function Services({
|
|
|
4341
4352
|
)) })
|
|
4342
4353
|
] }) });
|
|
4343
4354
|
}
|
|
4344
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4355
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4345
4356
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4346
4357
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4347
4358
|
ServiceCard,
|
|
@@ -4415,7 +4426,8 @@ function Testimonials({
|
|
|
4415
4426
|
showRatings = true,
|
|
4416
4427
|
variant = "cards",
|
|
4417
4428
|
limit,
|
|
4418
|
-
className = ""
|
|
4429
|
+
className = "",
|
|
4430
|
+
id = "reviews"
|
|
4419
4431
|
}) {
|
|
4420
4432
|
const displayedTestimonials = limit ? testimonials.slice(0, limit) : testimonials;
|
|
4421
4433
|
const gridCols = {
|
|
@@ -4423,7 +4435,7 @@ function Testimonials({
|
|
|
4423
4435
|
2: "md:grid-cols-2 max-w-4xl mx-auto",
|
|
4424
4436
|
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
4425
4437
|
};
|
|
4426
|
-
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4438
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4427
4439
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center mb-12", children: [
|
|
4428
4440
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4429
4441
|
subtitle && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
@@ -4526,7 +4538,8 @@ function FAQ({
|
|
|
4526
4538
|
variant = "accordion",
|
|
4527
4539
|
defaultOpen = 0,
|
|
4528
4540
|
allowMultiple = false,
|
|
4529
|
-
className = ""
|
|
4541
|
+
className = "",
|
|
4542
|
+
id = "faq"
|
|
4530
4543
|
}) {
|
|
4531
4544
|
const initialOpen = Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen];
|
|
4532
4545
|
const [openItems, setOpenItems] = (0, import_react2.useState)(initialOpen);
|
|
@@ -4542,18 +4555,18 @@ function FAQ({
|
|
|
4542
4555
|
}
|
|
4543
4556
|
};
|
|
4544
4557
|
if (variant === "cards") {
|
|
4545
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4558
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4546
4559
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4547
4560
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "grid md:grid-cols-2 gap-6 max-w-4xl mx-auto", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FAQCard, { item }, item.id || item.question)) })
|
|
4548
4561
|
] }) });
|
|
4549
4562
|
}
|
|
4550
4563
|
if (variant === "simple") {
|
|
4551
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4564
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4552
4565
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4553
4566
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "max-w-3xl mx-auto space-y-8", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FAQSimple, { item }, item.id || item.question)) })
|
|
4554
4567
|
] }) });
|
|
4555
4568
|
}
|
|
4556
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4569
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4557
4570
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4558
4571
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "max-w-3xl mx-auto", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
4559
4572
|
FAQAccordionItem,
|
|
@@ -4650,14 +4663,15 @@ function Hours({
|
|
|
4650
4663
|
highlightToday = true,
|
|
4651
4664
|
variant = "card",
|
|
4652
4665
|
timezone,
|
|
4653
|
-
className = ""
|
|
4666
|
+
className = "",
|
|
4667
|
+
id = "hours"
|
|
4654
4668
|
}) {
|
|
4655
4669
|
const todayDay = getTodayDay(timezone);
|
|
4656
4670
|
const sortedHours = [...hours].sort(
|
|
4657
4671
|
(a, b) => dayOrder.indexOf(a.day) - dayOrder.indexOf(b.day)
|
|
4658
4672
|
);
|
|
4659
4673
|
if (variant === "inline") {
|
|
4660
|
-
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `flex flex-wrap gap-4 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
4674
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { id, className: `flex flex-wrap gap-4 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
4661
4675
|
HoursInlineItem,
|
|
4662
4676
|
{
|
|
4663
4677
|
entry,
|
|
@@ -4667,7 +4681,7 @@ function Hours({
|
|
|
4667
4681
|
)) });
|
|
4668
4682
|
}
|
|
4669
4683
|
if (variant === "minimal") {
|
|
4670
|
-
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `space-y-1 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
4684
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { id, className: `space-y-1 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
4671
4685
|
HoursMinimalItem,
|
|
4672
4686
|
{
|
|
4673
4687
|
entry,
|
|
@@ -4676,7 +4690,7 @@ function Hours({
|
|
|
4676
4690
|
entry.day
|
|
4677
4691
|
)) });
|
|
4678
4692
|
}
|
|
4679
|
-
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: `bg-white rounded-lg shadow p-6 ${className}`, children: [
|
|
4693
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { id, className: `bg-white rounded-lg shadow p-6 ${className}`, children: [
|
|
4680
4694
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "flex items-center mb-4", children: [
|
|
4681
4695
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ClockIcon, { size: 24, className: "text-primary-600 mr-2" }),
|
|
4682
4696
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: "text-xl font-semibold text-gray-900", children: title })
|
|
@@ -4764,53 +4778,155 @@ function Gallery({
|
|
|
4764
4778
|
columns = 3,
|
|
4765
4779
|
variant = "grid",
|
|
4766
4780
|
showCaptions = true,
|
|
4781
|
+
enableLightbox = true,
|
|
4767
4782
|
limit,
|
|
4768
|
-
className = ""
|
|
4783
|
+
className = "",
|
|
4784
|
+
id = "gallery"
|
|
4769
4785
|
}) {
|
|
4770
4786
|
const displayedItems = limit ? items.slice(0, limit) : items;
|
|
4771
4787
|
const [failedImages, setFailedImages] = (0, import_react3.useState)(/* @__PURE__ */ new Set());
|
|
4772
|
-
const
|
|
4773
|
-
|
|
4788
|
+
const [lightboxIndex, setLightboxIndex] = (0, import_react3.useState)(null);
|
|
4789
|
+
const handleImageError = (id2) => {
|
|
4790
|
+
setFailedImages((prev) => new Set(prev).add(id2));
|
|
4774
4791
|
};
|
|
4775
4792
|
const gridCols = {
|
|
4776
4793
|
2: "grid-cols-1 sm:grid-cols-2",
|
|
4777
4794
|
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
4778
4795
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
|
|
4779
4796
|
};
|
|
4780
|
-
|
|
4781
|
-
|
|
4782
|
-
|
|
4783
|
-
|
|
4797
|
+
const openLightbox = (index) => {
|
|
4798
|
+
if (enableLightbox) {
|
|
4799
|
+
setLightboxIndex(index);
|
|
4800
|
+
}
|
|
4801
|
+
};
|
|
4802
|
+
const closeLightbox = () => setLightboxIndex(null);
|
|
4803
|
+
const goToPrevious = () => {
|
|
4804
|
+
if (lightboxIndex !== null) {
|
|
4805
|
+
setLightboxIndex(lightboxIndex === 0 ? displayedItems.length - 1 : lightboxIndex - 1);
|
|
4806
|
+
}
|
|
4807
|
+
};
|
|
4808
|
+
const goToNext = () => {
|
|
4809
|
+
if (lightboxIndex !== null) {
|
|
4810
|
+
setLightboxIndex(lightboxIndex === displayedItems.length - 1 ? 0 : lightboxIndex + 1);
|
|
4811
|
+
}
|
|
4812
|
+
};
|
|
4813
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: [
|
|
4814
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4815
|
+
(title || subtitle) && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "text-center mb-12", children: [
|
|
4816
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4817
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
4818
|
+
] }),
|
|
4819
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: `grid gap-4 ${gridCols[columns]}`, children: displayedItems.map((item, index) => {
|
|
4820
|
+
const itemId = item.id || item.imageUrl;
|
|
4821
|
+
const hasFailed = failedImages.has(itemId);
|
|
4822
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4823
|
+
"div",
|
|
4824
|
+
{
|
|
4825
|
+
className: `group relative aspect-square overflow-hidden rounded-lg bg-gray-100 ${enableLightbox ? "cursor-pointer" : ""}`,
|
|
4826
|
+
onClick: () => openLightbox(index),
|
|
4827
|
+
role: enableLightbox ? "button" : void 0,
|
|
4828
|
+
tabIndex: enableLightbox ? 0 : void 0,
|
|
4829
|
+
onKeyDown: enableLightbox ? (e) => e.key === "Enter" && openLightbox(index) : void 0,
|
|
4830
|
+
children: hasFailed ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute inset-0 flex items-center justify-center text-gray-400", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Image unavailable" }) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
|
|
4831
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4832
|
+
"img",
|
|
4833
|
+
{
|
|
4834
|
+
src: item.imageUrl,
|
|
4835
|
+
alt: item.alt || "",
|
|
4836
|
+
loading: "lazy",
|
|
4837
|
+
className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",
|
|
4838
|
+
onError: () => handleImageError(itemId)
|
|
4839
|
+
}
|
|
4840
|
+
),
|
|
4841
|
+
enableLightbox && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("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__ */ (0, import_jsx_runtime9.jsx)("svg", { className: "w-10 h-10 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("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" }) }) }),
|
|
4842
|
+
showCaptions && item.caption && !enableLightbox && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("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__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute bottom-0 left-0 right-0 p-4", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-white text-sm", children: item.caption }) }) })
|
|
4843
|
+
] })
|
|
4844
|
+
},
|
|
4845
|
+
itemId
|
|
4846
|
+
);
|
|
4847
|
+
}) })
|
|
4784
4848
|
] }),
|
|
4785
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.
|
|
4786
|
-
|
|
4787
|
-
|
|
4788
|
-
|
|
4789
|
-
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4849
|
+
enableLightbox && lightboxIndex !== null && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
4850
|
+
"div",
|
|
4851
|
+
{
|
|
4852
|
+
className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center",
|
|
4853
|
+
onClick: closeLightbox,
|
|
4854
|
+
children: [
|
|
4855
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4856
|
+
"button",
|
|
4857
|
+
{
|
|
4858
|
+
onClick: closeLightbox,
|
|
4859
|
+
className: "absolute top-4 right-4 text-white hover:text-gray-300 transition-colors z-10",
|
|
4860
|
+
"aria-label": "Close lightbox",
|
|
4861
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("svg", { className: "w-8 h-8", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
4862
|
+
}
|
|
4863
|
+
),
|
|
4864
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4865
|
+
"button",
|
|
4866
|
+
{
|
|
4867
|
+
onClick: (e) => {
|
|
4868
|
+
e.stopPropagation();
|
|
4869
|
+
goToPrevious();
|
|
4870
|
+
},
|
|
4871
|
+
className: "absolute left-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4872
|
+
"aria-label": "Previous image",
|
|
4873
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("svg", { className: "w-10 h-10", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
4874
|
+
}
|
|
4875
|
+
),
|
|
4876
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4877
|
+
"button",
|
|
4878
|
+
{
|
|
4879
|
+
onClick: (e) => {
|
|
4880
|
+
e.stopPropagation();
|
|
4881
|
+
goToNext();
|
|
4882
|
+
},
|
|
4883
|
+
className: "absolute right-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4884
|
+
"aria-label": "Next image",
|
|
4885
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("svg", { className: "w-10 h-10", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
4886
|
+
}
|
|
4887
|
+
),
|
|
4888
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
4889
|
+
"div",
|
|
4890
|
+
{
|
|
4891
|
+
className: "max-w-5xl max-h-[85vh] mx-4",
|
|
4892
|
+
onClick: (e) => e.stopPropagation(),
|
|
4893
|
+
children: [
|
|
4894
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4895
|
+
"img",
|
|
4896
|
+
{
|
|
4897
|
+
src: displayedItems[lightboxIndex].imageUrl,
|
|
4898
|
+
alt: displayedItems[lightboxIndex].alt || "",
|
|
4899
|
+
className: "max-w-full max-h-[85vh] object-contain"
|
|
4900
|
+
}
|
|
4901
|
+
),
|
|
4902
|
+
showCaptions && displayedItems[lightboxIndex].caption && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-white text-center mt-4 text-lg", children: displayedItems[lightboxIndex].caption })
|
|
4903
|
+
]
|
|
4904
|
+
}
|
|
4905
|
+
),
|
|
4906
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white text-sm", children: [
|
|
4907
|
+
lightboxIndex + 1,
|
|
4908
|
+
" / ",
|
|
4909
|
+
displayedItems.length
|
|
4804
4910
|
] })
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
] }) });
|
|
4911
|
+
]
|
|
4912
|
+
}
|
|
4913
|
+
)
|
|
4914
|
+
] });
|
|
4810
4915
|
}
|
|
4811
4916
|
|
|
4812
|
-
// src/components/
|
|
4917
|
+
// src/components/sections/Menu.tsx
|
|
4918
|
+
var import_react4 = require("react");
|
|
4813
4919
|
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
4920
|
+
|
|
4921
|
+
// src/components/sections/TrustBadges.tsx
|
|
4922
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
4923
|
+
|
|
4924
|
+
// src/components/sections/BeforeAfter.tsx
|
|
4925
|
+
var import_react5 = require("react");
|
|
4926
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
4927
|
+
|
|
4928
|
+
// src/components/ui/Button.tsx
|
|
4929
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
4814
4930
|
function getButtonClasses(props) {
|
|
4815
4931
|
const { variant = "primary", size = "md", fullWidth, disabled } = props;
|
|
4816
4932
|
const baseClasses = [
|
|
@@ -4852,16 +4968,16 @@ function Button({
|
|
|
4852
4968
|
...props
|
|
4853
4969
|
}) {
|
|
4854
4970
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
|
|
4855
|
-
return /* @__PURE__ */ (0,
|
|
4971
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4856
4972
|
"button",
|
|
4857
4973
|
{
|
|
4858
4974
|
className: `${classes} ${className}`,
|
|
4859
4975
|
disabled: disabled || loading,
|
|
4860
4976
|
...props,
|
|
4861
|
-
children: loading ? /* @__PURE__ */ (0,
|
|
4862
|
-
leftIcon && /* @__PURE__ */ (0,
|
|
4977
|
+
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(LoadingSpinner, { size }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
4978
|
+
leftIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "mr-2", children: leftIcon }),
|
|
4863
4979
|
children,
|
|
4864
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
4980
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4865
4981
|
] })
|
|
4866
4982
|
}
|
|
4867
4983
|
);
|
|
@@ -4872,7 +4988,7 @@ function LoadingSpinner({ size }) {
|
|
|
4872
4988
|
md: "w-5 h-5",
|
|
4873
4989
|
lg: "w-6 h-6"
|
|
4874
4990
|
};
|
|
4875
|
-
return /* @__PURE__ */ (0,
|
|
4991
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
4876
4992
|
"svg",
|
|
4877
4993
|
{
|
|
4878
4994
|
className: `animate-spin ${sizeClasses[size || "md"]}`,
|
|
@@ -4880,7 +4996,7 @@ function LoadingSpinner({ size }) {
|
|
|
4880
4996
|
fill: "none",
|
|
4881
4997
|
viewBox: "0 0 24 24",
|
|
4882
4998
|
children: [
|
|
4883
|
-
/* @__PURE__ */ (0,
|
|
4999
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4884
5000
|
"circle",
|
|
4885
5001
|
{
|
|
4886
5002
|
className: "opacity-25",
|
|
@@ -4891,7 +5007,7 @@ function LoadingSpinner({ size }) {
|
|
|
4891
5007
|
strokeWidth: "4"
|
|
4892
5008
|
}
|
|
4893
5009
|
),
|
|
4894
|
-
/* @__PURE__ */ (0,
|
|
5010
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4895
5011
|
"path",
|
|
4896
5012
|
{
|
|
4897
5013
|
className: "opacity-75",
|
|
@@ -4914,15 +5030,15 @@ function ButtonLink({
|
|
|
4914
5030
|
...props
|
|
4915
5031
|
}) {
|
|
4916
5032
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
|
|
4917
|
-
return /* @__PURE__ */ (0,
|
|
4918
|
-
leftIcon && /* @__PURE__ */ (0,
|
|
5033
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("a", { className: `${classes} ${className}`, ...props, children: [
|
|
5034
|
+
leftIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "mr-2", children: leftIcon }),
|
|
4919
5035
|
children,
|
|
4920
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
5036
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4921
5037
|
] });
|
|
4922
5038
|
}
|
|
4923
5039
|
|
|
4924
5040
|
// src/components/ui/Card.tsx
|
|
4925
|
-
var
|
|
5041
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
4926
5042
|
function getCardClasses(props) {
|
|
4927
5043
|
const { variant = "default", padding = "md", hover = false } = props;
|
|
4928
5044
|
const baseClasses = ["rounded-lg", "overflow-hidden"];
|
|
@@ -4955,7 +5071,7 @@ function Card({
|
|
|
4955
5071
|
...props
|
|
4956
5072
|
}) {
|
|
4957
5073
|
const classes = getCardClasses({ variant, padding, hover });
|
|
4958
|
-
return /* @__PURE__ */ (0,
|
|
5074
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `${classes} ${className}`, ...props, children });
|
|
4959
5075
|
}
|
|
4960
5076
|
function CardHeader({
|
|
4961
5077
|
title,
|
|
@@ -4965,13 +5081,13 @@ function CardHeader({
|
|
|
4965
5081
|
className = "",
|
|
4966
5082
|
...props
|
|
4967
5083
|
}) {
|
|
4968
|
-
return /* @__PURE__ */ (0,
|
|
4969
|
-
/* @__PURE__ */ (0,
|
|
4970
|
-
title && /* @__PURE__ */ (0,
|
|
4971
|
-
subtitle && /* @__PURE__ */ (0,
|
|
5084
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: `flex items-start justify-between ${className}`, ...props, children: [
|
|
5085
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
5086
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { className: "text-lg font-semibold text-gray-900", children: title }),
|
|
5087
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "mt-1 text-sm text-gray-500", children: subtitle }),
|
|
4972
5088
|
children
|
|
4973
5089
|
] }),
|
|
4974
|
-
action && /* @__PURE__ */ (0,
|
|
5090
|
+
action && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex-shrink-0 ml-4", children: action })
|
|
4975
5091
|
] });
|
|
4976
5092
|
}
|
|
4977
5093
|
function CardBody({
|
|
@@ -4979,14 +5095,14 @@ function CardBody({
|
|
|
4979
5095
|
className = "",
|
|
4980
5096
|
...props
|
|
4981
5097
|
}) {
|
|
4982
|
-
return /* @__PURE__ */ (0,
|
|
5098
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `mt-4 ${className}`, ...props, children });
|
|
4983
5099
|
}
|
|
4984
5100
|
function CardFooter({
|
|
4985
5101
|
children,
|
|
4986
5102
|
className = "",
|
|
4987
5103
|
...props
|
|
4988
5104
|
}) {
|
|
4989
|
-
return /* @__PURE__ */ (0,
|
|
5105
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `mt-4 pt-4 border-t border-gray-100 ${className}`, ...props, children });
|
|
4990
5106
|
}
|
|
4991
5107
|
function CardImage({
|
|
4992
5108
|
aspectRatio = "video",
|
|
@@ -5000,7 +5116,7 @@ function CardImage({
|
|
|
5000
5116
|
wide: "aspect-[2/1]",
|
|
5001
5117
|
auto: ""
|
|
5002
5118
|
};
|
|
5003
|
-
return /* @__PURE__ */ (0,
|
|
5119
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
5004
5120
|
"img",
|
|
5005
5121
|
{
|
|
5006
5122
|
className: `w-full h-full object-cover ${className}`,
|
|
@@ -5010,6 +5126,10 @@ function CardImage({
|
|
|
5010
5126
|
) });
|
|
5011
5127
|
}
|
|
5012
5128
|
|
|
5129
|
+
// src/components/ui/AnimatedSection.tsx
|
|
5130
|
+
var import_react6 = __toESM(require("react"));
|
|
5131
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
5132
|
+
|
|
5013
5133
|
// src/seo/index.ts
|
|
5014
5134
|
function generateMetadata(business, pageTitle, pageDescription, options = {}) {
|
|
5015
5135
|
const { titleTemplate = "%s", baseUrl } = options;
|