@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,58 @@
|
|
|
1
|
+
import PropTypes from "prop-types";
|
|
2
|
+
|
|
3
|
+
const navItemShape = PropTypes.shape({
|
|
4
|
+
label: PropTypes.string.isRequired,
|
|
5
|
+
href: PropTypes.string,
|
|
6
|
+
expandable: PropTypes.bool,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const socialShape = PropTypes.shape({
|
|
10
|
+
label: PropTypes.string.isRequired,
|
|
11
|
+
href: PropTypes.string,
|
|
12
|
+
icon: PropTypes.oneOf(["linkedin", "youtube", "instagram"]),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const legalLinkShape = PropTypes.shape({
|
|
16
|
+
label: PropTypes.string.isRequired,
|
|
17
|
+
href: PropTypes.string,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const footer15PropTypes = {
|
|
21
|
+
tagline: PropTypes.string,
|
|
22
|
+
ctaLabel: PropTypes.string,
|
|
23
|
+
ctaHref: PropTypes.string,
|
|
24
|
+
onCtaClick: PropTypes.func,
|
|
25
|
+
navItems: PropTypes.arrayOf(navItemShape),
|
|
26
|
+
socialLinks: PropTypes.arrayOf(socialShape),
|
|
27
|
+
logoSrc: PropTypes.string,
|
|
28
|
+
logoAlt: PropTypes.string,
|
|
29
|
+
copyright: PropTypes.string,
|
|
30
|
+
legalLinks: PropTypes.arrayOf(legalLinkShape),
|
|
31
|
+
className: PropTypes.string,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const footer15DefaultProps = {
|
|
35
|
+
tagline: "Logistics made simple, scalable, and efficient powered by Shipora.",
|
|
36
|
+
ctaLabel: "Get a Free Quote",
|
|
37
|
+
ctaHref: "#",
|
|
38
|
+
navItems: [
|
|
39
|
+
{ label: "Services", href: "#", expandable: true },
|
|
40
|
+
{ label: "Track Shipment", href: "#" },
|
|
41
|
+
{ label: "About", href: "#" },
|
|
42
|
+
{ label: "Resources", href: "#" },
|
|
43
|
+
{ label: "Contact Us", href: "#" },
|
|
44
|
+
],
|
|
45
|
+
socialLinks: [
|
|
46
|
+
{ label: "LinkedIn", href: "#", icon: "linkedin" },
|
|
47
|
+
{ label: "YouTube", href: "#", icon: "youtube" },
|
|
48
|
+
{ label: "Instagram", href: "#", icon: "instagram" },
|
|
49
|
+
],
|
|
50
|
+
logoSrc: "/footer/footer15/logo.svg",
|
|
51
|
+
logoAlt: "Shipora",
|
|
52
|
+
copyright: "© 2026 All rights reserved.",
|
|
53
|
+
legalLinks: [
|
|
54
|
+
{ label: "Terms & Condition", href: "#" },
|
|
55
|
+
{ label: "Privacy Policy", href: "#" },
|
|
56
|
+
],
|
|
57
|
+
className: "",
|
|
58
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer15, default } from "./Footer15";
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import SafeImage from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer16DefaultProps,
|
|
6
|
+
footer16PropTypes,
|
|
7
|
+
} from "./Footer16.propTypes";
|
|
8
|
+
|
|
9
|
+
function LinkColumn({ column }) {
|
|
10
|
+
return (
|
|
11
|
+
<div className="flex min-w-0 flex-col gap-4">
|
|
12
|
+
<p className="text-xl font-semibold leading-5 text-white">{column.title}</p>
|
|
13
|
+
<ul className="flex flex-col gap-3">
|
|
14
|
+
{column.links.map((link) => (
|
|
15
|
+
<li key={link.label}>
|
|
16
|
+
<a
|
|
17
|
+
href={link.href ?? "#"}
|
|
18
|
+
className="text-base text-white/70 transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
19
|
+
>
|
|
20
|
+
{link.label}
|
|
21
|
+
</a>
|
|
22
|
+
</li>
|
|
23
|
+
))}
|
|
24
|
+
</ul>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Footer16 — Axentec dark multi-column footer (1440px reference).
|
|
31
|
+
* Figma node 32:19076.
|
|
32
|
+
*/
|
|
33
|
+
export function Footer16({
|
|
34
|
+
logoSrc = footer16DefaultProps.logoSrc,
|
|
35
|
+
logoAlt = footer16DefaultProps.logoAlt,
|
|
36
|
+
linkColumns = footer16DefaultProps.linkColumns,
|
|
37
|
+
copyright = footer16DefaultProps.copyright,
|
|
38
|
+
legalLinks = footer16DefaultProps.legalLinks,
|
|
39
|
+
className = "",
|
|
40
|
+
}) {
|
|
41
|
+
return (
|
|
42
|
+
<footer
|
|
43
|
+
className={["relative w-full overflow-hidden bg-[#221e1f]", className]
|
|
44
|
+
.filter(Boolean)
|
|
45
|
+
.join(" ")}
|
|
46
|
+
data-footer="footer16"
|
|
47
|
+
>
|
|
48
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-8 px-4 py-12 sm:px-6 md:px-10 lg:gap-12 lg:px-[70px] lg:pb-8 lg:pt-[70px] xl:px-[70px]">
|
|
49
|
+
<div className="flex flex-col gap-10 lg:flex-row lg:items-start lg:justify-between">
|
|
50
|
+
<SafeImage
|
|
51
|
+
src={logoSrc}
|
|
52
|
+
alt={logoAlt}
|
|
53
|
+
width={144}
|
|
54
|
+
height={45}
|
|
55
|
+
className="h-9 w-auto max-w-[144px] sm:h-11"
|
|
56
|
+
/>
|
|
57
|
+
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4 lg:gap-12 xl:gap-16">
|
|
58
|
+
{linkColumns.map((column) => (
|
|
59
|
+
<LinkColumn key={column.title} column={column} />
|
|
60
|
+
))}
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div className="flex flex-col gap-6 border-t border-white/10 pt-6 lg:gap-8 lg:pt-8">
|
|
65
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
66
|
+
<p className="text-sm font-medium text-[#fffeff]/70">{copyright}</p>
|
|
67
|
+
<div className="flex flex-wrap gap-4">
|
|
68
|
+
{legalLinks.map((link) => (
|
|
69
|
+
<a
|
|
70
|
+
key={link.label}
|
|
71
|
+
href={link.href ?? "#"}
|
|
72
|
+
className="text-sm font-medium text-[#fffeff]/70 transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
73
|
+
>
|
|
74
|
+
{link.label}
|
|
75
|
+
</a>
|
|
76
|
+
))}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</footer>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Footer16.propTypes = footer16PropTypes;
|
|
86
|
+
|
|
87
|
+
export default Footer16;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import PropTypes from "prop-types";
|
|
2
|
+
|
|
3
|
+
const linkShape = PropTypes.shape({
|
|
4
|
+
label: PropTypes.string.isRequired,
|
|
5
|
+
href: PropTypes.string,
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const columnShape = PropTypes.shape({
|
|
9
|
+
title: PropTypes.string.isRequired,
|
|
10
|
+
links: PropTypes.arrayOf(linkShape),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const legalLinkShape = PropTypes.shape({
|
|
14
|
+
label: PropTypes.string.isRequired,
|
|
15
|
+
href: PropTypes.string,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const footer16PropTypes = {
|
|
19
|
+
logoSrc: PropTypes.string,
|
|
20
|
+
logoAlt: PropTypes.string,
|
|
21
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
22
|
+
copyright: PropTypes.string,
|
|
23
|
+
legalLinks: PropTypes.arrayOf(legalLinkShape),
|
|
24
|
+
className: PropTypes.string,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const footer16DefaultProps = {
|
|
28
|
+
logoSrc: "/footer/footer16/logo.svg",
|
|
29
|
+
logoAlt: "axentec",
|
|
30
|
+
linkColumns: [
|
|
31
|
+
{
|
|
32
|
+
title: "About",
|
|
33
|
+
links: [
|
|
34
|
+
{ label: "About axentec PLC", href: "#" },
|
|
35
|
+
{ label: "Career", href: "#" },
|
|
36
|
+
{ label: "Latest Insights", href: "#" },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: "Our Solutions",
|
|
41
|
+
links: [
|
|
42
|
+
{ label: "ICT Solutions", href: "#" },
|
|
43
|
+
{ label: "Cyber Security", href: "#" },
|
|
44
|
+
{ label: "AdTech & MarTech", href: "#" },
|
|
45
|
+
{ label: "Msft, Google, HRIS", href: "#" },
|
|
46
|
+
{ label: "Cloud & Colo", href: "#" },
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: "Useful Links",
|
|
51
|
+
links: [
|
|
52
|
+
{ label: "Contact Us", href: "#" },
|
|
53
|
+
{ label: "Customer Service", href: "#" },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
title: "Social",
|
|
58
|
+
links: [
|
|
59
|
+
{ label: "LinkedIn", href: "#" },
|
|
60
|
+
{ label: "Youtube", href: "#" },
|
|
61
|
+
{ label: "Facebook", href: "#" },
|
|
62
|
+
{ label: "X", href: "#" },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
copyright: "© 2024 axentec PLC",
|
|
67
|
+
legalLinks: [
|
|
68
|
+
{ label: "Privacy", href: "#" },
|
|
69
|
+
{ label: "Sitemap", href: "#" },
|
|
70
|
+
{ label: "Terms of Use", href: "#" },
|
|
71
|
+
],
|
|
72
|
+
className: "",
|
|
73
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer16, default } from "./Footer16";
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import SafeImage from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer17DefaultProps,
|
|
6
|
+
footer17PropTypes,
|
|
7
|
+
} from "./Footer17.propTypes";
|
|
8
|
+
|
|
9
|
+
function ChevronRightIcon({ className = "" }) {
|
|
10
|
+
return (
|
|
11
|
+
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true" className={className}>
|
|
12
|
+
<path d="M8 5l5 5-5 5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function FacebookIcon({ className = "" }) {
|
|
18
|
+
return (
|
|
19
|
+
<svg viewBox="0 0 18 18" fill="currentColor" aria-hidden="true" className={className}>
|
|
20
|
+
<path d="M18 9a9 9 0 10-10.4 8.9v-6.3H5.5V9h2.1V7.1c0-2.1 1.2-3.2 3.1-3.2.9 0 1.8.2 1.8.2v2h-1c-1 0-1.3.6-1.3 1.3V9h2.3l-.4 2.6h-1.9v6.3A9 9 0 0018 9z" />
|
|
21
|
+
</svg>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function LinkedinIcon({ className = "" }) {
|
|
26
|
+
return (
|
|
27
|
+
<svg viewBox="0 0 18 18" fill="currentColor" aria-hidden="true" className={className}>
|
|
28
|
+
<path d="M4 2a2 2 0 100 4 2 2 0 000-4zM2 7h4v11H2V7zm6 0h3.8v1.5c.6-1 1.8-1.7 3.2-1.7 3.4 0 4 2.2 4 5.1V18h-4v-5.6c0-1.3 0-2.9-1.8-2.9-1.8 0-2.1 1.4-2.1 2.8V18H8V7z" />
|
|
29
|
+
</svg>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function YoutubeIcon({ className = "" }) {
|
|
34
|
+
return (
|
|
35
|
+
<svg viewBox="0 0 18 18" fill="currentColor" aria-hidden="true" className={className}>
|
|
36
|
+
<path d="M17.6 4.8a2.3 2.3 0 00-1.6-1.6C14.4 3 9 3 9 3s-5.4 0-7 .2A2.3 2.3 0 00.4 4.8 24 24 0 000 9a24 24 0 00.4 4.2 2.3 2.3 0 001.6 1.6c1.6.2 7 .2 7 .2s5.4 0 7-.2a2.3 2.3 0 001.6-1.6A24 24 0 0018 9a24 24 0 00-.4-4.2zM7.2 11.7V6.3L12 9l-4.8 2.7z" />
|
|
37
|
+
</svg>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const SOCIAL_ICONS = {
|
|
42
|
+
facebook: FacebookIcon,
|
|
43
|
+
linkedin: LinkedinIcon,
|
|
44
|
+
youtube: YoutubeIcon,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function LinkColumn({ column }) {
|
|
48
|
+
return (
|
|
49
|
+
<div className="flex min-w-0 flex-col gap-6 sm:gap-[30px]">
|
|
50
|
+
<p className="text-base font-semibold leading-normal tracking-[0.48px] text-[#1c1917]">
|
|
51
|
+
{column.title}
|
|
52
|
+
</p>
|
|
53
|
+
<ul className="flex flex-col gap-4">
|
|
54
|
+
{column.links.map((link) => (
|
|
55
|
+
<li key={link.label}>
|
|
56
|
+
<a
|
|
57
|
+
href={link.href ?? "#"}
|
|
58
|
+
className="text-sm leading-[22px] text-[#2e2926] transition-colors duration-200 ease-out hover:text-[#1c1917] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
59
|
+
>
|
|
60
|
+
{link.label}
|
|
61
|
+
</a>
|
|
62
|
+
</li>
|
|
63
|
+
))}
|
|
64
|
+
</ul>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Footer17 — SAF cream footer with donate CTA and link columns.
|
|
71
|
+
* Figma node 32:19450 at 1440px.
|
|
72
|
+
*/
|
|
73
|
+
export function Footer17({
|
|
74
|
+
logoLeftSrc = footer17DefaultProps.logoLeftSrc,
|
|
75
|
+
logoRightSrc = footer17DefaultProps.logoRightSrc,
|
|
76
|
+
logoAlt = footer17DefaultProps.logoAlt,
|
|
77
|
+
ctaText = footer17DefaultProps.ctaText,
|
|
78
|
+
donateLabel = footer17DefaultProps.donateLabel,
|
|
79
|
+
donateHref = footer17DefaultProps.donateHref,
|
|
80
|
+
onDonateClick,
|
|
81
|
+
linkColumns = footer17DefaultProps.linkColumns,
|
|
82
|
+
followLabel = footer17DefaultProps.followLabel,
|
|
83
|
+
socialLinks = footer17DefaultProps.socialLinks,
|
|
84
|
+
copyright = footer17DefaultProps.copyright,
|
|
85
|
+
legalLinks = footer17DefaultProps.legalLinks,
|
|
86
|
+
className = "",
|
|
87
|
+
}) {
|
|
88
|
+
return (
|
|
89
|
+
<footer
|
|
90
|
+
className={["relative w-full overflow-hidden bg-[#faf9f5] pb-24 lg:pb-28", className]
|
|
91
|
+
.filter(Boolean)
|
|
92
|
+
.join(" ")}
|
|
93
|
+
data-footer="footer17"
|
|
94
|
+
>
|
|
95
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col px-4 pt-10 sm:px-6 md:px-10 lg:px-[75px] lg:pt-[41px]">
|
|
96
|
+
<div className="flex flex-col gap-8 lg:flex-row lg:items-start lg:justify-between">
|
|
97
|
+
<div className="relative h-12 w-full max-w-[265px] sm:h-14">
|
|
98
|
+
<SafeImage
|
|
99
|
+
src={logoLeftSrc}
|
|
100
|
+
alt=""
|
|
101
|
+
width={120}
|
|
102
|
+
height={58}
|
|
103
|
+
className="absolute bottom-0 left-0 h-full w-auto max-w-[45%] object-contain object-left"
|
|
104
|
+
/>
|
|
105
|
+
<SafeImage
|
|
106
|
+
src={logoRightSrc}
|
|
107
|
+
alt={logoAlt}
|
|
108
|
+
width={160}
|
|
109
|
+
height={58}
|
|
110
|
+
className="absolute bottom-0 right-0 h-full w-auto max-w-[55%] object-contain object-right"
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
<div className="flex flex-col items-start gap-2.5 lg:items-end">
|
|
114
|
+
<p className="text-base font-medium tracking-[0.48px] text-[#1c1917]">{ctaText}</p>
|
|
115
|
+
<a
|
|
116
|
+
href={donateHref ?? "#"}
|
|
117
|
+
onClick={onDonateClick}
|
|
118
|
+
className="inline-flex h-14 items-center gap-2 rounded-full bg-[#971512] px-6 text-base font-semibold text-white transition-colors duration-200 ease-out hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
119
|
+
>
|
|
120
|
+
{donateLabel}
|
|
121
|
+
<ChevronRightIcon className="size-5" />
|
|
122
|
+
</a>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div className="mt-10 flex flex-col gap-10">
|
|
127
|
+
<div className="h-px w-full bg-[#efecdf]" />
|
|
128
|
+
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6 lg:justify-between">
|
|
129
|
+
{linkColumns.map((column) => (
|
|
130
|
+
<LinkColumn key={column.title} column={column} />
|
|
131
|
+
))}
|
|
132
|
+
</div>
|
|
133
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-end">
|
|
134
|
+
<span className="text-sm tracking-[0.42px] text-[#2e2926]">{followLabel}</span>
|
|
135
|
+
<div className="flex items-center">
|
|
136
|
+
{socialLinks.map((social) => {
|
|
137
|
+
const Icon = SOCIAL_ICONS[social.icon] ?? FacebookIcon;
|
|
138
|
+
return (
|
|
139
|
+
<a
|
|
140
|
+
key={social.label}
|
|
141
|
+
href={social.href ?? "#"}
|
|
142
|
+
aria-label={social.label}
|
|
143
|
+
className="rounded-full p-2.5 text-[#2e2926] transition-opacity duration-200 ease-out hover:opacity-70 focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
144
|
+
>
|
|
145
|
+
<Icon className="size-[18px]" />
|
|
146
|
+
</a>
|
|
147
|
+
);
|
|
148
|
+
})}
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<div className="absolute bottom-0 left-0 right-0 border-t border-[#efecdf] bg-[#faf9f5] px-4 py-6 sm:px-6 md:px-10 lg:px-[75px]">
|
|
155
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-4 text-sm leading-[22px] text-[#5b5755] sm:flex-row sm:items-center sm:justify-between">
|
|
156
|
+
<p>{copyright}</p>
|
|
157
|
+
<div className="flex flex-wrap gap-6">
|
|
158
|
+
{legalLinks.map((link) => (
|
|
159
|
+
<a
|
|
160
|
+
key={link.label}
|
|
161
|
+
href={link.href ?? "#"}
|
|
162
|
+
className="transition-colors duration-200 ease-out hover:text-[#1c1917] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
163
|
+
>
|
|
164
|
+
{link.label}
|
|
165
|
+
</a>
|
|
166
|
+
))}
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</footer>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
Footer17.propTypes = footer17PropTypes;
|
|
175
|
+
|
|
176
|
+
export default Footer17;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import PropTypes from "prop-types";
|
|
2
|
+
|
|
3
|
+
const linkShape = PropTypes.shape({
|
|
4
|
+
label: PropTypes.string.isRequired,
|
|
5
|
+
href: PropTypes.string,
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const columnShape = PropTypes.shape({
|
|
9
|
+
title: PropTypes.string.isRequired,
|
|
10
|
+
links: PropTypes.arrayOf(linkShape),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const socialShape = PropTypes.shape({
|
|
14
|
+
label: PropTypes.string.isRequired,
|
|
15
|
+
href: PropTypes.string,
|
|
16
|
+
icon: PropTypes.oneOf(["facebook", "linkedin", "youtube"]),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const legalLinkShape = PropTypes.shape({
|
|
20
|
+
label: PropTypes.string.isRequired,
|
|
21
|
+
href: PropTypes.string,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const footer17PropTypes = {
|
|
25
|
+
logoLeftSrc: PropTypes.string,
|
|
26
|
+
logoRightSrc: PropTypes.string,
|
|
27
|
+
logoAlt: PropTypes.string,
|
|
28
|
+
ctaText: PropTypes.string,
|
|
29
|
+
donateLabel: PropTypes.string,
|
|
30
|
+
donateHref: PropTypes.string,
|
|
31
|
+
onDonateClick: PropTypes.func,
|
|
32
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
33
|
+
followLabel: PropTypes.string,
|
|
34
|
+
socialLinks: PropTypes.arrayOf(socialShape),
|
|
35
|
+
copyright: PropTypes.string,
|
|
36
|
+
legalLinks: PropTypes.arrayOf(legalLinkShape),
|
|
37
|
+
className: PropTypes.string,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const footer17DefaultProps = {
|
|
41
|
+
logoLeftSrc: "/footer/footer17/logo-left.svg",
|
|
42
|
+
logoRightSrc: "/footer/footer17/logo-right.svg",
|
|
43
|
+
logoAlt: "SAF Sustainable Agriculture Foundation",
|
|
44
|
+
ctaText: "You Can Help—Contribute Today!",
|
|
45
|
+
donateLabel: "Donate Now",
|
|
46
|
+
donateHref: "#",
|
|
47
|
+
linkColumns: [
|
|
48
|
+
{
|
|
49
|
+
title: "About us",
|
|
50
|
+
links: [
|
|
51
|
+
{ label: "Organization", href: "#" },
|
|
52
|
+
{ label: "Legacy", href: "#" },
|
|
53
|
+
{ label: "Vision", href: "#" },
|
|
54
|
+
{ label: "Mission", href: "#" },
|
|
55
|
+
{ label: "Values", href: "#" },
|
|
56
|
+
{ label: "Strategy", href: "#" },
|
|
57
|
+
{ label: "Leadership", href: "#" },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: "Our Work",
|
|
62
|
+
links: [
|
|
63
|
+
{ label: "Map", href: "#" },
|
|
64
|
+
{ label: "Global Program", href: "#" },
|
|
65
|
+
{ label: "Toc", href: "#" },
|
|
66
|
+
{ label: "Impacts", href: "#" },
|
|
67
|
+
{ label: "Partners", href: "#" },
|
|
68
|
+
{ label: "Donors", href: "#" },
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
title: "Global Presence",
|
|
73
|
+
links: [
|
|
74
|
+
{ label: "Bangladesh", href: "#" },
|
|
75
|
+
{ label: "Kenya", href: "#" },
|
|
76
|
+
{ label: "India", href: "#" },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
title: "Our Impact",
|
|
81
|
+
links: [
|
|
82
|
+
{ label: "Reports & Publications", href: "#" },
|
|
83
|
+
{ label: "Impacts stories", href: "#" },
|
|
84
|
+
{ label: "Blogs & Articles", href: "#" },
|
|
85
|
+
{ label: "Media & News", href: "#" },
|
|
86
|
+
{ label: "Gallery", href: "#" },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
title: "Get Involved",
|
|
91
|
+
links: [
|
|
92
|
+
{ label: "Careers", href: "#" },
|
|
93
|
+
{ label: "Consultancy", href: "#" },
|
|
94
|
+
{ label: "EOI", href: "#" },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
title: "Contact Us",
|
|
99
|
+
links: [
|
|
100
|
+
{ label: "Global", href: "#" },
|
|
101
|
+
{ label: "Countries", href: "#" },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
followLabel: "Follow us",
|
|
106
|
+
socialLinks: [
|
|
107
|
+
{ label: "Facebook", href: "#", icon: "facebook" },
|
|
108
|
+
{ label: "LinkedIn", href: "#", icon: "linkedin" },
|
|
109
|
+
{ label: "YouTube", href: "#", icon: "youtube" },
|
|
110
|
+
],
|
|
111
|
+
copyright: "© 2024 Sustainable Agriculture Foundation.",
|
|
112
|
+
legalLinks: [
|
|
113
|
+
{ label: "Privacy Notice", href: "#" },
|
|
114
|
+
{ label: "Terms of Use", href: "#" },
|
|
115
|
+
],
|
|
116
|
+
className: "",
|
|
117
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer17, default } from "./Footer17";
|