@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
|
@@ -894,7 +894,7 @@ function Services({
|
|
|
894
894
|
4: "md:grid-cols-2 lg:grid-cols-4"
|
|
895
895
|
};
|
|
896
896
|
if (variant === "list") {
|
|
897
|
-
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
897
|
+
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
898
898
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
899
899
|
/* @__PURE__ */ jsx5("div", { className: "max-w-3xl mx-auto divide-y divide-gray-200", children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
900
900
|
ServiceListItem,
|
|
@@ -908,7 +908,7 @@ function Services({
|
|
|
908
908
|
] }) });
|
|
909
909
|
}
|
|
910
910
|
if (variant === "minimal") {
|
|
911
|
-
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
911
|
+
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
912
912
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
913
913
|
/* @__PURE__ */ jsx5("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
914
914
|
ServiceMinimalCard,
|
|
@@ -920,7 +920,7 @@ function Services({
|
|
|
920
920
|
)) })
|
|
921
921
|
] }) });
|
|
922
922
|
}
|
|
923
|
-
return /* @__PURE__ */ jsx5("section", { id, className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs5("div", { className: "container mx-auto px-4", children: [
|
|
923
|
+
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: [
|
|
924
924
|
/* @__PURE__ */ jsx5(SectionHeader, { title, subtitle }),
|
|
925
925
|
/* @__PURE__ */ jsx5("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ jsx5(
|
|
926
926
|
ServiceCard,
|
|
@@ -1003,7 +1003,7 @@ function Testimonials({
|
|
|
1003
1003
|
2: "md:grid-cols-2 max-w-4xl mx-auto",
|
|
1004
1004
|
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
1005
1005
|
};
|
|
1006
|
-
return /* @__PURE__ */ jsx6("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs6("div", { className: "container mx-auto px-4", children: [
|
|
1006
|
+
return /* @__PURE__ */ jsx6("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs6("div", { className: "container mx-auto px-4", children: [
|
|
1007
1007
|
/* @__PURE__ */ jsxs6("div", { className: "text-center mb-12", children: [
|
|
1008
1008
|
/* @__PURE__ */ jsx6("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1009
1009
|
subtitle && /* @__PURE__ */ jsx6("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
@@ -1123,18 +1123,18 @@ function FAQ({
|
|
|
1123
1123
|
}
|
|
1124
1124
|
};
|
|
1125
1125
|
if (variant === "cards") {
|
|
1126
|
-
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
1126
|
+
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
1127
1127
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
1128
1128
|
/* @__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)) })
|
|
1129
1129
|
] }) });
|
|
1130
1130
|
}
|
|
1131
1131
|
if (variant === "simple") {
|
|
1132
|
-
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
1132
|
+
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
1133
1133
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
1134
1134
|
/* @__PURE__ */ jsx7("div", { className: "max-w-3xl mx-auto space-y-8", children: items.map((item) => /* @__PURE__ */ jsx7(FAQSimple, { item }, item.id || item.question)) })
|
|
1135
1135
|
] }) });
|
|
1136
1136
|
}
|
|
1137
|
-
return /* @__PURE__ */ jsx7("section", { id, className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs7("div", { className: "container mx-auto px-4", children: [
|
|
1137
|
+
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: [
|
|
1138
1138
|
/* @__PURE__ */ jsx7(SectionHeader2, { title, subtitle }),
|
|
1139
1139
|
/* @__PURE__ */ jsx7("div", { className: "max-w-3xl mx-auto", children: items.map((item, index) => /* @__PURE__ */ jsx7(
|
|
1140
1140
|
FAQAccordionItem,
|
|
@@ -1346,53 +1346,694 @@ function Gallery({
|
|
|
1346
1346
|
columns = 3,
|
|
1347
1347
|
variant = "grid",
|
|
1348
1348
|
showCaptions = true,
|
|
1349
|
+
enableLightbox = true,
|
|
1349
1350
|
limit,
|
|
1350
|
-
className = ""
|
|
1351
|
+
className = "",
|
|
1352
|
+
id = "gallery"
|
|
1351
1353
|
}) {
|
|
1352
1354
|
const displayedItems = limit ? items.slice(0, limit) : items;
|
|
1353
1355
|
const [failedImages, setFailedImages] = useState3(/* @__PURE__ */ new Set());
|
|
1354
|
-
const
|
|
1355
|
-
|
|
1356
|
+
const [lightboxIndex, setLightboxIndex] = useState3(null);
|
|
1357
|
+
const handleImageError = (id2) => {
|
|
1358
|
+
setFailedImages((prev) => new Set(prev).add(id2));
|
|
1356
1359
|
};
|
|
1357
1360
|
const gridCols = {
|
|
1358
1361
|
2: "grid-cols-1 sm:grid-cols-2",
|
|
1359
1362
|
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
1360
1363
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
|
|
1361
1364
|
};
|
|
1362
|
-
|
|
1363
|
-
(
|
|
1364
|
-
|
|
1365
|
-
|
|
1365
|
+
const openLightbox = (index) => {
|
|
1366
|
+
if (enableLightbox) {
|
|
1367
|
+
setLightboxIndex(index);
|
|
1368
|
+
}
|
|
1369
|
+
};
|
|
1370
|
+
const closeLightbox = () => setLightboxIndex(null);
|
|
1371
|
+
const goToPrevious = () => {
|
|
1372
|
+
if (lightboxIndex !== null) {
|
|
1373
|
+
setLightboxIndex(lightboxIndex === 0 ? displayedItems.length - 1 : lightboxIndex - 1);
|
|
1374
|
+
}
|
|
1375
|
+
};
|
|
1376
|
+
const goToNext = () => {
|
|
1377
|
+
if (lightboxIndex !== null) {
|
|
1378
|
+
setLightboxIndex(lightboxIndex === displayedItems.length - 1 ? 0 : lightboxIndex + 1);
|
|
1379
|
+
}
|
|
1380
|
+
};
|
|
1381
|
+
return /* @__PURE__ */ jsxs9("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: [
|
|
1382
|
+
/* @__PURE__ */ jsxs9("div", { className: "container mx-auto px-4", children: [
|
|
1383
|
+
(title || subtitle) && /* @__PURE__ */ jsxs9("div", { className: "text-center mb-12", children: [
|
|
1384
|
+
title && /* @__PURE__ */ jsx9("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1385
|
+
subtitle && /* @__PURE__ */ jsx9("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
1386
|
+
] }),
|
|
1387
|
+
/* @__PURE__ */ jsx9("div", { className: `grid gap-4 ${gridCols[columns]}`, children: displayedItems.map((item, index) => {
|
|
1388
|
+
const itemId = item.id || item.imageUrl;
|
|
1389
|
+
const hasFailed = failedImages.has(itemId);
|
|
1390
|
+
return /* @__PURE__ */ jsx9(
|
|
1391
|
+
"div",
|
|
1392
|
+
{
|
|
1393
|
+
className: `group relative aspect-square overflow-hidden rounded-lg bg-gray-100 ${enableLightbox ? "cursor-pointer" : ""}`,
|
|
1394
|
+
onClick: () => openLightbox(index),
|
|
1395
|
+
role: enableLightbox ? "button" : void 0,
|
|
1396
|
+
tabIndex: enableLightbox ? 0 : void 0,
|
|
1397
|
+
onKeyDown: enableLightbox ? (e) => e.key === "Enter" && openLightbox(index) : void 0,
|
|
1398
|
+
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: [
|
|
1399
|
+
/* @__PURE__ */ jsx9(
|
|
1400
|
+
"img",
|
|
1401
|
+
{
|
|
1402
|
+
src: item.imageUrl,
|
|
1403
|
+
alt: item.alt || "",
|
|
1404
|
+
loading: "lazy",
|
|
1405
|
+
className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",
|
|
1406
|
+
onError: () => handleImageError(itemId)
|
|
1407
|
+
}
|
|
1408
|
+
),
|
|
1409
|
+
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" }) }) }),
|
|
1410
|
+
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 }) }) })
|
|
1411
|
+
] })
|
|
1412
|
+
},
|
|
1413
|
+
itemId
|
|
1414
|
+
);
|
|
1415
|
+
}) })
|
|
1366
1416
|
] }),
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1417
|
+
enableLightbox && lightboxIndex !== null && /* @__PURE__ */ jsxs9(
|
|
1418
|
+
"div",
|
|
1419
|
+
{
|
|
1420
|
+
className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center",
|
|
1421
|
+
onClick: closeLightbox,
|
|
1422
|
+
children: [
|
|
1423
|
+
/* @__PURE__ */ jsx9(
|
|
1424
|
+
"button",
|
|
1425
|
+
{
|
|
1426
|
+
onClick: closeLightbox,
|
|
1427
|
+
className: "absolute top-4 right-4 text-white hover:text-gray-300 transition-colors z-10",
|
|
1428
|
+
"aria-label": "Close lightbox",
|
|
1429
|
+
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" }) })
|
|
1430
|
+
}
|
|
1431
|
+
),
|
|
1432
|
+
/* @__PURE__ */ jsx9(
|
|
1433
|
+
"button",
|
|
1434
|
+
{
|
|
1435
|
+
onClick: (e) => {
|
|
1436
|
+
e.stopPropagation();
|
|
1437
|
+
goToPrevious();
|
|
1438
|
+
},
|
|
1439
|
+
className: "absolute left-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
1440
|
+
"aria-label": "Previous image",
|
|
1441
|
+
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" }) })
|
|
1442
|
+
}
|
|
1443
|
+
),
|
|
1444
|
+
/* @__PURE__ */ jsx9(
|
|
1445
|
+
"button",
|
|
1446
|
+
{
|
|
1447
|
+
onClick: (e) => {
|
|
1448
|
+
e.stopPropagation();
|
|
1449
|
+
goToNext();
|
|
1450
|
+
},
|
|
1451
|
+
className: "absolute right-4 top-1/2 -translate-y-1/2 text-white hover:text-gray-300 transition-colors z-10",
|
|
1452
|
+
"aria-label": "Next image",
|
|
1453
|
+
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" }) })
|
|
1454
|
+
}
|
|
1455
|
+
),
|
|
1456
|
+
/* @__PURE__ */ jsxs9(
|
|
1457
|
+
"div",
|
|
1458
|
+
{
|
|
1459
|
+
className: "max-w-5xl max-h-[85vh] mx-4",
|
|
1460
|
+
onClick: (e) => e.stopPropagation(),
|
|
1461
|
+
children: [
|
|
1462
|
+
/* @__PURE__ */ jsx9(
|
|
1463
|
+
"img",
|
|
1464
|
+
{
|
|
1465
|
+
src: displayedItems[lightboxIndex].imageUrl,
|
|
1466
|
+
alt: displayedItems[lightboxIndex].alt || "",
|
|
1467
|
+
className: "max-w-full max-h-[85vh] object-contain"
|
|
1468
|
+
}
|
|
1469
|
+
),
|
|
1470
|
+
showCaptions && displayedItems[lightboxIndex].caption && /* @__PURE__ */ jsx9("p", { className: "text-white text-center mt-4 text-lg", children: displayedItems[lightboxIndex].caption })
|
|
1471
|
+
]
|
|
1472
|
+
}
|
|
1473
|
+
),
|
|
1474
|
+
/* @__PURE__ */ jsxs9("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 text-white text-sm", children: [
|
|
1475
|
+
lightboxIndex + 1,
|
|
1476
|
+
" / ",
|
|
1477
|
+
displayedItems.length
|
|
1386
1478
|
] })
|
|
1479
|
+
]
|
|
1480
|
+
}
|
|
1481
|
+
)
|
|
1482
|
+
] });
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
// src/components/sections/Menu.tsx
|
|
1486
|
+
import { useState as useState4 } from "react";
|
|
1487
|
+
import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1488
|
+
function Menu({
|
|
1489
|
+
items,
|
|
1490
|
+
title = "Our Menu",
|
|
1491
|
+
subtitle,
|
|
1492
|
+
showCategories = true,
|
|
1493
|
+
showImages = true,
|
|
1494
|
+
showDietary = true,
|
|
1495
|
+
variant = "cards",
|
|
1496
|
+
columns = 2,
|
|
1497
|
+
className = "",
|
|
1498
|
+
id = "menu"
|
|
1499
|
+
}) {
|
|
1500
|
+
const categories = showCategories ? [...new Set(items.filter((item) => item.category).map((item) => item.category))] : [];
|
|
1501
|
+
const [activeCategory, setActiveCategory] = useState4(
|
|
1502
|
+
categories.length > 0 ? categories[0] : null
|
|
1503
|
+
);
|
|
1504
|
+
const displayedItems = activeCategory ? items.filter((item) => item.category === activeCategory) : items;
|
|
1505
|
+
const sortedItems = [...displayedItems].sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0));
|
|
1506
|
+
const gridCols = {
|
|
1507
|
+
1: "max-w-2xl mx-auto",
|
|
1508
|
+
2: "md:grid-cols-2",
|
|
1509
|
+
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
1510
|
+
};
|
|
1511
|
+
return /* @__PURE__ */ jsx10("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs10("div", { className: "container mx-auto px-4", children: [
|
|
1512
|
+
/* @__PURE__ */ jsxs10("div", { className: "text-center mb-12", children: [
|
|
1513
|
+
/* @__PURE__ */ jsx10("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1514
|
+
subtitle && /* @__PURE__ */ jsx10("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
1515
|
+
] }),
|
|
1516
|
+
showCategories && categories.length > 1 && /* @__PURE__ */ jsx10("div", { className: "flex flex-wrap justify-center gap-2 mb-8", children: categories.map((category) => /* @__PURE__ */ jsx10(
|
|
1517
|
+
"button",
|
|
1518
|
+
{
|
|
1519
|
+
onClick: () => setActiveCategory(category),
|
|
1520
|
+
className: `px-4 py-2 rounded-full text-sm font-medium transition-colors ${activeCategory === category ? "bg-primary-600 text-white" : "bg-gray-100 text-gray-700 hover:bg-gray-200"}`,
|
|
1521
|
+
children: category
|
|
1522
|
+
},
|
|
1523
|
+
category
|
|
1524
|
+
)) }),
|
|
1525
|
+
variant === "list" ? /* @__PURE__ */ jsx10("div", { className: "max-w-3xl mx-auto divide-y divide-gray-200", children: sortedItems.map((item) => /* @__PURE__ */ jsx10(
|
|
1526
|
+
MenuListItem,
|
|
1527
|
+
{
|
|
1528
|
+
item,
|
|
1529
|
+
showImage: showImages,
|
|
1530
|
+
showDietary
|
|
1531
|
+
},
|
|
1532
|
+
item.id || item.name
|
|
1533
|
+
)) }) : variant === "compact" ? /* @__PURE__ */ jsx10("div", { className: `grid gap-4 ${gridCols[columns]}`, children: sortedItems.map((item) => /* @__PURE__ */ jsx10(
|
|
1534
|
+
MenuCompactItem,
|
|
1535
|
+
{
|
|
1536
|
+
item,
|
|
1537
|
+
showDietary
|
|
1538
|
+
},
|
|
1539
|
+
item.id || item.name
|
|
1540
|
+
)) }) : /* @__PURE__ */ jsx10("div", { className: `grid gap-6 ${gridCols[columns]}`, children: sortedItems.map((item) => /* @__PURE__ */ jsx10(
|
|
1541
|
+
MenuCard,
|
|
1542
|
+
{
|
|
1543
|
+
item,
|
|
1544
|
+
showImage: showImages,
|
|
1545
|
+
showDietary
|
|
1546
|
+
},
|
|
1547
|
+
item.id || item.name
|
|
1548
|
+
)) })
|
|
1549
|
+
] }) });
|
|
1550
|
+
}
|
|
1551
|
+
function MenuCard({
|
|
1552
|
+
item,
|
|
1553
|
+
showImage,
|
|
1554
|
+
showDietary
|
|
1555
|
+
}) {
|
|
1556
|
+
return /* @__PURE__ */ jsxs10("div", { className: "bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow", children: [
|
|
1557
|
+
showImage && item.imageUrl && /* @__PURE__ */ jsxs10("div", { className: "aspect-video relative overflow-hidden", children: [
|
|
1558
|
+
/* @__PURE__ */ jsx10(
|
|
1559
|
+
"img",
|
|
1560
|
+
{
|
|
1561
|
+
src: item.imageUrl,
|
|
1562
|
+
alt: item.name,
|
|
1563
|
+
className: "w-full h-full object-cover"
|
|
1564
|
+
}
|
|
1565
|
+
),
|
|
1566
|
+
item.featured && /* @__PURE__ */ jsx10("span", { className: "absolute top-2 left-2 px-2 py-1 bg-primary-600 text-white text-xs font-medium rounded", children: "Featured" })
|
|
1567
|
+
] }),
|
|
1568
|
+
/* @__PURE__ */ jsxs10("div", { className: "p-4", children: [
|
|
1569
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex justify-between items-start mb-2", children: [
|
|
1570
|
+
/* @__PURE__ */ jsx10("h3", { className: "text-lg font-semibold text-gray-900", children: item.name }),
|
|
1571
|
+
/* @__PURE__ */ jsx10(PriceDisplay, { item })
|
|
1572
|
+
] }),
|
|
1573
|
+
item.description && /* @__PURE__ */ jsx10("p", { className: "text-gray-600 text-sm mb-3", children: item.description }),
|
|
1574
|
+
showDietary && item.dietary && item.dietary.length > 0 && /* @__PURE__ */ jsx10(DietaryBadges, { dietary: item.dietary }),
|
|
1575
|
+
!item.available && /* @__PURE__ */ jsx10("span", { className: "inline-block mt-2 px-2 py-1 bg-gray-100 text-gray-500 text-xs rounded", children: "Currently unavailable" })
|
|
1576
|
+
] })
|
|
1577
|
+
] });
|
|
1578
|
+
}
|
|
1579
|
+
function MenuListItem({
|
|
1580
|
+
item,
|
|
1581
|
+
showImage,
|
|
1582
|
+
showDietary
|
|
1583
|
+
}) {
|
|
1584
|
+
return /* @__PURE__ */ jsxs10("div", { className: "py-4 flex gap-4", children: [
|
|
1585
|
+
showImage && item.imageUrl && /* @__PURE__ */ jsx10("div", { className: "w-20 h-20 flex-shrink-0 rounded-lg overflow-hidden", children: /* @__PURE__ */ jsx10(
|
|
1586
|
+
"img",
|
|
1587
|
+
{
|
|
1588
|
+
src: item.imageUrl,
|
|
1589
|
+
alt: item.name,
|
|
1590
|
+
className: "w-full h-full object-cover"
|
|
1591
|
+
}
|
|
1592
|
+
) }),
|
|
1593
|
+
/* @__PURE__ */ jsx10("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxs10("div", { className: "flex justify-between items-start", children: [
|
|
1594
|
+
/* @__PURE__ */ jsxs10("div", { children: [
|
|
1595
|
+
/* @__PURE__ */ jsxs10("h3", { className: "text-lg font-semibold text-gray-900", children: [
|
|
1596
|
+
item.name,
|
|
1597
|
+
item.featured && /* @__PURE__ */ jsx10("span", { className: "ml-2 px-2 py-0.5 bg-primary-100 text-primary-700 text-xs font-medium rounded", children: "Popular" })
|
|
1598
|
+
] }),
|
|
1599
|
+
item.description && /* @__PURE__ */ jsx10("p", { className: "text-gray-600 text-sm mt-1", children: item.description }),
|
|
1600
|
+
showDietary && item.dietary && item.dietary.length > 0 && /* @__PURE__ */ jsx10("div", { className: "mt-2", children: /* @__PURE__ */ jsx10(DietaryBadges, { dietary: item.dietary }) })
|
|
1601
|
+
] }),
|
|
1602
|
+
/* @__PURE__ */ jsx10(PriceDisplay, { item })
|
|
1603
|
+
] }) })
|
|
1604
|
+
] });
|
|
1605
|
+
}
|
|
1606
|
+
function MenuCompactItem({
|
|
1607
|
+
item,
|
|
1608
|
+
showDietary
|
|
1609
|
+
}) {
|
|
1610
|
+
return /* @__PURE__ */ jsxs10("div", { className: "flex justify-between items-center py-2 border-b border-gray-100 last:border-0", children: [
|
|
1611
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2", children: [
|
|
1612
|
+
/* @__PURE__ */ jsx10("span", { className: "font-medium text-gray-900", children: item.name }),
|
|
1613
|
+
item.featured && /* @__PURE__ */ jsx10("span", { className: "w-2 h-2 bg-primary-500 rounded-full", title: "Popular" }),
|
|
1614
|
+
showDietary && item.dietary && item.dietary.length > 0 && /* @__PURE__ */ jsxs10("span", { className: "text-xs text-gray-500", children: [
|
|
1615
|
+
"(",
|
|
1616
|
+
item.dietary.join(", "),
|
|
1617
|
+
")"
|
|
1618
|
+
] })
|
|
1619
|
+
] }),
|
|
1620
|
+
/* @__PURE__ */ jsx10(PriceDisplay, { item, compact: true })
|
|
1621
|
+
] });
|
|
1622
|
+
}
|
|
1623
|
+
function PriceDisplay({ item, compact = false }) {
|
|
1624
|
+
if (item.priceNote) {
|
|
1625
|
+
return /* @__PURE__ */ jsx10("span", { className: `text-primary-600 font-medium ${compact ? "text-sm" : ""}`, children: item.priceNote });
|
|
1626
|
+
}
|
|
1627
|
+
if (item.price) {
|
|
1628
|
+
return /* @__PURE__ */ jsxs10("span", { className: `text-primary-600 font-medium ${compact ? "text-sm" : ""}`, children: [
|
|
1629
|
+
"$",
|
|
1630
|
+
item.price.toFixed(2)
|
|
1631
|
+
] });
|
|
1632
|
+
}
|
|
1633
|
+
return null;
|
|
1634
|
+
}
|
|
1635
|
+
function DietaryBadges({ dietary }) {
|
|
1636
|
+
const dietaryIcons = {
|
|
1637
|
+
vegetarian: "V",
|
|
1638
|
+
vegan: "VG",
|
|
1639
|
+
"gluten-free": "GF",
|
|
1640
|
+
"dairy-free": "DF",
|
|
1641
|
+
"nut-free": "NF",
|
|
1642
|
+
spicy: "\u{1F336}",
|
|
1643
|
+
halal: "H",
|
|
1644
|
+
kosher: "K"
|
|
1645
|
+
};
|
|
1646
|
+
return /* @__PURE__ */ jsx10("div", { className: "flex flex-wrap gap-1", children: dietary.map((diet) => /* @__PURE__ */ jsx10(
|
|
1647
|
+
"span",
|
|
1648
|
+
{
|
|
1649
|
+
className: "px-1.5 py-0.5 bg-green-100 text-green-700 text-xs font-medium rounded",
|
|
1650
|
+
title: diet,
|
|
1651
|
+
children: dietaryIcons[diet.toLowerCase()] || diet
|
|
1652
|
+
},
|
|
1653
|
+
diet
|
|
1654
|
+
)) });
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
// src/components/sections/TrustBadges.tsx
|
|
1658
|
+
import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1659
|
+
function TrustBadges({
|
|
1660
|
+
badges,
|
|
1661
|
+
title = "Certifications & Affiliations",
|
|
1662
|
+
subtitle,
|
|
1663
|
+
variant = "grid",
|
|
1664
|
+
columns = 4,
|
|
1665
|
+
showDescriptions = false,
|
|
1666
|
+
className = "",
|
|
1667
|
+
id = "certifications"
|
|
1668
|
+
}) {
|
|
1669
|
+
const sortedBadges = [...badges].sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0));
|
|
1670
|
+
const gridCols = {
|
|
1671
|
+
3: "grid-cols-2 sm:grid-cols-3",
|
|
1672
|
+
4: "grid-cols-2 sm:grid-cols-4",
|
|
1673
|
+
5: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
|
|
1674
|
+
6: "grid-cols-3 sm:grid-cols-6"
|
|
1675
|
+
};
|
|
1676
|
+
if (variant === "inline") {
|
|
1677
|
+
return /* @__PURE__ */ jsx11("section", { id, className: `py-12 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs11("div", { className: "container mx-auto px-4", children: [
|
|
1678
|
+
title && /* @__PURE__ */ jsx11("p", { className: "text-center text-sm text-gray-500 mb-6", children: title }),
|
|
1679
|
+
/* @__PURE__ */ jsx11("div", { className: "flex flex-wrap justify-center items-center gap-8 md:gap-12", children: sortedBadges.map((badge) => /* @__PURE__ */ jsx11(InlineBadge, { badge }, badge.id || badge.name)) })
|
|
1680
|
+
] }) });
|
|
1681
|
+
}
|
|
1682
|
+
if (variant === "cards") {
|
|
1683
|
+
return /* @__PURE__ */ jsx11("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs11("div", { className: "container mx-auto px-4", children: [
|
|
1684
|
+
/* @__PURE__ */ jsxs11("div", { className: "text-center mb-12", children: [
|
|
1685
|
+
/* @__PURE__ */ jsx11("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1686
|
+
subtitle && /* @__PURE__ */ jsx11("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
1687
|
+
] }),
|
|
1688
|
+
/* @__PURE__ */ jsx11("div", { className: `grid gap-6 ${gridCols[columns]}`, children: sortedBadges.map((badge) => /* @__PURE__ */ jsx11(
|
|
1689
|
+
CardBadge,
|
|
1690
|
+
{
|
|
1691
|
+
badge,
|
|
1692
|
+
showDescription: showDescriptions
|
|
1387
1693
|
},
|
|
1388
|
-
|
|
1389
|
-
)
|
|
1390
|
-
}) })
|
|
1694
|
+
badge.id || badge.name
|
|
1695
|
+
)) })
|
|
1696
|
+
] }) });
|
|
1697
|
+
}
|
|
1698
|
+
return /* @__PURE__ */ jsx11("section", { id, className: `py-16 scroll-mt-20 bg-gray-50 ${className}`, children: /* @__PURE__ */ jsxs11("div", { className: "container mx-auto px-4", children: [
|
|
1699
|
+
/* @__PURE__ */ jsxs11("div", { className: "text-center mb-12", children: [
|
|
1700
|
+
/* @__PURE__ */ jsx11("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1701
|
+
subtitle && /* @__PURE__ */ jsx11("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
1702
|
+
] }),
|
|
1703
|
+
/* @__PURE__ */ jsx11("div", { className: `grid gap-8 ${gridCols[columns]}`, children: sortedBadges.map((badge) => /* @__PURE__ */ jsx11(
|
|
1704
|
+
GridBadge,
|
|
1705
|
+
{
|
|
1706
|
+
badge,
|
|
1707
|
+
showDescription: showDescriptions
|
|
1708
|
+
},
|
|
1709
|
+
badge.id || badge.name
|
|
1710
|
+
)) })
|
|
1391
1711
|
] }) });
|
|
1392
1712
|
}
|
|
1713
|
+
function InlineBadge({ badge }) {
|
|
1714
|
+
const Wrapper = badge.link ? "a" : "div";
|
|
1715
|
+
const wrapperProps = badge.link ? { href: badge.link, target: "_blank", rel: "noopener noreferrer" } : {};
|
|
1716
|
+
return /* @__PURE__ */ jsx11(
|
|
1717
|
+
Wrapper,
|
|
1718
|
+
{
|
|
1719
|
+
...wrapperProps,
|
|
1720
|
+
className: "flex items-center opacity-70 hover:opacity-100 transition-opacity",
|
|
1721
|
+
title: badge.name,
|
|
1722
|
+
children: badge.imageUrl ? /* @__PURE__ */ jsx11(
|
|
1723
|
+
"img",
|
|
1724
|
+
{
|
|
1725
|
+
src: badge.imageUrl,
|
|
1726
|
+
alt: badge.name,
|
|
1727
|
+
className: "h-10 md:h-12 w-auto object-contain grayscale hover:grayscale-0 transition-all"
|
|
1728
|
+
}
|
|
1729
|
+
) : /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2 text-gray-600", children: [
|
|
1730
|
+
badge.icon && /* @__PURE__ */ jsx11(BadgeIcon, { icon: badge.icon, className: "w-8 h-8" }),
|
|
1731
|
+
/* @__PURE__ */ jsx11("span", { className: "text-sm font-medium", children: badge.name })
|
|
1732
|
+
] })
|
|
1733
|
+
}
|
|
1734
|
+
);
|
|
1735
|
+
}
|
|
1736
|
+
function GridBadge({
|
|
1737
|
+
badge,
|
|
1738
|
+
showDescription
|
|
1739
|
+
}) {
|
|
1740
|
+
const Wrapper = badge.link ? "a" : "div";
|
|
1741
|
+
const wrapperProps = badge.link ? { href: badge.link, target: "_blank", rel: "noopener noreferrer" } : {};
|
|
1742
|
+
return /* @__PURE__ */ jsxs11(
|
|
1743
|
+
Wrapper,
|
|
1744
|
+
{
|
|
1745
|
+
...wrapperProps,
|
|
1746
|
+
className: "flex flex-col items-center text-center group",
|
|
1747
|
+
children: [
|
|
1748
|
+
/* @__PURE__ */ jsx11("div", { className: "w-20 h-20 mb-3 flex items-center justify-center", children: badge.imageUrl ? /* @__PURE__ */ jsx11(
|
|
1749
|
+
"img",
|
|
1750
|
+
{
|
|
1751
|
+
src: badge.imageUrl,
|
|
1752
|
+
alt: badge.name,
|
|
1753
|
+
className: "max-w-full max-h-full object-contain group-hover:scale-110 transition-transform"
|
|
1754
|
+
}
|
|
1755
|
+
) : /* @__PURE__ */ jsx11(
|
|
1756
|
+
BadgeIcon,
|
|
1757
|
+
{
|
|
1758
|
+
icon: badge.icon || "certificate",
|
|
1759
|
+
className: "w-16 h-16 text-primary-600 group-hover:scale-110 transition-transform"
|
|
1760
|
+
}
|
|
1761
|
+
) }),
|
|
1762
|
+
/* @__PURE__ */ jsx11("h3", { className: "font-semibold text-gray-900 text-sm", children: badge.name }),
|
|
1763
|
+
badge.year && /* @__PURE__ */ jsxs11("span", { className: "text-xs text-gray-500", children: [
|
|
1764
|
+
"Since ",
|
|
1765
|
+
badge.year
|
|
1766
|
+
] }),
|
|
1767
|
+
showDescription && badge.description && /* @__PURE__ */ jsx11("p", { className: "text-sm text-gray-600 mt-2", children: badge.description })
|
|
1768
|
+
]
|
|
1769
|
+
}
|
|
1770
|
+
);
|
|
1771
|
+
}
|
|
1772
|
+
function CardBadge({
|
|
1773
|
+
badge,
|
|
1774
|
+
showDescription
|
|
1775
|
+
}) {
|
|
1776
|
+
const Wrapper = badge.link ? "a" : "div";
|
|
1777
|
+
const wrapperProps = badge.link ? { href: badge.link, target: "_blank", rel: "noopener noreferrer" } : {};
|
|
1778
|
+
return /* @__PURE__ */ jsxs11(
|
|
1779
|
+
Wrapper,
|
|
1780
|
+
{
|
|
1781
|
+
...wrapperProps,
|
|
1782
|
+
className: "bg-white rounded-lg shadow p-6 flex flex-col items-center text-center hover:shadow-md transition-shadow",
|
|
1783
|
+
children: [
|
|
1784
|
+
/* @__PURE__ */ jsx11("div", { className: "w-16 h-16 mb-4 flex items-center justify-center", children: badge.imageUrl ? /* @__PURE__ */ jsx11(
|
|
1785
|
+
"img",
|
|
1786
|
+
{
|
|
1787
|
+
src: badge.imageUrl,
|
|
1788
|
+
alt: badge.name,
|
|
1789
|
+
className: "max-w-full max-h-full object-contain"
|
|
1790
|
+
}
|
|
1791
|
+
) : /* @__PURE__ */ jsx11(BadgeIcon, { icon: badge.icon || "certificate", className: "w-12 h-12 text-primary-600" }) }),
|
|
1792
|
+
/* @__PURE__ */ jsx11("h3", { className: "font-semibold text-gray-900", children: badge.name }),
|
|
1793
|
+
badge.year && /* @__PURE__ */ jsxs11("span", { className: "text-xs text-gray-500 mt-1", children: [
|
|
1794
|
+
"Since ",
|
|
1795
|
+
badge.year
|
|
1796
|
+
] }),
|
|
1797
|
+
showDescription && badge.description && /* @__PURE__ */ jsx11("p", { className: "text-sm text-gray-600 mt-2", children: badge.description })
|
|
1798
|
+
]
|
|
1799
|
+
}
|
|
1800
|
+
);
|
|
1801
|
+
}
|
|
1802
|
+
function BadgeIcon({ icon, className = "" }) {
|
|
1803
|
+
const icons = {
|
|
1804
|
+
certificate: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" }) }),
|
|
1805
|
+
shield: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" }) }),
|
|
1806
|
+
star: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z" }) }),
|
|
1807
|
+
award: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" }) }),
|
|
1808
|
+
check: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" }) }),
|
|
1809
|
+
verified: /* @__PURE__ */ jsx11("svg", { className, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx11("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" }) })
|
|
1810
|
+
};
|
|
1811
|
+
return icons[icon] || icons.certificate;
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
// src/components/sections/BeforeAfter.tsx
|
|
1815
|
+
import { useState as useState5, useRef, useCallback } from "react";
|
|
1816
|
+
import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1817
|
+
function BeforeAfter({
|
|
1818
|
+
items,
|
|
1819
|
+
title = "Our Work",
|
|
1820
|
+
subtitle = "See the transformation",
|
|
1821
|
+
columns = 2,
|
|
1822
|
+
variant = "slider",
|
|
1823
|
+
showCategories = true,
|
|
1824
|
+
className = "",
|
|
1825
|
+
id = "portfolio"
|
|
1826
|
+
}) {
|
|
1827
|
+
const categories = showCategories ? [...new Set(items.filter((item) => item.category).map((item) => item.category))] : [];
|
|
1828
|
+
const [activeCategory, setActiveCategory] = useState5(null);
|
|
1829
|
+
const displayedItems = activeCategory ? items.filter((item) => item.category === activeCategory) : items;
|
|
1830
|
+
const sortedItems = [...displayedItems].sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0));
|
|
1831
|
+
const gridCols = {
|
|
1832
|
+
1: "max-w-2xl mx-auto",
|
|
1833
|
+
2: "md:grid-cols-2",
|
|
1834
|
+
3: "md:grid-cols-2 lg:grid-cols-3"
|
|
1835
|
+
};
|
|
1836
|
+
return /* @__PURE__ */ jsx12("section", { id, className: `py-16 scroll-mt-20 ${className}`, children: /* @__PURE__ */ jsxs12("div", { className: "container mx-auto px-4", children: [
|
|
1837
|
+
/* @__PURE__ */ jsxs12("div", { className: "text-center mb-12", children: [
|
|
1838
|
+
/* @__PURE__ */ jsx12("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
|
|
1839
|
+
subtitle && /* @__PURE__ */ jsx12("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
|
|
1840
|
+
] }),
|
|
1841
|
+
showCategories && categories.length > 1 && /* @__PURE__ */ jsxs12("div", { className: "flex flex-wrap justify-center gap-2 mb-8", children: [
|
|
1842
|
+
/* @__PURE__ */ jsx12(
|
|
1843
|
+
"button",
|
|
1844
|
+
{
|
|
1845
|
+
onClick: () => setActiveCategory(null),
|
|
1846
|
+
className: `px-4 py-2 rounded-full text-sm font-medium transition-colors ${activeCategory === null ? "bg-primary-600 text-white" : "bg-gray-100 text-gray-700 hover:bg-gray-200"}`,
|
|
1847
|
+
children: "All"
|
|
1848
|
+
}
|
|
1849
|
+
),
|
|
1850
|
+
categories.map((category) => /* @__PURE__ */ jsx12(
|
|
1851
|
+
"button",
|
|
1852
|
+
{
|
|
1853
|
+
onClick: () => setActiveCategory(category),
|
|
1854
|
+
className: `px-4 py-2 rounded-full text-sm font-medium transition-colors ${activeCategory === category ? "bg-primary-600 text-white" : "bg-gray-100 text-gray-700 hover:bg-gray-200"}`,
|
|
1855
|
+
children: category
|
|
1856
|
+
},
|
|
1857
|
+
category
|
|
1858
|
+
))
|
|
1859
|
+
] }),
|
|
1860
|
+
/* @__PURE__ */ jsx12("div", { className: `grid gap-8 ${gridCols[columns]}`, children: sortedItems.map((item) => /* @__PURE__ */ jsx12(
|
|
1861
|
+
BeforeAfterCard,
|
|
1862
|
+
{
|
|
1863
|
+
item,
|
|
1864
|
+
variant
|
|
1865
|
+
},
|
|
1866
|
+
item.id || `${item.beforeImageUrl}-${item.afterImageUrl}`
|
|
1867
|
+
)) })
|
|
1868
|
+
] }) });
|
|
1869
|
+
}
|
|
1870
|
+
function BeforeAfterCard({
|
|
1871
|
+
item,
|
|
1872
|
+
variant
|
|
1873
|
+
}) {
|
|
1874
|
+
if (variant === "side-by-side") {
|
|
1875
|
+
return /* @__PURE__ */ jsx12(SideBySideCard, { item });
|
|
1876
|
+
}
|
|
1877
|
+
if (variant === "stacked") {
|
|
1878
|
+
return /* @__PURE__ */ jsx12(StackedCard, { item });
|
|
1879
|
+
}
|
|
1880
|
+
return /* @__PURE__ */ jsx12(SliderCard, { item });
|
|
1881
|
+
}
|
|
1882
|
+
function SliderCard({ item }) {
|
|
1883
|
+
const [sliderPosition, setSliderPosition] = useState5(50);
|
|
1884
|
+
const containerRef = useRef(null);
|
|
1885
|
+
const isDragging = useRef(false);
|
|
1886
|
+
const handleMove = useCallback((clientX) => {
|
|
1887
|
+
if (!containerRef.current) return;
|
|
1888
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
1889
|
+
const x = clientX - rect.left;
|
|
1890
|
+
const percentage = Math.max(0, Math.min(100, x / rect.width * 100));
|
|
1891
|
+
setSliderPosition(percentage);
|
|
1892
|
+
}, []);
|
|
1893
|
+
const handleMouseDown = () => {
|
|
1894
|
+
isDragging.current = true;
|
|
1895
|
+
};
|
|
1896
|
+
const handleMouseUp = () => {
|
|
1897
|
+
isDragging.current = false;
|
|
1898
|
+
};
|
|
1899
|
+
const handleMouseMove = (e) => {
|
|
1900
|
+
if (isDragging.current) {
|
|
1901
|
+
handleMove(e.clientX);
|
|
1902
|
+
}
|
|
1903
|
+
};
|
|
1904
|
+
const handleTouchMove = (e) => {
|
|
1905
|
+
handleMove(e.touches[0].clientX);
|
|
1906
|
+
};
|
|
1907
|
+
return /* @__PURE__ */ jsxs12("div", { className: "bg-white rounded-lg shadow-md overflow-hidden", children: [
|
|
1908
|
+
/* @__PURE__ */ jsxs12(
|
|
1909
|
+
"div",
|
|
1910
|
+
{
|
|
1911
|
+
ref: containerRef,
|
|
1912
|
+
className: "relative aspect-[4/3] cursor-ew-resize select-none overflow-hidden",
|
|
1913
|
+
onMouseDown: handleMouseDown,
|
|
1914
|
+
onMouseUp: handleMouseUp,
|
|
1915
|
+
onMouseLeave: handleMouseUp,
|
|
1916
|
+
onMouseMove: handleMouseMove,
|
|
1917
|
+
onTouchMove: handleTouchMove,
|
|
1918
|
+
children: [
|
|
1919
|
+
/* @__PURE__ */ jsx12(
|
|
1920
|
+
"img",
|
|
1921
|
+
{
|
|
1922
|
+
src: item.afterImageUrl,
|
|
1923
|
+
alt: item.afterAlt || "After",
|
|
1924
|
+
className: "absolute inset-0 w-full h-full object-cover"
|
|
1925
|
+
}
|
|
1926
|
+
),
|
|
1927
|
+
/* @__PURE__ */ jsx12(
|
|
1928
|
+
"div",
|
|
1929
|
+
{
|
|
1930
|
+
className: "absolute inset-0 overflow-hidden",
|
|
1931
|
+
style: { width: `${sliderPosition}%` },
|
|
1932
|
+
children: /* @__PURE__ */ jsx12(
|
|
1933
|
+
"img",
|
|
1934
|
+
{
|
|
1935
|
+
src: item.beforeImageUrl,
|
|
1936
|
+
alt: item.beforeAlt || "Before",
|
|
1937
|
+
className: "absolute inset-0 w-full h-full object-cover",
|
|
1938
|
+
style: { width: containerRef.current?.offsetWidth || "100%" }
|
|
1939
|
+
}
|
|
1940
|
+
)
|
|
1941
|
+
}
|
|
1942
|
+
),
|
|
1943
|
+
/* @__PURE__ */ jsx12(
|
|
1944
|
+
"div",
|
|
1945
|
+
{
|
|
1946
|
+
className: "absolute top-0 bottom-0 w-1 bg-white shadow-lg cursor-ew-resize",
|
|
1947
|
+
style: { left: `${sliderPosition}%`, transform: "translateX(-50%)" },
|
|
1948
|
+
children: /* @__PURE__ */ jsx12("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-10 h-10 bg-white rounded-full shadow-lg flex items-center justify-center", children: /* @__PURE__ */ jsx12("svg", { className: "w-6 h-6 text-gray-600", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx12("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 9l4-4 4 4m0 6l-4 4-4-4" }) }) })
|
|
1949
|
+
}
|
|
1950
|
+
),
|
|
1951
|
+
/* @__PURE__ */ jsx12("div", { className: "absolute bottom-4 left-4 px-2 py-1 bg-black/60 text-white text-xs rounded", children: "Before" }),
|
|
1952
|
+
/* @__PURE__ */ jsx12("div", { className: "absolute bottom-4 right-4 px-2 py-1 bg-black/60 text-white text-xs rounded", children: "After" })
|
|
1953
|
+
]
|
|
1954
|
+
}
|
|
1955
|
+
),
|
|
1956
|
+
(item.title || item.description) && /* @__PURE__ */ jsxs12("div", { className: "p-4", children: [
|
|
1957
|
+
item.title && /* @__PURE__ */ jsx12("h3", { className: "text-lg font-semibold text-gray-900 mb-1", children: item.title }),
|
|
1958
|
+
item.description && /* @__PURE__ */ jsx12("p", { className: "text-gray-600 text-sm", children: item.description })
|
|
1959
|
+
] })
|
|
1960
|
+
] });
|
|
1961
|
+
}
|
|
1962
|
+
function SideBySideCard({ item }) {
|
|
1963
|
+
return /* @__PURE__ */ jsxs12("div", { className: "bg-white rounded-lg shadow-md overflow-hidden", children: [
|
|
1964
|
+
/* @__PURE__ */ jsxs12("div", { className: "grid grid-cols-2", children: [
|
|
1965
|
+
/* @__PURE__ */ jsxs12("div", { className: "relative aspect-square", children: [
|
|
1966
|
+
/* @__PURE__ */ jsx12(
|
|
1967
|
+
"img",
|
|
1968
|
+
{
|
|
1969
|
+
src: item.beforeImageUrl,
|
|
1970
|
+
alt: item.beforeAlt || "Before",
|
|
1971
|
+
className: "w-full h-full object-cover"
|
|
1972
|
+
}
|
|
1973
|
+
),
|
|
1974
|
+
/* @__PURE__ */ jsx12("span", { className: "absolute bottom-2 left-2 px-2 py-1 bg-black/60 text-white text-xs rounded", children: "Before" })
|
|
1975
|
+
] }),
|
|
1976
|
+
/* @__PURE__ */ jsxs12("div", { className: "relative aspect-square", children: [
|
|
1977
|
+
/* @__PURE__ */ jsx12(
|
|
1978
|
+
"img",
|
|
1979
|
+
{
|
|
1980
|
+
src: item.afterImageUrl,
|
|
1981
|
+
alt: item.afterAlt || "After",
|
|
1982
|
+
className: "w-full h-full object-cover"
|
|
1983
|
+
}
|
|
1984
|
+
),
|
|
1985
|
+
/* @__PURE__ */ jsx12("span", { className: "absolute bottom-2 right-2 px-2 py-1 bg-black/60 text-white text-xs rounded", children: "After" })
|
|
1986
|
+
] })
|
|
1987
|
+
] }),
|
|
1988
|
+
(item.title || item.description) && /* @__PURE__ */ jsxs12("div", { className: "p-4", children: [
|
|
1989
|
+
item.title && /* @__PURE__ */ jsx12("h3", { className: "text-lg font-semibold text-gray-900 mb-1", children: item.title }),
|
|
1990
|
+
item.description && /* @__PURE__ */ jsx12("p", { className: "text-gray-600 text-sm", children: item.description })
|
|
1991
|
+
] })
|
|
1992
|
+
] });
|
|
1993
|
+
}
|
|
1994
|
+
function StackedCard({ item }) {
|
|
1995
|
+
const [showAfter, setShowAfter] = useState5(false);
|
|
1996
|
+
return /* @__PURE__ */ jsxs12("div", { className: "bg-white rounded-lg shadow-md overflow-hidden", children: [
|
|
1997
|
+
/* @__PURE__ */ jsxs12(
|
|
1998
|
+
"div",
|
|
1999
|
+
{
|
|
2000
|
+
className: "relative aspect-[4/3] cursor-pointer",
|
|
2001
|
+
onMouseEnter: () => setShowAfter(true),
|
|
2002
|
+
onMouseLeave: () => setShowAfter(false),
|
|
2003
|
+
onClick: () => setShowAfter(!showAfter),
|
|
2004
|
+
children: [
|
|
2005
|
+
/* @__PURE__ */ jsx12(
|
|
2006
|
+
"img",
|
|
2007
|
+
{
|
|
2008
|
+
src: item.beforeImageUrl,
|
|
2009
|
+
alt: item.beforeAlt || "Before",
|
|
2010
|
+
className: `absolute inset-0 w-full h-full object-cover transition-opacity duration-300 ${showAfter ? "opacity-0" : "opacity-100"}`
|
|
2011
|
+
}
|
|
2012
|
+
),
|
|
2013
|
+
/* @__PURE__ */ jsx12(
|
|
2014
|
+
"img",
|
|
2015
|
+
{
|
|
2016
|
+
src: item.afterImageUrl,
|
|
2017
|
+
alt: item.afterAlt || "After",
|
|
2018
|
+
className: `absolute inset-0 w-full h-full object-cover transition-opacity duration-300 ${showAfter ? "opacity-100" : "opacity-0"}`
|
|
2019
|
+
}
|
|
2020
|
+
),
|
|
2021
|
+
/* @__PURE__ */ jsxs12("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 px-3 py-1 bg-black/60 text-white text-sm rounded", children: [
|
|
2022
|
+
showAfter ? "After" : "Before",
|
|
2023
|
+
" (hover to toggle)"
|
|
2024
|
+
] })
|
|
2025
|
+
]
|
|
2026
|
+
}
|
|
2027
|
+
),
|
|
2028
|
+
(item.title || item.description) && /* @__PURE__ */ jsxs12("div", { className: "p-4", children: [
|
|
2029
|
+
item.title && /* @__PURE__ */ jsx12("h3", { className: "text-lg font-semibold text-gray-900 mb-1", children: item.title }),
|
|
2030
|
+
item.description && /* @__PURE__ */ jsx12("p", { className: "text-gray-600 text-sm", children: item.description })
|
|
2031
|
+
] })
|
|
2032
|
+
] });
|
|
2033
|
+
}
|
|
1393
2034
|
|
|
1394
2035
|
// src/components/ui/Button.tsx
|
|
1395
|
-
import { Fragment as Fragment2, jsx as
|
|
2036
|
+
import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1396
2037
|
function getButtonClasses(props) {
|
|
1397
2038
|
const { variant = "primary", size = "md", fullWidth, disabled } = props;
|
|
1398
2039
|
const baseClasses = [
|
|
@@ -1434,16 +2075,16 @@ function Button({
|
|
|
1434
2075
|
...props
|
|
1435
2076
|
}) {
|
|
1436
2077
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
|
|
1437
|
-
return /* @__PURE__ */
|
|
2078
|
+
return /* @__PURE__ */ jsx13(
|
|
1438
2079
|
"button",
|
|
1439
2080
|
{
|
|
1440
2081
|
className: `${classes} ${className}`,
|
|
1441
2082
|
disabled: disabled || loading,
|
|
1442
2083
|
...props,
|
|
1443
|
-
children: loading ? /* @__PURE__ */
|
|
1444
|
-
leftIcon && /* @__PURE__ */
|
|
2084
|
+
children: loading ? /* @__PURE__ */ jsx13(LoadingSpinner, { size }) : /* @__PURE__ */ jsxs13(Fragment2, { children: [
|
|
2085
|
+
leftIcon && /* @__PURE__ */ jsx13("span", { className: "mr-2", children: leftIcon }),
|
|
1445
2086
|
children,
|
|
1446
|
-
rightIcon && /* @__PURE__ */
|
|
2087
|
+
rightIcon && /* @__PURE__ */ jsx13("span", { className: "ml-2", children: rightIcon })
|
|
1447
2088
|
] })
|
|
1448
2089
|
}
|
|
1449
2090
|
);
|
|
@@ -1454,7 +2095,7 @@ function LoadingSpinner({ size }) {
|
|
|
1454
2095
|
md: "w-5 h-5",
|
|
1455
2096
|
lg: "w-6 h-6"
|
|
1456
2097
|
};
|
|
1457
|
-
return /* @__PURE__ */
|
|
2098
|
+
return /* @__PURE__ */ jsxs13(
|
|
1458
2099
|
"svg",
|
|
1459
2100
|
{
|
|
1460
2101
|
className: `animate-spin ${sizeClasses[size || "md"]}`,
|
|
@@ -1462,7 +2103,7 @@ function LoadingSpinner({ size }) {
|
|
|
1462
2103
|
fill: "none",
|
|
1463
2104
|
viewBox: "0 0 24 24",
|
|
1464
2105
|
children: [
|
|
1465
|
-
/* @__PURE__ */
|
|
2106
|
+
/* @__PURE__ */ jsx13(
|
|
1466
2107
|
"circle",
|
|
1467
2108
|
{
|
|
1468
2109
|
className: "opacity-25",
|
|
@@ -1473,7 +2114,7 @@ function LoadingSpinner({ size }) {
|
|
|
1473
2114
|
strokeWidth: "4"
|
|
1474
2115
|
}
|
|
1475
2116
|
),
|
|
1476
|
-
/* @__PURE__ */
|
|
2117
|
+
/* @__PURE__ */ jsx13(
|
|
1477
2118
|
"path",
|
|
1478
2119
|
{
|
|
1479
2120
|
className: "opacity-75",
|
|
@@ -1496,15 +2137,15 @@ function ButtonLink({
|
|
|
1496
2137
|
...props
|
|
1497
2138
|
}) {
|
|
1498
2139
|
const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
|
|
1499
|
-
return /* @__PURE__ */
|
|
1500
|
-
leftIcon && /* @__PURE__ */
|
|
2140
|
+
return /* @__PURE__ */ jsxs13("a", { className: `${classes} ${className}`, ...props, children: [
|
|
2141
|
+
leftIcon && /* @__PURE__ */ jsx13("span", { className: "mr-2", children: leftIcon }),
|
|
1501
2142
|
children,
|
|
1502
|
-
rightIcon && /* @__PURE__ */
|
|
2143
|
+
rightIcon && /* @__PURE__ */ jsx13("span", { className: "ml-2", children: rightIcon })
|
|
1503
2144
|
] });
|
|
1504
2145
|
}
|
|
1505
2146
|
|
|
1506
2147
|
// src/components/ui/Card.tsx
|
|
1507
|
-
import { jsx as
|
|
2148
|
+
import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1508
2149
|
function getCardClasses(props) {
|
|
1509
2150
|
const { variant = "default", padding = "md", hover = false } = props;
|
|
1510
2151
|
const baseClasses = ["rounded-lg", "overflow-hidden"];
|
|
@@ -1537,7 +2178,7 @@ function Card({
|
|
|
1537
2178
|
...props
|
|
1538
2179
|
}) {
|
|
1539
2180
|
const classes = getCardClasses({ variant, padding, hover });
|
|
1540
|
-
return /* @__PURE__ */
|
|
2181
|
+
return /* @__PURE__ */ jsx14("div", { className: `${classes} ${className}`, ...props, children });
|
|
1541
2182
|
}
|
|
1542
2183
|
function CardHeader({
|
|
1543
2184
|
title,
|
|
@@ -1547,13 +2188,13 @@ function CardHeader({
|
|
|
1547
2188
|
className = "",
|
|
1548
2189
|
...props
|
|
1549
2190
|
}) {
|
|
1550
|
-
return /* @__PURE__ */
|
|
1551
|
-
/* @__PURE__ */
|
|
1552
|
-
title && /* @__PURE__ */
|
|
1553
|
-
subtitle && /* @__PURE__ */
|
|
2191
|
+
return /* @__PURE__ */ jsxs14("div", { className: `flex items-start justify-between ${className}`, ...props, children: [
|
|
2192
|
+
/* @__PURE__ */ jsxs14("div", { children: [
|
|
2193
|
+
title && /* @__PURE__ */ jsx14("h3", { className: "text-lg font-semibold text-gray-900", children: title }),
|
|
2194
|
+
subtitle && /* @__PURE__ */ jsx14("p", { className: "mt-1 text-sm text-gray-500", children: subtitle }),
|
|
1554
2195
|
children
|
|
1555
2196
|
] }),
|
|
1556
|
-
action && /* @__PURE__ */
|
|
2197
|
+
action && /* @__PURE__ */ jsx14("div", { className: "flex-shrink-0 ml-4", children: action })
|
|
1557
2198
|
] });
|
|
1558
2199
|
}
|
|
1559
2200
|
function CardBody({
|
|
@@ -1561,14 +2202,14 @@ function CardBody({
|
|
|
1561
2202
|
className = "",
|
|
1562
2203
|
...props
|
|
1563
2204
|
}) {
|
|
1564
|
-
return /* @__PURE__ */
|
|
2205
|
+
return /* @__PURE__ */ jsx14("div", { className: `mt-4 ${className}`, ...props, children });
|
|
1565
2206
|
}
|
|
1566
2207
|
function CardFooter({
|
|
1567
2208
|
children,
|
|
1568
2209
|
className = "",
|
|
1569
2210
|
...props
|
|
1570
2211
|
}) {
|
|
1571
|
-
return /* @__PURE__ */
|
|
2212
|
+
return /* @__PURE__ */ jsx14("div", { className: `mt-4 pt-4 border-t border-gray-100 ${className}`, ...props, children });
|
|
1572
2213
|
}
|
|
1573
2214
|
function CardImage({
|
|
1574
2215
|
aspectRatio = "video",
|
|
@@ -1582,7 +2223,7 @@ function CardImage({
|
|
|
1582
2223
|
wide: "aspect-[2/1]",
|
|
1583
2224
|
auto: ""
|
|
1584
2225
|
};
|
|
1585
|
-
return /* @__PURE__ */
|
|
2226
|
+
return /* @__PURE__ */ jsx14("div", { className: `-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`, children: /* @__PURE__ */ jsx14(
|
|
1586
2227
|
"img",
|
|
1587
2228
|
{
|
|
1588
2229
|
className: `w-full h-full object-cover ${className}`,
|
|
@@ -1591,7 +2232,95 @@ function CardImage({
|
|
|
1591
2232
|
}
|
|
1592
2233
|
) });
|
|
1593
2234
|
}
|
|
2235
|
+
|
|
2236
|
+
// src/components/ui/AnimatedSection.tsx
|
|
2237
|
+
import React6, { useEffect, useRef as useRef2, useState as useState6 } from "react";
|
|
2238
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
2239
|
+
function AnimatedSection({
|
|
2240
|
+
children,
|
|
2241
|
+
animation = "fade-up",
|
|
2242
|
+
delay = 0,
|
|
2243
|
+
duration = 600,
|
|
2244
|
+
threshold = 0.1,
|
|
2245
|
+
once = true,
|
|
2246
|
+
className = "",
|
|
2247
|
+
as: Component = "div"
|
|
2248
|
+
}) {
|
|
2249
|
+
const ref = useRef2(null);
|
|
2250
|
+
const [isVisible, setIsVisible] = useState6(false);
|
|
2251
|
+
useEffect(() => {
|
|
2252
|
+
const observer = new IntersectionObserver(
|
|
2253
|
+
([entry]) => {
|
|
2254
|
+
if (entry.isIntersecting) {
|
|
2255
|
+
setIsVisible(true);
|
|
2256
|
+
if (once && ref.current) {
|
|
2257
|
+
observer.unobserve(ref.current);
|
|
2258
|
+
}
|
|
2259
|
+
} else if (!once) {
|
|
2260
|
+
setIsVisible(false);
|
|
2261
|
+
}
|
|
2262
|
+
},
|
|
2263
|
+
{ threshold }
|
|
2264
|
+
);
|
|
2265
|
+
if (ref.current) {
|
|
2266
|
+
observer.observe(ref.current);
|
|
2267
|
+
}
|
|
2268
|
+
return () => {
|
|
2269
|
+
if (ref.current) {
|
|
2270
|
+
observer.unobserve(ref.current);
|
|
2271
|
+
}
|
|
2272
|
+
};
|
|
2273
|
+
}, [threshold, once]);
|
|
2274
|
+
const getAnimationStyles = () => {
|
|
2275
|
+
const baseStyles = {
|
|
2276
|
+
transition: `opacity ${duration}ms ease-out, transform ${duration}ms ease-out`,
|
|
2277
|
+
transitionDelay: `${delay}ms`
|
|
2278
|
+
};
|
|
2279
|
+
if (!isVisible) {
|
|
2280
|
+
switch (animation) {
|
|
2281
|
+
case "fade-up":
|
|
2282
|
+
return { ...baseStyles, opacity: 0, transform: "translateY(30px)" };
|
|
2283
|
+
case "fade-down":
|
|
2284
|
+
return { ...baseStyles, opacity: 0, transform: "translateY(-30px)" };
|
|
2285
|
+
case "fade-left":
|
|
2286
|
+
return { ...baseStyles, opacity: 0, transform: "translateX(30px)" };
|
|
2287
|
+
case "fade-right":
|
|
2288
|
+
return { ...baseStyles, opacity: 0, transform: "translateX(-30px)" };
|
|
2289
|
+
case "zoom":
|
|
2290
|
+
return { ...baseStyles, opacity: 0, transform: "scale(0.95)" };
|
|
2291
|
+
case "none":
|
|
2292
|
+
return {};
|
|
2293
|
+
default:
|
|
2294
|
+
return { ...baseStyles, opacity: 0, transform: "translateY(30px)" };
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
return { ...baseStyles, opacity: 1, transform: "translateY(0) translateX(0) scale(1)" };
|
|
2298
|
+
};
|
|
2299
|
+
if (animation === "none") {
|
|
2300
|
+
return /* @__PURE__ */ jsx15(Component, { className, children });
|
|
2301
|
+
}
|
|
2302
|
+
return /* @__PURE__ */ jsx15(Component, { ref, style: getAnimationStyles(), className, children });
|
|
2303
|
+
}
|
|
2304
|
+
function StaggerContainer({
|
|
2305
|
+
children,
|
|
2306
|
+
staggerDelay = 100,
|
|
2307
|
+
animation = "fade-up",
|
|
2308
|
+
duration = 600,
|
|
2309
|
+
className = ""
|
|
2310
|
+
}) {
|
|
2311
|
+
return /* @__PURE__ */ jsx15("div", { className, children: React6.Children.map(children, (child, index) => /* @__PURE__ */ jsx15(
|
|
2312
|
+
AnimatedSection,
|
|
2313
|
+
{
|
|
2314
|
+
animation,
|
|
2315
|
+
delay: index * staggerDelay,
|
|
2316
|
+
duration,
|
|
2317
|
+
children: child
|
|
2318
|
+
}
|
|
2319
|
+
)) });
|
|
2320
|
+
}
|
|
1594
2321
|
export {
|
|
2322
|
+
AnimatedSection,
|
|
2323
|
+
BeforeAfter,
|
|
1595
2324
|
BriefcaseIcon,
|
|
1596
2325
|
Button,
|
|
1597
2326
|
ButtonLink,
|
|
@@ -1617,13 +2346,16 @@ export {
|
|
|
1617
2346
|
InstagramIcon,
|
|
1618
2347
|
MailIcon,
|
|
1619
2348
|
MapPinIcon,
|
|
2349
|
+
Menu,
|
|
1620
2350
|
MenuIcon,
|
|
1621
2351
|
PhoneIcon,
|
|
1622
2352
|
ScissorsIcon,
|
|
1623
2353
|
Services,
|
|
1624
2354
|
SparklesIcon,
|
|
2355
|
+
StaggerContainer,
|
|
1625
2356
|
StarIcon,
|
|
1626
2357
|
Testimonials,
|
|
2358
|
+
TrustBadges,
|
|
1627
2359
|
UtensilsIcon,
|
|
1628
2360
|
WrenchIcon,
|
|
1629
2361
|
XIcon,
|