nvis-fe-cms-libs 2.1.5 → 2.1.7
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.
|
@@ -844,7 +844,7 @@ const PartnerCard = ({ partner, idx, t, getLogoUrl, isDarkMode }) => {
|
|
|
844
844
|
}
|
|
845
845
|
);
|
|
846
846
|
};
|
|
847
|
-
function useWindowSize$
|
|
847
|
+
function useWindowSize$3() {
|
|
848
848
|
const [width, setWidth] = useState(
|
|
849
849
|
typeof window !== "undefined" ? window.innerWidth : 1200
|
|
850
850
|
);
|
|
@@ -856,13 +856,13 @@ function useWindowSize$1() {
|
|
|
856
856
|
}, []);
|
|
857
857
|
return width;
|
|
858
858
|
}
|
|
859
|
-
const PartnersSection = ({ data, t, imageBaseUrl = "", section }) => {
|
|
859
|
+
const PartnersSection$1 = ({ data, t, imageBaseUrl = "", section }) => {
|
|
860
860
|
var _a, _b, _c;
|
|
861
861
|
const partnersData = ((_c = (_b = (_a = data == null ? void 0 : data.sectionDataBindingItems) == null ? void 0 : _a.filter((item) => item == null ? void 0 : item.data)) == null ? void 0 : _b.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0))) == null ? void 0 : _c.map((item) => item.data)) || [];
|
|
862
862
|
const [currentPartnerSlide, setCurrentPartnerSlide] = useState(0);
|
|
863
863
|
const [partnersVisible, setPartnersVisible] = useState(false);
|
|
864
864
|
const partnersRef = useRef(null);
|
|
865
|
-
const windowWidth = useWindowSize$
|
|
865
|
+
const windowWidth = useWindowSize$3();
|
|
866
866
|
const sectionTitle = (section == null ? void 0 : section.title) || t("partners.sectionTitle") || "Đối tác";
|
|
867
867
|
const getLogoUrl = (logoUrl) => {
|
|
868
868
|
if (!logoUrl) return null;
|
|
@@ -948,6 +948,189 @@ const PartnersSection = ({ data, t, imageBaseUrl = "", section }) => {
|
|
|
948
948
|
) })
|
|
949
949
|
] }) });
|
|
950
950
|
};
|
|
951
|
+
const PartnerCard_2 = ({ partner, idx, t, getLogoUrl, isDarkMode }) => {
|
|
952
|
+
const itemRef = useRef(null);
|
|
953
|
+
const [visible, setVisible] = useState(false);
|
|
954
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
955
|
+
useEffect(() => {
|
|
956
|
+
const observer = new IntersectionObserver(
|
|
957
|
+
(entries) => {
|
|
958
|
+
entries.forEach((entry) => {
|
|
959
|
+
if (entry.isIntersecting) {
|
|
960
|
+
setVisible(true);
|
|
961
|
+
observer.unobserve(entry.target);
|
|
962
|
+
}
|
|
963
|
+
});
|
|
964
|
+
},
|
|
965
|
+
{ threshold: 0.2 }
|
|
966
|
+
);
|
|
967
|
+
if (itemRef.current) observer.observe(itemRef.current);
|
|
968
|
+
return () => itemRef.current && observer.unobserve(itemRef.current);
|
|
969
|
+
}, []);
|
|
970
|
+
const logoSrc = getLogoUrl(partner.logoUrl);
|
|
971
|
+
const cardContent = /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: {
|
|
972
|
+
display: "flex",
|
|
973
|
+
flexDirection: "column",
|
|
974
|
+
alignItems: "center",
|
|
975
|
+
justifyContent: "center",
|
|
976
|
+
flex: 1
|
|
977
|
+
}, children: logoSrc ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: {
|
|
978
|
+
width: "100%",
|
|
979
|
+
height: "100px",
|
|
980
|
+
display: "flex",
|
|
981
|
+
alignItems: "center",
|
|
982
|
+
justifyContent: "center"
|
|
983
|
+
}, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
984
|
+
"img",
|
|
985
|
+
{
|
|
986
|
+
src: logoSrc,
|
|
987
|
+
alt: partner.name || t("partners.logoAlt") || "Partner logo",
|
|
988
|
+
style: {
|
|
989
|
+
maxWidth: "100%",
|
|
990
|
+
maxHeight: "100%",
|
|
991
|
+
objectFit: "contain",
|
|
992
|
+
transform: isHovered ? "scale(1.05)" : "scale(1)",
|
|
993
|
+
transition: "transform 300ms cubic-bezier(0.4, 0, 0.2, 1)"
|
|
994
|
+
},
|
|
995
|
+
loading: "lazy"
|
|
996
|
+
}
|
|
997
|
+
) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-surface", style: {
|
|
998
|
+
width: "5rem",
|
|
999
|
+
height: "5rem",
|
|
1000
|
+
borderRadius: "9999px",
|
|
1001
|
+
display: "flex",
|
|
1002
|
+
alignItems: "center",
|
|
1003
|
+
justifyContent: "center"
|
|
1004
|
+
}, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: "1.875rem" }, children: "🤝" }) }) });
|
|
1005
|
+
const baseClasses = `card transition-all duration-700 ease-out ${visible ? "opacity-100 scale-100" : "opacity-0 scale-75"}`;
|
|
1006
|
+
const dynamicStyles = {
|
|
1007
|
+
transitionDelay: `${idx * 150}ms`,
|
|
1008
|
+
textDecoration: "none",
|
|
1009
|
+
overflow: "hidden",
|
|
1010
|
+
minHeight: "280px",
|
|
1011
|
+
padding: "1.5rem",
|
|
1012
|
+
display: "flex",
|
|
1013
|
+
flexDirection: "column"
|
|
1014
|
+
};
|
|
1015
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1016
|
+
"a",
|
|
1017
|
+
{
|
|
1018
|
+
ref: itemRef,
|
|
1019
|
+
href: partner.websiteUrl || "#",
|
|
1020
|
+
target: partner.websiteUrl ? "_blank" : "_self",
|
|
1021
|
+
rel: partner.websiteUrl ? "noopener noreferrer" : "",
|
|
1022
|
+
className: baseClasses,
|
|
1023
|
+
style: dynamicStyles,
|
|
1024
|
+
onMouseEnter: () => setIsHovered(true),
|
|
1025
|
+
onMouseLeave: () => setIsHovered(false),
|
|
1026
|
+
children: cardContent
|
|
1027
|
+
}
|
|
1028
|
+
);
|
|
1029
|
+
};
|
|
1030
|
+
function useWindowSize$2() {
|
|
1031
|
+
const [width, setWidth] = useState(
|
|
1032
|
+
typeof window !== "undefined" ? window.innerWidth : 1200
|
|
1033
|
+
);
|
|
1034
|
+
useEffect(() => {
|
|
1035
|
+
if (typeof window === "undefined") return;
|
|
1036
|
+
const handleResize = () => setWidth(window.innerWidth);
|
|
1037
|
+
window.addEventListener("resize", handleResize);
|
|
1038
|
+
return () => window.removeEventListener("resize", handleResize);
|
|
1039
|
+
}, []);
|
|
1040
|
+
return width;
|
|
1041
|
+
}
|
|
1042
|
+
const PartnersSection = ({ data, t, imageBaseUrl = "", section }) => {
|
|
1043
|
+
var _a, _b, _c;
|
|
1044
|
+
const partnersData = ((_c = (_b = (_a = data == null ? void 0 : data.sectionDataBindingItems) == null ? void 0 : _a.filter((item) => item == null ? void 0 : item.data)) == null ? void 0 : _b.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0))) == null ? void 0 : _c.map((item) => item.data)) || [];
|
|
1045
|
+
const [currentPartnerSlide, setCurrentPartnerSlide] = useState(0);
|
|
1046
|
+
const [partnersVisible, setPartnersVisible] = useState(false);
|
|
1047
|
+
const partnersRef = useRef(null);
|
|
1048
|
+
const windowWidth = useWindowSize$2();
|
|
1049
|
+
const sectionTitle = (section == null ? void 0 : section.title) || t("partners.sectionTitle") || "Đối tác";
|
|
1050
|
+
const getLogoUrl = (logoUrl) => {
|
|
1051
|
+
if (!logoUrl) return null;
|
|
1052
|
+
if (logoUrl.startsWith("http")) return logoUrl;
|
|
1053
|
+
return `${imageBaseUrl}${logoUrl}`;
|
|
1054
|
+
};
|
|
1055
|
+
const partners = useMemo(() => {
|
|
1056
|
+
const getPerSlide = () => {
|
|
1057
|
+
if (windowWidth < 640) return 2;
|
|
1058
|
+
if (windowWidth < 1024) return 3;
|
|
1059
|
+
return 4;
|
|
1060
|
+
};
|
|
1061
|
+
const grouped = [];
|
|
1062
|
+
const perSlide = getPerSlide();
|
|
1063
|
+
for (let i = 0; i < partnersData.length; i += perSlide) {
|
|
1064
|
+
grouped.push(partnersData.slice(i, i + perSlide));
|
|
1065
|
+
}
|
|
1066
|
+
return grouped;
|
|
1067
|
+
}, [partnersData, windowWidth]);
|
|
1068
|
+
useEffect(() => {
|
|
1069
|
+
if (partners.length > 1) {
|
|
1070
|
+
const interval = setInterval(() => {
|
|
1071
|
+
setCurrentPartnerSlide((prev) => (prev + 1) % partners.length);
|
|
1072
|
+
}, 5e3);
|
|
1073
|
+
return () => clearInterval(interval);
|
|
1074
|
+
}
|
|
1075
|
+
}, [partners.length]);
|
|
1076
|
+
useEffect(() => {
|
|
1077
|
+
const observer = new IntersectionObserver(
|
|
1078
|
+
(entries) => {
|
|
1079
|
+
entries.forEach((entry) => {
|
|
1080
|
+
if (entry.isIntersecting) {
|
|
1081
|
+
setPartnersVisible(true);
|
|
1082
|
+
observer.unobserve(entry.target);
|
|
1083
|
+
}
|
|
1084
|
+
});
|
|
1085
|
+
},
|
|
1086
|
+
{ threshold: 0.1 }
|
|
1087
|
+
);
|
|
1088
|
+
if (partnersRef.current) observer.observe(partnersRef.current);
|
|
1089
|
+
return () => partnersRef.current && observer.unobserve(partnersRef.current);
|
|
1090
|
+
}, []);
|
|
1091
|
+
if (!partnersData.length) return null;
|
|
1092
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(SectionWrapper, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
|
|
1093
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center mb-12", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "inline-block px-4 py-2 rounded-full border border-[var(--border-color)] bg-surface text-subtitle font-semibold text-brand-primary shadow-sm", children: [
|
|
1094
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ThemeIcon, { name: "icon-partner", folder: "PartnersSection", className: "w-4 h-4 icon-gradient" }),
|
|
1095
|
+
" ",
|
|
1096
|
+
sectionTitle
|
|
1097
|
+
] }) }),
|
|
1098
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: partnersRef, className: "relative overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1099
|
+
"div",
|
|
1100
|
+
{
|
|
1101
|
+
className: `transition-all duration-1000 ease-out ${partnersVisible ? "opacity-100 scale-100" : "opacity-0 scale-95"}`,
|
|
1102
|
+
children: [
|
|
1103
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-56 md:h-64 lg:h-72 xl:h-80 mb-8", children: partners.map((group, slideIndex) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1104
|
+
"div",
|
|
1105
|
+
{
|
|
1106
|
+
className: `absolute inset-0 transition-all duration-1000 ease-in-out ${slideIndex === currentPartnerSlide ? "opacity-100 translate-x-0" : slideIndex < currentPartnerSlide ? "opacity-0 -translate-x-full" : "opacity-0 translate-x-full"}`,
|
|
1107
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-6 h-full px-2", children: group.map((partner, idx) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1108
|
+
PartnerCard_2,
|
|
1109
|
+
{
|
|
1110
|
+
partner,
|
|
1111
|
+
idx,
|
|
1112
|
+
t,
|
|
1113
|
+
getLogoUrl
|
|
1114
|
+
},
|
|
1115
|
+
partner.id || idx
|
|
1116
|
+
)) })
|
|
1117
|
+
},
|
|
1118
|
+
slideIndex
|
|
1119
|
+
)) }),
|
|
1120
|
+
partners.length > 1 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center space-x-2", children: partners.map((_, index2) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1121
|
+
"button",
|
|
1122
|
+
{
|
|
1123
|
+
onClick: () => setCurrentPartnerSlide(index2),
|
|
1124
|
+
className: `w-3 h-3 rounded-full transition-all duration-300 ${index2 === currentPartnerSlide ? "bg-brand-primary scale-125 shadow-lg" : "bg-surface hover:bg-brand-primary/70"}`,
|
|
1125
|
+
"aria-label": `Slide ${index2 + 1}`
|
|
1126
|
+
},
|
|
1127
|
+
index2
|
|
1128
|
+
)) })
|
|
1129
|
+
]
|
|
1130
|
+
}
|
|
1131
|
+
) })
|
|
1132
|
+
] }) });
|
|
1133
|
+
};
|
|
951
1134
|
const MilestoneSection = ({ data, t, isDarkMode, getMilestoneTimeline, section }) => {
|
|
952
1135
|
const [milestones, setMilestones] = useState([]);
|
|
953
1136
|
const [loading, setLoading] = useState(true);
|
|
@@ -1121,7 +1304,7 @@ const TestimonialsSection = ({ data, t, section }) => {
|
|
|
1121
1304
|
] })
|
|
1122
1305
|
] }) });
|
|
1123
1306
|
};
|
|
1124
|
-
const PartnerListCard = ({ partner, idx, t, isDarkMode, getLogoUrl }) => {
|
|
1307
|
+
const PartnerListCard$1 = ({ partner, idx, t, isDarkMode, getLogoUrl }) => {
|
|
1125
1308
|
const logoUrl = getLogoUrl(partner.logoUrl);
|
|
1126
1309
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1127
1310
|
"a",
|
|
@@ -1201,7 +1384,7 @@ const PartnerListCard = ({ partner, idx, t, isDarkMode, getLogoUrl }) => {
|
|
|
1201
1384
|
}
|
|
1202
1385
|
);
|
|
1203
1386
|
};
|
|
1204
|
-
function useWindowSize() {
|
|
1387
|
+
function useWindowSize$1() {
|
|
1205
1388
|
const [width, setWidth] = useState(
|
|
1206
1389
|
typeof window !== "undefined" ? window.innerWidth : 1200
|
|
1207
1390
|
);
|
|
@@ -1213,6 +1396,230 @@ function useWindowSize() {
|
|
|
1213
1396
|
return width;
|
|
1214
1397
|
}
|
|
1215
1398
|
const PartnerListSection = ({ t, getPartnerList, imageBaseUrl = "", section }) => {
|
|
1399
|
+
const [partnersData, setPartnersData] = useState([]);
|
|
1400
|
+
const [error, setError] = useState(null);
|
|
1401
|
+
const [loading, setLoading] = useState(true);
|
|
1402
|
+
const [currentPartnerSlide, setCurrentPartnerSlide] = useState(0);
|
|
1403
|
+
const [partnersVisible, setPartnersVisible] = useState(false);
|
|
1404
|
+
const partnersRef = useRef(null);
|
|
1405
|
+
const windowWidth = useWindowSize$1();
|
|
1406
|
+
const sectionTitle = (section == null ? void 0 : section.title) || t("partners.sectionTitle");
|
|
1407
|
+
const getLogoUrl = (logoUrl) => {
|
|
1408
|
+
if (!logoUrl) return null;
|
|
1409
|
+
if (logoUrl.startsWith("http")) return logoUrl;
|
|
1410
|
+
return `${imageBaseUrl}${logoUrl}`;
|
|
1411
|
+
};
|
|
1412
|
+
useEffect(() => {
|
|
1413
|
+
const fetchData = () => __async(null, null, function* () {
|
|
1414
|
+
try {
|
|
1415
|
+
const res = yield getPartnerList();
|
|
1416
|
+
if (res.success) {
|
|
1417
|
+
setPartnersData(res.data || []);
|
|
1418
|
+
} else {
|
|
1419
|
+
setError(res.error || "Error fetching partners");
|
|
1420
|
+
}
|
|
1421
|
+
} catch (err) {
|
|
1422
|
+
setError(err.message);
|
|
1423
|
+
} finally {
|
|
1424
|
+
setLoading(false);
|
|
1425
|
+
}
|
|
1426
|
+
});
|
|
1427
|
+
fetchData();
|
|
1428
|
+
}, []);
|
|
1429
|
+
const partners = useMemo(() => {
|
|
1430
|
+
const getPerSlide = () => {
|
|
1431
|
+
if (windowWidth < 640) return 2;
|
|
1432
|
+
if (windowWidth < 1024) return 3;
|
|
1433
|
+
return 4;
|
|
1434
|
+
};
|
|
1435
|
+
const grouped = [];
|
|
1436
|
+
const perSlide = getPerSlide();
|
|
1437
|
+
for (let i = 0; i < partnersData.length; i += perSlide) {
|
|
1438
|
+
grouped.push(partnersData.slice(i, i + perSlide));
|
|
1439
|
+
}
|
|
1440
|
+
return grouped;
|
|
1441
|
+
}, [partnersData, windowWidth]);
|
|
1442
|
+
useEffect(() => {
|
|
1443
|
+
if (partners.length > 1) {
|
|
1444
|
+
const interval = setInterval(() => {
|
|
1445
|
+
setCurrentPartnerSlide((prev) => (prev + 1) % partners.length);
|
|
1446
|
+
}, 5e3);
|
|
1447
|
+
return () => clearInterval(interval);
|
|
1448
|
+
}
|
|
1449
|
+
}, [partners.length]);
|
|
1450
|
+
useEffect(() => {
|
|
1451
|
+
const fallbackTimer = setTimeout(() => setPartnersVisible(true), 500);
|
|
1452
|
+
const observer = new IntersectionObserver(
|
|
1453
|
+
(entries) => {
|
|
1454
|
+
entries.forEach((entry) => {
|
|
1455
|
+
if (entry.isIntersecting) {
|
|
1456
|
+
clearTimeout(fallbackTimer);
|
|
1457
|
+
setPartnersVisible(true);
|
|
1458
|
+
observer.unobserve(entry.target);
|
|
1459
|
+
}
|
|
1460
|
+
});
|
|
1461
|
+
},
|
|
1462
|
+
{ threshold: 0.1, rootMargin: "50px" }
|
|
1463
|
+
);
|
|
1464
|
+
if (partnersRef.current) observer.observe(partnersRef.current);
|
|
1465
|
+
else {
|
|
1466
|
+
clearTimeout(fallbackTimer);
|
|
1467
|
+
setPartnersVisible(true);
|
|
1468
|
+
}
|
|
1469
|
+
return () => {
|
|
1470
|
+
clearTimeout(fallbackTimer);
|
|
1471
|
+
if (partnersRef.current) observer.unobserve(partnersRef.current);
|
|
1472
|
+
};
|
|
1473
|
+
}, []);
|
|
1474
|
+
if (loading) {
|
|
1475
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 text-center bg-body", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-body text-muted", children: t("partners.loading") || "Đang tải danh sách đối tác..." }) });
|
|
1476
|
+
}
|
|
1477
|
+
if (error) {
|
|
1478
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 text-center bg-body", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-body text-brand-secondary", children: t("partners.error") || error }) });
|
|
1479
|
+
}
|
|
1480
|
+
if (!partnersData.length) return null;
|
|
1481
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(SectionWrapper, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
|
|
1482
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center mb-12", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "inline-block px-4 py-2 rounded-full border border-[var(--border-color)] bg-surface text-subtitle font-semibold text-brand-primary shadow-sm", children: [
|
|
1483
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ThemeIcon, { name: "icon-partner", folder: "PartnersSection", className: "w-4 h-4 icon-gradient" }),
|
|
1484
|
+
" ",
|
|
1485
|
+
sectionTitle
|
|
1486
|
+
] }) }),
|
|
1487
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: partnersRef, className: "relative", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1488
|
+
"div",
|
|
1489
|
+
{
|
|
1490
|
+
className: `transition-all duration-1000 ease-out ${partnersVisible ? "opacity-100 scale-100" : "opacity-0 scale-95"}`,
|
|
1491
|
+
children: [
|
|
1492
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative overflow-hidden mb-12", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { minHeight: "320px" }, children: partners.map((group, slideIndex) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1493
|
+
"div",
|
|
1494
|
+
{
|
|
1495
|
+
className: `absolute inset-0 w-full transition-all duration-1000 ease-in-out ${slideIndex === currentPartnerSlide ? "opacity-100 translate-x-0" : slideIndex < currentPartnerSlide ? "opacity-0 -translate-x-full" : "opacity-0 translate-x-full"}`,
|
|
1496
|
+
style: {
|
|
1497
|
+
zIndex: slideIndex === currentPartnerSlide ? 10 : 1
|
|
1498
|
+
},
|
|
1499
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8 px-2", children: group.map((partner, idx) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1500
|
+
PartnerListCard$1,
|
|
1501
|
+
{
|
|
1502
|
+
partner,
|
|
1503
|
+
idx,
|
|
1504
|
+
t,
|
|
1505
|
+
getLogoUrl
|
|
1506
|
+
},
|
|
1507
|
+
partner.id || `${slideIndex}-${idx}`
|
|
1508
|
+
)) })
|
|
1509
|
+
},
|
|
1510
|
+
slideIndex
|
|
1511
|
+
)) }) }),
|
|
1512
|
+
partners.length > 1 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center space-x-3", style: {
|
|
1513
|
+
position: "relative",
|
|
1514
|
+
zIndex: 100,
|
|
1515
|
+
paddingTop: "1rem"
|
|
1516
|
+
}, children: partners.map((_, index2) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1517
|
+
"button",
|
|
1518
|
+
{
|
|
1519
|
+
onClick: () => setCurrentPartnerSlide(index2),
|
|
1520
|
+
style: {
|
|
1521
|
+
width: "12px",
|
|
1522
|
+
height: "12px",
|
|
1523
|
+
borderRadius: "50%",
|
|
1524
|
+
border: "none",
|
|
1525
|
+
cursor: "pointer",
|
|
1526
|
+
transition: "all 0.3s ease",
|
|
1527
|
+
backgroundColor: index2 === currentPartnerSlide ? "var(--brand-primary)" : "rgba(151, 151, 151, 0.8)",
|
|
1528
|
+
transform: index2 === currentPartnerSlide ? "scale(1.3)" : "scale(1)"
|
|
1529
|
+
},
|
|
1530
|
+
onMouseEnter: (e) => {
|
|
1531
|
+
if (index2 !== currentPartnerSlide) {
|
|
1532
|
+
e.currentTarget.style.backgroundColor = "rgba(151, 151, 151, 0.8)";
|
|
1533
|
+
}
|
|
1534
|
+
},
|
|
1535
|
+
onMouseLeave: (e) => {
|
|
1536
|
+
if (index2 !== currentPartnerSlide) {
|
|
1537
|
+
e.currentTarget.style.backgroundColor = "rgba(151, 151, 151, 0.8)";
|
|
1538
|
+
}
|
|
1539
|
+
},
|
|
1540
|
+
"aria-label": `Slide ${index2 + 1}`
|
|
1541
|
+
},
|
|
1542
|
+
index2
|
|
1543
|
+
)) })
|
|
1544
|
+
]
|
|
1545
|
+
}
|
|
1546
|
+
) })
|
|
1547
|
+
] }) });
|
|
1548
|
+
};
|
|
1549
|
+
const PartnerListCard = ({ partner, idx, t, isDarkMode, getLogoUrl }) => {
|
|
1550
|
+
const logoUrl = getLogoUrl(partner.logoUrl);
|
|
1551
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1552
|
+
"a",
|
|
1553
|
+
{
|
|
1554
|
+
href: partner.websiteUrl || "#",
|
|
1555
|
+
target: partner.websiteUrl ? "_blank" : "_self",
|
|
1556
|
+
rel: partner.websiteUrl ? "noopener noreferrer" : "",
|
|
1557
|
+
className: "card",
|
|
1558
|
+
style: {
|
|
1559
|
+
animationDelay: `${idx * 0.1}s`,
|
|
1560
|
+
textDecoration: "none",
|
|
1561
|
+
overflow: "hidden",
|
|
1562
|
+
minHeight: "280px",
|
|
1563
|
+
padding: "1.5rem",
|
|
1564
|
+
display: "flex",
|
|
1565
|
+
flexDirection: "column"
|
|
1566
|
+
},
|
|
1567
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: {
|
|
1568
|
+
display: "flex",
|
|
1569
|
+
flexDirection: "column",
|
|
1570
|
+
alignItems: "center",
|
|
1571
|
+
justifyContent: "center",
|
|
1572
|
+
flex: 1
|
|
1573
|
+
}, children: logoUrl ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: {
|
|
1574
|
+
width: "100%",
|
|
1575
|
+
height: "100px",
|
|
1576
|
+
display: "flex",
|
|
1577
|
+
alignItems: "center",
|
|
1578
|
+
justifyContent: "center",
|
|
1579
|
+
marginBottom: "1rem"
|
|
1580
|
+
}, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1581
|
+
"img",
|
|
1582
|
+
{
|
|
1583
|
+
src: logoUrl,
|
|
1584
|
+
alt: partner.name || t("partners.logoAlt") || "Partner logo",
|
|
1585
|
+
style: {
|
|
1586
|
+
maxWidth: "100%",
|
|
1587
|
+
maxHeight: "100%",
|
|
1588
|
+
objectFit: "contain",
|
|
1589
|
+
transition: "transform 300ms cubic-bezier(0.4, 0, 0.2, 1)"
|
|
1590
|
+
},
|
|
1591
|
+
onMouseEnter: (e) => {
|
|
1592
|
+
e.currentTarget.style.transform = "scale(1.05)";
|
|
1593
|
+
},
|
|
1594
|
+
onMouseLeave: (e) => {
|
|
1595
|
+
e.currentTarget.style.transform = "scale(1)";
|
|
1596
|
+
},
|
|
1597
|
+
loading: "lazy"
|
|
1598
|
+
}
|
|
1599
|
+
) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-surface", style: {
|
|
1600
|
+
width: "5rem",
|
|
1601
|
+
height: "5rem",
|
|
1602
|
+
borderRadius: "9999px",
|
|
1603
|
+
display: "flex",
|
|
1604
|
+
alignItems: "center",
|
|
1605
|
+
justifyContent: "center",
|
|
1606
|
+
marginBottom: "1rem"
|
|
1607
|
+
}, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: "1.875rem" }, children: "🤝" }) }) })
|
|
1608
|
+
}
|
|
1609
|
+
);
|
|
1610
|
+
};
|
|
1611
|
+
function useWindowSize() {
|
|
1612
|
+
const [width, setWidth] = useState(
|
|
1613
|
+
typeof window !== "undefined" ? window.innerWidth : 1200
|
|
1614
|
+
);
|
|
1615
|
+
useEffect(() => {
|
|
1616
|
+
const handleResize = () => setWidth(window.innerWidth);
|
|
1617
|
+
window.addEventListener("resize", handleResize);
|
|
1618
|
+
return () => window.removeEventListener("resize", handleResize);
|
|
1619
|
+
}, []);
|
|
1620
|
+
return width;
|
|
1621
|
+
}
|
|
1622
|
+
const PartnerListSection_2 = ({ t, getPartnerList, imageBaseUrl = "", section }) => {
|
|
1216
1623
|
const [partnersData, setPartnersData] = useState([]);
|
|
1217
1624
|
const [error, setError] = useState(null);
|
|
1218
1625
|
const [loading, setLoading] = useState(true);
|
|
@@ -4941,10 +5348,12 @@ const index = {
|
|
|
4941
5348
|
CompanyValues,
|
|
4942
5349
|
TimelineSection,
|
|
4943
5350
|
PartnerCard,
|
|
4944
|
-
PartnersSection,
|
|
5351
|
+
PartnersSection: PartnersSection$1,
|
|
5352
|
+
PartnersSection_2: PartnersSection,
|
|
4945
5353
|
MilestoneSection,
|
|
4946
5354
|
TestimonialsSection,
|
|
4947
|
-
PartnerListCard,
|
|
5355
|
+
PartnerListCard: PartnerListCard$1,
|
|
5356
|
+
PartnerListSection_2,
|
|
4948
5357
|
PartnerListSection,
|
|
4949
5358
|
ContactFormSection,
|
|
4950
5359
|
ContactInfoSection,
|
|
@@ -4979,9 +5388,11 @@ export {
|
|
|
4979
5388
|
PageChildrenSelectSection2,
|
|
4980
5389
|
PageHighlightSection,
|
|
4981
5390
|
PartnerCard,
|
|
4982
|
-
PartnerListCard,
|
|
5391
|
+
PartnerListCard$1 as PartnerListCard,
|
|
4983
5392
|
PartnerListSection,
|
|
4984
|
-
|
|
5393
|
+
PartnerListSection_2,
|
|
5394
|
+
PartnersSection$1 as PartnersSection,
|
|
5395
|
+
PartnersSection as PartnersSection_2,
|
|
4985
5396
|
ProductListSection,
|
|
4986
5397
|
TestimonialsSection,
|
|
4987
5398
|
TextSection,
|