@aws505/sheetsite 1.0.2 → 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 +804 -57
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +789 -57
- package/dist/components/index.mjs.map +1 -1
- package/dist/index.js +175 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +165 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/index.ts +12 -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/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/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
|
|
@@ -4316,7 +4326,7 @@ function Services({
|
|
|
4316
4326
|
4: "md:grid-cols-2 lg:grid-cols-4"
|
|
4317
4327
|
};
|
|
4318
4328
|
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: [
|
|
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: [
|
|
4320
4330
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4321
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)(
|
|
4322
4332
|
ServiceListItem,
|
|
@@ -4330,7 +4340,7 @@ function Services({
|
|
|
4330
4340
|
] }) });
|
|
4331
4341
|
}
|
|
4332
4342
|
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: [
|
|
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: [
|
|
4334
4344
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4335
4345
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4336
4346
|
ServiceMinimalCard,
|
|
@@ -4342,7 +4352,7 @@ function Services({
|
|
|
4342
4352
|
)) })
|
|
4343
4353
|
] }) });
|
|
4344
4354
|
}
|
|
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: [
|
|
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: [
|
|
4346
4356
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
|
|
4347
4357
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
4348
4358
|
ServiceCard,
|
|
@@ -4425,7 +4435,7 @@ function Testimonials({
|
|
|
4425
4435
|
2: "md:grid-cols-2 max-w-4xl mx-auto",
|
|
4426
4436
|
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
4427
4437
|
};
|
|
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: [
|
|
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: [
|
|
4429
4439
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center mb-12", children: [
|
|
4430
4440
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
4431
4441
|
subtitle && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
@@ -4545,18 +4555,18 @@ function FAQ({
|
|
|
4545
4555
|
}
|
|
4546
4556
|
};
|
|
4547
4557
|
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: [
|
|
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: [
|
|
4549
4559
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4550
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)) })
|
|
4551
4561
|
] }) });
|
|
4552
4562
|
}
|
|
4553
4563
|
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: [
|
|
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: [
|
|
4555
4565
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4556
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)) })
|
|
4557
4567
|
] }) });
|
|
4558
4568
|
}
|
|
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: [
|
|
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: [
|
|
4560
4570
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
|
|
4561
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)(
|
|
4562
4572
|
FAQAccordionItem,
|
|
@@ -4768,53 +4778,155 @@ function Gallery({
|
|
|
4768
4778
|
columns = 3,
|
|
4769
4779
|
variant = "grid",
|
|
4770
4780
|
showCaptions = true,
|
|
4781
|
+
enableLightbox = true,
|
|
4771
4782
|
limit,
|
|
4772
|
-
className = ""
|
|
4783
|
+
className = "",
|
|
4784
|
+
id = "gallery"
|
|
4773
4785
|
}) {
|
|
4774
4786
|
const displayedItems = limit ? items.slice(0, limit) : items;
|
|
4775
4787
|
const [failedImages, setFailedImages] = (0, import_react3.useState)(/* @__PURE__ */ new Set());
|
|
4776
|
-
const
|
|
4777
|
-
|
|
4788
|
+
const [lightboxIndex, setLightboxIndex] = (0, import_react3.useState)(null);
|
|
4789
|
+
const handleImageError = (id2) => {
|
|
4790
|
+
setFailedImages((prev) => new Set(prev).add(id2));
|
|
4778
4791
|
};
|
|
4779
4792
|
const gridCols = {
|
|
4780
4793
|
2: "grid-cols-1 sm:grid-cols-2",
|
|
4781
4794
|
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
4782
4795
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
|
|
4783
4796
|
};
|
|
4784
|
-
|
|
4785
|
-
|
|
4786
|
-
|
|
4787
|
-
|
|
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
|
+
}) })
|
|
4788
4848
|
] }),
|
|
4789
|
-
/* @__PURE__ */ (0, import_jsx_runtime9.
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
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
|
|
4808
4910
|
] })
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
] }) });
|
|
4911
|
+
]
|
|
4912
|
+
}
|
|
4913
|
+
)
|
|
4914
|
+
] });
|
|
4814
4915
|
}
|
|
4815
4916
|
|
|
4816
|
-
// src/components/
|
|
4917
|
+
// src/components/sections/Menu.tsx
|
|
4918
|
+
var import_react4 = require("react");
|
|
4817
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");
|
|
4818
4930
|
function getButtonClasses(props) {
|
|
4819
4931
|
const { variant = "primary", size = "md", fullWidth, disabled } = props;
|
|
4820
4932
|
const baseClasses = [
|
|
@@ -4856,16 +4968,16 @@ function Button({
|
|
|
4856
4968
|
...props
|
|
4857
4969
|
}) {
|
|
4858
4970
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
|
|
4859
|
-
return /* @__PURE__ */ (0,
|
|
4971
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4860
4972
|
"button",
|
|
4861
4973
|
{
|
|
4862
4974
|
className: `${classes} ${className}`,
|
|
4863
4975
|
disabled: disabled || loading,
|
|
4864
4976
|
...props,
|
|
4865
|
-
children: loading ? /* @__PURE__ */ (0,
|
|
4866
|
-
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 }),
|
|
4867
4979
|
children,
|
|
4868
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
4980
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4869
4981
|
] })
|
|
4870
4982
|
}
|
|
4871
4983
|
);
|
|
@@ -4876,7 +4988,7 @@ function LoadingSpinner({ size }) {
|
|
|
4876
4988
|
md: "w-5 h-5",
|
|
4877
4989
|
lg: "w-6 h-6"
|
|
4878
4990
|
};
|
|
4879
|
-
return /* @__PURE__ */ (0,
|
|
4991
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
4880
4992
|
"svg",
|
|
4881
4993
|
{
|
|
4882
4994
|
className: `animate-spin ${sizeClasses[size || "md"]}`,
|
|
@@ -4884,7 +4996,7 @@ function LoadingSpinner({ size }) {
|
|
|
4884
4996
|
fill: "none",
|
|
4885
4997
|
viewBox: "0 0 24 24",
|
|
4886
4998
|
children: [
|
|
4887
|
-
/* @__PURE__ */ (0,
|
|
4999
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4888
5000
|
"circle",
|
|
4889
5001
|
{
|
|
4890
5002
|
className: "opacity-25",
|
|
@@ -4895,7 +5007,7 @@ function LoadingSpinner({ size }) {
|
|
|
4895
5007
|
strokeWidth: "4"
|
|
4896
5008
|
}
|
|
4897
5009
|
),
|
|
4898
|
-
/* @__PURE__ */ (0,
|
|
5010
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
4899
5011
|
"path",
|
|
4900
5012
|
{
|
|
4901
5013
|
className: "opacity-75",
|
|
@@ -4918,15 +5030,15 @@ function ButtonLink({
|
|
|
4918
5030
|
...props
|
|
4919
5031
|
}) {
|
|
4920
5032
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
|
|
4921
|
-
return /* @__PURE__ */ (0,
|
|
4922
|
-
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 }),
|
|
4923
5035
|
children,
|
|
4924
|
-
rightIcon && /* @__PURE__ */ (0,
|
|
5036
|
+
rightIcon && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ml-2", children: rightIcon })
|
|
4925
5037
|
] });
|
|
4926
5038
|
}
|
|
4927
5039
|
|
|
4928
5040
|
// src/components/ui/Card.tsx
|
|
4929
|
-
var
|
|
5041
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
4930
5042
|
function getCardClasses(props) {
|
|
4931
5043
|
const { variant = "default", padding = "md", hover = false } = props;
|
|
4932
5044
|
const baseClasses = ["rounded-lg", "overflow-hidden"];
|
|
@@ -4959,7 +5071,7 @@ function Card({
|
|
|
4959
5071
|
...props
|
|
4960
5072
|
}) {
|
|
4961
5073
|
const classes = getCardClasses({ variant, padding, hover });
|
|
4962
|
-
return /* @__PURE__ */ (0,
|
|
5074
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `${classes} ${className}`, ...props, children });
|
|
4963
5075
|
}
|
|
4964
5076
|
function CardHeader({
|
|
4965
5077
|
title,
|
|
@@ -4969,13 +5081,13 @@ function CardHeader({
|
|
|
4969
5081
|
className = "",
|
|
4970
5082
|
...props
|
|
4971
5083
|
}) {
|
|
4972
|
-
return /* @__PURE__ */ (0,
|
|
4973
|
-
/* @__PURE__ */ (0,
|
|
4974
|
-
title && /* @__PURE__ */ (0,
|
|
4975
|
-
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 }),
|
|
4976
5088
|
children
|
|
4977
5089
|
] }),
|
|
4978
|
-
action && /* @__PURE__ */ (0,
|
|
5090
|
+
action && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex-shrink-0 ml-4", children: action })
|
|
4979
5091
|
] });
|
|
4980
5092
|
}
|
|
4981
5093
|
function CardBody({
|
|
@@ -4983,14 +5095,14 @@ function CardBody({
|
|
|
4983
5095
|
className = "",
|
|
4984
5096
|
...props
|
|
4985
5097
|
}) {
|
|
4986
|
-
return /* @__PURE__ */ (0,
|
|
5098
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: `mt-4 ${className}`, ...props, children });
|
|
4987
5099
|
}
|
|
4988
5100
|
function CardFooter({
|
|
4989
5101
|
children,
|
|
4990
5102
|
className = "",
|
|
4991
5103
|
...props
|
|
4992
5104
|
}) {
|
|
4993
|
-
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 });
|
|
4994
5106
|
}
|
|
4995
5107
|
function CardImage({
|
|
4996
5108
|
aspectRatio = "video",
|
|
@@ -5004,7 +5116,7 @@ function CardImage({
|
|
|
5004
5116
|
wide: "aspect-[2/1]",
|
|
5005
5117
|
auto: ""
|
|
5006
5118
|
};
|
|
5007
|
-
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)(
|
|
5008
5120
|
"img",
|
|
5009
5121
|
{
|
|
5010
5122
|
className: `w-full h-full object-cover ${className}`,
|
|
@@ -5014,6 +5126,10 @@ function CardImage({
|
|
|
5014
5126
|
) });
|
|
5015
5127
|
}
|
|
5016
5128
|
|
|
5129
|
+
// src/components/ui/AnimatedSection.tsx
|
|
5130
|
+
var import_react6 = __toESM(require("react"));
|
|
5131
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
5132
|
+
|
|
5017
5133
|
// src/seo/index.ts
|
|
5018
5134
|
function generateMetadata(business, pageTitle, pageDescription, options = {}) {
|
|
5019
5135
|
const { titleTemplate = "%s", baseUrl } = options;
|