@appcorp/shadcn 1.1.83 → 1.1.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/enhanced-slider.d.ts +19 -0
- package/components/enhanced-slider.js +80 -0
- package/components/shadcn-io/copy-button/index.d.ts +1 -1
- package/components/ui/badge.d.ts +1 -1
- package/components/ui/button.d.ts +1 -1
- package/components/ui/slider.js +9 -1
- package/package.json +3 -2
- package/templates/appcorp-v1/footer/bottom-bar.d.ts +6 -0
- package/templates/appcorp-v1/footer/bottom-bar.js +25 -0
- package/templates/appcorp-v1/footer/cta.d.ts +6 -0
- package/templates/appcorp-v1/footer/cta.js +21 -0
- package/templates/appcorp-v1/footer/footer-grid.d.ts +14 -0
- package/templates/appcorp-v1/footer/footer-grid.js +52 -0
- package/templates/appcorp-v1/footer/index.d.ts +3 -0
- package/templates/appcorp-v1/footer/index.js +28 -0
- package/templates/appcorp-v1/footer/newsletter.d.ts +11 -0
- package/templates/appcorp-v1/footer/newsletter.js +28 -0
- package/templates/appcorp-v1/footer/stats.d.ts +6 -0
- package/templates/appcorp-v1/footer/stats.js +15 -0
- package/templates/appcorp-v1/header/announcement-bar.d.ts +3 -0
- package/templates/appcorp-v1/header/announcement-bar.js +15 -0
- package/templates/appcorp-v1/header/dropdown-panel.d.ts +8 -0
- package/templates/appcorp-v1/header/dropdown-panel.js +72 -0
- package/templates/appcorp-v1/header/index.d.ts +12 -0
- package/templates/appcorp-v1/header/index.js +16 -0
- package/templates/appcorp-v1/header/mobile-menu.d.ts +14 -0
- package/templates/appcorp-v1/header/mobile-menu.js +101 -0
- package/templates/appcorp-v1/header/navigation-bar.d.ts +3 -0
- package/templates/appcorp-v1/header/navigation-bar.js +117 -0
- package/templates/appcorp-v1/header/social-button.d.ts +7 -0
- package/templates/appcorp-v1/header/social-button.js +48 -0
- package/templates/appcorp-v1/home.d.ts +3 -0
- package/templates/appcorp-v1/home.js +27 -0
- package/templates/data/appcorp-v1.d.ts +93 -0
- package/templates/data/appcorp-v1.js +348 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Slider } from "./ui/slider";
|
|
3
|
+
interface EnhancedSliderProps extends React.ComponentPropsWithoutRef<typeof Slider> {
|
|
4
|
+
label?: string;
|
|
5
|
+
info?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
testIdWrapper?: string;
|
|
10
|
+
testIdLabel?: string;
|
|
11
|
+
testIdMessage?: string;
|
|
12
|
+
testIdError?: string;
|
|
13
|
+
testIdInfo?: string;
|
|
14
|
+
testIdSlider?: string;
|
|
15
|
+
testIdMin?: string;
|
|
16
|
+
testIdMax?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const EnhancedSlider: React.ForwardRefExoticComponent<EnhancedSliderProps & React.RefAttributes<HTMLSpanElement>>;
|
|
19
|
+
export { EnhancedSlider };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __assign = (this && this.__assign) || function () {
|
|
4
|
+
__assign = Object.assign || function(t) {
|
|
5
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
6
|
+
s = arguments[i];
|
|
7
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
8
|
+
t[p] = s[p];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
return __assign.apply(this, arguments);
|
|
13
|
+
};
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
48
|
+
var t = {};
|
|
49
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
50
|
+
t[p] = s[p];
|
|
51
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
52
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
53
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
54
|
+
t[p[i]] = s[p[i]];
|
|
55
|
+
}
|
|
56
|
+
return t;
|
|
57
|
+
};
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.EnhancedSlider = void 0;
|
|
60
|
+
var React = __importStar(require("react"));
|
|
61
|
+
var utils_1 = require("../lib/utils");
|
|
62
|
+
var enhanced_label_1 = require("./enhanced-label");
|
|
63
|
+
var slider_1 = require("./ui/slider");
|
|
64
|
+
var EnhancedSlider = React.forwardRef(function (_a, ref) {
|
|
65
|
+
var _b, _c, _d, _e;
|
|
66
|
+
var className = _a.className, label = _a.label, info = _a.info, error = _a.error, min = _a.min, max = _a.max, testIdWrapper = _a.testIdWrapper, testIdLabel = _a.testIdLabel, testIdMessage = _a.testIdMessage, testIdError = _a.testIdError, testIdInfo = _a.testIdInfo, testIdSlider = _a.testIdSlider, testIdMin = _a.testIdMin, testIdMax = _a.testIdMax, props = __rest(_a, ["className", "label", "info", "error", "min", "max", "testIdWrapper", "testIdLabel", "testIdMessage", "testIdError", "testIdInfo", "testIdSlider", "testIdMin", "testIdMax"]);
|
|
67
|
+
// Prefer explicit min/max props; fall back to Slider props
|
|
68
|
+
var sliderMin = (_c = min !== null && min !== void 0 ? min : (_b = props.defaultValue) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : 0;
|
|
69
|
+
var sliderMax = (_e = max !== null && max !== void 0 ? max : (_d = props.defaultValue) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : 100;
|
|
70
|
+
var sliderElement = (React.createElement(slider_1.Slider, __assign({ ref: ref, className: (0, utils_1.cn)("w-full", className), "data-testid": testIdSlider }, props)));
|
|
71
|
+
return (React.createElement("div", { className: "w-full space-y-2", "data-testid": testIdWrapper },
|
|
72
|
+
label && (React.createElement(enhanced_label_1.EnhancedLabel, { "data-testid": testIdLabel, className: "mb-0" }, label)),
|
|
73
|
+
React.createElement("div", { className: "flex items-center justify-between text-xs text-muted-foreground" },
|
|
74
|
+
React.createElement("span", { "data-testid": testIdMin }, sliderMin),
|
|
75
|
+
React.createElement("span", { "data-testid": testIdMax }, sliderMax)),
|
|
76
|
+
sliderElement,
|
|
77
|
+
(error || info) && (React.createElement("div", { "data-testid": testIdMessage }, error ? (React.createElement("p", { className: "text-xs text-destructive", "data-testid": testIdError }, error)) : info ? (React.createElement("p", { className: "text-xs text-blue-600 dark:text-blue-400", "data-testid": testIdInfo }, info)) : null))));
|
|
78
|
+
});
|
|
79
|
+
exports.EnhancedSlider = EnhancedSlider;
|
|
80
|
+
EnhancedSlider.displayName = "EnhancedSlider";
|
|
@@ -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?: "
|
|
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> & {
|
package/components/ui/badge.d.ts
CHANGED
|
@@ -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?: "
|
|
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" | "
|
|
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/components/ui/slider.js
CHANGED
|
@@ -65,7 +65,15 @@ var Slider = React.forwardRef(function (_a, ref) {
|
|
|
65
65
|
return (React.createElement(SliderPrimitive.Root, __assign({ ref: ref, className: (0, utils_1.cn)("relative flex w-full touch-none select-none items-center", className) }, props),
|
|
66
66
|
React.createElement(SliderPrimitive.Track, { className: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20" },
|
|
67
67
|
React.createElement(SliderPrimitive.Range, { className: "absolute h-full bg-primary" })),
|
|
68
|
-
|
|
68
|
+
// Render one thumb per value when used as a range (defaultValue or value is an array)
|
|
69
|
+
(function () {
|
|
70
|
+
var values = Array.isArray(props.value)
|
|
71
|
+
? props.value
|
|
72
|
+
: Array.isArray(props.defaultValue)
|
|
73
|
+
? props.defaultValue
|
|
74
|
+
: [undefined];
|
|
75
|
+
return values.map(function (_, i) { return (React.createElement(SliderPrimitive.Thumb, { key: i, className: "block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" })); });
|
|
76
|
+
})()));
|
|
69
77
|
});
|
|
70
78
|
exports.Slider = Slider;
|
|
71
79
|
Slider.displayName = SliderPrimitive.Root.displayName;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appcorp/shadcn",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.86",
|
|
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",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"license": "MIT",
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@ai-sdk/react": "^3",
|
|
35
|
+
"@base-ui/react": "^1.5.0",
|
|
35
36
|
"@commitlint/cli": "^20",
|
|
36
37
|
"@commitlint/config-conventional": "^20",
|
|
37
38
|
"@dnd-kit/core": "^6",
|
|
@@ -111,7 +112,7 @@
|
|
|
111
112
|
"next-themes": "^0",
|
|
112
113
|
"postcss": "^8",
|
|
113
114
|
"prettier": "^3",
|
|
114
|
-
"radix-ui": "^1",
|
|
115
|
+
"radix-ui": "^1.4.3",
|
|
115
116
|
"react": "^19",
|
|
116
117
|
"react-day-picker": "^9",
|
|
117
118
|
"react-dom": "^19",
|
|
@@ -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,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,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,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,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 {};
|