@notionhive/footers 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/footers.js +16 -0
- package/category.config.json +7 -0
- package/package.json +24 -0
- package/registry/footer-01.json +6 -0
- package/registry/footer-02.json +9 -0
- package/registry/footer-03.json +9 -0
- package/registry/footer-04.json +9 -0
- package/registry/footer-05.json +9 -0
- package/registry/footer-06.json +7 -0
- package/registry/footer-07.json +9 -0
- package/registry/footer-08.json +9 -0
- package/registry/footer-09.json +9 -0
- package/registry/footer-10.json +9 -0
- package/registry/footer-11.json +7 -0
- package/registry/footer-12.json +9 -0
- package/registry/footer-13.json +9 -0
- package/registry/footer-14.json +9 -0
- package/registry/footer-15.json +9 -0
- package/registry/footer-16.json +9 -0
- package/registry/footer-17.json +9 -0
- package/registry/footer-18.json +9 -0
- package/registry/footer-19.json +9 -0
- package/registry/footer-20.json +9 -0
- package/registry/footer-21.json +9 -0
- package/registry/footer-22.json +9 -0
- package/registry/footer-23.json +9 -0
- package/registry/footer-24.json +9 -0
- package/registry/footer-25.json +9 -0
- package/registry/footer-26.json +9 -0
- package/registry/footer-27.json +9 -0
- package/registry/footer-28.json +9 -0
- package/registry/footer-29.json +6 -0
- package/registry/footer-30.json +6 -0
- package/registry/index.json +263 -0
- package/templates/components/atoms/SafeImage/SafeImage.jsx +101 -0
- package/templates/components/atoms/SafeImage/index.js +1 -0
- package/templates/components/organisms/Footer01/Footer01.jsx +142 -0
- package/templates/components/organisms/Footer01/Footer01.propTypes.js +110 -0
- package/templates/components/organisms/Footer01/index.js +1 -0
- package/templates/components/organisms/Footer02/Footer02.jsx +136 -0
- package/templates/components/organisms/Footer02/Footer02.propTypes.js +112 -0
- package/templates/components/organisms/Footer02/index.js +1 -0
- package/templates/components/organisms/Footer03/Footer03.jsx +162 -0
- package/templates/components/organisms/Footer03/Footer03.propTypes.js +73 -0
- package/templates/components/organisms/Footer03/index.js +1 -0
- package/templates/components/organisms/Footer04/Footer04.jsx +128 -0
- package/templates/components/organisms/Footer04/Footer04.propTypes.js +93 -0
- package/templates/components/organisms/Footer04/index.js +1 -0
- package/templates/components/organisms/Footer05/Footer05.jsx +101 -0
- package/templates/components/organisms/Footer05/Footer05.propTypes.js +42 -0
- package/templates/components/organisms/Footer05/index.js +1 -0
- package/templates/components/organisms/Footer06/Footer06.jsx +170 -0
- package/templates/components/organisms/Footer06/Footer06.propTypes.js +53 -0
- package/templates/components/organisms/Footer06/index.js +1 -0
- package/templates/components/organisms/Footer07/Footer07.jsx +253 -0
- package/templates/components/organisms/Footer07/Footer07.propTypes.js +83 -0
- package/templates/components/organisms/Footer07/index.js +1 -0
- package/templates/components/organisms/Footer08/Footer08.jsx +183 -0
- package/templates/components/organisms/Footer08/Footer08.propTypes.js +92 -0
- package/templates/components/organisms/Footer08/index.js +1 -0
- package/templates/components/organisms/Footer09/Footer09.jsx +199 -0
- package/templates/components/organisms/Footer09/Footer09.propTypes.js +76 -0
- package/templates/components/organisms/Footer09/index.js +1 -0
- package/templates/components/organisms/Footer10/Footer10.jsx +172 -0
- package/templates/components/organisms/Footer10/Footer10.propTypes.js +38 -0
- package/templates/components/organisms/Footer10/index.js +1 -0
- package/templates/components/organisms/Footer11/Footer11.jsx +107 -0
- package/templates/components/organisms/Footer11/Footer11.propTypes.js +64 -0
- package/templates/components/organisms/Footer11/index.js +1 -0
- package/templates/components/organisms/Footer12/Footer12.jsx +122 -0
- package/templates/components/organisms/Footer12/Footer12.propTypes.js +94 -0
- package/templates/components/organisms/Footer12/index.js +1 -0
- package/templates/components/organisms/Footer13/Footer13.jsx +156 -0
- package/templates/components/organisms/Footer13/Footer13.propTypes.js +80 -0
- package/templates/components/organisms/Footer13/index.js +1 -0
- package/templates/components/organisms/Footer14/Footer14.jsx +157 -0
- package/templates/components/organisms/Footer14/Footer14.propTypes.js +60 -0
- package/templates/components/organisms/Footer14/index.js +1 -0
- package/templates/components/organisms/Footer15/Footer15.jsx +184 -0
- package/templates/components/organisms/Footer15/Footer15.propTypes.js +58 -0
- package/templates/components/organisms/Footer15/index.js +1 -0
- package/templates/components/organisms/Footer16/Footer16.jsx +87 -0
- package/templates/components/organisms/Footer16/Footer16.propTypes.js +73 -0
- package/templates/components/organisms/Footer16/index.js +1 -0
- package/templates/components/organisms/Footer17/Footer17.jsx +176 -0
- package/templates/components/organisms/Footer17/Footer17.propTypes.js +117 -0
- package/templates/components/organisms/Footer17/index.js +1 -0
- package/templates/components/organisms/Footer18/Footer18.jsx +236 -0
- package/templates/components/organisms/Footer18/Footer18.propTypes.js +92 -0
- package/templates/components/organisms/Footer18/index.js +1 -0
- package/templates/components/organisms/Footer19/Footer19.jsx +287 -0
- package/templates/components/organisms/Footer19/Footer19.propTypes.js +116 -0
- package/templates/components/organisms/Footer19/index.js +1 -0
- package/templates/components/organisms/Footer20/Footer20.jsx +201 -0
- package/templates/components/organisms/Footer20/Footer20.propTypes.js +70 -0
- package/templates/components/organisms/Footer20/index.js +1 -0
- package/templates/components/organisms/Footer21/Footer21.jsx +134 -0
- package/templates/components/organisms/Footer21/Footer21.propTypes.js +122 -0
- package/templates/components/organisms/Footer21/index.js +1 -0
- package/templates/components/organisms/Footer22/Footer22.jsx +136 -0
- package/templates/components/organisms/Footer22/Footer22.propTypes.js +58 -0
- package/templates/components/organisms/Footer22/index.js +1 -0
- package/templates/components/organisms/Footer23/Footer23.jsx +177 -0
- package/templates/components/organisms/Footer23/Footer23.propTypes.js +97 -0
- package/templates/components/organisms/Footer23/index.js +1 -0
- package/templates/components/organisms/Footer24/Footer24.jsx +192 -0
- package/templates/components/organisms/Footer24/Footer24.propTypes.js +132 -0
- package/templates/components/organisms/Footer24/index.js +1 -0
- package/templates/components/organisms/Footer25/Footer25.jsx +135 -0
- package/templates/components/organisms/Footer25/Footer25.propTypes.js +124 -0
- package/templates/components/organisms/Footer25/index.js +1 -0
- package/templates/components/organisms/Footer26/Footer26.jsx +167 -0
- package/templates/components/organisms/Footer26/Footer26.propTypes.js +54 -0
- package/templates/components/organisms/Footer26/index.js +1 -0
- package/templates/components/organisms/Footer27/Footer27.jsx +171 -0
- package/templates/components/organisms/Footer27/Footer27.propTypes.js +105 -0
- package/templates/components/organisms/Footer27/index.js +1 -0
- package/templates/components/organisms/Footer28/Footer28.jsx +98 -0
- package/templates/components/organisms/Footer28/Footer28.propTypes.js +96 -0
- package/templates/components/organisms/Footer28/index.js +1 -0
- package/templates/components/organisms/Footer29/Footer29.jsx +118 -0
- package/templates/components/organisms/Footer29/Footer29.propTypes.js +68 -0
- package/templates/components/organisms/Footer29/index.js +1 -0
- package/templates/components/organisms/Footer30/Footer30.jsx +92 -0
- package/templates/components/organisms/Footer30/Footer30.propTypes.js +51 -0
- package/templates/components/organisms/Footer30/index.js +1 -0
- package/templates/public/footer/footer02/payment-01.png +0 -0
- package/templates/public/footer/footer02/payment-02.png +0 -0
- package/templates/public/footer/footer02/payment-03.png +0 -0
- package/templates/public/footer/footer02/payment-04.png +0 -0
- package/templates/public/footer/footer02/payment-05.png +0 -0
- package/templates/public/footer/footer02/payment-06.png +0 -0
- package/templates/public/footer/footer02/payment-07.png +0 -0
- package/templates/public/footer/footer02/payment-08.png +0 -0
- package/templates/public/footer/footer02/payment-09.svg +5 -0
- package/templates/public/footer/footer02/payment-10.svg +11 -0
- package/templates/public/footer/footer02/payment-11.svg +22 -0
- package/templates/public/footer/footer02/payment-12.svg +25 -0
- package/templates/public/footer/footer02/payment-13.svg +10 -0
- package/templates/public/footer/footer02/payment-14.svg +36 -0
- package/templates/public/footer/footer02/payment-15.svg +18 -0
- package/templates/public/footer/footer02/payment-sprite-01.png +0 -0
- package/templates/public/footer/footer02/payment-sprite-02.png +0 -0
- package/templates/public/footer/footer02/payment-sprite-03.png +0 -0
- package/templates/public/footer/footer02/payment-sprite-04.png +0 -0
- package/templates/public/footer/footer02/payment-sprite-05.png +0 -0
- package/templates/public/footer/footer02/payment-sprite-06.png +0 -0
- package/templates/public/footer/footer03/logo-mask.png +0 -0
- package/templates/public/footer/footer03/logo.png +0 -0
- package/templates/public/footer/footer04/logo.svg +45 -0
- package/templates/public/footer/footer05/brand-watermark.png +0 -0
- package/templates/public/footer/footer07/logo.png +0 -0
- package/templates/public/footer/footer07/watch-hero.png +0 -0
- package/templates/public/footer/footer07/watch-overlay.png +0 -0
- package/templates/public/footer/footer08/logo.png +0 -0
- package/templates/public/footer/footer08/logo.svg +3 -0
- package/templates/public/footer/footer09/logo.svg +13 -0
- package/templates/public/footer/footer10/hero-image.png +0 -0
- package/templates/public/footer/footer10/hero-mask-download.svg +3 -0
- package/templates/public/footer/footer10/hero-mask.svg +3 -0
- package/templates/public/footer/footer12/logo-icon.svg +3 -0
- package/templates/public/footer/footer12/refugee-logo.png +0 -0
- package/templates/public/footer/footer13/logo.png +0 -0
- package/templates/public/footer/footer14/logo.png +0 -0
- package/templates/public/footer/footer15/logo.svg +19 -0
- package/templates/public/footer/footer16/logo.svg +6 -0
- package/templates/public/footer/footer17/logo-left.svg +11 -0
- package/templates/public/footer/footer17/logo-right.svg +36 -0
- package/templates/public/footer/footer18/logo.png +108 -0
- package/templates/public/footer/footer18/logo.svg +108 -0
- package/templates/public/footer/footer19/logo.png +0 -0
- package/templates/public/footer/footer19/payment-bkash.png +0 -0
- package/templates/public/footer/footer19/payment-mastercard.svg +12 -0
- package/templates/public/footer/footer19/payment-nagad.png +0 -0
- package/templates/public/footer/footer19/payment-nexus.png +0 -0
- package/templates/public/footer/footer19/payment-rocket.png +0 -0
- package/templates/public/footer/footer19/payment-upay.png +0 -0
- package/templates/public/footer/footer19/payment-visa.svg +6 -0
- package/templates/public/footer/footer20/bg.png +0 -0
- package/templates/public/footer/footer20/logo.png +0 -0
- package/templates/public/footer/footer21/logo.png +0 -0
- package/templates/public/footer/footer22/logo-icon.svg +10 -0
- package/templates/public/footer/footer22/logo-name.svg +5 -0
- package/templates/public/footer/footer22/logo-tagline.svg +5 -0
- package/templates/public/footer/footer23/logo-icon.svg +10 -0
- package/templates/public/footer/footer23/logo-name.svg +20 -0
- package/templates/public/footer/footer23/logo-tagline.svg +17 -0
- package/templates/public/footer/footer24/logo.svg +46 -0
- package/templates/public/footer/footer24/map.png +0 -0
- package/templates/public/footer/footer25/logo-icon.svg +15 -0
- package/templates/public/footer/footer25/logo-text.svg +42 -0
- package/templates/public/footer/footer25/map-pin.svg +7 -0
- package/templates/public/footer/footer25/map.png +0 -0
- package/templates/public/footer/footer26/logo-jpl.svg +5 -0
- package/templates/public/footer/footer26/logo.png +0 -0
- package/templates/public/footer/footer27/logo.png +0 -0
- package/templates/public/footer/footer28/logo.png +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import Image from "next/image";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SafeImage — renders local /heroes/ assets reliably.
|
|
5
|
+
*
|
|
6
|
+
* Figma exports are often SVG content saved with .png extensions.
|
|
7
|
+
* Native img avoids next/image SVG restrictions and broken renders in Storybook.
|
|
8
|
+
*
|
|
9
|
+
* @param {object} props - Same as next/image (src, alt, fill, className, sizes, priority, width, height).
|
|
10
|
+
*/
|
|
11
|
+
export function SafeImage({
|
|
12
|
+
src,
|
|
13
|
+
alt = "",
|
|
14
|
+
fill,
|
|
15
|
+
className = "",
|
|
16
|
+
sizes,
|
|
17
|
+
priority,
|
|
18
|
+
width,
|
|
19
|
+
height,
|
|
20
|
+
style,
|
|
21
|
+
...rest
|
|
22
|
+
}) {
|
|
23
|
+
if (!src) return null;
|
|
24
|
+
|
|
25
|
+
const isLocalAsset =
|
|
26
|
+
src.startsWith("/heroes/") ||
|
|
27
|
+
src.startsWith("/menus/") ||
|
|
28
|
+
src.startsWith("/about/") ||
|
|
29
|
+
src.startsWith("/services/") ||
|
|
30
|
+
src.startsWith("/testimonials/") ||
|
|
31
|
+
src.startsWith("/cta/") ||
|
|
32
|
+
src.startsWith("/contact/") ||
|
|
33
|
+
src.startsWith("/footer/");
|
|
34
|
+
const isSvg = src.endsWith(".svg");
|
|
35
|
+
|
|
36
|
+
if (isLocalAsset || isSvg) {
|
|
37
|
+
if (fill) {
|
|
38
|
+
return (
|
|
39
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
40
|
+
<img
|
|
41
|
+
src={src}
|
|
42
|
+
alt={alt}
|
|
43
|
+
className={className}
|
|
44
|
+
style={{
|
|
45
|
+
...style,
|
|
46
|
+
position: "absolute",
|
|
47
|
+
inset: 0,
|
|
48
|
+
width: "100%",
|
|
49
|
+
height: "100%",
|
|
50
|
+
objectFit: "cover",
|
|
51
|
+
}}
|
|
52
|
+
{...rest}
|
|
53
|
+
/>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
59
|
+
<img
|
|
60
|
+
src={src}
|
|
61
|
+
alt={alt}
|
|
62
|
+
className={className}
|
|
63
|
+
width={width}
|
|
64
|
+
height={height}
|
|
65
|
+
style={style}
|
|
66
|
+
{...rest}
|
|
67
|
+
/>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (fill) {
|
|
72
|
+
return (
|
|
73
|
+
<Image
|
|
74
|
+
src={src}
|
|
75
|
+
alt={alt}
|
|
76
|
+
fill
|
|
77
|
+
className={className}
|
|
78
|
+
sizes={sizes}
|
|
79
|
+
priority={priority}
|
|
80
|
+
style={style}
|
|
81
|
+
{...rest}
|
|
82
|
+
/>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<Image
|
|
88
|
+
src={src}
|
|
89
|
+
alt={alt}
|
|
90
|
+
width={width}
|
|
91
|
+
height={height}
|
|
92
|
+
className={className}
|
|
93
|
+
sizes={sizes}
|
|
94
|
+
priority={priority}
|
|
95
|
+
style={style}
|
|
96
|
+
{...rest}
|
|
97
|
+
/>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default SafeImage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SafeImage, default } from "./SafeImage";
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
footer01DefaultProps,
|
|
5
|
+
footer01PropTypes,
|
|
6
|
+
} from "./Footer01.propTypes";
|
|
7
|
+
|
|
8
|
+
function FacebookIcon({ className = "" }) {
|
|
9
|
+
return (
|
|
10
|
+
<svg viewBox="0 0 14 14" fill="none" aria-hidden="true" className={className}>
|
|
11
|
+
<path
|
|
12
|
+
d="M8.5 2.5h-1.5A1.5 1.5 0 005.5 4v1.5H4v2h1.5V12h2.5V7.5H10l.5-2H8.5V4c0-.28.22-.5.5-.5H10V2.5H8.5z"
|
|
13
|
+
fill="currentColor"
|
|
14
|
+
/>
|
|
15
|
+
</svg>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function InstagramIcon({ className = "" }) {
|
|
20
|
+
return (
|
|
21
|
+
<svg viewBox="0 0 14 14" fill="none" aria-hidden="true" className={className}>
|
|
22
|
+
<rect x="2" y="2" width="10" height="10" rx="2.5" stroke="currentColor" strokeWidth="1" />
|
|
23
|
+
<circle cx="7" cy="7" r="2" stroke="currentColor" strokeWidth="1" />
|
|
24
|
+
<circle cx="10" cy="4" r="0.75" fill="currentColor" />
|
|
25
|
+
</svg>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function LinkedinIcon({ className = "" }) {
|
|
30
|
+
return (
|
|
31
|
+
<svg viewBox="0 0 14 14" fill="none" aria-hidden="true" className={className}>
|
|
32
|
+
<rect x="2" y="5" width="2.5" height="7" fill="currentColor" />
|
|
33
|
+
<circle cx="3.25" cy="3.25" r="1.25" fill="currentColor" />
|
|
34
|
+
<path
|
|
35
|
+
d="M7 5h2.4v1c.4-.7 1.2-1.1 2.1-1.1 2.2 0 2.5 1.4 2.5 3.3V12H9.6V8.6c0-.8 0-1.8-1.1-1.8-1.1 0-1.3.9-1.3 1.7V12H7V5z"
|
|
36
|
+
fill="currentColor"
|
|
37
|
+
/>
|
|
38
|
+
</svg>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function YoutubeIcon({ className = "" }) {
|
|
43
|
+
return (
|
|
44
|
+
<svg viewBox="0 0 14 14" fill="none" aria-hidden="true" className={className}>
|
|
45
|
+
<path
|
|
46
|
+
d="M12.5 4.2a1.5 1.5 0 00-1.05-1.05C10.4 3 7 3 7 3s-3.4 0-4.45.15A1.5 1.5 0 001.5 4.2 15.7 15.7 0 001.35 7a15.7 15.7 0 00.15 2.8 1.5 1.5 0 001.05 1.05C3.6 11 7 11 7 11s3.4 0 4.45-.15a1.5 1.5 0 001.05-1.05A15.7 15.7 0 0012.65 7a15.7 15.7 0 00-.15-2.8zM5.75 8.75V5.25L9 7l-3.25 1.75z"
|
|
47
|
+
fill="currentColor"
|
|
48
|
+
/>
|
|
49
|
+
</svg>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const SOCIAL_ICONS = {
|
|
54
|
+
facebook: FacebookIcon,
|
|
55
|
+
instagram: InstagramIcon,
|
|
56
|
+
linkedin: LinkedinIcon,
|
|
57
|
+
youtube: YoutubeIcon,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function LinkColumn({ column }) {
|
|
61
|
+
return (
|
|
62
|
+
<div className="flex min-w-0 flex-1 flex-col gap-4">
|
|
63
|
+
<p className="text-base font-semibold leading-6 text-white">{column.title}</p>
|
|
64
|
+
<ul className="flex flex-col gap-2">
|
|
65
|
+
{column.links.map((link) => (
|
|
66
|
+
<li key={link.label}>
|
|
67
|
+
<a
|
|
68
|
+
href={link.href ?? "#"}
|
|
69
|
+
className="flex items-center gap-2 text-sm leading-5 text-[#b5b5b5] transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
70
|
+
>
|
|
71
|
+
{link.icon && SOCIAL_ICONS[link.icon] ? (
|
|
72
|
+
(() => {
|
|
73
|
+
const Icon = SOCIAL_ICONS[link.icon];
|
|
74
|
+
return <Icon className="size-3.5 shrink-0" />;
|
|
75
|
+
})()
|
|
76
|
+
) : null}
|
|
77
|
+
{link.label}
|
|
78
|
+
</a>
|
|
79
|
+
</li>
|
|
80
|
+
))}
|
|
81
|
+
</ul>
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Footer01 — Koenig Equipment multi-column dark footer.
|
|
88
|
+
* Figma node 32:19075 at 1920px.
|
|
89
|
+
*
|
|
90
|
+
* @param {object} props - See Footer01.propTypes.js.
|
|
91
|
+
*/
|
|
92
|
+
export function Footer01({
|
|
93
|
+
linkColumns = footer01DefaultProps.linkColumns,
|
|
94
|
+
copyright = footer01DefaultProps.copyright,
|
|
95
|
+
socialButtons = footer01DefaultProps.socialButtons,
|
|
96
|
+
className = "",
|
|
97
|
+
}) {
|
|
98
|
+
return (
|
|
99
|
+
<footer
|
|
100
|
+
className={["relative w-full overflow-hidden bg-[#0b1909]", className]
|
|
101
|
+
.filter(Boolean)
|
|
102
|
+
.join(" ")}
|
|
103
|
+
data-footer="footer01"
|
|
104
|
+
>
|
|
105
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-11 px-4 py-11 sm:px-6 md:px-8 lg:gap-[44px] lg:px-8 lg:py-11 xl:px-8">
|
|
106
|
+
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 xl:gap-0 xl:justify-between">
|
|
107
|
+
{linkColumns.map((column) => (
|
|
108
|
+
<LinkColumn key={column.title} column={column} />
|
|
109
|
+
))}
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<div className="flex flex-col gap-6">
|
|
113
|
+
<div className="h-px w-full bg-[#525252]/60" />
|
|
114
|
+
<div className="flex flex-col items-center justify-between gap-4 sm:flex-row">
|
|
115
|
+
<p className="text-center text-sm leading-5 text-[#b5b5b5] sm:text-left">
|
|
116
|
+
{copyright}
|
|
117
|
+
</p>
|
|
118
|
+
<div className="flex flex-wrap items-center justify-center gap-2.5">
|
|
119
|
+
{socialButtons.map((social) => {
|
|
120
|
+
const Icon = SOCIAL_ICONS[social.icon] ?? FacebookIcon;
|
|
121
|
+
return (
|
|
122
|
+
<a
|
|
123
|
+
key={social.label}
|
|
124
|
+
href={social.href ?? "#"}
|
|
125
|
+
aria-label={social.label}
|
|
126
|
+
className="flex size-10 items-center justify-center rounded-full border border-[#525252] p-3 text-[#b5b5b5] transition-colors duration-200 ease-out hover:border-white hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
127
|
+
>
|
|
128
|
+
<Icon className="size-3.5" />
|
|
129
|
+
</a>
|
|
130
|
+
);
|
|
131
|
+
})}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</footer>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
Footer01.propTypes = footer01PropTypes;
|
|
141
|
+
|
|
142
|
+
export default Footer01;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import PropTypes from "prop-types";
|
|
2
|
+
|
|
3
|
+
const linkShape = PropTypes.shape({
|
|
4
|
+
label: PropTypes.string.isRequired,
|
|
5
|
+
href: PropTypes.string,
|
|
6
|
+
icon: PropTypes.oneOf(["facebook", "instagram", "linkedin", "youtube"]),
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const columnShape = PropTypes.shape({
|
|
10
|
+
title: PropTypes.string.isRequired,
|
|
11
|
+
links: PropTypes.arrayOf(linkShape),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const socialShape = PropTypes.shape({
|
|
15
|
+
label: PropTypes.string.isRequired,
|
|
16
|
+
href: PropTypes.string,
|
|
17
|
+
icon: PropTypes.oneOf(["facebook", "instagram", "linkedin", "youtube"]),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const footer01PropTypes = {
|
|
21
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
22
|
+
copyright: PropTypes.string,
|
|
23
|
+
socialButtons: PropTypes.arrayOf(socialShape),
|
|
24
|
+
className: PropTypes.string,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const footer01DefaultProps = {
|
|
28
|
+
linkColumns: [
|
|
29
|
+
{
|
|
30
|
+
title: "New Equipment",
|
|
31
|
+
links: [
|
|
32
|
+
{ label: "Agriculture", href: "#" },
|
|
33
|
+
{ label: "Compact Construction Equipment", href: "#" },
|
|
34
|
+
{ label: "Lawn & Grounds Care", href: "#" },
|
|
35
|
+
{ label: "Build Your Own", href: "#" },
|
|
36
|
+
{ label: "Promotions", href: "#" },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: "Used Equipment",
|
|
41
|
+
links: [
|
|
42
|
+
{ label: "Ag Tractors", href: "#" },
|
|
43
|
+
{ label: "Harvesting", href: "#" },
|
|
44
|
+
{ label: "Spraying and Application", href: "#" },
|
|
45
|
+
{ label: "Planting & Seeding", href: "#" },
|
|
46
|
+
{ label: "Hay, Forage & Livestock", href: "#" },
|
|
47
|
+
{ label: "Tillage", href: "#" },
|
|
48
|
+
{ label: "Precision", href: "#" },
|
|
49
|
+
{ label: "Lawn & Grounds Care", href: "#" },
|
|
50
|
+
{ label: "Compact Construction", href: "#" },
|
|
51
|
+
{ label: "Just Arrived", href: "#" },
|
|
52
|
+
{ label: "Hot Deals", href: "#" },
|
|
53
|
+
{ label: "Be the first to know", href: "#" },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
title: "Parts & Services",
|
|
58
|
+
links: [
|
|
59
|
+
{ label: "Order Parts", href: "#" },
|
|
60
|
+
{ label: "Parts Drop Boxes", href: "#" },
|
|
61
|
+
{ label: "Schedule Service", href: "#" },
|
|
62
|
+
{ label: "Programs & Promotions", href: "#" },
|
|
63
|
+
{ label: "MyDealer", href: "#" },
|
|
64
|
+
{ label: "Precision Ag Solutions", href: "#" },
|
|
65
|
+
{ label: "Customer Service Advisor", href: "#" },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
title: "Contact Us",
|
|
70
|
+
links: [
|
|
71
|
+
{ label: "Find Nearest Location", href: "#" },
|
|
72
|
+
{ label: "Locations", href: "#" },
|
|
73
|
+
{ label: "Email Us", href: "#" },
|
|
74
|
+
{ label: "Careers", href: "#" },
|
|
75
|
+
{ label: "Equipment Transfer Request", href: "#" },
|
|
76
|
+
{ label: "eStatement Signup", href: "#" },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
title: "Resources",
|
|
81
|
+
links: [
|
|
82
|
+
{ label: "Blog", href: "#" },
|
|
83
|
+
{ label: "FAQ", href: "#" },
|
|
84
|
+
{ label: "How to Videos", href: "#" },
|
|
85
|
+
{ label: "MyDealer", href: "#" },
|
|
86
|
+
{ label: "About Us", href: "#" },
|
|
87
|
+
{ label: "Precision Ag Solutions", href: "#" },
|
|
88
|
+
{ label: "Privacy Policy", href: "#" },
|
|
89
|
+
{ label: "Employee Login", href: "#" },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
title: "Follow Us",
|
|
94
|
+
links: [
|
|
95
|
+
{ label: "Facebook", href: "#", icon: "facebook" },
|
|
96
|
+
{ label: "Instagram", href: "#", icon: "instagram" },
|
|
97
|
+
{ label: "Linkedin", href: "#", icon: "linkedin" },
|
|
98
|
+
{ label: "YouTube", href: "#", icon: "youtube" },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
copyright: "Copyright © 2023 Koenig Equipment, Inc. All Rights Reserved.",
|
|
103
|
+
socialButtons: [
|
|
104
|
+
{ label: "Facebook", href: "#", icon: "facebook" },
|
|
105
|
+
{ label: "Instagram", href: "#", icon: "instagram" },
|
|
106
|
+
{ label: "LinkedIn", href: "#", icon: "linkedin" },
|
|
107
|
+
{ label: "YouTube", href: "#", icon: "youtube" },
|
|
108
|
+
],
|
|
109
|
+
className: "",
|
|
110
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer01, default } from "./Footer01";
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { SafeImage } from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer02DefaultProps,
|
|
6
|
+
footer02PropTypes,
|
|
7
|
+
} from "./Footer02.propTypes";
|
|
8
|
+
|
|
9
|
+
function LinkColumn({ column }) {
|
|
10
|
+
return (
|
|
11
|
+
<div className="flex min-w-0 flex-col gap-8 px-3 py-6 sm:gap-10 sm:px-5 sm:py-10">
|
|
12
|
+
<p className="text-xs font-medium uppercase tracking-[0.96px] text-[#97989f]">
|
|
13
|
+
{column.title}
|
|
14
|
+
</p>
|
|
15
|
+
<ul className="flex flex-col gap-2">
|
|
16
|
+
{column.links.map((link) => (
|
|
17
|
+
<li key={link.label}>
|
|
18
|
+
<a
|
|
19
|
+
href={link.href ?? "#"}
|
|
20
|
+
className={[
|
|
21
|
+
"text-sm text-[#020617] transition-colors duration-200 ease-out hover:text-[#97989f] focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
22
|
+
link.underline ? "underline" : "",
|
|
23
|
+
].join(" ")}
|
|
24
|
+
>
|
|
25
|
+
{link.label}
|
|
26
|
+
</a>
|
|
27
|
+
</li>
|
|
28
|
+
))}
|
|
29
|
+
</ul>
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function RegionColumn({ region }) {
|
|
35
|
+
return (
|
|
36
|
+
<div className="flex min-w-0 flex-1 flex-col gap-8 px-3 py-6 sm:gap-10 sm:px-5 sm:py-10">
|
|
37
|
+
<p className="text-xs font-medium uppercase tracking-[0.96px] text-[#97989f]">
|
|
38
|
+
{region.title}
|
|
39
|
+
</p>
|
|
40
|
+
<div className="flex flex-col gap-2 text-sm text-[#020617]">
|
|
41
|
+
{region.address ? <p>{region.address}</p> : null}
|
|
42
|
+
{region.email ? (
|
|
43
|
+
<a
|
|
44
|
+
href={`mailto:${region.email}`}
|
|
45
|
+
className="w-max underline transition-colors duration-200 ease-out hover:text-[#97989f] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
46
|
+
>
|
|
47
|
+
{region.email}
|
|
48
|
+
</a>
|
|
49
|
+
) : null}
|
|
50
|
+
{region.phone ? (
|
|
51
|
+
<a
|
|
52
|
+
href={`tel:${region.phone.replace(/\s/g, "")}`}
|
|
53
|
+
className="w-max underline transition-colors duration-200 ease-out hover:text-[#97989f] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
54
|
+
>
|
|
55
|
+
{region.phone}
|
|
56
|
+
</a>
|
|
57
|
+
) : null}
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Footer02 — Gentle Park white multi-column footer with payment logos.
|
|
65
|
+
* Figma node 32:19378 at 1920px.
|
|
66
|
+
*/
|
|
67
|
+
export function Footer02({
|
|
68
|
+
linkColumns = footer02DefaultProps.linkColumns,
|
|
69
|
+
regions = footer02DefaultProps.regions,
|
|
70
|
+
paymentBadges = footer02DefaultProps.paymentBadges,
|
|
71
|
+
copyright = footer02DefaultProps.copyright,
|
|
72
|
+
siteByLabel = footer02DefaultProps.siteByLabel,
|
|
73
|
+
siteByHref = footer02DefaultProps.siteByHref,
|
|
74
|
+
className = "",
|
|
75
|
+
}) {
|
|
76
|
+
return (
|
|
77
|
+
<footer
|
|
78
|
+
className={["relative w-full overflow-hidden bg-white", className]
|
|
79
|
+
.filter(Boolean)
|
|
80
|
+
.join(" ")}
|
|
81
|
+
data-footer="footer02"
|
|
82
|
+
>
|
|
83
|
+
<div className="mx-auto w-full max-w-[1920px]">
|
|
84
|
+
<div className="flex flex-col gap-0 lg:flex-row lg:items-start lg:justify-between">
|
|
85
|
+
<div className="grid grid-cols-2 gap-0 sm:grid-cols-3 lg:flex lg:flex-wrap">
|
|
86
|
+
{linkColumns.map((column) => (
|
|
87
|
+
<LinkColumn key={column.title} column={column} />
|
|
88
|
+
))}
|
|
89
|
+
</div>
|
|
90
|
+
<div className="grid grid-cols-1 gap-0 sm:grid-cols-2 lg:flex lg:max-w-[794px]">
|
|
91
|
+
{regions.map((region) => (
|
|
92
|
+
<RegionColumn key={region.title} region={region} />
|
|
93
|
+
))}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div className="flex flex-col gap-3 border-t border-[#ededee] px-4 py-5 sm:px-5">
|
|
98
|
+
<div className="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
|
|
99
|
+
<p className="text-center text-sm text-[#020617] lg:text-left">
|
|
100
|
+
{copyright}{" "}
|
|
101
|
+
<span className="text-[#97989f]">( Site by </span>
|
|
102
|
+
<a
|
|
103
|
+
href={siteByHref ?? "#"}
|
|
104
|
+
className="underline transition-colors duration-200 ease-out hover:text-[#020617] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
105
|
+
>
|
|
106
|
+
{siteByLabel}
|
|
107
|
+
</a>
|
|
108
|
+
<span className="text-[#97989f]"> )</span>
|
|
109
|
+
</p>
|
|
110
|
+
|
|
111
|
+
<div className="flex flex-wrap items-center justify-center gap-1 lg:justify-end">
|
|
112
|
+
{paymentBadges.map((badge, index) => (
|
|
113
|
+
<div
|
|
114
|
+
key={`${badge.src}-${index}`}
|
|
115
|
+
className="flex size-[34px] items-center justify-center overflow-hidden rounded border border-[#ededee] bg-white p-1"
|
|
116
|
+
>
|
|
117
|
+
<SafeImage
|
|
118
|
+
src={badge.src}
|
|
119
|
+
alt={badge.alt ?? ""}
|
|
120
|
+
width={28}
|
|
121
|
+
height={28}
|
|
122
|
+
className="h-auto max-h-full w-auto max-w-full object-contain"
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
))}
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</footer>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
Footer02.propTypes = footer02PropTypes;
|
|
135
|
+
|
|
136
|
+
export default Footer02;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import PropTypes from "prop-types";
|
|
2
|
+
|
|
3
|
+
const linkShape = PropTypes.shape({
|
|
4
|
+
label: PropTypes.string.isRequired,
|
|
5
|
+
href: PropTypes.string,
|
|
6
|
+
underline: PropTypes.bool,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const columnShape = PropTypes.shape({
|
|
10
|
+
title: PropTypes.string.isRequired,
|
|
11
|
+
links: PropTypes.arrayOf(linkShape),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const regionShape = PropTypes.shape({
|
|
15
|
+
title: PropTypes.string.isRequired,
|
|
16
|
+
address: PropTypes.string,
|
|
17
|
+
email: PropTypes.string,
|
|
18
|
+
phone: PropTypes.string,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const paymentShape = PropTypes.shape({
|
|
22
|
+
src: PropTypes.string.isRequired,
|
|
23
|
+
alt: PropTypes.string,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const footer02PropTypes = {
|
|
27
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
28
|
+
regions: PropTypes.arrayOf(regionShape),
|
|
29
|
+
paymentBadges: PropTypes.arrayOf(paymentShape),
|
|
30
|
+
copyright: PropTypes.string,
|
|
31
|
+
siteByLabel: PropTypes.string,
|
|
32
|
+
siteByHref: PropTypes.string,
|
|
33
|
+
className: PropTypes.string,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const footer02DefaultProps = {
|
|
37
|
+
linkColumns: [
|
|
38
|
+
{
|
|
39
|
+
title: "Navigate",
|
|
40
|
+
links: [
|
|
41
|
+
{ label: "Shop", href: "#" },
|
|
42
|
+
{ label: "About", href: "#" },
|
|
43
|
+
{ label: "Contact", href: "#" },
|
|
44
|
+
{ label: "Store Locator", href: "#" },
|
|
45
|
+
{ label: "Blog", href: "#" },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: "Get Help",
|
|
50
|
+
links: [
|
|
51
|
+
{ label: "Faq", href: "#" },
|
|
52
|
+
{ label: "Delivery", href: "#" },
|
|
53
|
+
{ label: "Order Process", href: "#" },
|
|
54
|
+
{ label: "Returns", href: "#" },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: "Social",
|
|
59
|
+
links: [
|
|
60
|
+
{ label: "Instagram", href: "#" },
|
|
61
|
+
{ label: "Facebook", href: "#" },
|
|
62
|
+
{ label: "Tiktok", href: "#" },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
title: "My Account",
|
|
67
|
+
links: [
|
|
68
|
+
{ label: "Sign In / Register", href: "#" },
|
|
69
|
+
{ label: "My Orders", href: "#" },
|
|
70
|
+
{ label: "Wishlist", href: "#" },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: "Legal",
|
|
75
|
+
links: [
|
|
76
|
+
{ label: "Terms & Conditions", href: "#" },
|
|
77
|
+
{ label: "Privacy Policy", href: "#" },
|
|
78
|
+
{ label: "Refund Policy", href: "#" },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
regions: [
|
|
83
|
+
{
|
|
84
|
+
title: "United Arab Emirates",
|
|
85
|
+
address:
|
|
86
|
+
"89GR+4WX - Al Wahda St, Industrial Area - Al Majaz 2, Sharjah, United Arab Emirates",
|
|
87
|
+
email: "ecommerceuae@gentlepark.com",
|
|
88
|
+
phone: "+971 6 574 7803",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: "Bangladesh",
|
|
92
|
+
address:
|
|
93
|
+
"Ahmed Tower (9th Floor), 28 & 30, Kamal Ataturk Avenue, Banani C/A, Dhaka-1213",
|
|
94
|
+
email: "ecommercebd@gentlepark.com",
|
|
95
|
+
phone: "+8802 2222 74913-4",
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
paymentBadges: [
|
|
99
|
+
...Array.from({ length: 8 }, (_, i) => ({
|
|
100
|
+
src: `/footer/footer02/payment-${String(i + 1).padStart(2, "0")}.png`,
|
|
101
|
+
alt: `Payment method ${i + 1}`,
|
|
102
|
+
})),
|
|
103
|
+
...Array.from({ length: 7 }, (_, i) => ({
|
|
104
|
+
src: `/footer/footer02/payment-${String(i + 9).padStart(2, "0")}.svg`,
|
|
105
|
+
alt: `Payment method ${i + 9}`,
|
|
106
|
+
})),
|
|
107
|
+
],
|
|
108
|
+
copyright: "© 2025 Gentle Park. All rights Reserved",
|
|
109
|
+
siteByLabel: "Notionhive",
|
|
110
|
+
siteByHref: "#",
|
|
111
|
+
className: "",
|
|
112
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer02, default } from "./Footer02";
|