@aws505/sheetsite 1.0.2 → 1.0.4
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 +932 -60
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +916 -60
- package/dist/components/index.mjs.map +1 -1
- package/dist/index.js +195 -62
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +185 -62
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/index.ts +15 -0
- package/src/components/layout/Header.tsx +1 -0
- package/src/components/sections/BeforeAfter.tsx +345 -0
- package/src/components/sections/FAQ.tsx +3 -3
- package/src/components/sections/Gallery.tsx +104 -4
- package/src/components/sections/Hero.tsx +19 -3
- package/src/components/sections/Menu.tsx +312 -0
- package/src/components/sections/Services.tsx +3 -3
- package/src/components/sections/Testimonials.tsx +1 -1
- package/src/components/sections/TrustBadges.tsx +283 -0
- package/src/components/ui/AnimatedSection.tsx +136 -0
- package/src/components/ui/FloatingClaimBanner.tsx +160 -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
|
|
@@ -3894,6 +3904,7 @@ var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
|
3894
3904
|
var defaultNavigation = [
|
|
3895
3905
|
{ label: "Home", href: "/" },
|
|
3896
3906
|
{ label: "Services", href: "/#services" },
|
|
3907
|
+
{ label: "Gallery", href: "/#gallery" },
|
|
3897
3908
|
{ label: "Hours", href: "/#hours" },
|
|
3898
3909
|
{ label: "Reviews", href: "/#reviews" },
|
|
3899
3910
|
{ label: "FAQ", href: "/#faq" }
|
|
@@ -4152,6 +4163,15 @@ function Footer({
|
|
|
4152
4163
|
|
|
4153
4164
|
// src/components/sections/Hero.tsx
|
|
4154
4165
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
4166
|
+
var defaultTrustSignals = {
|
|
4167
|
+
salon: ["Expert Stylists", "Walk-Ins Welcome", "Quality Products"],
|
|
4168
|
+
restaurant: ["Fresh Ingredients", "Family Recipes", "Friendly Service"],
|
|
4169
|
+
repair: ["Certified Technicians", "Honest Estimates", "Quality Parts"],
|
|
4170
|
+
tailor: ["Expert Craftsmanship", "Perfect Fit Guaranteed", "Quick Turnaround"],
|
|
4171
|
+
professional: ["Quality Work", "Fair Prices", "Fast Service"],
|
|
4172
|
+
retail: ["Quality Products", "Great Selection", "Friendly Service"],
|
|
4173
|
+
default: ["Quality Work", "Fair Prices", "Fast Service"]
|
|
4174
|
+
};
|
|
4155
4175
|
function Hero({
|
|
4156
4176
|
business,
|
|
4157
4177
|
variant = "centered",
|
|
@@ -4160,8 +4180,11 @@ function Hero({
|
|
|
4160
4180
|
todayHours,
|
|
4161
4181
|
backgroundImage,
|
|
4162
4182
|
overlay = true,
|
|
4163
|
-
className = ""
|
|
4183
|
+
className = "",
|
|
4184
|
+
trustSignals
|
|
4164
4185
|
}) {
|
|
4186
|
+
const businessType = business.type || "default";
|
|
4187
|
+
const signals = trustSignals || defaultTrustSignals[businessType] || defaultTrustSignals.default;
|
|
4165
4188
|
const bgStyle = backgroundImage ? { backgroundImage: `url(${backgroundImage})` } : void 0;
|
|
4166
4189
|
const handleCallClick = () => {
|
|
4167
4190
|
if (business.phone) {
|
|
@@ -4241,8 +4264,8 @@ function Hero({
|
|
|
4241
4264
|
) }),
|
|
4242
4265
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h1", { className: "text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-4", children: business.name }),
|
|
4243
4266
|
business.tagline && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xl md:text-2xl text-white/90 mb-6", children: business.tagline }),
|
|
4244
|
-
business.aboutShort && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className:
|
|
4245
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className:
|
|
4267
|
+
business.aboutShort && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: `text-lg text-white/80 mb-8 max-w-xl ${variant === "centered" ? "mx-auto" : ""}`, children: business.aboutShort }),
|
|
4268
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `flex flex-wrap gap-4 mb-8 ${variant === "centered" ? "justify-center" : ""}`, children: signals.map((signal) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center text-white/90", children: [
|
|
4246
4269
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { className: "w-5 h-5 text-accent-400 mr-2", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
4247
4270
|
"path",
|
|
4248
4271
|
{
|
|
@@ -4316,7 +4339,7 @@ function Services({
|
|
|
4316
4339
|
4: "md:grid-cols-2 lg:grid-cols-4"
|
|
4317
4340
|
};
|
|
4318
4341
|
if (variant === "list") {
|
|
4319
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4342
|
+
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: [
|
|
4320
4343
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4321
4344
|
/* @__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)(
|
|
4322
4345
|
ServiceListItem,
|
|
@@ -4330,7 +4353,7 @@ function Services({
|
|
|
4330
4353
|
] }) });
|
|
4331
4354
|
}
|
|
4332
4355
|
if (variant === "minimal") {
|
|
4333
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4356
|
+
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: [
|
|
4334
4357
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4335
4358
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4336
4359
|
ServiceMinimalCard,
|
|
@@ -4342,7 +4365,7 @@ function Services({
|
|
|
4342
4365
|
)) })
|
|
4343
4366
|
] }) });
|
|
4344
4367
|
}
|
|
4345
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { id, className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4368
|
+
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: [
|
|
4346
4369
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4347
4370
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4348
4371
|
ServiceCard,
|
|
@@ -4425,7 +4448,7 @@ function Testimonials({
|
|
|
4425
4448
|
2: "md:grid-cols-2 max-w-4xl mx-auto",
|
|
4426
4449
|
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
4427
4450
|
};
|
|
4428
|
-
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4451
|
+
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: [
|
|
4429
4452
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center mb-12", children: [
|
|
4430
4453
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4431
4454
|
subtitle && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
@@ -4545,18 +4568,18 @@ function FAQ({
|
|
|
4545
4568
|
}
|
|
4546
4569
|
};
|
|
4547
4570
|
if (variant === "cards") {
|
|
4548
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4571
|
+
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: [
|
|
4549
4572
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4550
4573
|
/* @__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)) })
|
|
4551
4574
|
] }) });
|
|
4552
4575
|
}
|
|
4553
4576
|
if (variant === "simple") {
|
|
4554
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4577
|
+
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: [
|
|
4555
4578
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4556
4579
|
/* @__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)) })
|
|
4557
4580
|
] }) });
|
|
4558
4581
|
}
|
|
4559
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { id, className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4582
|
+
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: [
|
|
4560
4583
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4561
4584
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "max-w-3xl mx-auto", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
4562
4585
|
FAQAccordionItem,
|
|
@@ -4768,53 +4791,155 @@ function Gallery({
|
|
|
4768
4791
|
columns = 3,
|
|
4769
4792
|
variant = "grid",
|
|
4770
4793
|
showCaptions = true,
|
|
4794
|
+
enableLightbox = true,
|
|
4771
4795
|
limit,
|
|
4772
|
-
className = ""
|
|
4796
|
+
className = "",
|
|
4797
|
+
id = "gallery"
|
|
4773
4798
|
}) {
|
|
4774
4799
|
const displayedItems = limit ? items.slice(0, limit) : items;
|
|
4775
4800
|
const [failedImages, setFailedImages] = (0, import_react3.useState)(/* @__PURE__ */ new Set());
|
|
4776
|
-
const
|
|
4777
|
-
|
|
4801
|
+
const [lightboxIndex, setLightboxIndex] = (0, import_react3.useState)(null);
|
|
4802
|
+
const handleImageError = (id2) => {
|
|
4803
|
+
setFailedImages((prev) => new Set(prev).add(id2));
|
|
4778
4804
|
};
|
|
4779
4805
|
const gridCols = {
|
|
4780
4806
|
2: "grid-cols-1 sm:grid-cols-2",
|
|
4781
4807
|
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
4782
4808
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
|
|
4783
4809
|
};
|
|
4784
|
-
|
|
4785
|
-
|
|
4786
|
-
|
|
4787
|
-
|
|
4810
|
+
const openLightbox = (index) => {
|
|
4811
|
+
if (enableLightbox) {
|
|
4812
|
+
setLightboxIndex(index);
|
|
4813
|
+
}
|
|
4814
|
+
};
|
|
4815
|
+
const closeLightbox = () => setLightboxIndex(null);
|
|
4816
|
+
const goToPrevious = () => {
|
|
4817
|
+
if (lightboxIndex !== null) {
|
|
4818
|
+
setLightboxIndex(lightboxIndex === 0 ? displayedItems.length - 1 : lightboxIndex - 1);
|
|
4819
|
+
}
|
|
4820
|
+
};
|
|
4821
|
+
const goToNext = () => {
|
|
4822
|
+
if (lightboxIndex !== null) {
|
|
4823
|
+
setLightboxIndex(lightboxIndex === displayedItems.length - 1 ? 0 : lightboxIndex + 1);
|
|
4824
|
+
}
|
|
4825
|
+
};
|
|
4826
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: [
|
|
4827
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "container mx-auto px-4", children: [
|
|
4828
|
+
(title || subtitle) && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "text-center mb-12", children: [
|
|
4829
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4830
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
4831
|
+
] }),
|
|
4832
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: `grid gap-4 ${gridCols[columns]}`, children: displayedItems.map((item, index) => {
|
|
4833
|
+
const itemId = item.id || item.imageUrl;
|
|
4834
|
+
const hasFailed = failedImages.has(itemId);
|
|
4835
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4836
|
+
"div",
|
|
4837
|
+
{
|
|
4838
|
+
className: `group relative aspect-square overflow-hidden rounded-lg bg-gray-100 ${enableLightbox ? "cursor-pointer" : ""}`,
|
|
4839
|
+
onClick: () => openLightbox(index),
|
|
4840
|
+
role: enableLightbox ? "button" : void 0,
|
|
4841
|
+
tabIndex: enableLightbox ? 0 : void 0,
|
|
4842
|
+
onKeyDown: enableLightbox ? (e) => e.key === "Enter" && openLightbox(index) : void 0,
|
|
4843
|
+
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: [
|
|
4844
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4845
|
+
"img",
|
|
4846
|
+
{
|
|
4847
|
+
src: item.imageUrl,
|
|
4848
|
+
alt: item.alt || "",
|
|
4849
|
+
loading: "lazy",
|
|
4850
|
+
className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",
|
|
4851
|
+
onError: () => handleImageError(itemId)
|
|
4852
|
+
}
|
|
4853
|
+
),
|
|
4854
|
+
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" }) }) }),
|
|
4855
|
+
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 }) }) })
|
|
4856
|
+
] })
|
|
4857
|
+
},
|
|
4858
|
+
itemId
|
|
4859
|
+
);
|
|
4860
|
+
}) })
|
|
4788
4861
|
] }),
|
|
4789
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4862
|
+
enableLightbox && lightboxIndex !== null && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
4863
|
+
"div",
|
|
4864
|
+
{
|
|
4865
|
+
className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center",
|
|
4866
|
+
onClick: closeLightbox,
|
|
4867
|
+
children: [
|
|
4868
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4869
|
+
"button",
|
|
4870
|
+
{
|
|
4871
|
+
onClick: closeLightbox,
|
|
4872
|
+
className: "absolute top-4 right-4 text-white hover:text-gray-300 transition-colors z-10",
|
|
4873
|
+
"aria-label": "Close lightbox",
|
|
4874
|
+
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" }) })
|
|
4875
|
+
}
|
|
4876
|
+
),
|
|
4877
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4878
|
+
"button",
|
|
4879
|
+
{
|
|
4880
|
+
onClick: (e) => {
|
|
4881
|
+
e.stopPropagation();
|
|
4882
|
+
goToPrevious();
|
|
4883
|
+
},
|
|
4884
|
+
className: "absolute left-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4885
|
+
"aria-label": "Previous image",
|
|
4886
|
+
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" }) })
|
|
4887
|
+
}
|
|
4888
|
+
),
|
|
4889
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4890
|
+
"button",
|
|
4891
|
+
{
|
|
4892
|
+
onClick: (e) => {
|
|
4893
|
+
e.stopPropagation();
|
|
4894
|
+
goToNext();
|
|
4895
|
+
},
|
|
4896
|
+
className: "absolute right-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
4897
|
+
"aria-label": "Next image",
|
|
4898
|
+
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" }) })
|
|
4899
|
+
}
|
|
4900
|
+
),
|
|
4901
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
4902
|
+
"div",
|
|
4903
|
+
{
|
|
4904
|
+
className: "max-w-5xl max-h-[85vh] mx-4",
|
|
4905
|
+
onClick: (e) => e.stopPropagation(),
|
|
4906
|
+
children: [
|
|
4907
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
4908
|
+
"img",
|
|
4909
|
+
{
|
|
4910
|
+
src: displayedItems[lightboxIndex].imageUrl,
|
|
4911
|
+
alt: displayedItems[lightboxIndex].alt || "",
|
|
4912
|
+
className: "max-w-full max-h-[85vh] object-contain"
|
|
4913
|
+
}
|
|
4914
|
+
),
|
|
4915
|
+
showCaptions && displayedItems[lightboxIndex].caption && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-white text-center mt-4 text-lg", children: displayedItems[lightboxIndex].caption })
|
|
4916
|
+
]
|
|
4917
|
+
}
|
|
4918
|
+
),
|
|
4919
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white text-sm", children: [
|
|
4920
|
+
lightboxIndex + 1,
|
|
4921
|
+
" / ",
|
|
4922
|
+
displayedItems.length
|
|
4808
4923
|
] })
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
] }) });
|
|
4924
|
+
]
|
|
4925
|
+
}
|
|
4926
|
+
)
|
|
4927
|
+
] });
|
|
4814
4928
|
}
|
|
4815
4929
|
|
|
4816
|
-
// src/components/
|
|
4930
|
+
// src/components/sections/Menu.tsx
|
|
4931
|
+
var import_react4 = require("react");
|
|
4817
4932
|
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
4933
|
+
|
|
4934
|
+
// src/components/sections/TrustBadges.tsx
|
|
4935
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
4936
|
+
|
|
4937
|
+
// src/components/sections/BeforeAfter.tsx
|
|
4938
|
+
var import_react5 = require("react");
|
|
4939
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
4940
|
+
|
|
4941
|
+
// src/components/ui/Button.tsx
|
|
4942
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
4818
4943
|
function getButtonClasses(props) {
|
|
4819
4944
|
const { variant = "primary", size = "md", fullWidth, disabled } = props;
|
|
4820
4945
|
const baseClasses = [
|
|
@@ -4856,16 +4981,16 @@ function Button({
|
|
|
4856
4981
|
...props
|
|
4857
4982
|
}) {
|
|
4858
4983
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
|
|
4859
|
-
return /* @__PURE__ */ (0,
|
|
4984
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4860
4985
|
"button",
|
|
4861
4986
|
{
|
|
4862
4987
|
className: `${classes} ${className}`,
|
|
4863
4988
|
disabled: disabled || loading,
|
|
4864
4989
|
...props,
|
|
4865
|
-
children: loading ? /* @__PURE__ */ (0,
|
|
4866
|
-
leftIcon && /* @__PURE__ */ (0,
|
|
4990
|
+
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(LoadingSpinner, { size }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
4991
|
+
leftIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "mr-2", children: leftIcon }),
|
|
4867
4992
|
children,
|
|
4868
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
4993
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4869
4994
|
] })
|
|
4870
4995
|
}
|
|
4871
4996
|
);
|
|
@@ -4876,7 +5001,7 @@ function LoadingSpinner({ size }) {
|
|
|
4876
5001
|
md: "w-5 h-5",
|
|
4877
5002
|
lg: "w-6 h-6"
|
|
4878
5003
|
};
|
|
4879
|
-
return /* @__PURE__ */ (0,
|
|
5004
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
4880
5005
|
"svg",
|
|
4881
5006
|
{
|
|
4882
5007
|
className: `animate-spin ${sizeClasses[size || "md"]}`,
|
|
@@ -4884,7 +5009,7 @@ function LoadingSpinner({ size }) {
|
|
|
4884
5009
|
fill: "none",
|
|
4885
5010
|
viewBox: "0 0 24 24",
|
|
4886
5011
|
children: [
|
|
4887
|
-
/* @__PURE__ */ (0,
|
|
5012
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4888
5013
|
"circle",
|
|
4889
5014
|
{
|
|
4890
5015
|
className: "opacity-25",
|
|
@@ -4895,7 +5020,7 @@ function LoadingSpinner({ size }) {
|
|
|
4895
5020
|
strokeWidth: "4"
|
|
4896
5021
|
}
|
|
4897
5022
|
),
|
|
4898
|
-
/* @__PURE__ */ (0,
|
|
5023
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4899
5024
|
"path",
|
|
4900
5025
|
{
|
|
4901
5026
|
className: "opacity-75",
|
|
@@ -4918,15 +5043,15 @@ function ButtonLink({
|
|
|
4918
5043
|
...props
|
|
4919
5044
|
}) {
|
|
4920
5045
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
|
|
4921
|
-
return /* @__PURE__ */ (0,
|
|
4922
|
-
leftIcon && /* @__PURE__ */ (0,
|
|
5046
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("a", { className: `${classes} ${className}`, ...props, children: [
|
|
5047
|
+
leftIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "mr-2", children: leftIcon }),
|
|
4923
5048
|
children,
|
|
4924
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
5049
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4925
5050
|
] });
|
|
4926
5051
|
}
|
|
4927
5052
|
|
|
4928
5053
|
// src/components/ui/Card.tsx
|
|
4929
|
-
var
|
|
5054
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
4930
5055
|
function getCardClasses(props) {
|
|
4931
5056
|
const { variant = "default", padding = "md", hover = false } = props;
|
|
4932
5057
|
const baseClasses = ["rounded-lg", "overflow-hidden"];
|
|
@@ -4959,7 +5084,7 @@ function Card({
|
|
|
4959
5084
|
...props
|
|
4960
5085
|
}) {
|
|
4961
5086
|
const classes = getCardClasses({ variant, padding, hover });
|
|
4962
|
-
return /* @__PURE__ */ (0,
|
|
5087
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `${classes} ${className}`, ...props, children });
|
|
4963
5088
|
}
|
|
4964
5089
|
function CardHeader({
|
|
4965
5090
|
title,
|
|
@@ -4969,13 +5094,13 @@ function CardHeader({
|
|
|
4969
5094
|
className = "",
|
|
4970
5095
|
...props
|
|
4971
5096
|
}) {
|
|
4972
|
-
return /* @__PURE__ */ (0,
|
|
4973
|
-
/* @__PURE__ */ (0,
|
|
4974
|
-
title && /* @__PURE__ */ (0,
|
|
4975
|
-
subtitle && /* @__PURE__ */ (0,
|
|
5097
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: `flex items-start justify-between ${className}`, ...props, children: [
|
|
5098
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
5099
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h3", { className: "text-lg font-semibold text-gray-900", children: title }),
|
|
5100
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "mt-1 text-sm text-gray-500", children: subtitle }),
|
|
4976
5101
|
children
|
|
4977
5102
|
] }),
|
|
4978
|
-
action && /* @__PURE__ */ (0,
|
|
5103
|
+
action && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex-shrink-0 ml-4", children: action })
|
|
4979
5104
|
] });
|
|
4980
5105
|
}
|
|
4981
5106
|
function CardBody({
|
|
@@ -4983,14 +5108,14 @@ function CardBody({
|
|
|
4983
5108
|
className = "",
|
|
4984
5109
|
...props
|
|
4985
5110
|
}) {
|
|
4986
|
-
return /* @__PURE__ */ (0,
|
|
5111
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `mt-4 ${className}`, ...props, children });
|
|
4987
5112
|
}
|
|
4988
5113
|
function CardFooter({
|
|
4989
5114
|
children,
|
|
4990
5115
|
className = "",
|
|
4991
5116
|
...props
|
|
4992
5117
|
}) {
|
|
4993
|
-
return /* @__PURE__ */ (0,
|
|
5118
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `mt-4 pt-4 border-t border-gray-100 ${className}`, ...props, children });
|
|
4994
5119
|
}
|
|
4995
5120
|
function CardImage({
|
|
4996
5121
|
aspectRatio = "video",
|
|
@@ -5004,7 +5129,7 @@ function CardImage({
|
|
|
5004
5129
|
wide: "aspect-[2/1]",
|
|
5005
5130
|
auto: ""
|
|
5006
5131
|
};
|
|
5007
|
-
return /* @__PURE__ */ (0,
|
|
5132
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
5008
5133
|
"img",
|
|
5009
5134
|
{
|
|
5010
5135
|
className: `w-full h-full object-cover ${className}`,
|
|
@@ -5014,6 +5139,14 @@ function CardImage({
|
|
|
5014
5139
|
) });
|
|
5015
5140
|
}
|
|
5016
5141
|
|
|
5142
|
+
// src/components/ui/AnimatedSection.tsx
|
|
5143
|
+
var import_react6 = __toESM(require("react"));
|
|
5144
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
5145
|
+
|
|
5146
|
+
// src/components/ui/FloatingClaimBanner.tsx
|
|
5147
|
+
var import_react7 = require("react");
|
|
5148
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
5149
|
+
|
|
5017
5150
|
// src/seo/index.ts
|
|
5018
5151
|
function generateMetadata(business, pageTitle, pageDescription, options = {}) {
|
|
5019
5152
|
const { titleTemplate = "%s", baseUrl } = options;
|