@goldlabelapps/theme 1.0.0

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.
Files changed (63) hide show
  1. package/README.md +51 -0
  2. package/dist/components/download/DownloadBanner.d.ts +6 -0
  3. package/dist/components/download/DownloadBanner.js +37 -0
  4. package/dist/components/footer/Footer.d.ts +2 -0
  5. package/dist/components/footer/Footer.js +10 -0
  6. package/dist/components/guide/GuideLayout.d.ts +8 -0
  7. package/dist/components/guide/GuideLayout.js +12 -0
  8. package/dist/components/guide/MarkdownContent.d.ts +4 -0
  9. package/dist/components/guide/MarkdownContent.js +6 -0
  10. package/dist/components/hero/HeroSection.d.ts +7 -0
  11. package/dist/components/hero/HeroSection.js +12 -0
  12. package/dist/components/hero/ParticleCanvas.d.ts +7 -0
  13. package/dist/components/hero/ParticleCanvas.js +199 -0
  14. package/dist/components/hero/VideoModal.d.ts +11 -0
  15. package/dist/components/hero/VideoModal.js +42 -0
  16. package/dist/components/index.d.ts +23 -0
  17. package/dist/components/index.js +23 -0
  18. package/dist/components/navigation/DropdownMenu.d.ts +6 -0
  19. package/dist/components/navigation/DropdownMenu.js +67 -0
  20. package/dist/components/navigation/Header.d.ts +5 -0
  21. package/dist/components/navigation/Header.js +32 -0
  22. package/dist/components/navigation/LogoContextMenu.d.ts +7 -0
  23. package/dist/components/navigation/LogoContextMenu.js +61 -0
  24. package/dist/components/navigation/MobileMenu.d.ts +7 -0
  25. package/dist/components/navigation/MobileMenu.js +69 -0
  26. package/dist/components/navigation/ShareMenu.d.ts +7 -0
  27. package/dist/components/navigation/ShareMenu.js +75 -0
  28. package/dist/components/showcase/BlogSection.d.ts +8 -0
  29. package/dist/components/showcase/BlogSection.js +12 -0
  30. package/dist/components/showcase/FeatureExplorer.d.ts +9 -0
  31. package/dist/components/showcase/FeatureExplorer.js +36 -0
  32. package/dist/components/showcase/SolutionsSection.d.ts +6 -0
  33. package/dist/components/showcase/SolutionsSection.js +14 -0
  34. package/dist/components/showcase/StatementSection.d.ts +6 -0
  35. package/dist/components/showcase/StatementSection.js +9 -0
  36. package/dist/components/showcase/UseCaseSlider.d.ts +3 -0
  37. package/dist/components/showcase/UseCaseSlider.js +3 -0
  38. package/dist/components/showcase/VideoSection.d.ts +8 -0
  39. package/dist/components/showcase/VideoSection.js +28 -0
  40. package/dist/components/ui/Button.d.ts +10 -0
  41. package/dist/components/ui/Button.js +43 -0
  42. package/dist/components/ui/Card.d.ts +6 -0
  43. package/dist/components/ui/Card.js +15 -0
  44. package/dist/components/ui/CustomCursor.d.ts +8 -0
  45. package/dist/components/ui/CustomCursor.js +22 -0
  46. package/dist/components/ui/ThemeToggle.d.ts +5 -0
  47. package/dist/components/ui/ThemeToggle.js +4 -0
  48. package/dist/components/video/VideoLayout.d.ts +7 -0
  49. package/dist/components/video/VideoLayout.js +14 -0
  50. package/dist/context/ConfigContext.d.ts +9 -0
  51. package/dist/context/ConfigContext.js +114 -0
  52. package/dist/context/ThemeContext.d.ts +11 -0
  53. package/dist/context/ThemeContext.js +47 -0
  54. package/dist/context/index.d.ts +2 -0
  55. package/dist/context/index.js +2 -0
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.js +4 -0
  58. package/dist/lib/utils.d.ts +4 -0
  59. package/dist/lib/utils.js +21 -0
  60. package/dist/styles/globals.css +91 -0
  61. package/dist/types/index.d.ts +319 -0
  62. package/dist/types/index.js +1 -0
  63. package/package.json +65 -0
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import Link from "next/link";
5
+ import Image from "next/image";
6
+ import { Copy, Check, FileText } from "lucide-react";
7
+ import { useSiteConfig } from "../../context/ConfigContext";
8
+ export function BrandLogo({ className = "h-8 w-auto" }) {
9
+ const siteConfig = useSiteConfig();
10
+ return (_jsxs("div", { className: `inline-flex items-center gap-2.5 font-bold tracking-tight select-none ${className}`, children: [_jsx(Image, { src: siteConfig.brand.logoSrc || "/svg/favicon_light.svg", alt: siteConfig.brand.name, width: 34, height: 34, className: "h-8 w-8 shrink-0 object-contain", priority: true }), _jsx("span", { className: "font-extrabold text-lg sm:text-xl tracking-tight text-[#012867] inline-flex items-center", children: _jsx("span", { children: siteConfig.brand.name }) })] }));
11
+ }
12
+ export const EchoPayLogo = BrandLogo;
13
+ export const NxLogo = BrandLogo;
14
+ export function LogoContextMenu() {
15
+ const siteConfig = useSiteConfig();
16
+ const [isOpen, setIsOpen] = useState(false);
17
+ const [copied, setCopied] = useState(false);
18
+ const [position, setPosition] = useState({ x: 0, y: 0 });
19
+ const menuRef = useRef(null);
20
+ const containerRef = useRef(null);
21
+ const handleContextMenu = (e) => {
22
+ e.preventDefault();
23
+ const rect = containerRef.current?.getBoundingClientRect();
24
+ if (rect) {
25
+ setPosition({
26
+ x: Math.min(e.clientX, window.innerWidth - 220),
27
+ y: e.clientY + 8,
28
+ });
29
+ }
30
+ setIsOpen(true);
31
+ };
32
+ const handleCopySvg = async () => {
33
+ try {
34
+ const svgString = siteConfig.brand.customSvgLogo || `<svg width="34" height="34" viewBox="0 0 34 34" fill="#012867"><circle cx="17" cy="17" r="16"/></svg>`;
35
+ await navigator.clipboard.writeText(svgString);
36
+ setCopied(true);
37
+ setTimeout(() => {
38
+ setCopied(false);
39
+ setIsOpen(false);
40
+ }, 1500);
41
+ }
42
+ catch {
43
+ // ignore
44
+ }
45
+ };
46
+ useEffect(() => {
47
+ const handleClickOutside = (e) => {
48
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
49
+ setIsOpen(false);
50
+ }
51
+ };
52
+ if (isOpen) {
53
+ document.addEventListener("mousedown", handleClickOutside);
54
+ document.addEventListener("scroll", () => setIsOpen(false));
55
+ }
56
+ return () => {
57
+ document.removeEventListener("mousedown", handleClickOutside);
58
+ };
59
+ }, [isOpen]);
60
+ return (_jsxs("div", { ref: containerRef, onContextMenu: handleContextMenu, className: "relative inline-flex items-center", children: [_jsx(Link, { href: "/", className: "group flex items-center py-1 text-slate-900 hover:opacity-90 transition-all focus:outline-none focus:ring-2 focus:ring-[#012867]/30 rounded-lg", title: `Right click for ${siteConfig.brand.name} brand assets`, "aria-label": siteConfig.brand.name, children: _jsx(BrandLogo, {}) }), isOpen && (_jsxs("div", { ref: menuRef, style: { top: `${position.y}px`, left: `${position.x}px` }, className: "fixed z-50 min-w-[200px] rounded-xl bg-white/95 border border-slate-200 p-1.5 shadow-2xl backdrop-blur-xl animate-in fade-in zoom-in-95 duration-150", children: [_jsxs("button", { onClick: handleCopySvg, className: "flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-xs font-medium text-slate-800 hover:bg-[#012867]/[0.05] hover:text-[#012867] transition-colors cursor-pointer", children: [copied ? (_jsx(Check, { className: "h-4 w-4 text-slate-700" })) : (_jsx(Copy, { className: "h-4 w-4 text-slate-500" })), _jsx("span", { children: copied ? "Copied SVG!" : siteConfig.brand.contextMenu.copySvgLabel })] }), _jsx("div", { className: "my-1 h-px bg-slate-100" }), _jsxs("a", { href: siteConfig.brand.contextMenu.guidelinesUrl, onClick: () => setIsOpen(false), className: "flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-xs font-medium text-slate-800 hover:bg-[#012867]/[0.05] hover:text-[#012867] transition-colors", children: [_jsx(FileText, { className: "h-4 w-4 text-slate-500" }), _jsx("span", { children: siteConfig.brand.contextMenu.guidelinesLabel })] })] }))] }));
61
+ }
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export interface MobileMenuProps {
3
+ isOpen?: boolean;
4
+ onToggle?: () => void;
5
+ onClose?: () => void;
6
+ }
7
+ export declare function MobileMenu({ isOpen: controlledIsOpen, onToggle, onClose, }?: MobileMenuProps): React.JSX.Element;
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useEffect, useSyncExternalStore } from "react";
4
+ import { createPortal } from "react-dom";
5
+ import Link from "next/link";
6
+ import { Menu, X, ChevronDown, ExternalLink } from "lucide-react";
7
+ import { useSiteConfig } from "../../context/ConfigContext";
8
+ import { Button } from "../ui/Button";
9
+ const emptySubscribe = () => () => { };
10
+ export function MobileMenu({ isOpen: controlledIsOpen, onToggle, onClose, } = {}) {
11
+ const siteConfig = useSiteConfig();
12
+ const [internalIsOpen, setInternalIsOpen] = useState(false);
13
+ const [expandedSections, setExpandedSections] = useState({});
14
+ const mounted = useSyncExternalStore(emptySubscribe, () => true, () => false);
15
+ const isControlled = controlledIsOpen !== undefined;
16
+ const isOpen = isControlled ? controlledIsOpen : internalIsOpen;
17
+ const handleToggle = () => {
18
+ if (isControlled) {
19
+ onToggle?.();
20
+ }
21
+ else {
22
+ setInternalIsOpen((prev) => !prev);
23
+ }
24
+ };
25
+ const handleClose = () => {
26
+ if (isControlled) {
27
+ onClose?.();
28
+ }
29
+ else {
30
+ setInternalIsOpen(false);
31
+ }
32
+ };
33
+ useEffect(() => {
34
+ if (isOpen) {
35
+ const originalOverflow = document.body.style.overflow;
36
+ document.body.style.overflow = "hidden";
37
+ return () => {
38
+ document.body.style.overflow = originalOverflow;
39
+ };
40
+ }
41
+ }, [isOpen]);
42
+ const toggleSection = (label) => {
43
+ setExpandedSections((prev) => ({
44
+ ...prev,
45
+ [label]: !prev[label],
46
+ }));
47
+ };
48
+ const drawerContent = (_jsxs("div", { className: "fixed inset-0 z-50 md:hidden animate-in fade-in duration-200", children: [_jsx("div", { className: "fixed inset-0 bg-slate-900/40 backdrop-blur-sm transition-opacity", onClick: handleClose, "aria-hidden": "true" }), _jsxs("div", { className: "fixed inset-y-0 right-0 z-50 w-full max-w-xs bg-white shadow-2xl p-6 flex flex-col justify-between overflow-y-auto animate-in slide-in-from-right duration-300", children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between pb-4 border-b border-slate-100", children: [_jsx("span", { className: "font-extrabold text-lg text-[#012867]", children: "Menu" }), _jsx("button", { onClick: handleClose, className: "p-2 -mr-2 text-slate-500 hover:text-slate-900 rounded-full hover:bg-slate-100 transition-colors", "aria-label": "Close menu", children: _jsx(X, { className: "h-5 w-5" }) })] }), _jsx("div", { className: "space-y-1", children: siteConfig.navigation.links.map((item, idx) => {
49
+ const hasDropdown = item.dropdown && item.dropdown.length > 0;
50
+ const isExpanded = expandedSections[item.label] ?? false;
51
+ if (hasDropdown) {
52
+ const dropdownItems = (item.dropdown || []);
53
+ return (_jsxs("div", { className: "space-y-1 py-1", children: [_jsxs("button", { onClick: () => toggleSection(item.label), className: "flex items-center justify-between w-full px-3 py-2.5 text-sm font-semibold text-slate-800 rounded-xl hover:bg-slate-50 transition-colors", children: [_jsx("span", { children: item.label }), _jsx(ChevronDown, { className: `h-4 w-4 text-slate-400 transition-transform duration-200 ${isExpanded ? "rotate-180" : ""}` })] }), isExpanded && (_jsx("div", { className: "pl-3 space-y-1 border-l-2 border-[#012867]/20 ml-3 mt-1", children: dropdownItems.map((sub, sIdx) => {
54
+ const content = (_jsxs("div", { className: "px-3 py-2 rounded-lg hover:bg-slate-50 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-xs font-semibold text-slate-800", children: sub.title }), sub.badge && (_jsx("span", { className: "text-[9px] font-bold px-1.5 py-0.5 rounded bg-[#012867]/[0.08] text-[#012867]", children: sub.badge }))] }), sub.description && (_jsx("p", { className: "text-[11px] text-slate-500 line-clamp-1 mt-0.5", children: sub.description }))] }));
55
+ if (sub.external) {
56
+ return (_jsx("a", { href: sub.href, target: "_blank", rel: "noopener noreferrer", onClick: handleClose, className: "block", children: content }, sIdx));
57
+ }
58
+ return (_jsx(Link, { href: sub.href, onClick: handleClose, className: "block", children: content }, sIdx));
59
+ }) }))] }, idx));
60
+ }
61
+ if (item.external) {
62
+ return (_jsxs("a", { href: item.href || "#", target: "_blank", rel: "noopener noreferrer", onClick: handleClose, className: "flex items-center justify-between px-3 py-2.5 text-sm font-semibold text-slate-800 rounded-xl hover:bg-slate-50 transition-colors", children: [_jsx("span", { children: item.label }), _jsx(ExternalLink, { className: "h-4 w-4 text-slate-400" })] }, idx));
63
+ }
64
+ return (_jsxs(Link, { href: item.href || "#", onClick: handleClose, className: "flex items-center justify-between px-3 py-2.5 text-sm font-semibold text-slate-800 rounded-xl hover:bg-slate-50 transition-colors", children: [_jsx("span", { children: item.label }), item.badge && (_jsx("span", { className: "text-[10px] font-bold px-2 py-0.5 rounded-full bg-[#012867]/[0.08] text-[#012867]", children: item.badge }))] }, idx));
65
+ }) })] }), _jsxs("div", { className: "pt-6 border-t border-slate-100 space-y-3", children: [_jsx(Button, { href: siteConfig.navigation.primaryCta.href, variant: "primary", className: "w-full justify-center shadow-md bg-[#012867] hover:bg-[#011f52] text-white", onClick: handleClose, children: siteConfig.navigation.primaryCta.label }), siteConfig.navigation.secondaryCta && (_jsx(Button, { href: siteConfig.navigation.secondaryCta.href, variant: "outline", className: "w-full justify-center", onClick: handleClose, children: siteConfig.navigation.secondaryCta.label }))] })] })] }));
66
+ return (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleToggle, className: "md:hidden p-2 -mr-2 text-slate-700 hover:text-slate-900 rounded-lg hover:bg-slate-100 transition-colors", "aria-label": "Open mobile menu", children: _jsx(Menu, { className: "h-6 w-6" }) }), isOpen && mounted && typeof document !== "undefined"
67
+ ? createPortal(drawerContent, document.body)
68
+ : null] }));
69
+ }
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export interface ShareMenuProps {
3
+ url?: string;
4
+ title?: string;
5
+ description?: string;
6
+ }
7
+ export declare function ShareMenu({ url, title, description }: ShareMenuProps): React.JSX.Element;
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef, useSyncExternalStore } from "react";
4
+ import { FacebookShareButton, TwitterShareButton, WhatsappShareButton, } from "react-share";
5
+ import { Share2, Copy, Check } from "lucide-react";
6
+ import { useSiteConfig } from "../../context/ConfigContext";
7
+ import { cn } from "../../lib/utils";
8
+ const emptySubscribe = (callback) => {
9
+ if (typeof window === "undefined")
10
+ return () => { };
11
+ window.addEventListener("popstate", callback);
12
+ return () => window.removeEventListener("popstate", callback);
13
+ };
14
+ export function ShareMenu({ url, title, description }) {
15
+ const siteConfig = useSiteConfig();
16
+ const [isOpen, setIsOpen] = useState(false);
17
+ const [copied, setCopied] = useState(false);
18
+ const getSnapshot = () => typeof window !== "undefined" ? window.location.href : siteConfig.metadata.siteUrl;
19
+ const getServerSnapshot = () => siteConfig.metadata.siteUrl;
20
+ const browserUrl = useSyncExternalStore(emptySubscribe, getSnapshot, getServerSnapshot);
21
+ const currentUrl = url || browserUrl || siteConfig.metadata.siteUrl;
22
+ const menuRef = useRef(null);
23
+ const copyTimeoutRef = useRef(null);
24
+ useEffect(() => {
25
+ const handleClickOutside = (event) => {
26
+ if (menuRef.current && !menuRef.current.contains(event.target)) {
27
+ setIsOpen(false);
28
+ }
29
+ };
30
+ const handleKeyDown = (event) => {
31
+ if (event.key === "Escape") {
32
+ setIsOpen(false);
33
+ }
34
+ };
35
+ if (isOpen) {
36
+ document.addEventListener("mousedown", handleClickOutside);
37
+ document.addEventListener("keydown", handleKeyDown);
38
+ }
39
+ return () => {
40
+ document.removeEventListener("mousedown", handleClickOutside);
41
+ document.removeEventListener("keydown", handleKeyDown);
42
+ };
43
+ }, [isOpen]);
44
+ const handleCopy = async () => {
45
+ try {
46
+ if (navigator.clipboard && navigator.clipboard.writeText) {
47
+ await navigator.clipboard.writeText(currentUrl);
48
+ }
49
+ else {
50
+ const textArea = document.createElement("textarea");
51
+ textArea.value = currentUrl;
52
+ textArea.style.position = "fixed";
53
+ textArea.style.opacity = "0";
54
+ document.body.appendChild(textArea);
55
+ textArea.select();
56
+ document.execCommand("copy");
57
+ document.body.removeChild(textArea);
58
+ }
59
+ setCopied(true);
60
+ if (copyTimeoutRef.current)
61
+ clearTimeout(copyTimeoutRef.current);
62
+ copyTimeoutRef.current = setTimeout(() => {
63
+ setCopied(false);
64
+ }, 2000);
65
+ }
66
+ catch (err) {
67
+ console.error("Failed to copy URL:", err);
68
+ }
69
+ };
70
+ const shareTitle = title || siteConfig.metadata.title;
71
+ const shareDescription = description || siteConfig.metadata.description;
72
+ return (_jsxs("div", { className: "relative inline-flex items-center", ref: menuRef, children: [_jsxs("button", { type: "button", onClick: () => setIsOpen((prev) => !prev), "aria-expanded": isOpen, "aria-haspopup": "dialog", "aria-label": `Share ${siteConfig.brand.name}`, className: cn("inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-semibold transition-all duration-200 cursor-pointer border", isOpen
73
+ ? "bg-[#012867] text-white border-[#012867] shadow-sm"
74
+ : "text-slate-700 bg-slate-100/80 hover:bg-[#012867]/[0.08] hover:text-[#012867] border-slate-200/80"), children: [_jsx(Share2, { className: "h-3.5 w-3.5" }), _jsx("span", { children: "Share" })] }), isOpen && (_jsxs("div", { role: "dialog", "aria-label": "Share options", className: "absolute right-0 top-full mt-2 z-50 w-64 rounded-2xl bg-white border border-slate-200 p-2 shadow-2xl backdrop-blur-2xl animate-in fade-in zoom-in-95 duration-150", children: [_jsx("div", { className: "px-2.5 py-1.5 border-b border-slate-100 mb-1", children: _jsx("p", { className: "text-[11px] font-bold text-slate-500 uppercase tracking-wider", children: "Share this page" }) }), _jsxs("div", { className: "space-y-1", children: [_jsx(FacebookShareButton, { url: currentUrl, title: shareTitle, className: "w-full text-left !flex", onClick: () => setIsOpen(false), children: _jsx("div", { className: "flex items-center gap-3 p-2 rounded-xl hover:bg-slate-100/80 transition-colors w-full cursor-pointer group", children: _jsx("span", { className: "text-xs font-medium text-slate-700 group-hover:text-slate-900", children: "Facebook" }) }) }), _jsx(TwitterShareButton, { url: currentUrl, title: shareTitle, className: "w-full text-left !flex", onClick: () => setIsOpen(false), children: _jsx("div", { className: "flex items-center gap-3 p-2 rounded-xl hover:bg-slate-100/80 transition-colors w-full cursor-pointer group", children: _jsx("span", { className: "text-xs font-medium text-slate-700 group-hover:text-slate-900", children: "Twitter / X" }) }) }), _jsx(WhatsappShareButton, { url: currentUrl, title: shareTitle, className: "w-full text-left !flex", onClick: () => setIsOpen(false), children: _jsx("div", { className: "flex items-center gap-3 p-2 rounded-xl hover:bg-slate-100/80 transition-colors w-full cursor-pointer group", children: _jsx("span", { className: "text-xs font-medium text-slate-700 group-hover:text-slate-900", children: "WhatsApp" }) }) }), _jsx("div", { className: "pt-1 border-t border-slate-100", children: _jsxs("button", { type: "button", onClick: handleCopy, className: "flex items-center justify-between w-full p-2 rounded-xl hover:bg-[#012867]/[0.06] hover:text-[#012867] transition-colors cursor-pointer text-left group", children: [_jsx("div", { className: "flex items-center gap-3", children: _jsx("span", { className: "text-xs font-medium text-slate-700 group-hover:text-[#012867]", children: copied ? "Link Copied!" : "Copy Link" }) }), copied ? (_jsx(Check, { className: "h-4 w-4 text-emerald-600" })) : (_jsx(Copy, { className: "h-4 w-4 text-slate-400 group-hover:text-[#012867]" }))] }) })] })] }))] }));
75
+ }
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import type { BlogPost } from "../../types";
3
+ export interface BlogSectionProps {
4
+ posts?: BlogPost[];
5
+ title?: string;
6
+ subtitle?: string;
7
+ }
8
+ export declare function BlogSection({ posts: propPosts, title: propTitle, subtitle: propSubtitle, }: BlogSectionProps): React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { useSiteConfig } from "../../context/ConfigContext";
5
+ import { ChevronLeft, ChevronRight, BookOpen } from "lucide-react";
6
+ export function BlogSection({ posts: propPosts, title: propTitle, subtitle: propSubtitle, }) {
7
+ const siteConfig = useSiteConfig();
8
+ const posts = propPosts || siteConfig.blogs.posts || [];
9
+ const title = propTitle || siteConfig.blogs.title || "Guides & Articles";
10
+ const subtitle = propSubtitle || siteConfig.blogs.subtitle;
11
+ return (_jsx("section", { id: "articles", className: "py-24 sm:py-32 relative bg-white overflow-hidden transition-colors duration-200", children: _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10", children: [_jsxs("div", { className: "flex flex-col md:flex-row md:items-end justify-between gap-6 mb-12", children: [_jsxs("div", { children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 px-3.5 py-1 rounded-full bg-[#012867]/[0.06] border border-[#012867]/15 text-xs font-bold text-[#012867] mb-4 backdrop-blur-md", children: [_jsx(BookOpen, { className: "h-3.5 w-3.5" }), _jsx("span", { children: "Articles & Guides" })] }), _jsx("h2", { className: "text-3xl sm:text-5xl font-extrabold text-slate-900 tracking-tight", children: title }), subtitle && (_jsx("p", { className: "mt-4 text-base text-slate-600 max-w-2xl", children: subtitle }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { "aria-label": "Previous blog posts", className: "p-2 rounded-full bg-slate-100 hover:bg-slate-200 text-slate-700 transition-colors cursor-pointer", children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { "aria-label": "Next blog posts", className: "p-2 rounded-full bg-slate-100 hover:bg-slate-200 text-slate-700 transition-colors cursor-pointer", children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] })] }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-8", children: posts.map((post) => (_jsxs(Link, { href: post.href, className: "group rounded-3xl p-6 sm:p-8 bg-slate-50 border border-slate-200 hover:border-[#012867]/40 shadow-sm hover:shadow-xl transition-all duration-300 flex flex-col justify-between", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between gap-2 mb-4", children: [_jsx("span", { className: "text-[11px] font-bold px-2.5 py-0.5 rounded-full bg-[#012867]/[0.08] text-[#012867]", children: post.category }), _jsx("span", { className: "text-xs text-slate-400 font-medium", children: post.date })] }), _jsx("h3", { className: "text-lg sm:text-xl font-bold text-slate-900 group-hover:text-[#012867] transition-colors leading-snug mb-3", children: post.title }), post.summary && (_jsx("p", { className: "text-xs sm:text-sm text-slate-600 line-clamp-3 leading-relaxed", children: post.summary }))] }), _jsx("div", { className: "pt-6 mt-6 border-t border-slate-200/60 flex items-center text-xs font-bold text-[#012867] group-hover:underline", children: _jsx("span", { children: "Read guide \u2192" }) })] }, post.id))) })] }) }));
12
+ }
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { FeatureItem } from "../../types";
3
+ export interface FeatureExplorerProps {
4
+ items?: FeatureItem[];
5
+ sectionTitle?: string;
6
+ subtitle?: string;
7
+ badgeLabel?: string;
8
+ }
9
+ export declare function FeatureExplorer({ items: propItems, sectionTitle: propTitle, subtitle: propSubtitle, badgeLabel, }: FeatureExplorerProps): React.JSX.Element | null;
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useSiteConfig } from "../../context/ConfigContext";
5
+ import { Terminal, Code2, Copy, Check, Zap, } from "lucide-react";
6
+ import { cn } from "../../lib/utils";
7
+ export function FeatureExplorer({ items: propItems, sectionTitle: propTitle, subtitle: propSubtitle, badgeLabel, }) {
8
+ const siteConfig = useSiteConfig();
9
+ const items = propItems || siteConfig.features.items || [];
10
+ const sectionTitle = propTitle || siteConfig.features.sectionTitle || "Techstack";
11
+ const subtitle = propSubtitle || siteConfig.features.subtitle;
12
+ const badge = badgeLabel || siteConfig.statement.badge || "Architecture & Capabilities";
13
+ const [activeItemId, setActiveItemId] = useState(items[0]?.id || "");
14
+ const [copiedCode, setCopiedCode] = useState(false);
15
+ const activeItem = items.find((t) => t.id === activeItemId) || items[0];
16
+ const handleCopyCode = async (code) => {
17
+ try {
18
+ await navigator.clipboard.writeText(code);
19
+ setCopiedCode(true);
20
+ setTimeout(() => setCopiedCode(false), 2000);
21
+ }
22
+ catch {
23
+ // ignore
24
+ }
25
+ };
26
+ if (!items.length)
27
+ return null;
28
+ return (_jsxs("section", { id: "features", className: "py-24 sm:py-32 relative bg-white overflow-hidden transition-colors duration-200", children: [_jsx("div", { className: "pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[500px] bg-[#012867]/10 rounded-full blur-3xl opacity-60" }), _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10", children: [_jsxs("div", { className: "text-center max-w-3xl mx-auto mb-12 sm:mb-16", children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 px-3.5 py-1 rounded-full bg-[#012867]/[0.06] border border-[#012867]/15 text-xs font-bold text-[#012867] mb-4 backdrop-blur-md", children: [_jsx(Zap, { className: "h-3.5 w-3.5" }), _jsx("span", { children: badge })] }), _jsx("h2", { className: "text-3xl sm:text-5xl font-extrabold text-slate-900 tracking-tight", children: sectionTitle }), subtitle && (_jsx("p", { className: "mt-4 text-base sm:text-lg text-slate-600", children: subtitle }))] }), _jsx("div", { className: "flex justify-center mb-10 overflow-x-auto pb-2 scrollbar-none", children: _jsx("div", { className: "inline-flex p-1.5 rounded-2xl bg-slate-100 border border-slate-200 shadow-sm max-w-full", children: items.map((tab) => {
29
+ const isActive = tab.id === activeItem?.id;
30
+ return (_jsxs("button", { onClick: () => setActiveItemId(tab.id), className: cn("px-4 sm:px-6 py-2.5 rounded-xl text-xs sm:text-sm font-semibold transition-all duration-200 cursor-pointer whitespace-nowrap flex items-center gap-2", isActive
31
+ ? "bg-white text-[#012867] shadow-sm font-bold border border-slate-200/80"
32
+ : "text-slate-600 hover:text-slate-900 hover:bg-slate-200/60"), children: [_jsx("span", { children: tab.tabLabel || tab.title }), tab.badge && (_jsx("span", { className: cn("text-[10px] font-extrabold px-2 py-0.5 rounded-full uppercase tracking-wider", isActive
33
+ ? "bg-[#012867]/[0.08] text-[#012867]"
34
+ : "bg-slate-200 text-slate-600"), children: tab.badge }))] }, tab.id));
35
+ }) }) }), activeItem && (_jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-12 gap-8 items-center rounded-3xl bg-slate-50 border border-slate-200 p-6 sm:p-10 shadow-xl transition-all duration-300", children: [_jsxs("div", { className: "lg:col-span-5 space-y-6", children: [_jsx("div", { className: "inline-flex items-center gap-2 px-3 py-1 rounded-lg bg-[#012867]/[0.06] text-[#012867] font-semibold text-xs border border-[#012867]/15", children: _jsx("span", { children: activeItem.tag }) }), _jsx("h3", { className: "text-2xl sm:text-3xl font-extrabold text-slate-900 leading-tight", children: activeItem.title }), _jsx("p", { className: "text-sm sm:text-base text-slate-600 leading-relaxed", children: activeItem.description }), activeItem.cta && (_jsx("div", { className: "pt-2", children: _jsxs("a", { href: activeItem.cta.href, className: "inline-flex items-center gap-2 text-sm font-bold text-[#012867] hover:underline", children: [_jsx("span", { children: activeItem.cta.label }), _jsx("span", { children: "\u2192" })] }) }))] }), _jsxs("div", { className: "lg:col-span-7", children: [activeItem.previewType === "terminal" && activeItem.terminalSnippet && (_jsxs("div", { className: "rounded-2xl bg-slate-900 border border-slate-800 shadow-2xl overflow-hidden font-mono text-xs sm:text-sm text-slate-200", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-slate-950 border-b border-slate-800", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "w-3 h-3 rounded-full bg-rose-500/80" }), _jsx("span", { className: "w-3 h-3 rounded-full bg-amber-500/80" }), _jsx("span", { className: "w-3 h-3 rounded-full bg-emerald-500/80" })] }), _jsx("span", { className: "text-[11px] font-bold text-slate-400", children: activeItem.terminalSnippet.prompt || "terminal" }), _jsx(Terminal, { className: "h-4 w-4 text-slate-500" })] }), _jsx("div", { className: "p-4 sm:p-6 space-y-4", children: activeItem.terminalSnippet.commands.map((cmd, cIdx) => (_jsxs("div", { className: "space-y-1.5", children: [cmd.cmd && (_jsxs("div", { className: "flex items-center justify-between group", children: [_jsxs("div", { className: "flex items-center gap-2 text-emerald-400", children: [_jsx("span", { children: "$" }), _jsx("span", { className: "text-slate-100", children: cmd.cmd })] }), _jsx("button", { onClick: () => handleCopyCode(cmd.cmd), title: "Copy command", className: "opacity-0 group-hover:opacity-100 transition-opacity p-1 text-slate-400 hover:text-white", children: copiedCode ? (_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-400" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) })] })), cmd.output && (_jsx("p", { className: "text-slate-400 text-xs sm:text-xs leading-relaxed whitespace-pre-wrap pl-4 border-l border-slate-700", children: cmd.output }))] }, cIdx))) })] })), activeItem.previewType === "code" && activeItem.codeSnippet && (_jsxs("div", { className: "rounded-2xl bg-slate-900 border border-slate-800 shadow-2xl overflow-hidden font-mono text-xs sm:text-sm text-slate-200", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-slate-950 border-b border-slate-800", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Code2, { className: "h-4 w-4 text-[#38BDF8]" }), _jsx("span", { className: "text-xs font-semibold text-slate-300", children: activeItem.codeSnippet.filename || "snippet" })] }), _jsx("button", { onClick: () => handleCopyCode(activeItem.codeSnippet.code), className: "flex items-center gap-1.5 px-2.5 py-1 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-300 text-xs transition-colors cursor-pointer", children: copiedCode ? (_jsxs(_Fragment, { children: [_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-400" }), _jsx("span", { children: "Copied" })] })) : (_jsxs(_Fragment, { children: [_jsx(Copy, { className: "h-3.5 w-3.5" }), _jsx("span", { children: "Copy Code" })] })) })] }), _jsx("pre", { className: "p-4 sm:p-6 overflow-x-auto text-xs sm:text-sm text-slate-100 bg-transparent border-0", children: _jsx("code", { children: activeItem.codeSnippet.code }) })] })), activeItem.previewType === "interactive-ui" && (_jsxs("div", { className: "rounded-2xl bg-white border border-slate-200 p-8 shadow-inner flex flex-col items-center justify-center min-h-[260px] text-center space-y-4", children: [_jsx("div", { className: "h-12 w-12 rounded-2xl bg-[#012867]/[0.08] text-[#012867] flex items-center justify-center", children: _jsx(Zap, { className: "h-6 w-6" }) }), _jsxs("div", { children: [_jsx("h4", { className: "font-bold text-slate-900 text-base", children: activeItem.title }), _jsx("p", { className: "text-xs text-slate-500 mt-1 max-w-sm", children: activeItem.description })] }), activeItem.cta && (_jsx("a", { href: activeItem.cta.href, className: "px-4 py-2 rounded-full bg-[#012867] text-white text-xs font-bold shadow hover:bg-[#011f52] transition-colors", children: activeItem.cta.label }))] }))] })] }))] })] }));
36
+ }
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { SolutionsConfig } from "../../types";
3
+ export interface SolutionsSectionProps {
4
+ config?: Partial<SolutionsConfig>;
5
+ }
6
+ export declare function SolutionsSection({ config }: SolutionsSectionProps): React.JSX.Element;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useSiteConfig } from "../../context/ConfigContext";
4
+ import { Button } from "../ui/Button";
5
+ import { Check, Sparkles } from "lucide-react";
6
+ export function SolutionsSection({ config }) {
7
+ const siteConfig = useSiteConfig();
8
+ const solutions = config ? { ...siteConfig.solutions, ...config } : siteConfig.solutions;
9
+ return (_jsx("section", { id: "solutions", className: "py-24 sm:py-32 relative bg-slate-50 overflow-hidden transition-colors duration-200", children: _jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10", children: [_jsxs("div", { className: "text-center max-w-3xl mx-auto mb-16 sm:mb-20", children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 px-3.5 py-1 rounded-full bg-[#012867]/[0.06] border border-[#012867]/15 text-xs font-bold text-[#012867] mb-4 backdrop-blur-md", children: [_jsx(Sparkles, { className: "h-3.5 w-3.5" }), _jsx("span", { children: "Pricing & Plans" })] }), _jsx("h2", { className: "text-3xl sm:text-5xl font-extrabold text-slate-900 tracking-tight", children: solutions.title }), _jsx("p", { className: "mt-4 text-base sm:text-lg text-slate-600", children: solutions.subtitle })] }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8 max-w-5xl mx-auto items-stretch", children: solutions.cards.map((card) => (_jsxs("div", { className: `rounded-3xl p-8 sm:p-10 flex flex-col justify-between transition-all duration-300 ${card.highlighted
10
+ ? "bg-white border-2 border-[#012867] shadow-2xl relative"
11
+ : "bg-white border border-slate-200 shadow-md"}`, children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between gap-4 mb-4", children: [_jsx("span", { className: "text-xs font-bold uppercase tracking-wider text-slate-500", children: card.tier }), card.badge && (_jsx("span", { className: "px-3 py-1 rounded-full text-xs font-bold bg-[#012867]/[0.08] text-[#012867] border border-[#012867]/20", children: card.badge }))] }), _jsx("h3", { className: "text-3xl font-extrabold text-slate-900 mb-2", children: card.heading }), _jsx("p", { className: "text-sm text-slate-600 mb-8 leading-relaxed", children: card.description }), _jsx("div", { className: "space-y-3 pt-4 border-t border-slate-100 mb-8", children: card.features.map((feature, fIdx) => (_jsxs("div", { className: "flex items-start gap-3 text-sm text-slate-700", children: [_jsx("div", { className: "rounded-full p-1 bg-emerald-100 text-emerald-700 shrink-0 mt-0.5", children: _jsx(Check, { className: "h-3.5 w-3.5" }) }), _jsx("span", { children: feature })] }, fIdx))) })] }), _jsx(Button, { href: card.cta.href, variant: card.cta.variant === "primary" ? "primary" : "secondary", className: `w-full justify-center ${card.cta.variant === "primary"
12
+ ? "bg-[#012867] hover:bg-[#011f52] text-white shadow-md"
13
+ : "border-slate-300 text-slate-800 hover:bg-slate-100"}`, children: card.cta.label })] }, card.id))) })] }) }));
14
+ }
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { StatementConfig } from "../../types";
3
+ export interface StatementSectionProps {
4
+ config?: Partial<StatementConfig>;
5
+ }
6
+ export declare function StatementSection({ config }: StatementSectionProps): React.JSX.Element;
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useSiteConfig } from "../../context/ConfigContext";
4
+ import { Sparkles } from "lucide-react";
5
+ export function StatementSection({ config }) {
6
+ const siteConfig = useSiteConfig();
7
+ const statement = config ? { ...siteConfig.statement, ...config } : siteConfig.statement;
8
+ return (_jsxs("section", { className: "py-24 sm:py-32 relative bg-slate-900 text-white overflow-hidden", children: [_jsx("div", { className: "pointer-events-none absolute inset-0 bg-[radial-gradient(#38bdf81a_1px,transparent_1px)] [background-size:24px_24px] opacity-25" }), _jsxs("div", { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10", children: [statement.badge && (_jsxs("div", { className: "inline-flex items-center gap-1.5 px-3.5 py-1 rounded-full bg-white/10 border border-white/15 text-xs font-bold text-sky-400 mb-6 backdrop-blur-md", children: [_jsx(Sparkles, { className: "h-3.5 w-3.5" }), _jsx("span", { children: statement.badge })] })), _jsx("h2", { className: "text-3xl sm:text-5xl font-extrabold tracking-tight leading-tight text-slate-100 max-w-4xl mx-auto", children: statement.headline }), statement.subtext && (_jsx("p", { className: "mt-6 text-base sm:text-lg text-slate-400 max-w-3xl mx-auto leading-relaxed", children: statement.subtext })), statement.floatingIcons && statement.floatingIcons.length > 0 && (_jsx("div", { className: "mt-12 flex flex-wrap items-center justify-center gap-4", children: statement.floatingIcons.map((icon, idx) => (_jsxs("div", { className: "flex items-center gap-2 px-4 py-2 rounded-2xl bg-white/5 border border-white/10 backdrop-blur-md shadow-sm", children: [_jsx("span", { className: "text-lg", children: icon.symbol }), icon.label && _jsx("span", { className: "text-xs font-semibold text-slate-300", children: icon.label })] }, idx))) }))] })] }));
9
+ }
@@ -0,0 +1,3 @@
1
+ import { VideoSection, type VideoSectionProps } from "./VideoSection";
2
+ export type UseCaseSliderProps = VideoSectionProps;
3
+ export declare const UseCaseSlider: typeof VideoSection;
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import { VideoSection } from "./VideoSection";
3
+ export const UseCaseSlider = VideoSection;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import type { VideoItem } from "../../types";
3
+ export interface VideoSectionProps {
4
+ items?: VideoItem[];
5
+ title?: string;
6
+ subtitle?: string;
7
+ }
8
+ export declare function VideoSection({ items: propItems, title: propTitle, subtitle: propSubtitle, }: VideoSectionProps): React.JSX.Element | null;
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useSiteConfig } from "../../context/ConfigContext";
5
+ import { VideoModal } from "../hero/VideoModal";
6
+ import { Play, ChevronLeft, ChevronRight, Video } from "lucide-react";
7
+ export function VideoSection({ items: propItems, title: propTitle, subtitle: propSubtitle, }) {
8
+ const siteConfig = useSiteConfig();
9
+ const items = propItems || siteConfig.videos.items || [];
10
+ const title = propTitle || siteConfig.videos.title || "Video Showcase";
11
+ const subtitle = propSubtitle || siteConfig.videos.subtitle;
12
+ const [activeIdx, setActiveIdx] = useState(0);
13
+ const [modalOpen, setModalOpen] = useState(false);
14
+ const activeVideo = items[activeIdx] || items[0];
15
+ const handlePrev = () => {
16
+ setActiveIdx((prev) => (prev === 0 ? items.length - 1 : prev - 1));
17
+ };
18
+ const handleNext = () => {
19
+ setActiveIdx((prev) => (prev === items.length - 1 ? 0 : prev + 1));
20
+ };
21
+ if (!items.length)
22
+ return null;
23
+ return (_jsxs("section", { id: "videos", className: "py-24 sm:py-32 relative bg-slate-50 overflow-hidden transition-colors duration-200", children: [_jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10", children: [_jsxs("div", { className: "text-center max-w-3xl mx-auto mb-16", children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 px-3.5 py-1 rounded-full bg-[#012867]/[0.06] border border-[#012867]/15 text-xs font-bold text-[#012867] mb-4 backdrop-blur-md", children: [_jsx(Video, { className: "h-3.5 w-3.5" }), _jsx("span", { children: "Walkthroughs & Demos" })] }), _jsx("h2", { className: "text-3xl sm:text-5xl font-extrabold text-slate-900 tracking-tight", children: title }), subtitle && (_jsx("p", { className: "mt-4 text-base sm:text-lg text-slate-600", children: subtitle }))] }), _jsxs("div", { className: "flex items-center justify-between mb-8", children: [_jsx("div", { className: "flex items-center gap-2 overflow-x-auto pb-2 scrollbar-none", children: items.map((v, idx) => (_jsx("button", { onClick: () => setActiveIdx(idx), className: `px-4 py-2 rounded-xl text-xs sm:text-sm font-semibold transition-all cursor-pointer whitespace-nowrap ${idx === activeIdx
24
+ ? "bg-[#012867] text-white shadow-md"
25
+ : "bg-white text-slate-700 hover:bg-slate-200/70 border border-slate-200"}`, children: v.title }, v.id))) }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [_jsx("button", { onClick: handlePrev, "aria-label": "Previous video", className: "p-2 rounded-full bg-white border border-slate-200 text-slate-700 hover:bg-slate-100 transition-colors cursor-pointer", children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { onClick: handleNext, "aria-label": "Next video", className: "p-2 rounded-full bg-white border border-slate-200 text-slate-700 hover:bg-slate-100 transition-colors cursor-pointer", children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] })] }), activeVideo && (_jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-12 gap-8 items-center rounded-3xl bg-white border border-slate-200 p-6 sm:p-10 shadow-xl", children: [_jsxs("div", { className: "lg:col-span-6 space-y-6", children: [_jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1 rounded-lg bg-[#012867]/[0.06] text-[#012867] font-semibold text-xs border border-[#012867]/15", children: [_jsx("span", { children: activeVideo.badge || activeVideo.title }), _jsx("span", { children: "\u2022" }), _jsx("span", { children: activeVideo.duration })] }), _jsx("h3", { className: "text-2xl sm:text-3xl font-extrabold text-slate-900 leading-tight", children: activeVideo.tagline || activeVideo.title }), _jsx("p", { className: "text-sm sm:text-base text-slate-600 leading-relaxed", children: activeVideo.description }), activeVideo.keyFeatures && activeVideo.keyFeatures.length > 0 && (_jsx("ul", { className: "space-y-2 pt-2", children: activeVideo.keyFeatures.map((kf, kIdx) => (_jsxs("li", { className: "flex items-start gap-2 text-xs sm:text-sm text-slate-700", children: [_jsx("span", { className: "text-[#012867] font-bold", children: "\u2713" }), _jsx("span", { children: kf })] }, kIdx))) })), _jsxs("div", { className: "pt-4 flex flex-wrap gap-4", children: [_jsxs("button", { onClick: () => setModalOpen(true), className: "inline-flex items-center gap-2 px-6 py-3 rounded-full bg-[#012867] hover:bg-[#011f52] text-white font-bold text-sm shadow-md transition-all cursor-pointer", children: [_jsx(Play, { className: "h-4 w-4 fill-white" }), _jsx("span", { children: "Watch Video Demo" })] }), activeVideo.cta && (_jsx("a", { href: activeVideo.cta.href, className: "inline-flex items-center gap-2 px-6 py-3 rounded-full bg-slate-100 hover:bg-slate-200 text-slate-800 font-semibold text-sm transition-all", children: _jsx("span", { children: activeVideo.cta.label }) }))] })] }), _jsx("div", { className: "lg:col-span-6 flex items-center justify-center", children: _jsxs("div", { onClick: () => setModalOpen(true), className: `relative w-full rounded-2xl bg-slate-900 overflow-hidden shadow-2xl group cursor-pointer border border-slate-800 ${activeVideo.orientation === "portrait"
26
+ ? "max-w-[280px] aspect-[9/16]"
27
+ : "aspect-video"}`, children: [_jsx("div", { className: "absolute inset-0 flex items-center justify-center z-20", children: _jsx("div", { className: "h-16 w-16 rounded-full bg-[#012867] text-white flex items-center justify-center shadow-2xl group-hover:scale-110 transition-transform", children: _jsx(Play, { className: "h-7 w-7 fill-white ml-1" }) }) }), _jsx("div", { className: "absolute inset-0 bg-slate-950/40 group-hover:bg-slate-950/20 transition-colors z-10" }), _jsx("div", { className: "absolute bottom-4 left-4 right-4 z-20", children: _jsx("span", { className: "text-xs font-bold text-white bg-black/60 px-2.5 py-1 rounded-md backdrop-blur-sm", children: activeVideo.duration }) })] }) })] }))] }), activeVideo && (_jsx(VideoModal, { isOpen: modalOpen, onClose: () => setModalOpen(false), videoUrl: activeVideo.videoUrl, title: activeVideo.title, badge: activeVideo.badge, orientation: activeVideo.orientation }))] }));
28
+ }
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
+ variant?: "primary" | "secondary" | "outline" | "ghost" | "glass" | "pill";
4
+ size?: "sm" | "md" | "lg";
5
+ icon?: string;
6
+ iconPosition?: "left" | "right";
7
+ href?: string;
8
+ external?: boolean;
9
+ }
10
+ export declare function Button({ className, variant, size, icon, iconPosition, href, external, children, onClick, ...props }: ButtonProps): React.JSX.Element;
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { cn } from "../../lib/utils";
5
+ import { Download, ArrowRight, ChevronDown, Play, ExternalLink, Sparkles, Terminal, Code2, Check, } from "lucide-react";
6
+ const iconMap = {
7
+ Download,
8
+ ArrowRight,
9
+ ChevronDown,
10
+ Play,
11
+ ExternalLink,
12
+ Sparkles,
13
+ Terminal,
14
+ Code2,
15
+ Check,
16
+ };
17
+ export function Button({ className, variant = "primary", size = "md", icon, iconPosition = "right", href, external, children, onClick, ...props }) {
18
+ const IconComponent = icon ? iconMap[icon] : null;
19
+ const baseStyles = "inline-flex items-center justify-center font-medium transition-all duration-200 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed select-none rounded-full whitespace-nowrap";
20
+ const sizeStyles = {
21
+ sm: "px-3.5 py-1.5 text-xs gap-1.5",
22
+ md: "px-5 py-2.5 text-sm gap-2",
23
+ lg: "px-7 py-3.5 text-base gap-2.5",
24
+ };
25
+ const variantStyles = {
26
+ primary: "bg-[#012867] hover:bg-[#011f52] text-white font-bold shadow-md shadow-[#012867]/20 active:scale-[0.98]",
27
+ secondary: "bg-slate-100 hover:bg-slate-200 text-slate-900 border border-slate-200 font-semibold active:scale-[0.98]",
28
+ outline: "border border-slate-300 hover:border-[#012867] bg-white text-slate-800 hover:text-[#012867] hover:bg-[#012867]/[0.04] active:scale-[0.98]",
29
+ ghost: "bg-transparent text-slate-600 hover:text-[#012867] hover:bg-[#012867]/[0.06]",
30
+ glass: "bg-white/90 hover:bg-white text-slate-900 backdrop-blur-lg border border-slate-200 shadow-md active:scale-[0.98]",
31
+ pill: "bg-[#012867] text-white hover:bg-[#011f52] font-bold shadow-md active:scale-[0.98]",
32
+ };
33
+ const classes = cn(baseStyles, sizeStyles[size], variantStyles[variant], className);
34
+ const iconElement = IconComponent ? (_jsx(IconComponent, { className: cn("shrink-0 inline-block align-middle", size === "sm" ? "w-3.5 h-3.5" : size === "lg" ? "w-5 h-5" : "w-4 h-4") })) : null;
35
+ const content = (_jsxs(_Fragment, { children: [iconPosition === "left" && iconElement, _jsx("span", { className: "inline-flex items-center gap-1.5 leading-none", children: children }), iconPosition === "right" && iconElement] }));
36
+ if (href) {
37
+ if (external) {
38
+ return (_jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", className: classes, onClick: onClick, children: content }));
39
+ }
40
+ return (_jsx(Link, { href: href, className: classes, onClick: onClick, children: content }));
41
+ }
42
+ return (_jsx("button", { className: classes, onClick: onClick, ...props, children: content }));
43
+ }
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ variant?: "default" | "glass" | "bordered" | "glow";
4
+ hoverEffect?: boolean;
5
+ }
6
+ export declare function Card({ className, variant, hoverEffect, children, ...props }: CardProps): React.JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ export function Card({ className, variant = "default", hoverEffect = true, children, ...props }) {
4
+ const baseStyles = "rounded-2xl transition-all duration-300 relative overflow-hidden";
5
+ const variantStyles = {
6
+ default: "bg-white border border-black/[0.08] text-[#2c2c2a] shadow-sm dark:bg-[#2d3943] dark:border-white/[0.1] dark:text-white",
7
+ glass: "bg-white/85 backdrop-blur-xl border border-black/[0.08] text-[#2c2c2a] shadow-xl dark:bg-[#2d3943]/90 dark:border-white/[0.12] dark:text-white",
8
+ bordered: "bg-neutral-50 border border-neutral-200 text-[#2c2c2a] dark:bg-[#2c3741] dark:border-neutral-700 dark:text-white",
9
+ glow: "bg-white border border-[#FFD849]/30 shadow-xl shadow-[#FFD849]/5 text-[#2c2c2a] dark:bg-[#2d3943] dark:border-[#FFD849]/30 dark:shadow-[#FFD849]/5 dark:text-white",
10
+ };
11
+ const hoverStyles = hoverEffect
12
+ ? "hover:border-[#FFD849]/50 hover:translate-y-[-2px] hover:shadow-lg dark:hover:border-[#FFD849]/60 dark:hover:shadow-black/40"
13
+ : "";
14
+ return (_jsx("div", { className: cn(baseStyles, variantStyles[variant], hoverStyles, className), ...props, children: children }));
15
+ }
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ export interface CustomCursorWrapperProps {
3
+ children: React.ReactNode;
4
+ cursorLabel?: string;
5
+ onClick?: () => void;
6
+ className?: string;
7
+ }
8
+ export declare function CustomCursorWrapper({ children, cursorLabel, onClick, className, }: CustomCursorWrapperProps): React.JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useRef } from "react";
4
+ import { Play } from "lucide-react";
5
+ import { cn } from "../../lib/utils";
6
+ export function CustomCursorWrapper({ children, cursorLabel = "Play intro", onClick, className, }) {
7
+ const [isHovered, setIsHovered] = useState(false);
8
+ const [position, setPosition] = useState({ x: 0, y: 0 });
9
+ const containerRef = useRef(null);
10
+ const handleMouseMove = (e) => {
11
+ if (!containerRef.current)
12
+ return;
13
+ const rect = containerRef.current.getBoundingClientRect();
14
+ setPosition({
15
+ x: e.clientX - rect.left,
16
+ y: e.clientY - rect.top,
17
+ });
18
+ };
19
+ return (_jsxs("div", { ref: containerRef, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onMouseMove: handleMouseMove, onClick: onClick, className: cn("relative cursor-pointer group overflow-hidden rounded-3xl", className), children: [children, _jsxs("div", { style: {
20
+ transform: `translate3d(${position.x}px, ${position.y}px, 0) translate(-50%, -50%)`,
21
+ }, className: cn("pointer-events-none absolute z-30 flex items-center gap-2 rounded-full bg-white px-4 py-2 text-xs font-semibold text-neutral-950 shadow-2xl transition-opacity duration-150", isHovered ? "opacity-100 scale-100" : "opacity-0 scale-75"), children: [_jsx(Play, { className: "h-3.5 w-3.5 fill-black text-black" }), _jsx("span", { children: cursorLabel })] })] }));
22
+ }
@@ -0,0 +1,5 @@
1
+ export interface ThemeToggleProps {
2
+ className?: string;
3
+ showLabel?: boolean;
4
+ }
5
+ export declare function ThemeToggle(_props: ThemeToggleProps): null;
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ export function ThemeToggle(_props) {
3
+ return null;
4
+ }
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import type { VideoItem } from "../../types";
3
+ export interface VideoLayoutProps {
4
+ videos: VideoItem[];
5
+ currentVideo: VideoItem;
6
+ }
7
+ export declare function VideoLayout({ videos, currentVideo }: VideoLayoutProps): React.JSX.Element;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { Video } from "lucide-react";
5
+ import { Button } from "../ui/Button";
6
+ export function VideoLayout({ videos, currentVideo }) {
7
+ const isPortrait = currentVideo.orientation === "portrait";
8
+ return (_jsx("div", { className: "min-h-screen pt-28 pb-20 bg-slate-50", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-12 gap-8", children: [_jsx("aside", { className: "lg:col-span-4 space-y-4", children: _jsxs("div", { className: "p-4 rounded-3xl bg-white border border-slate-200 shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4 text-[#012867] font-bold text-sm", children: [_jsx(Video, { className: "h-4 w-4" }), _jsx("span", { children: "Live Walkthroughs & Demos" })] }), _jsx("ul", { className: "space-y-2", children: videos.map((v) => {
9
+ const isActive = v.id === currentVideo.id;
10
+ return (_jsx("li", { children: _jsxs(Link, { href: `/videos/${v.id}`, className: `block p-3 rounded-2xl transition-all ${isActive
11
+ ? "bg-[#012867] text-white shadow-md"
12
+ : "hover:bg-slate-100 text-slate-800"}`, children: [_jsx("div", { className: "font-bold text-xs", children: v.title }), _jsx("div", { className: "text-[11px] opacity-80 line-clamp-1", children: v.tagline })] }) }, v.id));
13
+ }) })] }) }), _jsx("main", { className: "lg:col-span-8 space-y-6", children: _jsxs("div", { className: "rounded-3xl bg-white border border-slate-200 p-6 sm:p-10 shadow-xl space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("h1", { className: "text-2xl sm:text-3xl font-extrabold text-slate-900", children: currentVideo.title }), _jsxs("span", { className: "text-xs font-bold px-3 py-1 rounded-full bg-slate-100 text-slate-700", children: ["Duration: ", currentVideo.duration] })] }), _jsx("div", { className: `w-full bg-black rounded-2xl overflow-hidden flex items-center justify-center ${isPortrait ? "aspect-[9/16] max-w-[320px] mx-auto" : "aspect-video"}`, children: _jsx("video", { src: currentVideo.videoUrl, controls: true, className: "w-full h-full object-contain" }) }), _jsx("p", { className: "text-slate-600 text-sm leading-relaxed", children: currentVideo.description }), currentVideo.keyFeatures && (_jsxs("div", { className: "pt-4 border-t border-slate-100", children: [_jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-slate-900 mb-3", children: "Key Walkthrough Highlights" }), _jsx("ul", { className: "space-y-2", children: currentVideo.keyFeatures.map((kf, idx) => (_jsxs("li", { className: "flex items-start gap-2 text-xs sm:text-sm text-slate-700", children: [_jsx("span", { className: "text-[#012867] font-bold", children: "\u2713" }), _jsx("span", { children: kf })] }, idx))) })] })), currentVideo.cta && (_jsx("div", { className: "pt-4", children: _jsx(Button, { href: currentVideo.cta.href, variant: "primary", children: currentVideo.cta.label }) }))] }) })] }) }) }));
14
+ }
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { SiteConfig } from "../types";
3
+ export declare const defaultConfig: SiteConfig;
4
+ export interface ConfigProviderProps {
5
+ value: SiteConfig;
6
+ children: React.ReactNode;
7
+ }
8
+ export declare function ConfigProvider({ value, children }: ConfigProviderProps): React.JSX.Element;
9
+ export declare function useSiteConfig(override?: Partial<SiteConfig>): SiteConfig;