@appcorp/shadcn 1.1.50 → 1.1.52
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/components/nav-projects.js +6 -2
- package/components/ui/chart.d.ts +1 -1
- package/components/ui/resizable.d.ts +1 -1
- package/package.json +2 -2
- package/templates/data/school-v1.d.ts +169 -0
- package/templates/data/school-v1.js +1040 -0
- package/templates/school-v1/footer.d.ts +2 -0
- package/templates/school-v1/footer.js +74 -0
- package/templates/school-v1/index.d.ts +2 -0
- package/templates/school-v1/index.js +36 -0
- package/templates/school-v1/navigation.d.ts +7 -0
- package/templates/school-v1/navigation.js +86 -0
- package/templates/school-v1/sections/about.d.ts +8 -0
- package/templates/school-v1/sections/about.js +69 -0
- package/templates/school-v1/sections/admissions.d.ts +7 -0
- package/templates/school-v1/sections/admissions.js +66 -0
- package/templates/school-v1/sections/contact.d.ts +2 -0
- package/templates/school-v1/sections/contact.js +99 -0
- package/templates/school-v1/sections/faqs.d.ts +5 -0
- package/templates/school-v1/sections/faqs.js +33 -0
- package/templates/school-v1/sections/hero.d.ts +12 -0
- package/templates/school-v1/sections/hero.js +98 -0
- package/templates/school-v1/sections/management.d.ts +5 -0
- package/templates/school-v1/sections/management.js +33 -0
- package/templates/school-v1/sections/news-events.d.ts +2 -0
- package/templates/school-v1/sections/news-events.js +60 -0
- package/templates/school-v1/sections/policies.d.ts +13 -0
- package/templates/school-v1/sections/policies.js +126 -0
- package/templates/school-v1/sections/programs.d.ts +5 -0
- package/templates/school-v1/sections/programs.js +93 -0
- package/templates/school-v1/sections/testimonials.d.ts +5 -0
- package/templates/school-v1/sections/testimonials.js +45 -0
- package/templates/school-v1/sections/why-choose-us.d.ts +6 -0
- package/templates/school-v1/sections/why-choose-us.js +40 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.HeroSection = HeroSection;
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var react_2 = require("react");
|
|
10
|
+
var link_1 = __importDefault(require("next/link"));
|
|
11
|
+
var framer_motion_1 = require("framer-motion");
|
|
12
|
+
var lucide_react_1 = require("lucide-react");
|
|
13
|
+
var button_1 = require("../../../components/ui/button");
|
|
14
|
+
var statIcons = {
|
|
15
|
+
award: lucide_react_1.Award,
|
|
16
|
+
users: lucide_react_1.Users,
|
|
17
|
+
building: lucide_react_1.Building2,
|
|
18
|
+
heart: lucide_react_1.Heart,
|
|
19
|
+
};
|
|
20
|
+
var textVariants = {
|
|
21
|
+
enter: { opacity: 0, y: 40 },
|
|
22
|
+
center: { opacity: 1, y: 0 },
|
|
23
|
+
exit: { opacity: 0, y: -30 },
|
|
24
|
+
};
|
|
25
|
+
var slideVariants = {
|
|
26
|
+
enter: function (direction) { return ({ x: direction > 0 ? "100%" : "-100%" }); },
|
|
27
|
+
center: { x: 0 },
|
|
28
|
+
exit: function (direction) { return ({ x: direction > 0 ? "-100%" : "100%" }); },
|
|
29
|
+
};
|
|
30
|
+
function HeroSection(_a) {
|
|
31
|
+
var heroSlides = _a.heroSlides, heroStats = _a.heroStats;
|
|
32
|
+
var _b = (0, react_2.useState)(0), current = _b[0], setCurrent = _b[1];
|
|
33
|
+
var _c = (0, react_2.useState)(1), direction = _c[0], setDirection = _c[1];
|
|
34
|
+
var _d = (0, react_2.useState)(false), isPaused = _d[0], setIsPaused = _d[1];
|
|
35
|
+
var paginate = (0, react_2.useCallback)(function (newDirection) {
|
|
36
|
+
setDirection(newDirection);
|
|
37
|
+
setCurrent(function (prev) { return (prev + newDirection + heroSlides.length) % heroSlides.length; });
|
|
38
|
+
}, []);
|
|
39
|
+
(0, react_2.useEffect)(function () {
|
|
40
|
+
if (isPaused)
|
|
41
|
+
return;
|
|
42
|
+
var timer = setInterval(function () { return paginate(1); }, 5500);
|
|
43
|
+
return function () { return clearInterval(timer); };
|
|
44
|
+
}, [isPaused, paginate]);
|
|
45
|
+
var slide = heroSlides[current];
|
|
46
|
+
return (react_1.default.createElement("section", { id: "home", className: "relative overflow-hidden bg-blue-950", style: { height: "75vh", minHeight: "560px" }, onMouseEnter: function () { return setIsPaused(true); }, onMouseLeave: function () { return setIsPaused(false); } },
|
|
47
|
+
react_1.default.createElement(framer_motion_1.AnimatePresence, { initial: false, custom: direction },
|
|
48
|
+
react_1.default.createElement(framer_motion_1.motion.div, { key: slide.id, custom: direction, variants: slideVariants, initial: "enter", animate: "center", exit: "exit", transition: { duration: 0.85, ease: [0.32, 0.72, 0, 1] }, className: "absolute inset-0 bg-gradient-to-br ".concat(slide.gradient) },
|
|
49
|
+
react_1.default.createElement("img", { src: slide.imageUrl, alt: "", role: "presentation", className: "absolute inset-0 h-full w-full object-cover opacity-20" }),
|
|
50
|
+
react_1.default.createElement("div", { className: "absolute inset-0 opacity-60", style: { background: slide.pattern } }),
|
|
51
|
+
react_1.default.createElement("div", { className: "absolute inset-0 bg-[radial-gradient(ellipse_at_bottom_left,rgba(255,255,255,0.06)_0%,transparent_55%)]" }),
|
|
52
|
+
react_1.default.createElement("div", { className: "absolute top-10 right-10 h-72 w-72 rounded-full bg-white/5 blur-3xl" }),
|
|
53
|
+
react_1.default.createElement("div", { className: "absolute bottom-10 left-20 h-56 w-56 rounded-full bg-white/5 blur-2xl" }),
|
|
54
|
+
react_1.default.createElement("div", { className: "absolute top-1/2 right-1/4 h-40 w-40 rounded-full border border-white/10" }),
|
|
55
|
+
react_1.default.createElement("div", { className: "absolute top-1/3 right-1/3 h-64 w-64 rounded-full border border-white/5" }))),
|
|
56
|
+
react_1.default.createElement("div", { className: "relative z-10 flex h-full flex-col" },
|
|
57
|
+
react_1.default.createElement("div", { className: "flex flex-1 items-center" },
|
|
58
|
+
react_1.default.createElement("div", { className: "container mx-auto px-6 md:px-12" },
|
|
59
|
+
react_1.default.createElement("div", { className: "max-w-3xl" },
|
|
60
|
+
react_1.default.createElement(framer_motion_1.AnimatePresence, { mode: "wait" },
|
|
61
|
+
react_1.default.createElement(framer_motion_1.motion.div, { key: slide.id + "-content", initial: "enter", animate: "center", exit: "exit", variants: textVariants, transition: { duration: 0.6 } },
|
|
62
|
+
react_1.default.createElement(framer_motion_1.motion.div, { variants: textVariants, transition: { duration: 0.5 }, className: "mb-2" },
|
|
63
|
+
react_1.default.createElement("span", { className: "inline-block rounded-full border border-white/20 bg-white/10 px-4 py-1.5 text-sm font-medium text-white backdrop-blur-sm" }, slide.badge)),
|
|
64
|
+
react_1.default.createElement(framer_motion_1.motion.h1, { variants: textVariants, transition: { duration: 0.55, delay: 0.1 }, className: "mb-1 text-2xl leading-tight font-extrabold tracking-tight text-white md:text-5xl lg:text-6xl xl:text-7xl" }, slide.headline),
|
|
65
|
+
react_1.default.createElement(framer_motion_1.motion.h1, { variants: textVariants, transition: { duration: 0.55, delay: 0.2 }, className: "mb-2 text-2xl leading-tight font-extrabold tracking-tight md:text-5xl lg:text-6xl xl:text-7xl ".concat(slide.accentColor) }, slide.subheadline),
|
|
66
|
+
react_1.default.createElement(framer_motion_1.motion.p, { variants: textVariants, transition: { duration: 0.5, delay: 0.3 }, className: "mb-8 max-w-xl text-base leading-relaxed text-white/75 md:text-lg" }, slide.description),
|
|
67
|
+
react_1.default.createElement(framer_motion_1.motion.div, { variants: textVariants, transition: { duration: 0.5, delay: 0.4 }, className: "flex flex-wrap gap-4" },
|
|
68
|
+
react_1.default.createElement(button_1.Button, { asChild: true, size: "lg", className: "rounded-full bg-yellow-400 font-semibold text-gray-900 shadow-lg hover:bg-yellow-300" },
|
|
69
|
+
react_1.default.createElement(link_1.default, { href: slide.primaryCta.href }, slide.primaryCta.label)),
|
|
70
|
+
react_1.default.createElement(button_1.Button, { asChild: true, size: "lg", variant: "outline", className: "rounded-full border-white/40 bg-white/10 text-white backdrop-blur-sm hover:bg-white hover:text-gray-900" },
|
|
71
|
+
react_1.default.createElement(link_1.default, { href: slide.secondaryCta.href }, slide.secondaryCta.label)))))))),
|
|
72
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "border-t border-white/10 bg-black/20 backdrop-blur-sm", initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.8, delay: 0.6 } },
|
|
73
|
+
react_1.default.createElement("div", { className: "container mx-auto px-6 py-4 md:px-12" },
|
|
74
|
+
react_1.default.createElement("div", { className: "grid grid-cols-2 gap-4 md:grid-cols-4" }, heroStats.map(function (stat, i) {
|
|
75
|
+
var Icon = statIcons[stat.icon];
|
|
76
|
+
return (react_1.default.createElement(framer_motion_1.motion.div, { key: stat.label, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: 0.7 + i * 0.1 }, className: "flex items-center gap-3" },
|
|
77
|
+
react_1.default.createElement("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-yellow-400/20" },
|
|
78
|
+
react_1.default.createElement(Icon, { className: "h-5 w-5 text-yellow-400" })),
|
|
79
|
+
react_1.default.createElement("div", null,
|
|
80
|
+
react_1.default.createElement("div", { className: "text-lg leading-none font-bold text-white" }, stat.value),
|
|
81
|
+
react_1.default.createElement("div", { className: "text-xs text-white/60" }, stat.label))));
|
|
82
|
+
}))))),
|
|
83
|
+
react_1.default.createElement("button", { onClick: function () { return paginate(-1); }, "aria-label": "Previous slide", className: "absolute top-1/2 left-4 z-20 -translate-y-1/2 rounded-full bg-white/10 p-2 text-white backdrop-blur-sm transition hover:bg-white/25" },
|
|
84
|
+
react_1.default.createElement(lucide_react_1.ChevronLeft, { className: "h-6 w-6" })),
|
|
85
|
+
react_1.default.createElement("button", { onClick: function () { return paginate(1); }, "aria-label": "Next slide", className: "absolute top-1/2 right-4 z-20 -translate-y-1/2 rounded-full bg-white/10 p-2 text-white backdrop-blur-sm transition hover:bg-white/25" },
|
|
86
|
+
react_1.default.createElement(lucide_react_1.ChevronRight, { className: "h-6 w-6" })),
|
|
87
|
+
react_1.default.createElement("div", { className: "absolute bottom-20 left-6 z-20 flex hidden gap-2 md:left-12 md:block" }, heroSlides.map(function (_, i) { return (react_1.default.createElement("button", { key: i, onClick: function () {
|
|
88
|
+
setDirection(i > current ? 1 : -1);
|
|
89
|
+
setCurrent(i);
|
|
90
|
+
}, "aria-label": "Go to slide ".concat(i + 1), className: "h-2 rounded-full transition-all duration-300 ".concat(i === current
|
|
91
|
+
? "w-8 bg-yellow-400"
|
|
92
|
+
: "w-2 bg-white/40 hover:bg-white/70") })); })),
|
|
93
|
+
react_1.default.createElement("div", { className: "absolute right-6 bottom-24 z-20 hidden rounded-full bg-black/20 px-3 py-1 text-xs text-white/60 backdrop-blur-sm md:block" },
|
|
94
|
+
String(current + 1).padStart(2, "0"),
|
|
95
|
+
" /",
|
|
96
|
+
" ",
|
|
97
|
+
String(heroSlides.length).padStart(2, "0"))));
|
|
98
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ManagementSection = ManagementSection;
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var framer_motion_1 = require("framer-motion");
|
|
10
|
+
var image_1 = __importDefault(require("next/image"));
|
|
11
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
12
|
+
var lucide_react_1 = require("lucide-react");
|
|
13
|
+
function ManagementSection(_a) {
|
|
14
|
+
var managementTeam = _a.managementTeam;
|
|
15
|
+
return (react_1.default.createElement("section", { id: "management", className: "overflow-hidden bg-white py-24" },
|
|
16
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
17
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-16 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
18
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "Leadership"),
|
|
19
|
+
react_1.default.createElement("h2", { className: "mb-5 text-4xl font-bold text-gray-900 md:text-5xl" },
|
|
20
|
+
"The Dedicated Team",
|
|
21
|
+
" ",
|
|
22
|
+
react_1.default.createElement("span", { className: "text-blue-700" }, "Behind LGGS")),
|
|
23
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg leading-relaxed text-gray-500" }, "Our school is guided by a passionate, experienced leadership team committed to maintaining the highest standards of education, care, and institutional integrity.")),
|
|
24
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5" }, managementTeam.map(function (member, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: member.id, className: "group flex flex-col items-center text-center", initial: { opacity: 1, y: 50 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: i * 0.1 }, viewport: { once: true } },
|
|
25
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "relative mb-5 h-24 w-24 rounded-full shadow-lg", whileHover: { scale: 1.08 }, transition: { type: "spring", stiffness: 300 } },
|
|
26
|
+
react_1.default.createElement(image_1.default, { src: member.avatar, alt: member.name, fill: true, className: "rounded-full object-cover" })),
|
|
27
|
+
react_1.default.createElement("h3", { className: "mb-0.5 font-bold text-gray-900" }, member.name),
|
|
28
|
+
react_1.default.createElement("p", { className: "mb-3 text-xs font-semibold text-blue-700" }, member.title),
|
|
29
|
+
react_1.default.createElement("span", { className: "mb-3 inline-flex items-center gap-1 rounded-full bg-slate-100 px-2.5 py-1 text-xs text-gray-600" },
|
|
30
|
+
react_1.default.createElement(lucide_react_1.GraduationCap, { className: "h-3 w-3" }),
|
|
31
|
+
member.qualifications),
|
|
32
|
+
react_1.default.createElement("p", { className: "line-clamp-4 text-xs leading-relaxed text-gray-500 transition-all duration-300 group-hover:line-clamp-none" }, member.bio))); })))));
|
|
33
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.NewsEventsSection = NewsEventsSection;
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var framer_motion_1 = require("framer-motion");
|
|
10
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
11
|
+
var button_1 = require("../../../components/ui/button");
|
|
12
|
+
var link_1 = __importDefault(require("next/link"));
|
|
13
|
+
var lucide_react_1 = require("lucide-react");
|
|
14
|
+
var school_v1_1 = require("../../../templates/data/school-v1");
|
|
15
|
+
var eventTypeColors = {
|
|
16
|
+
Academic: "bg-blue-100 text-blue-700",
|
|
17
|
+
Parents: "bg-purple-100 text-purple-700",
|
|
18
|
+
Cultural: "bg-amber-100 text-amber-700",
|
|
19
|
+
Creative: "bg-pink-100 text-pink-700",
|
|
20
|
+
Sports: "bg-green-100 text-green-700",
|
|
21
|
+
};
|
|
22
|
+
function NewsEventsSection() {
|
|
23
|
+
return (react_1.default.createElement("section", { id: "news", className: "bg-slate-50 py-24" },
|
|
24
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
25
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-16 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
26
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "News & Events"),
|
|
27
|
+
react_1.default.createElement("h2", { className: "mb-5 text-4xl font-bold text-gray-900 md:text-5xl" },
|
|
28
|
+
"Life at ",
|
|
29
|
+
react_1.default.createElement("span", { className: "text-blue-700" }, "LGGS")),
|
|
30
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg leading-relaxed text-gray-500" }, "Stay connected with our vibrant school community \u2014 from academic achievements and cultural celebrations to upcoming events and competitions.")),
|
|
31
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-8 lg:grid-cols-3" },
|
|
32
|
+
react_1.default.createElement("div", { className: "space-y-5 lg:col-span-2" },
|
|
33
|
+
school_v1_1.newsArticles.map(function (article, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: article.id, className: "group rounded-2xl border border-gray-100 bg-white p-6 shadow-sm transition-shadow duration-300 hover:shadow-lg", initial: { opacity: 0, x: -30 }, whileInView: { opacity: 1, x: 0 }, transition: { duration: 0.5, delay: i * 0.08 }, viewport: { once: true } },
|
|
34
|
+
react_1.default.createElement("div", { className: "mb-3 flex items-center gap-3" },
|
|
35
|
+
react_1.default.createElement(badge_1.Badge, { className: article.categoryColor }, article.category),
|
|
36
|
+
react_1.default.createElement("span", { className: "text-xs text-gray-400" }, article.date)),
|
|
37
|
+
react_1.default.createElement("h3", { className: "mb-2 text-lg font-bold text-gray-900 transition-colors group-hover:text-blue-700" },
|
|
38
|
+
react_1.default.createElement(link_1.default, { href: article.href }, article.title)),
|
|
39
|
+
react_1.default.createElement("p", { className: "mb-4 text-sm leading-relaxed text-gray-500" }, article.excerpt),
|
|
40
|
+
react_1.default.createElement(link_1.default, { href: article.href, className: "inline-flex items-center gap-1 text-sm font-semibold text-blue-700 transition-colors hover:text-blue-900" },
|
|
41
|
+
"Read full story ",
|
|
42
|
+
react_1.default.createElement(lucide_react_1.ArrowRight, { className: "h-4 w-4" })))); }),
|
|
43
|
+
react_1.default.createElement(button_1.Button, { asChild: true, variant: "outline", className: "border-blue-700 text-blue-700 hover:bg-blue-50" },
|
|
44
|
+
react_1.default.createElement(link_1.default, { href: "/blog" }, "View All Stories"))),
|
|
45
|
+
react_1.default.createElement(framer_motion_1.motion.div, { initial: { opacity: 0, x: 30 }, whileInView: { opacity: 1, x: 0 }, transition: { duration: 0.5, delay: 0.2 }, viewport: { once: true } },
|
|
46
|
+
react_1.default.createElement("div", { className: "sticky top-8 rounded-2xl border border-gray-100 bg-white p-6 shadow-sm" },
|
|
47
|
+
react_1.default.createElement("h3", { className: "mb-5 text-lg font-bold text-gray-900" }, "Upcoming Events"),
|
|
48
|
+
react_1.default.createElement("div", { className: "space-y-4" }, school_v1_1.upcomingEvents.map(function (event, i) {
|
|
49
|
+
var _a;
|
|
50
|
+
return (react_1.default.createElement(framer_motion_1.motion.div, { key: event.title, className: "flex items-start gap-4 border-b border-gray-100 pb-4 last:border-0 last:pb-0", initial: { opacity: 0 }, whileInView: { opacity: 1 }, transition: { duration: 0.3, delay: i * 0.06 }, viewport: { once: true } },
|
|
51
|
+
react_1.default.createElement("div", { className: "flex h-12 w-12 flex-shrink-0 flex-col items-center justify-center rounded-xl bg-blue-700 text-white" },
|
|
52
|
+
react_1.default.createElement("span", { className: "text-sm leading-none font-bold" }, event.date),
|
|
53
|
+
react_1.default.createElement("span", { className: "text-xs opacity-80" }, event.month)),
|
|
54
|
+
react_1.default.createElement("div", null,
|
|
55
|
+
react_1.default.createElement("div", { className: "text-sm font-medium text-gray-900" }, event.title),
|
|
56
|
+
react_1.default.createElement("div", { className: "mt-0.5 text-xs text-gray-400" }, event.time),
|
|
57
|
+
react_1.default.createElement(badge_1.Badge, { className: "mt-1.5 text-xs ".concat((_a = eventTypeColors[event.type]) !== null && _a !== void 0 ? _a : "bg-gray-100 text-gray-600") }, event.type))));
|
|
58
|
+
})),
|
|
59
|
+
react_1.default.createElement(button_1.Button, { className: "mt-5 w-full bg-blue-700 hover:bg-blue-800" }, "Full Events Calendar")))))));
|
|
60
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { UniformSeason, type PolicyCategory } from "../../../templates/data/school-v1";
|
|
3
|
+
type PolicyHighlight = {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
note: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const PoliciesSection: ({ policyCategories, policyHighlights, uniformData, }: {
|
|
9
|
+
policyCategories: PolicyCategory[];
|
|
10
|
+
policyHighlights: PolicyHighlight[];
|
|
11
|
+
uniformData: UniformSeason[];
|
|
12
|
+
}) => React.JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.PoliciesSection = void 0;
|
|
38
|
+
var react_1 = __importStar(require("react"));
|
|
39
|
+
var framer_motion_1 = require("framer-motion");
|
|
40
|
+
var lucide_react_1 = require("lucide-react");
|
|
41
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
42
|
+
var categoryIcons = {
|
|
43
|
+
"book-open": lucide_react_1.BookOpen,
|
|
44
|
+
"user-plus": lucide_react_1.UserPlus,
|
|
45
|
+
"graduation-cap": lucide_react_1.GraduationCap,
|
|
46
|
+
"credit-card": lucide_react_1.CreditCard,
|
|
47
|
+
shield: lucide_react_1.Shield,
|
|
48
|
+
info: lucide_react_1.Info,
|
|
49
|
+
tag: lucide_react_1.Tag,
|
|
50
|
+
};
|
|
51
|
+
function AccordionItem(_a) {
|
|
52
|
+
var section = _a.section, colorClass = _a.colorClass, bgClass = _a.bgClass, borderClass = _a.borderClass, bulletBg = _a.bulletBg;
|
|
53
|
+
var _b = (0, react_1.useState)(false), open = _b[0], setOpen = _b[1];
|
|
54
|
+
return (react_1.default.createElement("div", { className: "self-start overflow-hidden rounded-xl border ".concat(borderClass, " bg-white") },
|
|
55
|
+
react_1.default.createElement("button", { className: "flex w-full items-center justify-between gap-4 px-5 py-4 text-left", onClick: function () { return setOpen(function (o) { return !o; }); } },
|
|
56
|
+
react_1.default.createElement("span", { className: "text-sm font-semibold text-gray-800" }, section.title),
|
|
57
|
+
react_1.default.createElement(framer_motion_1.motion.div, { animate: { rotate: open ? 180 : 0 }, transition: { duration: 0.2 } },
|
|
58
|
+
react_1.default.createElement(lucide_react_1.ChevronDown, { className: "h-4 w-4 flex-shrink-0 ".concat(colorClass) }))),
|
|
59
|
+
react_1.default.createElement(framer_motion_1.AnimatePresence, { initial: false }, open && (react_1.default.createElement(framer_motion_1.motion.div, { initial: { height: 0, opacity: 0 }, animate: { height: "auto", opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.25, ease: "easeInOut" } },
|
|
60
|
+
react_1.default.createElement("div", { className: "border-t ".concat(borderClass, " ").concat(bgClass, " space-y-3 px-5 py-4") }, section.points.map(function (point, i) { return (react_1.default.createElement("div", { key: i, className: "flex gap-3" },
|
|
61
|
+
react_1.default.createElement(lucide_react_1.CheckCircle, { className: "mt-0.5 h-4 w-4 flex-shrink-0 ".concat(colorClass) }),
|
|
62
|
+
react_1.default.createElement("div", null,
|
|
63
|
+
react_1.default.createElement("p", { className: "text-sm leading-relaxed text-gray-700" }, point.text),
|
|
64
|
+
point.sub && (react_1.default.createElement("ul", { className: "mt-2 space-y-1" }, point.sub.map(function (s, j) { return (react_1.default.createElement("li", { key: j, className: "flex items-start gap-2" },
|
|
65
|
+
react_1.default.createElement("span", { className: "mt-2 h-1.5 w-1.5 flex-shrink-0 rounded-full ".concat(bulletBg) }),
|
|
66
|
+
react_1.default.createElement("span", { className: "text-sm text-gray-600" }, s))); })))))); })))))));
|
|
67
|
+
}
|
|
68
|
+
function UniformPanel(_a) {
|
|
69
|
+
var colorClass = _a.colorClass, bgClass = _a.bgClass, borderClass = _a.borderClass, bulletBg = _a.bulletBg, uniformData = _a.uniformData;
|
|
70
|
+
var _b = (0, react_1.useState)("Summer"), season = _b[0], setSeason = _b[1];
|
|
71
|
+
var current = uniformData.find(function (u) { return u.season === season; });
|
|
72
|
+
return (react_1.default.createElement("div", { className: "space-y-4" },
|
|
73
|
+
react_1.default.createElement("div", { className: "flex w-fit gap-2 rounded-xl border border-gray-100 bg-white p-1" }, ["Summer", "Winter"].map(function (s) { return (react_1.default.createElement("button", { key: s, onClick: function () { return setSeason(s); }, className: "flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-all ".concat(season === s
|
|
74
|
+
? "".concat(bgClass, " ").concat(colorClass, " shadow-sm")
|
|
75
|
+
: "text-gray-500 hover:text-gray-700") },
|
|
76
|
+
s === "Summer" ? (react_1.default.createElement(lucide_react_1.Sun, { className: "h-4 w-4" })) : (react_1.default.createElement(lucide_react_1.Snowflake, { className: "h-4 w-4" })),
|
|
77
|
+
s)); })),
|
|
78
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2" }, current.variants.map(function (variant, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: "".concat(variant.gender, "-").concat(variant.classes), initial: { opacity: 0, y: 12 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.2, delay: i * 0.06 }, className: "rounded-xl border ".concat(borderClass, " bg-white p-4") },
|
|
79
|
+
react_1.default.createElement("div", { className: "mb-3 flex items-center gap-2" },
|
|
80
|
+
react_1.default.createElement("span", { className: "rounded-md px-2 py-0.5 text-xs font-bold ".concat(bgClass, " ").concat(colorClass) }, variant.gender),
|
|
81
|
+
react_1.default.createElement("span", { className: "text-xs text-gray-500" }, variant.classes)),
|
|
82
|
+
react_1.default.createElement("ul", { className: "space-y-1.5" }, variant.items.map(function (item, j) { return (react_1.default.createElement("li", { key: j, className: "flex items-start gap-2" },
|
|
83
|
+
react_1.default.createElement("span", { className: "mt-2 h-1.5 w-1.5 flex-shrink-0 rounded-full ".concat(bulletBg) }),
|
|
84
|
+
react_1.default.createElement("span", { className: "text-sm leading-relaxed text-gray-600" }, item))); })))); })),
|
|
85
|
+
react_1.default.createElement("p", { className: "rounded-lg border border-amber-200 bg-amber-50 px-4 py-2.5 text-xs text-amber-700" }, "Uniforms for both campuses are available at each campus canteen. Playgroup children may come in private clothes.")));
|
|
86
|
+
}
|
|
87
|
+
var PoliciesSection = function (_a) {
|
|
88
|
+
var policyCategories = _a.policyCategories, policyHighlights = _a.policyHighlights, uniformData = _a.uniformData;
|
|
89
|
+
var _b = (0, react_1.useState)("overview"), activeTab = _b[0], setActiveTab = _b[1];
|
|
90
|
+
var active = policyCategories.find(function (c) { return c.id === activeTab; });
|
|
91
|
+
var ActiveIcon = categoryIcons[active.icon];
|
|
92
|
+
return (react_1.default.createElement("section", { id: "policies", className: "overflow-hidden bg-gray-50 py-24" },
|
|
93
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
94
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-12 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
95
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "School Charter"),
|
|
96
|
+
react_1.default.createElement("h2", { className: "mb-5 text-4xl font-bold text-gray-900 md:text-5xl" },
|
|
97
|
+
"Rules & ",
|
|
98
|
+
react_1.default.createElement("span", { className: "text-blue-700" }, "Policies")),
|
|
99
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg leading-relaxed text-gray-500" }, "Everything parents and students need to know about how LGGS operates \u2014 presented clearly and concisely.")),
|
|
100
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-12 grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6", initial: { opacity: 0, y: 20 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6, delay: 0.15 }, viewport: { once: true } }, policyHighlights.map(function (h) { return (react_1.default.createElement("div", { key: h.label, className: "rounded-2xl border border-blue-100 bg-white px-3 py-4 text-center shadow-sm" },
|
|
101
|
+
react_1.default.createElement("div", { className: "text-2xl font-bold text-blue-700" }, h.value),
|
|
102
|
+
react_1.default.createElement("div", { className: "mt-0.5 text-xs font-semibold text-gray-800" }, h.label),
|
|
103
|
+
react_1.default.createElement("div", { className: "mt-0.5 text-xs text-gray-400" }, h.note))); })),
|
|
104
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-6 flex flex-wrap gap-2", initial: { opacity: 0, y: 16 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: 0.2 }, viewport: { once: true } }, policyCategories.map(function (cat) {
|
|
105
|
+
var Icon = categoryIcons[cat.icon];
|
|
106
|
+
var isActive = cat.id === activeTab;
|
|
107
|
+
return (react_1.default.createElement("button", { key: cat.id, onClick: function () { return setActiveTab(cat.id); }, className: "flex items-center gap-2 rounded-full border px-4 py-2 text-sm font-medium transition-all ".concat(isActive
|
|
108
|
+
? "".concat(cat.bgClass, " ").concat(cat.colorClass, " ").concat(cat.borderClass, " shadow-sm")
|
|
109
|
+
: "border-gray-200 bg-white text-gray-500 hover:border-gray-300 hover:text-gray-700") },
|
|
110
|
+
react_1.default.createElement(Icon, { className: "h-4 w-4" }),
|
|
111
|
+
cat.label));
|
|
112
|
+
})),
|
|
113
|
+
react_1.default.createElement(framer_motion_1.AnimatePresence, { mode: "wait" },
|
|
114
|
+
react_1.default.createElement(framer_motion_1.motion.div, { key: activeTab, initial: { opacity: 0, y: 16 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: { duration: 0.25 } },
|
|
115
|
+
react_1.default.createElement("div", { className: "mb-6 flex items-center gap-4 rounded-2xl border ".concat(active.borderClass, " ").concat(active.bgClass, " p-5") },
|
|
116
|
+
react_1.default.createElement("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-xl border ".concat(active.borderClass, " bg-white") },
|
|
117
|
+
react_1.default.createElement(ActiveIcon, { className: "h-6 w-6 ".concat(active.colorClass) })),
|
|
118
|
+
react_1.default.createElement("div", null,
|
|
119
|
+
react_1.default.createElement("h3", { className: "text-lg font-bold ".concat(active.colorClass) }, active.label),
|
|
120
|
+
react_1.default.createElement("p", { className: "text-sm text-gray-500" }, active.description)),
|
|
121
|
+
react_1.default.createElement(badge_1.Badge, { className: "ml-auto ".concat(active.badgeClass, " hover:").concat(active.badgeClass) }, activeTab === "uniform"
|
|
122
|
+
? "2 seasons"
|
|
123
|
+
: "".concat(active.sections.length, " section").concat(active.sections.length !== 1 ? "s" : ""))),
|
|
124
|
+
activeTab === "uniform" ? (react_1.default.createElement(UniformPanel, { colorClass: active.colorClass, bgClass: active.bgClass, borderClass: active.borderClass, bulletBg: active.bulletBg, uniformData: uniformData })) : (react_1.default.createElement("div", { className: "grid grid-cols-1 gap-3 lg:grid-cols-2" }, active.sections.map(function (section) { return (react_1.default.createElement(AccordionItem, { key: section.id, section: section, colorClass: active.colorClass, bgClass: active.bgClass, borderClass: active.borderClass, bulletBg: active.bulletBg })); }))))))));
|
|
125
|
+
};
|
|
126
|
+
exports.PoliciesSection = PoliciesSection;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ProgramsSection = ProgramsSection;
|
|
41
|
+
var react_1 = __importStar(require("react"));
|
|
42
|
+
var framer_motion_1 = require("framer-motion");
|
|
43
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
44
|
+
var card_1 = require("../../../components/ui/card");
|
|
45
|
+
var button_1 = require("../../../components/ui/button");
|
|
46
|
+
var link_1 = __importDefault(require("next/link"));
|
|
47
|
+
var lucide_react_1 = require("lucide-react");
|
|
48
|
+
function ProgramsSection(_a) {
|
|
49
|
+
var programs = _a.programs;
|
|
50
|
+
var _b = (0, react_1.useState)(0), activeIdx = _b[0], setActiveIdx = _b[1];
|
|
51
|
+
var active = programs[activeIdx];
|
|
52
|
+
return (react_1.default.createElement("section", { id: "programs", className: "bg-gray-50 py-24" },
|
|
53
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
54
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-14 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
55
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "Our Programs"),
|
|
56
|
+
react_1.default.createElement("h2", { className: "mb-4 text-4xl font-bold text-gray-900 md:text-5xl" }, "A Complete Educational Journey"),
|
|
57
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg text-gray-600" }, "From a child's very first steps into learning all the way to board examinations, LGGS provides nurturing, rigorous, and joyful education at every stage.")),
|
|
58
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-10 flex flex-wrap justify-center gap-3", initial: { opacity: 0, y: 20 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: 0.2 }, viewport: { once: true } }, programs.map(function (p, i) { return (react_1.default.createElement("button", { key: p.title, onClick: function () { return setActiveIdx(i); }, className: "rounded-full px-5 py-2.5 text-sm font-medium transition-all ".concat(activeIdx === i
|
|
59
|
+
? "".concat(p.color, " text-white shadow-md")
|
|
60
|
+
: "bg-white text-gray-600 shadow-sm hover:bg-gray-100") },
|
|
61
|
+
p.title,
|
|
62
|
+
react_1.default.createElement("span", { className: "ml-2 text-xs opacity-75" }, p.ages))); })),
|
|
63
|
+
react_1.default.createElement(framer_motion_1.AnimatePresence, { mode: "wait" },
|
|
64
|
+
react_1.default.createElement(framer_motion_1.motion.div, { key: activeIdx, initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -20 }, transition: { duration: 0.4 } },
|
|
65
|
+
react_1.default.createElement(card_1.Card, { className: "overflow-hidden border-0 shadow-xl" },
|
|
66
|
+
react_1.default.createElement("div", { className: "h-2 w-full ".concat(active.color) }),
|
|
67
|
+
react_1.default.createElement(card_1.CardContent, { className: "p-0" },
|
|
68
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2" },
|
|
69
|
+
react_1.default.createElement("div", { className: "p-8 md:p-12 ".concat(active.lightColor) },
|
|
70
|
+
react_1.default.createElement("div", { className: "mb-4 inline-flex items-center gap-2 rounded-full ".concat(active.color, " px-4 py-1.5 text-sm font-semibold text-white") },
|
|
71
|
+
react_1.default.createElement(active.icon, { className: "h-4 w-4" }),
|
|
72
|
+
active.ages),
|
|
73
|
+
react_1.default.createElement("h3", { className: "mb-4 text-2xl font-bold text-gray-900 md:text-3xl" }, active.title),
|
|
74
|
+
react_1.default.createElement("p", { className: "mb-6 leading-relaxed text-gray-700" }, active.description),
|
|
75
|
+
react_1.default.createElement(button_1.Button, { asChild: true, className: "".concat(active.color, " border-0 text-white hover:opacity-90") },
|
|
76
|
+
react_1.default.createElement(link_1.default, { href: "#admissions" },
|
|
77
|
+
"Enroll Now ",
|
|
78
|
+
react_1.default.createElement(lucide_react_1.ArrowRight, { className: "ml-2 h-4 w-4" })))),
|
|
79
|
+
react_1.default.createElement("div", { className: "p-8 md:p-12" },
|
|
80
|
+
react_1.default.createElement("h4", { className: "mb-6 text-lg font-semibold text-gray-900" }, "What Your Child Gains"),
|
|
81
|
+
react_1.default.createElement("ul", { className: "space-y-4" }, active.highlights.map(function (hl, i) { return (react_1.default.createElement(framer_motion_1.motion.li, { key: hl, initial: { opacity: 0, x: -10 }, animate: { opacity: 1, x: 0 }, transition: { delay: i * 0.08 }, className: "flex items-start gap-3" },
|
|
82
|
+
react_1.default.createElement("div", { className: "mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full ".concat(active.color) },
|
|
83
|
+
react_1.default.createElement(lucide_react_1.Check, { className: "h-3 w-3 text-white" })),
|
|
84
|
+
react_1.default.createElement("span", { className: "text-gray-700" }, hl))); })))))))),
|
|
85
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mt-12 grid grid-cols-2 gap-4 md:grid-cols-4", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6, delay: 0.3 }, viewport: { once: true } }, programs.map(function (program, index) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: program.title, whileHover: { y: -6, scale: 1.02 }, transition: { type: "spring", stiffness: 300 }, onClick: function () { return setActiveIdx(index); }, className: "cursor-pointer" },
|
|
86
|
+
react_1.default.createElement(card_1.Card, { className: "border-2 transition-all ".concat(activeIdx === index ? "border-current ".concat(program.textColor, " shadow-md") : "border-transparent") },
|
|
87
|
+
react_1.default.createElement(card_1.CardContent, { className: "flex flex-col items-center gap-3 rounded-lg p-6 text-center ".concat(program.lightColor) },
|
|
88
|
+
react_1.default.createElement("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl ".concat(program.color) },
|
|
89
|
+
react_1.default.createElement(program.icon, { className: "h-7 w-7 text-white" })),
|
|
90
|
+
react_1.default.createElement("div", null,
|
|
91
|
+
react_1.default.createElement("div", { className: "text-sm font-semibold text-gray-900" }, program.title),
|
|
92
|
+
react_1.default.createElement("div", { className: "text-xs font-medium ".concat(program.textColor) }, program.ages)))))); })))));
|
|
93
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
4
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
5
|
+
if (ar || !(i in from)) {
|
|
6
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
7
|
+
ar[i] = from[i];
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
11
|
+
};
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TestimonialsSection = TestimonialsSection;
|
|
17
|
+
var react_1 = __importDefault(require("react"));
|
|
18
|
+
var framer_motion_1 = require("framer-motion");
|
|
19
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
20
|
+
var lucide_react_1 = require("lucide-react");
|
|
21
|
+
function TestimonialsSection(_a) {
|
|
22
|
+
var testimonials = _a.testimonials;
|
|
23
|
+
return (react_1.default.createElement("section", { id: "testimonials", className: "overflow-hidden bg-white py-24" },
|
|
24
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
25
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-16 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
26
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "Testimonials"),
|
|
27
|
+
react_1.default.createElement("h2", { className: "mb-5 text-4xl font-bold text-gray-900 md:text-5xl" },
|
|
28
|
+
"Trusted by",
|
|
29
|
+
" ",
|
|
30
|
+
react_1.default.createElement("span", { className: "text-blue-700" }, "Families Across Lahore")),
|
|
31
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg leading-relaxed text-gray-500" }, "Don't just take our word for it \u2014 hear from the parents and alumni who have experienced the LGGS difference firsthand.")),
|
|
32
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3" }, testimonials.map(function (t, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: t.id, className: "group relative overflow-hidden rounded-3xl border border-gray-100 bg-white p-7 shadow-sm transition-all duration-300 hover:shadow-xl", initial: { opacity: 0, y: 40 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: i * 0.07 }, viewport: { once: true }, whileHover: { y: -4 } },
|
|
33
|
+
react_1.default.createElement("div", { className: "pointer-events-none absolute top-0 right-0 h-24 w-24 rounded-bl-full bg-gradient-to-br ".concat(t.gradientFrom, " ").concat(t.gradientTo, " opacity-5 transition-opacity group-hover:opacity-10") }),
|
|
34
|
+
react_1.default.createElement("div", { className: "mb-4 flex gap-1" }, __spreadArray([], Array(5), true).map(function (_, s) { return (react_1.default.createElement(lucide_react_1.Star, { key: s, className: "h-4 w-4 fill-yellow-400 text-yellow-400" })); })),
|
|
35
|
+
react_1.default.createElement(lucide_react_1.Quote, { className: "mb-3 h-7 w-7 text-blue-100" }),
|
|
36
|
+
react_1.default.createElement("p", { className: "mb-6 text-sm leading-relaxed text-gray-600 italic" },
|
|
37
|
+
"\u201C",
|
|
38
|
+
t.quote,
|
|
39
|
+
"\u201D"),
|
|
40
|
+
react_1.default.createElement("div", { className: "flex items-center gap-3" },
|
|
41
|
+
react_1.default.createElement("div", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-gradient-to-br ".concat(t.gradientFrom, " ").concat(t.gradientTo, " text-sm font-bold text-white") }, t.initials),
|
|
42
|
+
react_1.default.createElement("div", null,
|
|
43
|
+
react_1.default.createElement("div", { className: "text-sm font-semibold text-gray-900" }, t.name),
|
|
44
|
+
react_1.default.createElement("div", { className: "text-xs text-gray-400" }, t.role))))); })))));
|
|
45
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { WhyUsFeature } from "../../../templates/data/school-v1";
|
|
3
|
+
export declare function WhyChooseUsSection({ whyUsFeatures, highlightBadges, }: {
|
|
4
|
+
whyUsFeatures: WhyUsFeature[];
|
|
5
|
+
highlightBadges: string[];
|
|
6
|
+
}): React.JSX.Element;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WhyChooseUsSection = WhyChooseUsSection;
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var framer_motion_1 = require("framer-motion");
|
|
10
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
11
|
+
var lucide_react_1 = require("lucide-react");
|
|
12
|
+
function WhyChooseUsSection(_a) {
|
|
13
|
+
var whyUsFeatures = _a.whyUsFeatures, highlightBadges = _a.highlightBadges;
|
|
14
|
+
var _b = [whyUsFeatures.slice(0, 2), whyUsFeatures.slice(2)], firstTwo = _b[0], rest = _b[1];
|
|
15
|
+
return (react_1.default.createElement("section", { id: "why-choose-us", className: "overflow-hidden bg-slate-50 py-24" },
|
|
16
|
+
react_1.default.createElement("div", { className: "container mx-auto px-4" },
|
|
17
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "mb-16 text-center", initial: { opacity: 0, y: 30 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.6 }, viewport: { once: true } },
|
|
18
|
+
react_1.default.createElement(badge_1.Badge, { className: "mb-4 bg-blue-100 text-blue-700 hover:bg-blue-100" }, "Why Choose LGGS?"),
|
|
19
|
+
react_1.default.createElement("h2", { className: "mb-5 text-4xl font-bold text-gray-900 md:text-5xl" },
|
|
20
|
+
"Choose Excellence.",
|
|
21
|
+
" ",
|
|
22
|
+
react_1.default.createElement("span", { className: "text-blue-700" }, "Choose LGGS.")),
|
|
23
|
+
react_1.default.createElement("p", { className: "mx-auto max-w-2xl text-lg leading-relaxed text-gray-500" }, "Every parent wants the very best for their child. At Lahore Garrison Grammar School, we have built an institution where excellence is the baseline \u2014 not the exception.")),
|
|
24
|
+
react_1.default.createElement("div", { className: "mb-8 grid grid-cols-1 gap-5 md:grid-cols-2 lg:grid-cols-4" },
|
|
25
|
+
firstTwo.map(function (f, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: f.title, className: "group relative overflow-hidden rounded-3xl border border-gray-100 bg-white p-8 shadow-sm transition-shadow duration-300 hover:shadow-xl lg:col-span-2", initial: { opacity: 0, y: 40 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: i * 0.1 }, viewport: { once: true }, whileHover: { y: -4 } },
|
|
26
|
+
react_1.default.createElement("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-br from-blue-50 to-transparent opacity-0 transition-opacity duration-300 group-hover:opacity-100" }),
|
|
27
|
+
react_1.default.createElement("div", { className: "mb-5 inline-flex h-14 w-14 items-center justify-center rounded-2xl bg-gray-50 transition-transform duration-300 group-hover:scale-110" },
|
|
28
|
+
react_1.default.createElement(f.icon, { className: "h-7 w-7 ".concat(f.color) })),
|
|
29
|
+
react_1.default.createElement("h3", { className: "mb-3 text-xl font-bold text-gray-900" }, f.title),
|
|
30
|
+
react_1.default.createElement("p", { className: "leading-relaxed text-gray-500" }, f.description))); }),
|
|
31
|
+
rest.map(function (f, i) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: f.title, className: "group relative overflow-hidden rounded-2xl border border-gray-100 bg-white p-6 shadow-sm transition-shadow duration-300 hover:shadow-lg", initial: { opacity: 0, y: 40 }, whileInView: { opacity: 1, y: 0 }, transition: { duration: 0.5, delay: (i + 2) * 0.08 }, viewport: { once: true }, whileHover: { y: -3 } },
|
|
32
|
+
react_1.default.createElement("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-br from-blue-50 to-transparent opacity-0 transition-opacity duration-300 group-hover:opacity-100" }),
|
|
33
|
+
react_1.default.createElement("div", { className: "mb-4 inline-flex h-11 w-11 items-center justify-center rounded-xl bg-gray-50 transition-transform duration-300 group-hover:scale-110" },
|
|
34
|
+
react_1.default.createElement(f.icon, { className: "h-5 w-5 ".concat(f.color) })),
|
|
35
|
+
react_1.default.createElement("h3", { className: "mb-2 font-bold text-gray-900" }, f.title),
|
|
36
|
+
react_1.default.createElement("p", { className: "text-sm leading-relaxed text-gray-500" }, f.description))); })),
|
|
37
|
+
react_1.default.createElement(framer_motion_1.motion.div, { className: "flex flex-wrap items-center justify-center gap-3 border-t border-gray-200 py-8", initial: { opacity: 0 }, whileInView: { opacity: 1 }, transition: { duration: 0.6, delay: 0.5 }, viewport: { once: true } }, highlightBadges.map(function (badge) { return (react_1.default.createElement(framer_motion_1.motion.div, { key: badge, className: "flex items-center gap-2 rounded-full border border-blue-100 bg-white px-4 py-2 text-sm font-medium text-blue-800 shadow-sm", whileHover: { scale: 1.05 }, transition: { type: "spring", stiffness: 400 } },
|
|
38
|
+
react_1.default.createElement(lucide_react_1.CheckCircle, { className: "h-4 w-4 text-blue-500" }),
|
|
39
|
+
badge)); })))));
|
|
40
|
+
}
|