@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,136 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import SafeImage from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer22DefaultProps,
|
|
6
|
+
footer22PropTypes,
|
|
7
|
+
} from "./Footer22.propTypes";
|
|
8
|
+
|
|
9
|
+
function LinkColumn({ column, linkClassName }) {
|
|
10
|
+
return (
|
|
11
|
+
<div className="flex min-w-0 flex-col gap-4">
|
|
12
|
+
<p className="text-base font-semibold leading-[30px] text-[#0a0057] sm:text-lg xl:text-xl">
|
|
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 leading-[22px] tracking-[-0.7px] text-[#546677] transition-colors duration-200 ease-out hover:text-[#0a0057] focus-visible:outline-2 focus-visible:outline-offset-2",
|
|
22
|
+
linkClassName,
|
|
23
|
+
]
|
|
24
|
+
.filter(Boolean)
|
|
25
|
+
.join(" ")}
|
|
26
|
+
>
|
|
27
|
+
{link.label}
|
|
28
|
+
</a>
|
|
29
|
+
</li>
|
|
30
|
+
))}
|
|
31
|
+
</ul>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Footer22 — Cerebral Edge white footer with contact and link columns.
|
|
38
|
+
* Figma node 32:19983 at 1920px.
|
|
39
|
+
*/
|
|
40
|
+
export function Footer22({
|
|
41
|
+
logoIconSrc = footer22DefaultProps.logoIconSrc,
|
|
42
|
+
logoNameSrc = footer22DefaultProps.logoNameSrc,
|
|
43
|
+
logoTaglineSrc = footer22DefaultProps.logoTaglineSrc,
|
|
44
|
+
email = footer22DefaultProps.email,
|
|
45
|
+
emailHref = footer22DefaultProps.emailHref,
|
|
46
|
+
phone = footer22DefaultProps.phone,
|
|
47
|
+
linkColumns = footer22DefaultProps.linkColumns,
|
|
48
|
+
copyright = footer22DefaultProps.copyright,
|
|
49
|
+
privacyLabel = footer22DefaultProps.privacyLabel,
|
|
50
|
+
privacyHref = footer22DefaultProps.privacyHref,
|
|
51
|
+
className = "",
|
|
52
|
+
}) {
|
|
53
|
+
return (
|
|
54
|
+
<footer
|
|
55
|
+
className={["relative w-full overflow-hidden bg-white", className]
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.join(" ")}
|
|
58
|
+
data-footer="footer22"
|
|
59
|
+
>
|
|
60
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-10 px-4 py-10 sm:px-6 md:gap-12 md:px-10 lg:px-20 lg:py-[75px] xl:px-[131px]">
|
|
61
|
+
<div className="grid grid-cols-1 gap-10 sm:grid-cols-2 lg:grid-cols-4 lg:gap-8 xl:gap-12">
|
|
62
|
+
<div className="flex flex-col gap-6 sm:col-span-2 lg:col-span-1">
|
|
63
|
+
<div className="relative h-auto w-full max-w-[200px]">
|
|
64
|
+
<SafeImage
|
|
65
|
+
src={logoIconSrc}
|
|
66
|
+
alt=""
|
|
67
|
+
width={94}
|
|
68
|
+
height={94}
|
|
69
|
+
className="mb-2 h-auto w-[94px] max-w-full"
|
|
70
|
+
/>
|
|
71
|
+
<SafeImage
|
|
72
|
+
src={logoNameSrc}
|
|
73
|
+
alt="CerebralEdge"
|
|
74
|
+
width={200}
|
|
75
|
+
height={28}
|
|
76
|
+
className="mb-1 h-auto w-full max-w-[200px]"
|
|
77
|
+
/>
|
|
78
|
+
<SafeImage
|
|
79
|
+
src={logoTaglineSrc}
|
|
80
|
+
alt="Deep Insights, Powerful Results"
|
|
81
|
+
width={200}
|
|
82
|
+
height={14}
|
|
83
|
+
className="h-auto w-full max-w-[200px]"
|
|
84
|
+
/>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div className="flex flex-col gap-6">
|
|
89
|
+
<div className="flex flex-col gap-2">
|
|
90
|
+
<p className="text-base font-semibold leading-[30px] text-[#0a0057] sm:text-lg xl:text-xl">
|
|
91
|
+
Email Us —
|
|
92
|
+
</p>
|
|
93
|
+
<a
|
|
94
|
+
href={emailHref ?? `mailto:${email}`}
|
|
95
|
+
className="text-sm leading-[22px] tracking-[-0.7px] text-[#546677] underline transition-colors duration-200 ease-out hover:text-[#0a0057] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
96
|
+
>
|
|
97
|
+
{email}
|
|
98
|
+
</a>
|
|
99
|
+
</div>
|
|
100
|
+
<div className="flex flex-col gap-2">
|
|
101
|
+
<p className="text-base font-semibold leading-[30px] text-[#0a0057] sm:text-lg xl:text-xl">
|
|
102
|
+
Call Us —
|
|
103
|
+
</p>
|
|
104
|
+
<a
|
|
105
|
+
href={`tel:${phone.replace(/\s/g, "")}`}
|
|
106
|
+
className="text-sm leading-[22px] tracking-[-0.7px] text-[#546677] transition-colors duration-200 ease-out hover:text-[#0a0057] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
107
|
+
>
|
|
108
|
+
{phone}
|
|
109
|
+
</a>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
{linkColumns.map((column) => (
|
|
114
|
+
<LinkColumn key={column.title} column={column} />
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div className="flex flex-col items-center justify-between gap-4 border-t border-transparent pt-4 sm:flex-row">
|
|
119
|
+
<p className="text-center text-sm leading-[22px] tracking-[-0.7px] text-[#546677] sm:text-left">
|
|
120
|
+
{copyright}
|
|
121
|
+
</p>
|
|
122
|
+
<a
|
|
123
|
+
href={privacyHref ?? "#"}
|
|
124
|
+
className="text-sm leading-[22px] tracking-[-0.7px] text-[#546677] transition-colors duration-200 ease-out hover:text-[#0a0057] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
125
|
+
>
|
|
126
|
+
{privacyLabel}
|
|
127
|
+
</a>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</footer>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
Footer22.propTypes = footer22PropTypes;
|
|
135
|
+
|
|
136
|
+
export default Footer22;
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
export const footer22PropTypes = {
|
|
14
|
+
logoIconSrc: PropTypes.string,
|
|
15
|
+
logoNameSrc: PropTypes.string,
|
|
16
|
+
logoTaglineSrc: PropTypes.string,
|
|
17
|
+
email: PropTypes.string,
|
|
18
|
+
emailHref: PropTypes.string,
|
|
19
|
+
phone: PropTypes.string,
|
|
20
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
21
|
+
copyright: PropTypes.string,
|
|
22
|
+
privacyLabel: PropTypes.string,
|
|
23
|
+
privacyHref: PropTypes.string,
|
|
24
|
+
className: PropTypes.string,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const footer22DefaultProps = {
|
|
28
|
+
logoIconSrc: "/footer/footer22/logo-icon.svg",
|
|
29
|
+
logoNameSrc: "/footer/footer22/logo-name.svg",
|
|
30
|
+
logoTaglineSrc: "/footer/footer22/logo-tagline.svg",
|
|
31
|
+
email: "solutions@cerebraledge.com",
|
|
32
|
+
emailHref: "mailto:solutions@cerebraledge.com",
|
|
33
|
+
phone: "469 223 9013",
|
|
34
|
+
linkColumns: [
|
|
35
|
+
{
|
|
36
|
+
title: "Useful Links",
|
|
37
|
+
links: [
|
|
38
|
+
{ label: "Serivces", href: "#" },
|
|
39
|
+
{ label: "Case Studies", href: "#" },
|
|
40
|
+
{ label: "Blog", href: "#" },
|
|
41
|
+
{ label: "Contact Us", href: "#" },
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
title: "Useful Link",
|
|
46
|
+
links: [
|
|
47
|
+
{ label: "Design Break Podcast", href: "#" },
|
|
48
|
+
{ label: "Press & Media", href: "#" },
|
|
49
|
+
{ label: "Work in Progress", href: "#" },
|
|
50
|
+
{ label: "Resources", href: "#" },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
copyright: "Copyright © 2021 Cerebral Edge. All rights reserved",
|
|
55
|
+
privacyLabel: "Privacy Policy",
|
|
56
|
+
privacyHref: "#",
|
|
57
|
+
className: "",
|
|
58
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer22, default } from "./Footer22";
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import SafeImage from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer23DefaultProps,
|
|
6
|
+
footer23PropTypes,
|
|
7
|
+
} from "./Footer23.propTypes";
|
|
8
|
+
|
|
9
|
+
function FacebookIcon({ className = "" }) {
|
|
10
|
+
return (
|
|
11
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
|
|
12
|
+
<path d="M12 2C6.48 2 2 6.48 2 12c0 5.01 3.66 9.15 8.44 9.9v-7H7.9V12h2.54V9.8c0-2.5 1.49-3.89 3.78-3.89 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56V12h2.78l-.44 2.9h-2.34v7C18.34 21.15 22 17.01 22 12c0-5.52-4.48-10-10-10z" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function LinkedinIcon({ className = "" }) {
|
|
18
|
+
return (
|
|
19
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
|
|
20
|
+
<path d="M20 3H4a1 1 0 00-1 1v16a1 1 0 001 1h16a1 1 0 001-1V4a1 1 0 00-1-1zM8 18H5v-9h3v9zM6.5 7.5a1.75 1.75 0 110-3.5 1.75 1.75 0 010 3.5zM19 18h-3v-4.6c0-1.1-.02-2.5-1.52-2.5-1.52 0-1.75 1.19-1.75 2.42V18h-3v-9h2.88v1.23h.04c.4-.76 1.38-1.56 2.84-1.56 3.04 0 3.6 2 3.6 4.6V18z" />
|
|
21
|
+
</svg>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function InstagramIcon({ className = "" }) {
|
|
26
|
+
return (
|
|
27
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
|
|
28
|
+
<path d="M12 2.2c2.67 0 2.99.01 4.04.06 1.01.05 1.56.23 1.93.38.48.19.83.41 1.19.77.36.36.58.71.77 1.19.15.37.33.92.38 1.93.05 1.05.06 1.37.06 4.04s-.01 2.99-.06 4.04c-.05 1.01-.23 1.56-.38 1.93-.19.48-.41.83-.77 1.19-.36.36-.71.58-1.19.77-.37.15-.92.33-1.93.38-1.05.05-1.37.06-4.04.06s-2.99-.01-4.04-.06c-1.01-.05-1.56-.23-1.93-.38a3.2 3.2 0 01-1.19-.77 3.2 3.2 0 01-.77-1.19c-.15-.37-.33-.92-.38-1.93C2.21 14.99 2.2 14.67 2.2 12s.01-2.99.06-4.04c.05-1.01.23-1.56.38-1.93.19-.48.41-.83.77-1.19.36-.36.71-.58 1.19-.77.37-.15.92-.33 1.93-.38C9.01 2.21 9.33 2.2 12 2.2zm0 1.8c-2.63 0-2.94.01-3.97.06-.96.04-1.48.2-1.83.34-.46.18-.79.4-1.14.75-.35.35-.57.68-.75 1.14-.14.35-.3.87-.34 1.83-.05 1.03-.06 1.34-.06 3.97s.01 2.94.06 3.97c.04.96.2 1.48.34 1.83.18.46.4.79.75 1.14.35.35.68.57 1.14.75.35.14.87.3 1.83.34 1.03.05 1.34.06 3.97.06s2.94-.01 3.97-.06c.96-.04 1.48-.2 1.83-.34.46-.18.79-.4 1.14-.75.35-.35.57-.68.75-1.14.14-.35.3-.87.34-1.83.05-1.03.06-1.34.06-3.97s-.01-2.94-.06-3.97c-.04-.96-.2-1.48-.34-1.83a3.1 3.1 0 00-.75-1.14 3.1 3.1 0 00-1.14-.75c-.35-.14-.87-.3-1.83-.34-1.03-.05-1.34-.06-3.97-.06zM12 7a5 5 0 100 10 5 5 0 000-10zm0 8.2a3.2 3.2 0 110-6.4 3.2 3.2 0 010 6.4zm5.25-9.85a1.17 1.17 0 11-2.34 0 1.17 1.17 0 012.34 0z" />
|
|
29
|
+
</svg>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function YoutubeIcon({ className = "" }) {
|
|
34
|
+
return (
|
|
35
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
|
|
36
|
+
<path d="M21.6 7.2a2.5 2.5 0 00-1.76-1.77C18 5 12 5 12 5s-6 0-7.84.43A2.5 2.5 0 002.4 7.2 26.3 26.3 0 002 12a26.3 26.3 0 00.4 4.8 2.5 2.5 0 001.76 1.77C6 19 12 19 12 19s6 0 7.84-.43a2.5 2.5 0 001.76-1.77A26.3 26.3 0 0022 12a26.3 26.3 0 00-.4-4.8zM10 15.5V8.5l5.25 3.5L10 15.5z" />
|
|
37
|
+
</svg>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const SOCIAL_ICONS = {
|
|
42
|
+
facebook: FacebookIcon,
|
|
43
|
+
instagram: InstagramIcon,
|
|
44
|
+
linkedin: LinkedinIcon,
|
|
45
|
+
youtube: YoutubeIcon,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
function LinkColumn({ column }) {
|
|
49
|
+
return (
|
|
50
|
+
<div className="flex min-w-0 flex-col gap-4">
|
|
51
|
+
<p className="text-base font-semibold leading-6 text-[#18191a]">{column.title}</p>
|
|
52
|
+
<ul className="flex flex-col gap-3">
|
|
53
|
+
{column.links.map((link) => (
|
|
54
|
+
<li key={link.label}>
|
|
55
|
+
<a
|
|
56
|
+
href={link.href ?? "#"}
|
|
57
|
+
className="text-sm leading-5 text-[#484a4d] transition-colors duration-200 ease-out hover:text-[#18191a] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
58
|
+
>
|
|
59
|
+
{link.label}
|
|
60
|
+
</a>
|
|
61
|
+
</li>
|
|
62
|
+
))}
|
|
63
|
+
</ul>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Footer23 — Japan Experiences & Tours multi-column footer.
|
|
70
|
+
* Figma node 32:19984 at 1920px.
|
|
71
|
+
*/
|
|
72
|
+
export function Footer23({
|
|
73
|
+
logoIconSrc = footer23DefaultProps.logoIconSrc,
|
|
74
|
+
logoNameSrc = footer23DefaultProps.logoNameSrc,
|
|
75
|
+
logoTaglineSrc = footer23DefaultProps.logoTaglineSrc,
|
|
76
|
+
description = footer23DefaultProps.description,
|
|
77
|
+
socialButtons = footer23DefaultProps.socialButtons,
|
|
78
|
+
linkColumns = footer23DefaultProps.linkColumns,
|
|
79
|
+
copyright = footer23DefaultProps.copyright,
|
|
80
|
+
legalLinks = footer23DefaultProps.legalLinks,
|
|
81
|
+
className = "",
|
|
82
|
+
}) {
|
|
83
|
+
return (
|
|
84
|
+
<footer
|
|
85
|
+
className={["relative w-full overflow-hidden bg-[#fdf9f6]", className]
|
|
86
|
+
.filter(Boolean)
|
|
87
|
+
.join(" ")}
|
|
88
|
+
data-footer="footer23"
|
|
89
|
+
>
|
|
90
|
+
<div className="mx-auto w-full max-w-[1920px] border-t border-[#eee] bg-white">
|
|
91
|
+
<div className="flex flex-col gap-12 px-4 py-12 sm:px-6 md:px-10 lg:gap-16 lg:px-10 lg:pt-20 xl:px-10">
|
|
92
|
+
<div className="flex flex-col gap-12 lg:flex-row lg:items-start lg:justify-between">
|
|
93
|
+
<div className="flex max-w-sm flex-col gap-6">
|
|
94
|
+
<div className="flex items-center gap-2">
|
|
95
|
+
<SafeImage
|
|
96
|
+
src={logoIconSrc}
|
|
97
|
+
alt=""
|
|
98
|
+
width={58}
|
|
99
|
+
height={58}
|
|
100
|
+
className="size-12 shrink-0 sm:size-14"
|
|
101
|
+
/>
|
|
102
|
+
<div className="flex min-w-0 flex-col gap-0.5">
|
|
103
|
+
<SafeImage
|
|
104
|
+
src={logoNameSrc}
|
|
105
|
+
alt="Japan Experiences & Tours"
|
|
106
|
+
width={124}
|
|
107
|
+
height={14}
|
|
108
|
+
className="h-auto w-[124px] max-w-full"
|
|
109
|
+
/>
|
|
110
|
+
<SafeImage
|
|
111
|
+
src={logoTaglineSrc}
|
|
112
|
+
alt=""
|
|
113
|
+
width={84}
|
|
114
|
+
height={10}
|
|
115
|
+
className="h-auto w-[84px] max-w-full"
|
|
116
|
+
/>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
<p className="text-sm leading-5 text-[#484a4d]">{description}</p>
|
|
120
|
+
<div className="flex flex-wrap items-center gap-6">
|
|
121
|
+
{socialButtons.map((social) => {
|
|
122
|
+
const Icon = SOCIAL_ICONS[social.icon] ?? FacebookIcon;
|
|
123
|
+
return (
|
|
124
|
+
<a
|
|
125
|
+
key={social.label}
|
|
126
|
+
href={social.href ?? "#"}
|
|
127
|
+
aria-label={social.label}
|
|
128
|
+
className="text-[#484a4d] transition-colors duration-200 ease-out hover:text-[#e31d4a] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
129
|
+
>
|
|
130
|
+
<Icon className="size-6" />
|
|
131
|
+
</a>
|
|
132
|
+
);
|
|
133
|
+
})}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div className="grid grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 xl:gap-10">
|
|
138
|
+
{linkColumns.map((column) => (
|
|
139
|
+
<LinkColumn key={column.title} column={column} />
|
|
140
|
+
))}
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<div className="bg-[#fafafa] px-4 pb-8 pt-5 sm:px-6 md:px-10 lg:px-10">
|
|
146
|
+
<div className="mb-5 h-px w-full bg-[#eee]" />
|
|
147
|
+
<div className="flex flex-col items-center justify-between gap-4 sm:flex-row">
|
|
148
|
+
<p className="text-center text-base leading-6 text-[#484a4d] sm:text-left">
|
|
149
|
+
{copyright}
|
|
150
|
+
</p>
|
|
151
|
+
<div className="flex flex-wrap items-center justify-center gap-2">
|
|
152
|
+
{legalLinks.map((link, index) => (
|
|
153
|
+
<span key={link.label} className="flex items-center gap-2">
|
|
154
|
+
{index > 0 ? (
|
|
155
|
+
<span className="text-[#484a4d]" aria-hidden="true">
|
|
156
|
+
|
|
|
157
|
+
</span>
|
|
158
|
+
) : null}
|
|
159
|
+
<a
|
|
160
|
+
href={link.href ?? "#"}
|
|
161
|
+
className="text-base leading-6 text-[#484a4d] transition-colors duration-200 ease-out hover:text-[#18191a] focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
162
|
+
>
|
|
163
|
+
{link.label}
|
|
164
|
+
</a>
|
|
165
|
+
</span>
|
|
166
|
+
))}
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</footer>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
Footer23.propTypes = footer23PropTypes;
|
|
176
|
+
|
|
177
|
+
export default Footer23;
|
|
@@ -0,0 +1,97 @@
|
|
|
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", "instagram", "linkedin", "youtube"]),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export const footer23PropTypes = {
|
|
20
|
+
logoIconSrc: PropTypes.string,
|
|
21
|
+
logoNameSrc: PropTypes.string,
|
|
22
|
+
logoTaglineSrc: PropTypes.string,
|
|
23
|
+
description: PropTypes.string,
|
|
24
|
+
socialButtons: PropTypes.arrayOf(socialShape),
|
|
25
|
+
linkColumns: PropTypes.arrayOf(columnShape),
|
|
26
|
+
copyright: PropTypes.string,
|
|
27
|
+
legalLinks: PropTypes.arrayOf(linkShape),
|
|
28
|
+
className: PropTypes.string,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const footer23DefaultProps = {
|
|
32
|
+
logoIconSrc: "/footer/footer23/logo-icon.svg",
|
|
33
|
+
logoNameSrc: "/footer/footer23/logo-name.svg",
|
|
34
|
+
logoTaglineSrc: "/footer/footer23/logo-tagline.svg",
|
|
35
|
+
description:
|
|
36
|
+
"Connecting travelers with local experts for authentic Japanese experiences. Discover Japan beyond the tourist trail with our passionate guides.",
|
|
37
|
+
socialButtons: [
|
|
38
|
+
{ label: "Facebook", href: "#", icon: "facebook" },
|
|
39
|
+
{ label: "LinkedIn", href: "#", icon: "linkedin" },
|
|
40
|
+
{ label: "Instagram", href: "#", icon: "instagram" },
|
|
41
|
+
{ label: "YouTube", href: "#", icon: "youtube" },
|
|
42
|
+
],
|
|
43
|
+
linkColumns: [
|
|
44
|
+
{
|
|
45
|
+
title: "About Japan Tour",
|
|
46
|
+
links: [
|
|
47
|
+
{ label: "About Us", href: "#" },
|
|
48
|
+
{ label: "Our Story", href: "#" },
|
|
49
|
+
{ label: "Blog", href: "#" },
|
|
50
|
+
{ label: "Log in", href: "#" },
|
|
51
|
+
{ label: "Register", href: "#" },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
title: "Download Our App",
|
|
56
|
+
links: [
|
|
57
|
+
{ label: "App Store", href: "#" },
|
|
58
|
+
{ label: "Google Play Store", href: "#" },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: "Popular Tours Category",
|
|
63
|
+
links: [
|
|
64
|
+
{ label: "16 days group tour", href: "#" },
|
|
65
|
+
{ label: "11 days group tour", href: "#" },
|
|
66
|
+
{ label: "Private 11 days tour", href: "#" },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: "Help & Support",
|
|
71
|
+
links: [{ label: "Contact us", href: "#" }],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: "For Tour Guide",
|
|
75
|
+
links: [
|
|
76
|
+
{ label: "Become a Guide", href: "#" },
|
|
77
|
+
{ label: "Support", href: "#" },
|
|
78
|
+
{ label: "Terms & Conditions", href: "#" },
|
|
79
|
+
{ label: "Cancelation Policy", href: "#" },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
title: "For Travellers",
|
|
84
|
+
links: [
|
|
85
|
+
{ label: "Support", href: "#" },
|
|
86
|
+
{ label: "Terms & Conditions", href: "#" },
|
|
87
|
+
{ label: "Cancelation Policy", href: "#" },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
copyright: "© 2025 Japan Experience & Tour Company. All Rights Reserved.",
|
|
92
|
+
legalLinks: [
|
|
93
|
+
{ label: "Privacy", href: "#" },
|
|
94
|
+
{ label: "Terms & Conditions", href: "#" },
|
|
95
|
+
],
|
|
96
|
+
className: "",
|
|
97
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Footer23, default } from "./Footer23";
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import SafeImage from "../../atoms/SafeImage";
|
|
4
|
+
import {
|
|
5
|
+
footer24DefaultProps,
|
|
6
|
+
footer24PropTypes,
|
|
7
|
+
} from "./Footer24.propTypes";
|
|
8
|
+
|
|
9
|
+
function FacebookIcon({ className = "" }) {
|
|
10
|
+
return (
|
|
11
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
12
|
+
<path d="M18.5 3h-3.5A5 5 0 0010 8v3.5H6.5V16H10v13h5.5V16h3.7l.7-4.5H15.5V8.8c0-1.3.4-2.3 2.3-2.3H20V3h-1.5z" />
|
|
13
|
+
</svg>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function TwitterIcon({ className = "" }) {
|
|
18
|
+
return (
|
|
19
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
20
|
+
<path d="M21.6 7h3.2l-7 8 8.2 10h-6.4l-5-6.6-5.7 6.6H5.5l7.5-8.6L5 7h6.6l4.5 6 5.5-6z" />
|
|
21
|
+
</svg>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function YoutubeIcon({ className = "" }) {
|
|
26
|
+
return (
|
|
27
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
28
|
+
<path d="M28.8 10.2a3 3 0 00-2.1-2.1C24 7.5 16 7.5 16 7.5s-8 0-10.7.6A3 3 0 003.2 10.2 31.5 31.5 0 002.5 16a31.5 31.5 0 00.7 5.8 3 3 0 002.1 2.1c2.7.6 10.7.6 10.7.6s8 0 10.7-.6a3 3 0 002.1-2.1A31.5 31.5 0 0029.5 16a31.5 31.5 0 00-.7-5.8zM13.3 20.7V11.3L20 16l-6.7 4.7z" />
|
|
29
|
+
</svg>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function LinkedinIcon({ className = "" }) {
|
|
34
|
+
return (
|
|
35
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
36
|
+
<path d="M8 12H4v16h4V12zm2-6a2.3 2.3 0 110 4.6 2.3 2.3 0 010-4.6zM28 19.5c0-5.2-2.8-7.6-6.5-7.6-3 0-4.3 1.6-5.1 2.8v-.2H12V28h4.5v-7.5c0-2 .4-3.9 2.8-3.9 2.4 0 2.4 2.2 2.4 3.9V28H28v-8.5z" />
|
|
37
|
+
</svg>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function InstagramIcon({ className = "" }) {
|
|
42
|
+
return (
|
|
43
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
44
|
+
<path d="M16 4.5c3.6 0 4 .01 5.4.08 1.3.06 2 .28 2.5.46.6.24 1.1.53 1.6.98.45.45.74.95.98 1.6.18.5.4 1.2.46 2.5.07 1.4.08 1.8.08 5.4s-.01 4-.08 5.4c-.06 1.3-.28 2-.46 2.5a4.2 4.2 0 01-.98 1.6 4.2 4.2 0 01-1.6.98c-.5.18-1.2.4-2.5.46-1.4.07-1.8.08-5.4.08s-4-.01-5.4-.08c-1.3-.06-2-.28-2.5-.46a4.2 4.2 0 01-1.6-.98 4.2 4.2 0 01-.98-1.6c-.18-.5-.4-1.2-.46-2.5-.07-1.4-.08-1.8-.08-5.4s.01-4 .08-5.4c.06-1.3.28-2 .46-2.5.24-.65.53-1.15.98-1.6.45-.45.95-.74 1.6-.98.5-.18 1.2-.4 2.5-.46 1.4-.07 1.8-.08 5.4-.08zM16 8.8a7.2 7.2 0 100 14.4 7.2 7.2 0 000-14.4zm0 11.9a4.7 4.7 0 110-9.4 4.7 4.7 0 010 9.4zm7.5-12.2a1.7 1.7 0 11-3.4 0 1.7 1.7 0 013.4 0z" />
|
|
45
|
+
</svg>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function FlickrIcon({ className = "" }) {
|
|
50
|
+
return (
|
|
51
|
+
<svg viewBox="0 0 32 32" fill="currentColor" aria-hidden="true" className={className}>
|
|
52
|
+
<circle cx="10" cy="16" r="5" />
|
|
53
|
+
<circle cx="22" cy="16" r="5" />
|
|
54
|
+
</svg>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const SOCIAL_ICONS = {
|
|
59
|
+
facebook: FacebookIcon,
|
|
60
|
+
twitter: TwitterIcon,
|
|
61
|
+
youtube: YoutubeIcon,
|
|
62
|
+
linkedin: LinkedinIcon,
|
|
63
|
+
instagram: InstagramIcon,
|
|
64
|
+
flickr: FlickrIcon,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
function LinkColumn({ column }) {
|
|
68
|
+
return (
|
|
69
|
+
<div className="flex min-w-0 flex-1 flex-col gap-4">
|
|
70
|
+
<p className="text-xl font-semibold leading-[30px] text-[#0e274e]">{column.title}</p>
|
|
71
|
+
<div className="h-px w-full bg-[#e3e6ef]" />
|
|
72
|
+
<ul className="flex flex-col gap-2">
|
|
73
|
+
{column.links.map((link) => (
|
|
74
|
+
<li key={link.label}>
|
|
75
|
+
<a
|
|
76
|
+
href={link.href ?? "#"}
|
|
77
|
+
className="text-base leading-[26px] text-[#0e274e] transition-colors duration-200 ease-out hover:opacity-70 focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
78
|
+
>
|
|
79
|
+
{link.label}
|
|
80
|
+
</a>
|
|
81
|
+
</li>
|
|
82
|
+
))}
|
|
83
|
+
</ul>
|
|
84
|
+
</div>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Footer24 — BRAC University academic footer with contact map.
|
|
90
|
+
* Figma node 32:20238 at 1920px.
|
|
91
|
+
*/
|
|
92
|
+
export function Footer24({
|
|
93
|
+
contactTitle = footer24DefaultProps.contactTitle,
|
|
94
|
+
contactLines = footer24DefaultProps.contactLines,
|
|
95
|
+
mapSrc = footer24DefaultProps.mapSrc,
|
|
96
|
+
mapAlt = footer24DefaultProps.mapAlt,
|
|
97
|
+
linkColumns = footer24DefaultProps.linkColumns,
|
|
98
|
+
copyright = footer24DefaultProps.copyright,
|
|
99
|
+
privacyLabel = footer24DefaultProps.privacyLabel,
|
|
100
|
+
privacyHref = footer24DefaultProps.privacyHref,
|
|
101
|
+
logoSrc = footer24DefaultProps.logoSrc,
|
|
102
|
+
logoAlt = footer24DefaultProps.logoAlt,
|
|
103
|
+
socialButtons = footer24DefaultProps.socialButtons,
|
|
104
|
+
className = "",
|
|
105
|
+
}) {
|
|
106
|
+
return (
|
|
107
|
+
<footer
|
|
108
|
+
className={["relative w-full overflow-hidden bg-[#f5f6f9]", className]
|
|
109
|
+
.filter(Boolean)
|
|
110
|
+
.join(" ")}
|
|
111
|
+
data-footer="footer24"
|
|
112
|
+
>
|
|
113
|
+
<div className="h-0.5 w-full bg-[#2a5caa]" />
|
|
114
|
+
<div className="mx-auto flex w-full max-w-[1920px] flex-col gap-10 px-4 py-10 sm:px-6 md:px-8 lg:gap-12 lg:px-8 lg:py-20 xl:px-8">
|
|
115
|
+
<div className="flex flex-col gap-10 xl:flex-row xl:gap-8">
|
|
116
|
+
<div className="flex w-full max-w-[282px] flex-col gap-6">
|
|
117
|
+
<p className="text-xl font-semibold leading-[30px] text-[#0e274e]">
|
|
118
|
+
{contactTitle}
|
|
119
|
+
</p>
|
|
120
|
+
<div className="flex flex-col gap-1 text-base leading-[26px] text-[#0e274e]">
|
|
121
|
+
{contactLines.map((line) => (
|
|
122
|
+
<p key={line.label}>
|
|
123
|
+
<span className="font-semibold">{line.label}</span>
|
|
124
|
+
{line.value}
|
|
125
|
+
</p>
|
|
126
|
+
))}
|
|
127
|
+
</div>
|
|
128
|
+
<div className="relative aspect-[282/181] w-full max-w-[282px] overflow-hidden">
|
|
129
|
+
<SafeImage
|
|
130
|
+
src={mapSrc}
|
|
131
|
+
alt={mapAlt}
|
|
132
|
+
fill
|
|
133
|
+
className="object-cover object-center"
|
|
134
|
+
/>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<div className="grid flex-1 grid-cols-1 gap-8 sm:grid-cols-2 xl:grid-cols-4 xl:gap-8">
|
|
139
|
+
{linkColumns.map((column) => (
|
|
140
|
+
<LinkColumn key={column.title} column={column} />
|
|
141
|
+
))}
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<div className="h-px w-full bg-[#e3e6ef]" />
|
|
146
|
+
|
|
147
|
+
<div className="flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between">
|
|
148
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center">
|
|
149
|
+
<SafeImage
|
|
150
|
+
src={logoSrc}
|
|
151
|
+
alt={logoAlt}
|
|
152
|
+
width={94}
|
|
153
|
+
height={86}
|
|
154
|
+
className="h-auto w-[94px] shrink-0"
|
|
155
|
+
/>
|
|
156
|
+
<div className="flex flex-wrap items-center gap-2 text-sm leading-[22px] text-[#0e274e]">
|
|
157
|
+
<span>{copyright}</span>
|
|
158
|
+
<span className="text-[#0e274e]/40" aria-hidden="true">
|
|
159
|
+
|
|
|
160
|
+
</span>
|
|
161
|
+
<a
|
|
162
|
+
href={privacyHref ?? "#"}
|
|
163
|
+
className="transition-colors duration-200 ease-out hover:opacity-70 focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
164
|
+
>
|
|
165
|
+
{privacyLabel}
|
|
166
|
+
</a>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
<div className="flex flex-wrap items-center gap-1">
|
|
170
|
+
{socialButtons.map((social) => {
|
|
171
|
+
const Icon = SOCIAL_ICONS[social.icon] ?? FacebookIcon;
|
|
172
|
+
return (
|
|
173
|
+
<a
|
|
174
|
+
key={social.label}
|
|
175
|
+
href={social.href ?? "#"}
|
|
176
|
+
aria-label={social.label}
|
|
177
|
+
className="p-2 text-[#0e274e] transition-colors duration-200 ease-out hover:opacity-70 focus-visible:outline-2 focus-visible:outline-offset-2"
|
|
178
|
+
>
|
|
179
|
+
<Icon className="size-8" />
|
|
180
|
+
</a>
|
|
181
|
+
);
|
|
182
|
+
})}
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</footer>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
Footer24.propTypes = footer24PropTypes;
|
|
191
|
+
|
|
192
|
+
export default Footer24;
|