@appcorp/shadcn 1.1.82 → 1.1.85

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 (33) hide show
  1. package/components/shadcn-io/copy-button/index.d.ts +1 -1
  2. package/components/ui/badge.d.ts +1 -1
  3. package/components/ui/button.d.ts +1 -1
  4. package/package.json +1 -1
  5. package/templates/appcorp-v1/footer/bottom-bar.d.ts +6 -0
  6. package/templates/appcorp-v1/footer/bottom-bar.js +25 -0
  7. package/templates/appcorp-v1/footer/cta.d.ts +6 -0
  8. package/templates/appcorp-v1/footer/cta.js +21 -0
  9. package/templates/appcorp-v1/footer/footer-grid.d.ts +14 -0
  10. package/templates/appcorp-v1/footer/footer-grid.js +52 -0
  11. package/templates/appcorp-v1/footer/index.d.ts +3 -0
  12. package/templates/appcorp-v1/footer/index.js +28 -0
  13. package/templates/appcorp-v1/footer/newsletter.d.ts +11 -0
  14. package/templates/appcorp-v1/footer/newsletter.js +28 -0
  15. package/templates/appcorp-v1/footer/stats.d.ts +6 -0
  16. package/templates/appcorp-v1/footer/stats.js +15 -0
  17. package/templates/appcorp-v1/header/announcement-bar.d.ts +3 -0
  18. package/templates/appcorp-v1/header/announcement-bar.js +15 -0
  19. package/templates/appcorp-v1/header/dropdown-panel.d.ts +8 -0
  20. package/templates/appcorp-v1/header/dropdown-panel.js +72 -0
  21. package/templates/appcorp-v1/header/index.d.ts +12 -0
  22. package/templates/appcorp-v1/header/index.js +16 -0
  23. package/templates/appcorp-v1/header/mobile-menu.d.ts +14 -0
  24. package/templates/appcorp-v1/header/mobile-menu.js +101 -0
  25. package/templates/appcorp-v1/header/navigation-bar.d.ts +3 -0
  26. package/templates/appcorp-v1/header/navigation-bar.js +117 -0
  27. package/templates/appcorp-v1/header/social-button.d.ts +7 -0
  28. package/templates/appcorp-v1/header/social-button.js +48 -0
  29. package/templates/appcorp-v1/home.d.ts +3 -0
  30. package/templates/appcorp-v1/home.js +27 -0
  31. package/templates/data/appcorp-v1.d.ts +93 -0
  32. package/templates/data/appcorp-v1.js +348 -0
  33. package/templates/school-v1/navigation.js +6 -6
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
  import { HTMLMotionProps } from "motion/react";
3
3
  import { type VariantProps } from "class-variance-authority";
4
4
  declare const buttonVariants: (props?: ({
5
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "muted" | null | undefined;
5
+ variant?: "secondary" | "default" | "destructive" | "outline" | "ghost" | "muted" | null | undefined;
6
6
  size?: "default" | "sm" | "lg" | "md" | null | undefined;
7
7
  } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
8
8
  type CopyButtonProps = Omit<HTMLMotionProps<"button">, "children" | "onCopy"> & VariantProps<typeof buttonVariants> & {
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { type VariantProps } from "class-variance-authority";
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
4
+ variant?: "secondary" | "default" | "destructive" | "outline" | null | undefined;
5
5
  } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
6
6
  export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { type VariantProps } from "class-variance-authority";
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "link" | "secondary" | "default" | "destructive" | "outline" | "ghost" | null | undefined;
5
5
  size?: "icon" | "default" | "sm" | "lg" | null | undefined;
6
6
  } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appcorp/shadcn",
3
- "version": "1.1.82",
3
+ "version": "1.1.85",
4
4
  "scripts": {
5
5
  "build:next": "next build",
6
6
  "build:storybook": "mv ../.pnp.cjs ../.pnp.cjs.bak 2>/dev/null || true && storybook build -c .storybook -o .out && mv ../.pnp.cjs.bak ../.pnp.cjs 2>/dev/null || true",
@@ -0,0 +1,6 @@
1
+ import { FC } from "react";
2
+ export interface BottomBarProps {
3
+ founded: string;
4
+ year: string;
5
+ }
6
+ export declare const BottomBar: FC<BottomBarProps>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BottomBar = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var link_1 = __importDefault(require("next/link"));
9
+ var BottomBar = function (_a) {
10
+ var founded = _a.founded, year = _a.year;
11
+ return (react_1.default.createElement("div", { className: "relative mx-auto max-w-7xl px-6 py-5 md:px-10" },
12
+ react_1.default.createElement("div", { className: "flex flex-col items-center justify-between gap-3 text-xs text-white/35 sm:flex-row" },
13
+ react_1.default.createElement("p", null,
14
+ "\u00A9 ",
15
+ year,
16
+ " App Corp Ltd. All rights reserved.",
17
+ founded ? " Est. ".concat(founded, ".") : ""),
18
+ react_1.default.createElement("div", { className: "flex flex-wrap items-center gap-x-5 gap-y-1" },
19
+ react_1.default.createElement(link_1.default, { href: "/privacy", className: "hover:text-white/70 transition-colors" }, "Privacy"),
20
+ react_1.default.createElement(link_1.default, { href: "/terms", className: "hover:text-white/70 transition-colors" }, "Terms"),
21
+ react_1.default.createElement(link_1.default, { href: "/contact", className: "hover:text-white/70 transition-colors" }, "Contact"),
22
+ react_1.default.createElement("span", { className: "hidden sm:inline text-white/20" }, "|"),
23
+ react_1.default.createElement("span", { className: "hidden sm:inline" }, "Crafted with care in London \uD83C\uDDEC\uD83C\uDDE7")))));
24
+ };
25
+ exports.BottomBar = BottomBar;
@@ -0,0 +1,6 @@
1
+ import { FC } from "react";
2
+ export interface CtaProps {
3
+ href: string;
4
+ label: string;
5
+ }
6
+ export declare const Cta: FC<CtaProps>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Cta = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var link_1 = __importDefault(require("next/link"));
9
+ var lucide_react_1 = require("lucide-react");
10
+ var Cta = function (_a) {
11
+ var href = _a.href, label = _a.label;
12
+ return (react_1.default.createElement("div", { className: "relative border-y border-white/8" },
13
+ react_1.default.createElement("div", { className: "mx-auto flex max-w-7xl flex-col items-center justify-between gap-5 px-6 py-8 text-center sm:flex-row sm:text-left md:px-10" },
14
+ react_1.default.createElement("div", null,
15
+ react_1.default.createElement("p", { className: "text-base font-semibold text-white" }, "Ready to build something remarkable?"),
16
+ react_1.default.createElement("p", { className: "mt-1 text-sm text-white/50" }, "Tell us what you want to ship \u2014 we'll tell you exactly how we'd build it.")),
17
+ react_1.default.createElement(link_1.default, { href: href, className: "inline-flex shrink-0 items-center gap-2 rounded-full bg-primary px-6 py-2.5 text-sm font-semibold text-primary-foreground shadow-lg transition-all hover:bg-primary/90 hover:shadow-primary/25" },
18
+ label,
19
+ react_1.default.createElement(lucide_react_1.ArrowRight, { className: "h-4 w-4" })))));
20
+ };
21
+ exports.Cta = Cta;
@@ -0,0 +1,14 @@
1
+ import { FC } from "react";
2
+ import { FooterColumn, SocialLink } from "../../../templates/data/appcorp-v1";
3
+ export interface FooterGridProps {
4
+ description: string;
5
+ email: string;
6
+ location: string;
7
+ logo: string;
8
+ name: string;
9
+ phone: string;
10
+ socialLinks: SocialLink[];
11
+ tagline: string;
12
+ columns: FooterColumn[];
13
+ }
14
+ export declare const FooterGrid: FC<FooterGridProps>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.FooterGrid = void 0;
18
+ var react_1 = __importDefault(require("react"));
19
+ var image_1 = __importDefault(require("next/image"));
20
+ var link_1 = __importDefault(require("next/link"));
21
+ var social_button_1 = require("../header/social-button");
22
+ var lucide_react_1 = require("lucide-react");
23
+ var badge_1 = require("../../../components/ui/badge");
24
+ var FooterGrid = function (_a) {
25
+ var columns = _a.columns, description = _a.description, email = _a.email, location = _a.location, logo = _a.logo, name = _a.name, phone = _a.phone, socialLinks = _a.socialLinks, tagline = _a.tagline;
26
+ return (react_1.default.createElement("div", { className: "relative mx-auto max-w-7xl px-6 pb-10 pt-16 md:px-10" },
27
+ react_1.default.createElement("div", { className: "grid gap-12 lg:grid-cols-[1.6fr_repeat(4,1fr)]" },
28
+ react_1.default.createElement("div", { className: "flex flex-col" },
29
+ react_1.default.createElement(link_1.default, { href: "/", className: "mb-5 inline-flex items-center gap-2.5", "aria-label": "App Corp home" },
30
+ react_1.default.createElement(image_1.default, { alt: "App Corp icon", className: "h-9 w-9", height: 36, src: logo, width: 36 }),
31
+ react_1.default.createElement("span", { className: "text-base font-semibold tracking-tight text-white" }, name)),
32
+ react_1.default.createElement("p", { className: "mb-4 text-sm font-medium leading-snug text-white/80" }, tagline),
33
+ react_1.default.createElement("p", { className: "mb-7 text-sm leading-relaxed text-white/45" }, description),
34
+ react_1.default.createElement("div", { className: "mb-7 flex items-center gap-2" }, socialLinks.map(function (s) { return (react_1.default.createElement(social_button_1.SocialButton, __assign({ key: s.label }, s))); })),
35
+ react_1.default.createElement("div", { className: "space-y-2" },
36
+ react_1.default.createElement("a", { href: "mailto:".concat(email), className: "flex items-center gap-2 text-xs text-white/45 transition-colors hover:text-white/80" },
37
+ react_1.default.createElement(lucide_react_1.Mail, { className: "h-3.5 w-3.5 shrink-0" }),
38
+ email),
39
+ phone && (react_1.default.createElement("a", { href: "tel:".concat(phone), className: "flex items-center gap-2 text-xs text-white/45 transition-colors hover:text-white/80" },
40
+ react_1.default.createElement(lucide_react_1.Phone, { className: "h-3.5 w-3.5 shrink-0" }),
41
+ phone)),
42
+ react_1.default.createElement("span", { className: "flex items-center gap-2 text-xs text-white/45" },
43
+ react_1.default.createElement(lucide_react_1.MapPin, { className: "h-3.5 w-3.5 shrink-0" }),
44
+ location))),
45
+ columns.slice(0, 4).map(function (col) { return (react_1.default.createElement("div", { key: col.heading },
46
+ react_1.default.createElement("h3", { className: "mb-5 text-xs font-semibold uppercase tracking-widest text-white/40" }, col.heading),
47
+ react_1.default.createElement("ul", { className: "space-y-3" }, col.links.map(function (link) { return (react_1.default.createElement("li", { key: link.label },
48
+ react_1.default.createElement(link_1.default, { href: link.href, className: "group inline-flex items-center gap-1.5 text-sm text-white/60 transition-colors hover:text-white" },
49
+ link.label,
50
+ link.badge && (react_1.default.createElement(badge_1.Badge, { className: "h-5 rounded-full bg-emerald-500/15 px-2 py-0 text-[10px] font-semibold text-emerald-400 border-0 whitespace-nowrap" }, link.badge))))); })))); }))));
51
+ };
52
+ exports.FooterGrid = FooterGrid;
@@ -0,0 +1,3 @@
1
+ import { FC } from "react";
2
+ import { FooterProps } from "@/templates/data/appcorp-v1";
3
+ export declare const SiteFooter: FC<FooterProps>;
@@ -0,0 +1,28 @@
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.SiteFooter = void 0;
8
+ var react_1 = __importDefault(require("react"));
9
+ var bottom_bar_1 = require("./bottom-bar");
10
+ var cta_1 = require("./cta");
11
+ var newsletter_1 = require("./newsletter");
12
+ var stats_1 = require("./stats");
13
+ var footer_grid_1 = require("./footer-grid");
14
+ var SiteFooter = function (_a) {
15
+ var ctas = _a.ctas, description = _a.description, email = _a.email, columns = _a.columns, founded = _a.founded, location = _a.location, logo = _a.logo, name = _a.name, newsletterBody = _a.newsletterBody, newsletterCta = _a.newsletterCta, newsletterDisclaimer = _a.newsletterDisclaimer, newsletterHeading = _a.newsletterHeading, newsletterPlaceholder = _a.newsletterPlaceholder, phone = _a.phone, socialLinks = _a.socialLinks, stats = _a.stats, tagline = _a.tagline, badges = _a.badges, year = _a.year;
16
+ return (react_1.default.createElement("footer", { className: "relative overflow-hidden bg-gray-800 text-background" },
17
+ react_1.default.createElement("div", { "aria-hidden": true, className: "bg-dot-grid pointer-events-none absolute inset-0 opacity-[0.04]" }),
18
+ react_1.default.createElement("div", { "aria-hidden": true, className: "pointer-events-none absolute -top-40 left-1/4 h-112 w-md rounded-full bg-primary/10 blur-3xl" }),
19
+ react_1.default.createElement(stats_1.Stats, { footerStats: stats }),
20
+ react_1.default.createElement(footer_grid_1.FooterGrid, { columns: columns, description: description, email: email, location: location, logo: logo, name: name, phone: phone, socialLinks: socialLinks, tagline: tagline }),
21
+ react_1.default.createElement(newsletter_1.Newsletter, { newsletterBody: newsletterBody, newsletterCta: newsletterCta, newsletterDisclaimer: newsletterDisclaimer, newsletterHeading: newsletterHeading, newsletterPlaceholder: newsletterPlaceholder, techBadges: badges }),
22
+ ctas
23
+ .filter(function (cta) { return cta.enabled; })
24
+ .sort(function (a, b) { return (a.order || 0) - (b.order || 0); })
25
+ .map(function (cta) { return (react_1.default.createElement(cta_1.Cta, { key: cta.label, href: cta.href, label: cta.label })); }),
26
+ react_1.default.createElement(bottom_bar_1.BottomBar, { year: year, founded: founded })));
27
+ };
28
+ exports.SiteFooter = SiteFooter;
@@ -0,0 +1,11 @@
1
+ import { FC } from "react";
2
+ import { TechBadge } from "../../../templates/data/appcorp-v1";
3
+ export interface NewsletterProps {
4
+ newsletterHeading: string;
5
+ newsletterBody: string;
6
+ newsletterPlaceholder: string;
7
+ newsletterCta: string;
8
+ newsletterDisclaimer: string;
9
+ techBadges: TechBadge[];
10
+ }
11
+ export declare const Newsletter: FC<NewsletterProps>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Newsletter = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var lucide_react_1 = require("lucide-react");
9
+ var Newsletter = function (_a) {
10
+ var newsletterHeading = _a.newsletterHeading, newsletterBody = _a.newsletterBody, newsletterPlaceholder = _a.newsletterPlaceholder, newsletterCta = _a.newsletterCta, newsletterDisclaimer = _a.newsletterDisclaimer, techBadges = _a.techBadges;
11
+ return (react_1.default.createElement("div", { className: "relative border-y border-white/8" },
12
+ react_1.default.createElement("div", { className: "mx-auto max-w-7xl px-6 py-10 md:px-10" },
13
+ react_1.default.createElement("div", { className: "grid gap-10 md:grid-cols-2 md:items-center" },
14
+ react_1.default.createElement("div", null,
15
+ react_1.default.createElement("h3", { className: "mb-1 text-base font-semibold text-white" }, newsletterHeading),
16
+ react_1.default.createElement("p", { className: "mb-4 text-sm text-white/50" }, newsletterBody),
17
+ react_1.default.createElement("form", { onSubmit: function (e) { return e.preventDefault(); }, className: "flex max-w-sm gap-2" },
18
+ react_1.default.createElement("input", { type: "email", placeholder: newsletterPlaceholder, className: "flex-1 rounded-full border border-white/10 bg-white/5 px-4 py-2 text-sm text-white placeholder:text-white/30 outline-none focus:border-white/25 focus:ring-0" }),
19
+ react_1.default.createElement("button", { type: "submit", className: "rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground transition-all hover:bg-primary/90" }, newsletterCta)),
20
+ react_1.default.createElement("p", { className: "mt-2 text-xs text-white/25" }, newsletterDisclaimer)),
21
+ react_1.default.createElement("div", { className: "flex flex-wrap justify-start gap-2 md:justify-end" }, techBadges
22
+ .filter(function (badge) { return badge.enabled; })
23
+ .sort(function (a, b) { return a.order - b.order; })
24
+ .map(function (badge) { return (react_1.default.createElement("span", { key: badge.label, className: "inline-flex items-center gap-1.5 rounded-full border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-white/60" },
25
+ react_1.default.createElement(lucide_react_1.CheckCircle2, { className: "h-3 w-3 text-emerald-400" }),
26
+ badge.label)); }))))));
27
+ };
28
+ exports.Newsletter = Newsletter;
@@ -0,0 +1,6 @@
1
+ import { FC } from "react";
2
+ import { FooterStat } from "../../../templates/data/appcorp-v1";
3
+ export interface StatsProps {
4
+ footerStats: FooterStat[];
5
+ }
6
+ export declare const Stats: FC<StatsProps>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Stats = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var Stats = function (_a) {
9
+ var footerStats = _a.footerStats;
10
+ return (react_1.default.createElement("div", { className: "relative border-b border-white/8" },
11
+ react_1.default.createElement("div", { className: "mx-auto grid max-w-7xl grid-cols-2 divide-x divide-white/8 px-6 md:grid-cols-4 md:px-10" }, footerStats.map(function (stat) { return (react_1.default.createElement("div", { key: stat.label, className: "flex flex-col items-center py-7 text-center" },
12
+ react_1.default.createElement("span", { className: "text-2xl font-bold tracking-tight text-white md:text-3xl" }, stat.value),
13
+ react_1.default.createElement("span", { className: "mt-1 text-xs text-white/50" }, stat.label))); }))));
14
+ };
15
+ exports.Stats = Stats;
@@ -0,0 +1,3 @@
1
+ import { FC } from "react";
2
+ import { AnnouncementBar as AnnouncementBarProps } from "../../data/appcorp-v1";
3
+ export declare const AnnouncementBar: FC<AnnouncementBarProps>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnnouncementBar = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var link_1 = __importDefault(require("next/link"));
9
+ var AnnouncementBar = function (_a) {
10
+ var text = _a.text, cta = _a.cta, href = _a.href;
11
+ return (react_1.default.createElement("div", { className: "fixed left-0 right-0 top-0 z-50 flex items-center justify-center gap-3 bg-foreground px-4 py-2 text-xs text-background/80" },
12
+ react_1.default.createElement("span", null, text),
13
+ react_1.default.createElement(link_1.default, { className: "font-semibold text-background underline-offset-2 hover:underline", href: href }, cta)));
14
+ };
15
+ exports.AnnouncementBar = AnnouncementBar;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { NavItem } from "../../data/appcorp-v1";
3
+ interface DropdownPanelProps {
4
+ item: NavItem;
5
+ onClose: () => void;
6
+ }
7
+ export declare const DropdownPanel: ({ item, onClose }: DropdownPanelProps) => React.JSX.Element | null;
8
+ export {};
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DropdownPanel = void 0;
40
+ var react_1 = __importDefault(require("react"));
41
+ var link_1 = __importDefault(require("next/link"));
42
+ var badge_1 = require("../../../components/ui/badge");
43
+ var lucide_react_1 = require("lucide-react");
44
+ var Icons = __importStar(require("lucide-react"));
45
+ var DropdownPanel = function (_a) {
46
+ var item = _a.item, onClose = _a.onClose;
47
+ if (!item.dropdown)
48
+ return null;
49
+ var isWide = item.dropdown.length >= 4;
50
+ return (react_1.default.createElement("div", { className: "absolute top-full mt-2.5 rounded-2xl border border-border/50 bg-background/98 shadow-xl backdrop-blur-lg\n ".concat(isWide ? "left-1/2 w-155 -translate-x-1/2" : "left-1/2 w-90 -translate-x-1/2"), style: { zIndex: 100 } },
51
+ react_1.default.createElement("div", { className: "absolute -top-px left-1/2 h-px w-24 -translate-x-1/2 bg-linear-to-r from-transparent via-primary/60 to-transparent" }),
52
+ react_1.default.createElement("div", { className: "p-3 ".concat(isWide ? "grid grid-cols-2 gap-1" : "flex flex-col gap-1") }, item.dropdown
53
+ .filter(function (sub) { return sub.enabled; })
54
+ .sort(function (a, b) { return a.order - b.order; })
55
+ .map(function (sub) {
56
+ var IconComp = Icons[sub.icon] || Icons.Circle;
57
+ return (react_1.default.createElement(link_1.default, { key: sub.href, href: sub.href, onClick: onClose, className: "group flex items-start gap-3.5 rounded-xl p-3.5 transition-all duration-150 hover:bg-muted/60" },
58
+ react_1.default.createElement("span", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-primary/8 transition-colors group-hover:bg-primary/14" },
59
+ react_1.default.createElement(IconComp, { className: "h-4.5 w-4.5 text-primary" })),
60
+ react_1.default.createElement("span", { className: "min-w-0" },
61
+ react_1.default.createElement("span", { className: "flex items-center gap-2 text-sm font-medium text-foreground" },
62
+ sub.label,
63
+ sub.badge && (react_1.default.createElement(badge_1.Badge, { className: "h-5 rounded-full bg-emerald-500/15 px-2 py-0 text-[10px] font-semibold text-emerald-600 border-0 whitespace-nowrap" }, sub.badge))),
64
+ react_1.default.createElement("span", { className: "mt-0.5 block text-xs leading-relaxed text-muted-foreground" }, sub.description))));
65
+ })),
66
+ react_1.default.createElement("div", { className: "border-t border-border/40 px-4 py-3 flex items-center justify-between" },
67
+ react_1.default.createElement("span", { className: "text-xs text-muted-foreground" }, "Not sure where to start?"),
68
+ react_1.default.createElement(link_1.default, { href: "/contact-new", onClick: onClose, className: "inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline" },
69
+ "Talk to us ",
70
+ react_1.default.createElement(lucide_react_1.ArrowRight, { className: "h-3 w-3" })))));
71
+ };
72
+ exports.DropdownPanel = DropdownPanel;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { AnnouncementBar as AnnouncementBarProps, Cta, NavItem } from "../../data/appcorp-v1";
3
+ export interface SiteHeaderProps {
4
+ announcementBar: AnnouncementBarProps;
5
+ headerCta: Cta[];
6
+ logo: string;
7
+ navItems: NavItem[];
8
+ email: string;
9
+ phone: string;
10
+ location: string;
11
+ }
12
+ export declare const SiteHeader: ({ announcementBar, headerCta, logo, navItems, email, phone, location, }: SiteHeaderProps) => React.JSX.Element;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SiteHeader = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var announcement_bar_1 = require("./announcement-bar");
9
+ var navigation_bar_1 = require("./navigation-bar");
10
+ var SiteHeader = function (_a) {
11
+ var announcementBar = _a.announcementBar, headerCta = _a.headerCta, logo = _a.logo, navItems = _a.navItems, email = _a.email, phone = _a.phone, location = _a.location;
12
+ return (react_1.default.createElement(react_1.default.Fragment, null,
13
+ react_1.default.createElement(announcement_bar_1.AnnouncementBar, { text: announcementBar.text, cta: announcementBar.cta, href: announcementBar.href }),
14
+ react_1.default.createElement(navigation_bar_1.NavigationBar, { logo: logo, navItems: navItems, headerCta: headerCta, email: email, phone: phone, location: location })));
15
+ };
16
+ exports.SiteHeader = SiteHeader;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Cta, NavItem } from "../../data/appcorp-v1";
3
+ interface MobileMenuProps {
4
+ announcementVisible?: boolean;
5
+ headerCta: Cta[];
6
+ items: NavItem[];
7
+ logo: string;
8
+ onClose: () => void;
9
+ email: string;
10
+ phone: string;
11
+ location: string;
12
+ }
13
+ export declare function MobileMenu({ headerCta, items, logo, onClose, email, phone, location, }: MobileMenuProps): React.JSX.Element;
14
+ export {};
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.MobileMenu = MobileMenu;
40
+ var lucide_react_1 = require("lucide-react");
41
+ var image_1 = __importDefault(require("next/image"));
42
+ var link_1 = __importDefault(require("next/link"));
43
+ var react_1 = __importStar(require("react"));
44
+ var Icons = __importStar(require("lucide-react"));
45
+ var badge_1 = require("../../../components/ui/badge");
46
+ var button_1 = require("../../../components/ui/button");
47
+ var lucide_react_2 = require("lucide-react");
48
+ function MobileMenu(_a) {
49
+ var headerCta = _a.headerCta, items = _a.items, logo = _a.logo, onClose = _a.onClose, email = _a.email, phone = _a.phone, location = _a.location;
50
+ var _b = (0, react_1.useState)(null), openSection = _b[0], setOpenSection = _b[1];
51
+ var toggle = function (label) {
52
+ return setOpenSection(function (prev) { return (prev === label ? null : label); });
53
+ };
54
+ return (react_1.default.createElement("div", { className: "fixed inset-x-0 bottom-0 z-50 flex flex-col bg-background top-8" },
55
+ react_1.default.createElement("div", { className: "flex h-16 items-center justify-between border-b border-border/40 px-6" },
56
+ react_1.default.createElement(link_1.default, { href: "/", onClick: onClose, className: "flex items-center gap-2.5" },
57
+ react_1.default.createElement(image_1.default, { src: logo, alt: "App Corp icon", width: 32, height: 32, className: "h-8 w-8", priority: true }),
58
+ react_1.default.createElement("span", { className: "text-base font-semibold tracking-tight text-foreground" }, "App Corp")),
59
+ react_1.default.createElement("button", { onClick: onClose, "aria-label": "Close menu", className: "flex h-9 w-9 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground" },
60
+ react_1.default.createElement(lucide_react_1.X, { className: "h-5 w-5" }))),
61
+ react_1.default.createElement("nav", { className: "flex-1 overflow-y-auto px-4 py-4" }, items.map(function (item) {
62
+ var isOpen = openSection === item.label;
63
+ if (item.dropdown) {
64
+ return (react_1.default.createElement("div", { key: item.label, className: "mb-1" },
65
+ react_1.default.createElement("button", { onClick: function () { return toggle(item.label); }, className: "flex w-full items-center justify-between rounded-xl px-4 py-3 text-sm font-medium text-foreground transition-colors hover:bg-muted" },
66
+ item.label,
67
+ react_1.default.createElement(lucide_react_1.ChevronDown, { className: "h-4 w-4 text-muted-foreground transition-transform duration-200 ".concat(isOpen ? "rotate-180" : "") })),
68
+ isOpen && (react_1.default.createElement("div", { className: "mb-2 mt-1 space-y-0.5 pl-2" }, item.dropdown.map(function (sub) {
69
+ var IconComp = Icons[sub.icon] || Icons.Circle;
70
+ return (react_1.default.createElement(link_1.default, { key: sub.href, href: sub.href, onClick: onClose, className: "group flex items-start gap-3 rounded-xl px-4 py-3 transition-colors hover:bg-muted/60" },
71
+ react_1.default.createElement("span", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 transition-colors group-hover:bg-primary/15" },
72
+ react_1.default.createElement(IconComp, { className: "h-4 w-4 text-primary" })),
73
+ react_1.default.createElement("span", null,
74
+ react_1.default.createElement("span", { className: "flex items-center gap-2 text-sm font-medium text-foreground" },
75
+ sub.label,
76
+ sub.badge && (react_1.default.createElement(badge_1.Badge, { className: "h-4 rounded-full bg-emerald-500/15 px-1.5 py-0 text-[10px] font-semibold text-emerald-600 border-0" }, sub.badge))),
77
+ react_1.default.createElement("span", { className: "mt-0.5 line-clamp-1 text-xs text-muted-foreground" }, sub.description))));
78
+ })))));
79
+ }
80
+ return (react_1.default.createElement(link_1.default, { key: item.label, href: item.href, onClick: onClose, className: "flex items-center justify-between rounded-xl px-4 py-3 text-sm font-medium text-foreground transition-colors hover:bg-muted" },
81
+ item.label,
82
+ react_1.default.createElement(lucide_react_1.ArrowRight, { className: "h-3.5 w-3.5 text-muted-foreground" })));
83
+ })),
84
+ react_1.default.createElement("div", { className: "border-t border-border/40 p-5 space-y-3" },
85
+ react_1.default.createElement("div", { className: "flex items-center gap-2 text-xs text-muted-foreground" },
86
+ react_1.default.createElement(lucide_react_2.Mail, { className: "h-3.5 w-3.5 shrink-0" }),
87
+ react_1.default.createElement("span", null, email)),
88
+ phone && (react_1.default.createElement("div", { className: "flex items-center gap-2 text-xs text-muted-foreground" },
89
+ react_1.default.createElement(lucide_react_2.Phone, { className: "h-3.5 w-3.5 shrink-0" }),
90
+ react_1.default.createElement("span", null, phone))),
91
+ react_1.default.createElement("div", { className: "flex items-center gap-2 text-xs text-muted-foreground" },
92
+ react_1.default.createElement(lucide_react_2.MapPin, { className: "h-3.5 w-3.5 shrink-0" }),
93
+ react_1.default.createElement("span", null, location)),
94
+ react_1.default.createElement("div", { className: "flex flex-row gap-3 mt-1" }, headerCta
95
+ .filter(function (cta) { return cta.enabled; })
96
+ .sort(function (a, b) { return a.order - b.order; })
97
+ .map(function (cta) {
98
+ return (react_1.default.createElement(button_1.Button, { asChild: true, className: "flex-1 rounded-full ".concat(cta.type === "primary" ? "bg-primary text-white" : "bg-secondary text-foreground hover:bg-foreground hover:text-background"), key: cta.href, size: "default" },
99
+ react_1.default.createElement(link_1.default, { href: cta.href }, cta.label)));
100
+ })))));
101
+ }
@@ -0,0 +1,3 @@
1
+ import { FC } from "react";
2
+ import { SiteHeaderProps } from ".";
3
+ export declare const NavigationBar: FC<Omit<SiteHeaderProps, "announcementBar">>;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.NavigationBar = void 0;
40
+ var lucide_react_1 = require("lucide-react");
41
+ var image_1 = __importDefault(require("next/image"));
42
+ var link_1 = __importDefault(require("next/link"));
43
+ var navigation_1 = require("next/navigation");
44
+ var react_1 = __importStar(require("react"));
45
+ var button_1 = require("../../../components/ui/button");
46
+ var dropdown_panel_1 = require("./dropdown-panel");
47
+ var mobile_menu_1 = require("./mobile-menu");
48
+ var NavigationBar = function (_a) {
49
+ var headerCta = _a.headerCta, logo = _a.logo, navItems = _a.navItems, email = _a.email, phone = _a.phone, location = _a.location;
50
+ var pathname = (0, navigation_1.usePathname)();
51
+ var _b = (0, react_1.useState)(false), scrolled = _b[0], setScrolled = _b[1];
52
+ var _c = (0, react_1.useState)(false), mobileOpen = _c[0], setMobileOpen = _c[1];
53
+ var _d = (0, react_1.useState)(null), activeDropdown = _d[0], setActiveDropdown = _d[1];
54
+ var timeoutRef = (0, react_1.useRef)(null);
55
+ // Scroll detection
56
+ (0, react_1.useEffect)(function () {
57
+ var onScroll = function () { return setScrolled(window.scrollY > 20); };
58
+ window.addEventListener("scroll", onScroll, { passive: true });
59
+ return function () { return window.removeEventListener("scroll", onScroll); };
60
+ }, []);
61
+ // Lock body scroll when mobile menu open
62
+ (0, react_1.useEffect)(function () {
63
+ document.body.style.overflow = mobileOpen ? "hidden" : "";
64
+ return function () {
65
+ document.body.style.overflow = "";
66
+ };
67
+ }, [mobileOpen]);
68
+ var openDropdown = function (label) {
69
+ if (timeoutRef.current)
70
+ clearTimeout(timeoutRef.current);
71
+ setActiveDropdown(label);
72
+ };
73
+ var closeDropdown = function () {
74
+ timeoutRef.current = setTimeout(function () { return setActiveDropdown(null); }, 150);
75
+ };
76
+ var keepOpen = function () {
77
+ if (timeoutRef.current)
78
+ clearTimeout(timeoutRef.current);
79
+ };
80
+ return (react_1.default.createElement("header", { className: "fixed left-0 right-0 z-40 transition-all duration-300 top-8\n ".concat(scrolled
81
+ ? "border-b border-border/40 bg-background/95 shadow-sm backdrop-blur-md"
82
+ : "bg-transparent") },
83
+ react_1.default.createElement("div", { className: "relative mx-auto flex h-17 w-full max-w-350 items-center justify-between px-6 md:px-10" },
84
+ react_1.default.createElement(link_1.default, { href: "/", className: "flex shrink-0 items-center gap-2.5", "aria-label": "App Corp \u2014 home" },
85
+ react_1.default.createElement(image_1.default, { src: logo, alt: "App Corp icon", width: 32, height: 32, className: "h-8 w-8", priority: true }),
86
+ react_1.default.createElement("span", { className: "text-base font-semibold tracking-tight text-foreground" }, "App Corp")),
87
+ react_1.default.createElement("nav", { className: "absolute left-1/2 top-1/2 hidden -translate-x-1/2 -translate-y-1/2 lg:block", "aria-label": "Main navigation" },
88
+ react_1.default.createElement("ul", { className: "flex items-center gap-1" }, navItems
89
+ .filter(function (item) { return item.enabled; })
90
+ .sort(function (a, b) { return a.order - b.order; })
91
+ .map(function (item) {
92
+ var hasDropdown = !!item.dropdown;
93
+ var isActive = activeDropdown === item.label;
94
+ return (react_1.default.createElement("li", { key: item.label, className: "relative" },
95
+ hasDropdown ? (react_1.default.createElement("button", { onMouseEnter: function () { return openDropdown(item.label); }, onMouseLeave: closeDropdown, onFocus: function () { return openDropdown(item.label); }, onBlur: closeDropdown, className: "inline-flex items-center gap-1.5 rounded-xl px-3.5 py-2 text-sm font-medium transition-colors\n ".concat(isActive
96
+ ? "bg-muted text-foreground"
97
+ : "text-muted-foreground hover:bg-muted/70 hover:text-foreground"), "aria-expanded": isActive },
98
+ item.label,
99
+ react_1.default.createElement(lucide_react_1.ChevronDown, { className: "h-3.5 w-3.5 transition-transform duration-200 ".concat(isActive ? "rotate-180" : "") }))) : (react_1.default.createElement(link_1.default, { href: item.href, className: "inline-flex items-center gap-1.5 rounded-xl px-3.5 py-2 text-sm font-medium transition-colors\n ".concat(pathname === item.href
100
+ ? "text-foreground bg-muted"
101
+ : "text-muted-foreground hover:bg-muted/70 hover:text-foreground") }, item.label)),
102
+ hasDropdown && isActive && (react_1.default.createElement("div", { onMouseEnter: keepOpen, onMouseLeave: closeDropdown },
103
+ react_1.default.createElement(dropdown_panel_1.DropdownPanel, { item: item, onClose: function () { return setActiveDropdown(null); } })))));
104
+ }))),
105
+ react_1.default.createElement("div", { className: "flex shrink-0 items-center gap-3" },
106
+ headerCta
107
+ .filter(function (cta) { return cta.enabled; })
108
+ .sort(function (a, b) { return a.order - b.order; })
109
+ .map(function (cta) {
110
+ return (react_1.default.createElement(button_1.Button, { asChild: true, className: "hidden rounded-full px-5 text-sm shadow-sm transition-all hover:bg-foreground/90 lg:inline-flex ".concat(cta.type === "primary" ? "bg-primary text-white" : "bg-secondary text-foreground hover:bg-foreground hover:text-background"), key: cta.href, size: "default" },
111
+ react_1.default.createElement(link_1.default, { href: cta.href }, cta.label)));
112
+ }),
113
+ react_1.default.createElement("button", { onClick: function () { return setMobileOpen(true); }, "aria-label": "Open menu", className: "flex h-9 w-9 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground lg:hidden" },
114
+ react_1.default.createElement(lucide_react_1.Menu, { className: "h-5 w-5" })),
115
+ mobileOpen && (react_1.default.createElement(mobile_menu_1.MobileMenu, { items: navItems, onClose: function () { return setMobileOpen(false); }, logo: logo, headerCta: headerCta, email: email, phone: phone, location: location }))))));
116
+ };
117
+ exports.NavigationBar = NavigationBar;
@@ -0,0 +1,7 @@
1
+ import { FC } from "react";
2
+ export interface SocialButtonProps {
3
+ label: string;
4
+ href: string;
5
+ icon: string;
6
+ }
7
+ export declare const SocialButton: FC<SocialButtonProps>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SocialButton = void 0;
40
+ var react_1 = __importDefault(require("react"));
41
+ var Icons = __importStar(require("lucide-react"));
42
+ var SocialButton = function (_a) {
43
+ var label = _a.label, href = _a.href, icon = _a.icon;
44
+ var IconComp = Icons[icon] || Icons.Globe;
45
+ return (react_1.default.createElement("a", { "aria-label": label, className: "flex h-9 w-9 items-center justify-center rounded-full border border-white/10 bg-white/5 text-white/60 transition-all hover:border-white/25 hover:bg-white/10 hover:text-white", href: href, rel: "noopener noreferrer", target: "_blank" },
46
+ react_1.default.createElement(IconComp, { className: "h-4 w-4" })));
47
+ };
48
+ exports.SocialButton = SocialButton;
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import { AppCorpV1HomeTemplateProps } from "@/templates/data/appcorp-v1";
3
+ export declare const AppCorpV1HomeTemplate: ({ siteHeader, siteFooter, }: AppCorpV1HomeTemplateProps) => React.JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.AppCorpV1HomeTemplate = void 0;
18
+ var react_1 = __importDefault(require("react"));
19
+ var footer_1 = require("./footer");
20
+ var header_1 = require("./header");
21
+ var AppCorpV1HomeTemplate = function (_a) {
22
+ var siteHeader = _a.siteHeader, siteFooter = _a.siteFooter;
23
+ return (react_1.default.createElement("div", null,
24
+ react_1.default.createElement(header_1.SiteHeader, __assign({}, siteHeader)),
25
+ react_1.default.createElement(footer_1.SiteFooter, __assign({}, siteFooter))));
26
+ };
27
+ exports.AppCorpV1HomeTemplate = AppCorpV1HomeTemplate;
@@ -0,0 +1,93 @@
1
+ export type AnnouncementBar = {
2
+ text: string;
3
+ cta: string;
4
+ href: string;
5
+ };
6
+ export interface NavDropdownItem {
7
+ badge?: string;
8
+ description: string;
9
+ enabled: boolean;
10
+ href: string;
11
+ icon: string;
12
+ label: string;
13
+ order: number;
14
+ }
15
+ export interface NavItem {
16
+ dropdown?: NavDropdownItem[];
17
+ enabled: boolean;
18
+ href?: string;
19
+ label: string;
20
+ order: number;
21
+ }
22
+ export interface Cta {
23
+ href: string;
24
+ enabled: boolean;
25
+ label: string;
26
+ order: number;
27
+ type: "primary" | "secondary";
28
+ }
29
+ export interface FooterLinkItem {
30
+ label: string;
31
+ href: string;
32
+ badge?: string;
33
+ }
34
+ export interface FooterColumn {
35
+ heading: string;
36
+ links: FooterLinkItem[];
37
+ }
38
+ export interface SocialLink {
39
+ enabled: boolean;
40
+ href: string;
41
+ icon: string;
42
+ label: string;
43
+ order: number;
44
+ }
45
+ export interface FooterStat {
46
+ value: string;
47
+ label: string;
48
+ }
49
+ export interface TechBadge {
50
+ label: string;
51
+ enabled: boolean;
52
+ order: number;
53
+ }
54
+ export interface HeaderProps {
55
+ navItems: NavItem[];
56
+ announcementBar: AnnouncementBar;
57
+ headerCta: Cta[];
58
+ logo: string;
59
+ email: string;
60
+ phone: string;
61
+ location: string;
62
+ }
63
+ export interface FooterProps {
64
+ badges: TechBadge[];
65
+ columns: FooterColumn[];
66
+ ctas: Cta[];
67
+ description: string;
68
+ email: string;
69
+ founded: string;
70
+ location: string;
71
+ logo: string;
72
+ name: string;
73
+ newsletterBody: string;
74
+ newsletterCta: string;
75
+ newsletterDisclaimer: string;
76
+ newsletterHeading: string;
77
+ newsletterPlaceholder: string;
78
+ phone: string;
79
+ socialLinks: SocialLink[];
80
+ stats: FooterStat[];
81
+ tagline: string;
82
+ year: string;
83
+ }
84
+ export interface AppCorpV1HomeTemplateProps {
85
+ siteHeader: HeaderProps;
86
+ siteFooter: FooterProps;
87
+ }
88
+ export declare const announcementBar: AnnouncementBar;
89
+ export declare const navItems: NavItem[];
90
+ export declare const headerCta: Cta[];
91
+ export declare const header: HeaderProps;
92
+ export declare const footer: FooterProps;
93
+ export declare const homePageData: AppCorpV1HomeTemplateProps;
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.homePageData = exports.footer = exports.header = exports.headerCta = exports.navItems = exports.announcementBar = void 0;
15
+ // Data constants
16
+ exports.announcementBar = {
17
+ text: "Introducing AI Operating System for Business & School — our most powerful products yet.",
18
+ cta: "Explore products →",
19
+ href: "/product/ai-os-business",
20
+ };
21
+ exports.navItems = [
22
+ {
23
+ label: "Products",
24
+ order: 1,
25
+ enabled: true,
26
+ dropdown: [
27
+ {
28
+ label: "AI Operating System for Business",
29
+ description: "An end-to-end AI layer for your entire business — automate operations, unify data, and make decisions 10× faster.",
30
+ href: "/product/ai-os-business",
31
+ icon: "Building2",
32
+ badge: "New",
33
+ order: 1,
34
+ enabled: true,
35
+ },
36
+ {
37
+ label: "AI Operating System for School",
38
+ description: "Transform your institution with AI — personalised learning, automated admin, and real-time analytics for educators.",
39
+ href: "/product/ai-os-school",
40
+ icon: "GraduationCap",
41
+ badge: "New",
42
+ order: 2,
43
+ enabled: true,
44
+ },
45
+ ],
46
+ },
47
+ {
48
+ label: "Services",
49
+ order: 2,
50
+ enabled: true,
51
+ dropdown: [
52
+ {
53
+ label: "AI & Machine Learning",
54
+ description: "Predictive models, NLP pipelines, LLM integrations, and ML infrastructure built for production scale.",
55
+ href: "/service/ai-machine-learning",
56
+ icon: "Brain",
57
+ order: 1,
58
+ enabled: true,
59
+ },
60
+ {
61
+ label: "Custom Web Development",
62
+ description: "Full-stack web applications engineered for performance, long-term maintainability, and global scale.",
63
+ href: "/service/custom-web-development",
64
+ icon: "Code2",
65
+ order: 2,
66
+ enabled: true,
67
+ },
68
+ {
69
+ label: "UI / UX Design",
70
+ description: "Research-led design systems and interfaces that reduce churn, increase conversion, and delight users.",
71
+ href: "/service/ui-ux-design",
72
+ icon: "Palette",
73
+ order: 3,
74
+ enabled: true,
75
+ },
76
+ {
77
+ label: "Mobile App Development",
78
+ description: "Cross-platform iOS and Android applications with native performance and offline-first architecture.",
79
+ href: "/service/mobile-app-development",
80
+ icon: "Smartphone",
81
+ order: 4,
82
+ enabled: true,
83
+ },
84
+ {
85
+ label: "MVP Development",
86
+ description: "From validated idea to first paying customer in 8–16 weeks — scoped, engineered, and shipped on time.",
87
+ href: "/service/mvp-development",
88
+ icon: "Rocket",
89
+ badge: "Fast-track",
90
+ order: 5,
91
+ enabled: true,
92
+ },
93
+ {
94
+ label: "SaaS Platform Development",
95
+ description: "Multi-tenant SaaS platforms built for thousands of customers, millions of events, and ISO-27001 compliance.",
96
+ href: "/service/saas-platform-development",
97
+ icon: "Layers",
98
+ order: 6,
99
+ enabled: true,
100
+ },
101
+ ],
102
+ },
103
+ {
104
+ label: "Work",
105
+ order: 3,
106
+ enabled: true,
107
+ dropdown: [
108
+ {
109
+ label: "Case Studies",
110
+ description: "Six in-depth breakdowns of real problems, real architecture decisions, and real measurable business outcomes.",
111
+ href: "/case-study",
112
+ icon: "BarChart3",
113
+ order: 1,
114
+ enabled: true,
115
+ },
116
+ {
117
+ label: "Portfolio",
118
+ description: "500+ projects across fintech, healthcare, logistics, e-commerce, SaaS, and emerging technology.",
119
+ href: "/portfolio",
120
+ icon: "Briefcase",
121
+ order: 2,
122
+ enabled: true,
123
+ },
124
+ {
125
+ label: "Client Results",
126
+ description: "$250M+ in measurable revenue generated for clients. See the numbers behind the outcomes we deliver.",
127
+ href: "/case-study",
128
+ icon: "TrendingUp",
129
+ order: 3,
130
+ enabled: true,
131
+ },
132
+ ],
133
+ },
134
+ {
135
+ label: "Company",
136
+ order: 4,
137
+ enabled: true,
138
+ dropdown: [
139
+ {
140
+ label: "About App Corp",
141
+ description: "The team, the mission, the values, and why 200+ companies across 28 countries trust us with their critical builds.",
142
+ href: "/about",
143
+ icon: "Building2",
144
+ order: 1,
145
+ enabled: true,
146
+ },
147
+ {
148
+ label: "Blog & Engineering Insights",
149
+ description: "Architecture deep-dives, engineering guides, product strategy, and technical commentary from our team.",
150
+ href: "/blog",
151
+ icon: "BookOpen",
152
+ order: 2,
153
+ enabled: true,
154
+ },
155
+ {
156
+ label: "Careers",
157
+ description: "Join a team that ships ambitious products and grows fast. Senior engineering roles always open.",
158
+ href: "/careers",
159
+ icon: "Users",
160
+ badge: "Hiring",
161
+ order: 3,
162
+ enabled: true,
163
+ },
164
+ ],
165
+ },
166
+ {
167
+ label: "Contact",
168
+ order: 5,
169
+ enabled: true,
170
+ href: "/contact",
171
+ },
172
+ ];
173
+ exports.headerCta = [
174
+ {
175
+ label: "View our work",
176
+ href: "/case-study",
177
+ order: 1,
178
+ enabled: true,
179
+ type: "secondary",
180
+ },
181
+ {
182
+ label: "Schedule a Call",
183
+ href: "/contact-new",
184
+ order: 2,
185
+ enabled: true,
186
+ type: "primary",
187
+ },
188
+ ];
189
+ exports.header = {
190
+ navItems: exports.navItems,
191
+ announcementBar: exports.announcementBar,
192
+ headerCta: exports.headerCta,
193
+ logo: "/appcorp-logo.svg",
194
+ email: "info@appcorp.org",
195
+ phone: "+92 349 4913126",
196
+ location: "Lahore, Pakistan",
197
+ };
198
+ exports.footer = {
199
+ name: "App Corp",
200
+ tagline: "We build software that powers the next generation of market leaders.",
201
+ description: "A full-service software engineering agency trusted by startups, scale-ups, and enterprises across the US, UK, and EU. From zero-to-one MVPs to enterprise platform rebuilds — we engineer measurable outcomes, not just code.",
202
+ email: "info@appcorp.org",
203
+ phone: "+92 349 4913126",
204
+ location: "Lahore, Pakistan",
205
+ founded: "2017",
206
+ year: new Date().getFullYear().toString(),
207
+ logo: "/appcorp-logo.svg",
208
+ newsletterBody: "Architecture deep-dives, technology decisions, and product strategy from senior engineers who ship. No fluff.",
209
+ newsletterCta: "Subscribe",
210
+ newsletterDisclaimer: "No spam. Unsubscribe any time.",
211
+ newsletterHeading: "Engineering insights, monthly.",
212
+ newsletterPlaceholder: "your@email.com",
213
+ ctas: [
214
+ {
215
+ label: "Schedule a Call",
216
+ href: "/contact-new",
217
+ type: "primary",
218
+ enabled: true,
219
+ order: 1,
220
+ },
221
+ {
222
+ label: "View our Work",
223
+ href: "/case-study",
224
+ type: "secondary",
225
+ enabled: false,
226
+ order: 2,
227
+ },
228
+ ],
229
+ columns: [
230
+ {
231
+ heading: "Products",
232
+ links: [
233
+ {
234
+ label: "AI OS for Business",
235
+ href: "/product/ai-os-business",
236
+ badge: "New",
237
+ },
238
+ {
239
+ label: "AI OS for School",
240
+ href: "/product/ai-os-school",
241
+ badge: "New",
242
+ },
243
+ ],
244
+ },
245
+ {
246
+ heading: "Services",
247
+ links: [
248
+ {
249
+ label: "AI & Machine Learning",
250
+ href: "/service/ai-machine-learning",
251
+ },
252
+ {
253
+ label: "Custom Web Development",
254
+ href: "/service/custom-web-development",
255
+ },
256
+ { label: "UI / UX Design", href: "/service-detail/ui-ux-design" },
257
+ {
258
+ label: "Mobile App Development",
259
+ href: "/service/mobile-app-development",
260
+ },
261
+ {
262
+ label: "MVP Development",
263
+ href: "/service/mvp-development",
264
+ badge: "Fast-track",
265
+ },
266
+ {
267
+ label: "SaaS Platform Development",
268
+ href: "/service/saas-platform-development",
269
+ },
270
+ ],
271
+ },
272
+ {
273
+ heading: "Work",
274
+ links: [
275
+ { label: "Case Studies", href: "/case-study" },
276
+ { label: "Portfolio", href: "/portfolio" },
277
+ { label: "Client Results", href: "/case-study" },
278
+ { label: "Industries We Serve", href: "/about" },
279
+ ],
280
+ },
281
+ {
282
+ heading: "Company",
283
+ links: [
284
+ { label: "About Us", href: "/about" },
285
+ { label: "Blog & Insights", href: "/blog" },
286
+ { label: "Pricing", href: "/pricing" },
287
+ { label: "Careers", href: "/careers", badge: "Hiring" },
288
+ { label: "Contact Us", href: "/contact" },
289
+ ],
290
+ },
291
+ {
292
+ heading: "Legal",
293
+ links: [
294
+ { label: "Privacy Policy", href: "/privacy" },
295
+ { label: "Terms & Conditions", href: "/terms" },
296
+ { label: "Cookie Policy", href: "/privacy" },
297
+ { label: "Security", href: "/privacy" },
298
+ ],
299
+ },
300
+ ],
301
+ socialLinks: [
302
+ {
303
+ label: "LinkedIn",
304
+ href: "https://linkedin.com/company/appcorp",
305
+ icon: "Linkedin",
306
+ enabled: true,
307
+ order: 1,
308
+ },
309
+ {
310
+ label: "Twitter / X",
311
+ href: "https://twitter.com/appcorp",
312
+ icon: "Twitter",
313
+ enabled: true,
314
+ order: 2,
315
+ },
316
+ {
317
+ label: "GitHub",
318
+ href: "https://github.com/appcorp",
319
+ icon: "Github",
320
+ enabled: true,
321
+ order: 3,
322
+ },
323
+ {
324
+ label: "YouTube",
325
+ href: "https://youtube.com/@appcorp",
326
+ icon: "Youtube",
327
+ enabled: true,
328
+ order: 4,
329
+ },
330
+ ],
331
+ badges: [
332
+ { label: "AWS Partner", enabled: true, order: 1 },
333
+ { label: "ISO 27001 Aligned", enabled: true, order: 2 },
334
+ { label: "SOC 2 Ready", enabled: true, order: 3 },
335
+ { label: "GDPR Compliant", enabled: true, order: 4 },
336
+ { label: "PCI DSS Capable", enabled: true, order: 5 },
337
+ ],
338
+ stats: [
339
+ { value: "200+", label: "Projects Shipped" },
340
+ { value: "100+", label: "Clients Worldwide" },
341
+ { value: "$50M+", label: "Client Revenue Generated" },
342
+ { value: "98%", label: "Client Retention Rate" },
343
+ ],
344
+ };
345
+ exports.homePageData = {
346
+ siteHeader: __assign({}, exports.header),
347
+ siteFooter: __assign({}, exports.footer),
348
+ };
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
40
40
  exports.Navigation = void 0;
41
41
  var react_1 = __importStar(require("react"));
42
42
  var link_1 = __importDefault(require("next/link"));
43
+ var navigation_1 = require("next/navigation");
43
44
  var button_1 = require("../../components/ui/button");
44
45
  var sheet_1 = require("../../components/ui/sheet");
45
46
  var separator_1 = require("../../components/ui/separator");
@@ -47,13 +48,12 @@ var lucide_react_1 = require("lucide-react");
47
48
  var utils_1 = require("../../lib/utils");
48
49
  var Navigation = function (_a) {
49
50
  var brandFullName = _a.brandFullName, brandShortName = _a.brandShortName, ctaHref = _a.ctaHref, ctaLabel = _a.ctaLabel, items = _a.items;
51
+ var pathname = (0, navigation_1.usePathname)();
52
+ var isHome = pathname === "/";
50
53
  var _b = (0, react_1.useState)(false), scrolled = _b[0], setScrolled = _b[1];
51
- var _c = (0, react_1.useState)(false), isHome = _c[0], setIsHome = _c[1];
52
- var _d = (0, react_1.useState)(false), open = _d[0], setOpen = _d[1];
54
+ var _c = (0, react_1.useState)(false), open = _c[0], setOpen = _c[1];
53
55
  (0, react_1.useEffect)(function () {
54
- var home = window.location.pathname === "/";
55
- setIsHome(home);
56
- if (home) {
56
+ if (isHome) {
57
57
  var handleScroll_1 = function () { return setScrolled(window.scrollY > 20); };
58
58
  window.addEventListener("scroll", handleScroll_1);
59
59
  handleScroll_1();
@@ -62,7 +62,7 @@ var Navigation = function (_a) {
62
62
  else {
63
63
  setScrolled(false);
64
64
  }
65
- }, []);
65
+ }, [isHome]);
66
66
  return (react_1.default.createElement("div", { className: (0, utils_1.cn)(isHome
67
67
  ? "fixed top-0 z-50 w-full transition-all duration-300"
68
68
  : "sticky top-0 z-50 w-full", isHome