@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.
Files changed (197) hide show
  1. package/bin/footers.js +16 -0
  2. package/category.config.json +7 -0
  3. package/package.json +24 -0
  4. package/registry/footer-01.json +6 -0
  5. package/registry/footer-02.json +9 -0
  6. package/registry/footer-03.json +9 -0
  7. package/registry/footer-04.json +9 -0
  8. package/registry/footer-05.json +9 -0
  9. package/registry/footer-06.json +7 -0
  10. package/registry/footer-07.json +9 -0
  11. package/registry/footer-08.json +9 -0
  12. package/registry/footer-09.json +9 -0
  13. package/registry/footer-10.json +9 -0
  14. package/registry/footer-11.json +7 -0
  15. package/registry/footer-12.json +9 -0
  16. package/registry/footer-13.json +9 -0
  17. package/registry/footer-14.json +9 -0
  18. package/registry/footer-15.json +9 -0
  19. package/registry/footer-16.json +9 -0
  20. package/registry/footer-17.json +9 -0
  21. package/registry/footer-18.json +9 -0
  22. package/registry/footer-19.json +9 -0
  23. package/registry/footer-20.json +9 -0
  24. package/registry/footer-21.json +9 -0
  25. package/registry/footer-22.json +9 -0
  26. package/registry/footer-23.json +9 -0
  27. package/registry/footer-24.json +9 -0
  28. package/registry/footer-25.json +9 -0
  29. package/registry/footer-26.json +9 -0
  30. package/registry/footer-27.json +9 -0
  31. package/registry/footer-28.json +9 -0
  32. package/registry/footer-29.json +6 -0
  33. package/registry/footer-30.json +6 -0
  34. package/registry/index.json +263 -0
  35. package/templates/components/atoms/SafeImage/SafeImage.jsx +101 -0
  36. package/templates/components/atoms/SafeImage/index.js +1 -0
  37. package/templates/components/organisms/Footer01/Footer01.jsx +142 -0
  38. package/templates/components/organisms/Footer01/Footer01.propTypes.js +110 -0
  39. package/templates/components/organisms/Footer01/index.js +1 -0
  40. package/templates/components/organisms/Footer02/Footer02.jsx +136 -0
  41. package/templates/components/organisms/Footer02/Footer02.propTypes.js +112 -0
  42. package/templates/components/organisms/Footer02/index.js +1 -0
  43. package/templates/components/organisms/Footer03/Footer03.jsx +162 -0
  44. package/templates/components/organisms/Footer03/Footer03.propTypes.js +73 -0
  45. package/templates/components/organisms/Footer03/index.js +1 -0
  46. package/templates/components/organisms/Footer04/Footer04.jsx +128 -0
  47. package/templates/components/organisms/Footer04/Footer04.propTypes.js +93 -0
  48. package/templates/components/organisms/Footer04/index.js +1 -0
  49. package/templates/components/organisms/Footer05/Footer05.jsx +101 -0
  50. package/templates/components/organisms/Footer05/Footer05.propTypes.js +42 -0
  51. package/templates/components/organisms/Footer05/index.js +1 -0
  52. package/templates/components/organisms/Footer06/Footer06.jsx +170 -0
  53. package/templates/components/organisms/Footer06/Footer06.propTypes.js +53 -0
  54. package/templates/components/organisms/Footer06/index.js +1 -0
  55. package/templates/components/organisms/Footer07/Footer07.jsx +253 -0
  56. package/templates/components/organisms/Footer07/Footer07.propTypes.js +83 -0
  57. package/templates/components/organisms/Footer07/index.js +1 -0
  58. package/templates/components/organisms/Footer08/Footer08.jsx +183 -0
  59. package/templates/components/organisms/Footer08/Footer08.propTypes.js +92 -0
  60. package/templates/components/organisms/Footer08/index.js +1 -0
  61. package/templates/components/organisms/Footer09/Footer09.jsx +199 -0
  62. package/templates/components/organisms/Footer09/Footer09.propTypes.js +76 -0
  63. package/templates/components/organisms/Footer09/index.js +1 -0
  64. package/templates/components/organisms/Footer10/Footer10.jsx +172 -0
  65. package/templates/components/organisms/Footer10/Footer10.propTypes.js +38 -0
  66. package/templates/components/organisms/Footer10/index.js +1 -0
  67. package/templates/components/organisms/Footer11/Footer11.jsx +107 -0
  68. package/templates/components/organisms/Footer11/Footer11.propTypes.js +64 -0
  69. package/templates/components/organisms/Footer11/index.js +1 -0
  70. package/templates/components/organisms/Footer12/Footer12.jsx +122 -0
  71. package/templates/components/organisms/Footer12/Footer12.propTypes.js +94 -0
  72. package/templates/components/organisms/Footer12/index.js +1 -0
  73. package/templates/components/organisms/Footer13/Footer13.jsx +156 -0
  74. package/templates/components/organisms/Footer13/Footer13.propTypes.js +80 -0
  75. package/templates/components/organisms/Footer13/index.js +1 -0
  76. package/templates/components/organisms/Footer14/Footer14.jsx +157 -0
  77. package/templates/components/organisms/Footer14/Footer14.propTypes.js +60 -0
  78. package/templates/components/organisms/Footer14/index.js +1 -0
  79. package/templates/components/organisms/Footer15/Footer15.jsx +184 -0
  80. package/templates/components/organisms/Footer15/Footer15.propTypes.js +58 -0
  81. package/templates/components/organisms/Footer15/index.js +1 -0
  82. package/templates/components/organisms/Footer16/Footer16.jsx +87 -0
  83. package/templates/components/organisms/Footer16/Footer16.propTypes.js +73 -0
  84. package/templates/components/organisms/Footer16/index.js +1 -0
  85. package/templates/components/organisms/Footer17/Footer17.jsx +176 -0
  86. package/templates/components/organisms/Footer17/Footer17.propTypes.js +117 -0
  87. package/templates/components/organisms/Footer17/index.js +1 -0
  88. package/templates/components/organisms/Footer18/Footer18.jsx +236 -0
  89. package/templates/components/organisms/Footer18/Footer18.propTypes.js +92 -0
  90. package/templates/components/organisms/Footer18/index.js +1 -0
  91. package/templates/components/organisms/Footer19/Footer19.jsx +287 -0
  92. package/templates/components/organisms/Footer19/Footer19.propTypes.js +116 -0
  93. package/templates/components/organisms/Footer19/index.js +1 -0
  94. package/templates/components/organisms/Footer20/Footer20.jsx +201 -0
  95. package/templates/components/organisms/Footer20/Footer20.propTypes.js +70 -0
  96. package/templates/components/organisms/Footer20/index.js +1 -0
  97. package/templates/components/organisms/Footer21/Footer21.jsx +134 -0
  98. package/templates/components/organisms/Footer21/Footer21.propTypes.js +122 -0
  99. package/templates/components/organisms/Footer21/index.js +1 -0
  100. package/templates/components/organisms/Footer22/Footer22.jsx +136 -0
  101. package/templates/components/organisms/Footer22/Footer22.propTypes.js +58 -0
  102. package/templates/components/organisms/Footer22/index.js +1 -0
  103. package/templates/components/organisms/Footer23/Footer23.jsx +177 -0
  104. package/templates/components/organisms/Footer23/Footer23.propTypes.js +97 -0
  105. package/templates/components/organisms/Footer23/index.js +1 -0
  106. package/templates/components/organisms/Footer24/Footer24.jsx +192 -0
  107. package/templates/components/organisms/Footer24/Footer24.propTypes.js +132 -0
  108. package/templates/components/organisms/Footer24/index.js +1 -0
  109. package/templates/components/organisms/Footer25/Footer25.jsx +135 -0
  110. package/templates/components/organisms/Footer25/Footer25.propTypes.js +124 -0
  111. package/templates/components/organisms/Footer25/index.js +1 -0
  112. package/templates/components/organisms/Footer26/Footer26.jsx +167 -0
  113. package/templates/components/organisms/Footer26/Footer26.propTypes.js +54 -0
  114. package/templates/components/organisms/Footer26/index.js +1 -0
  115. package/templates/components/organisms/Footer27/Footer27.jsx +171 -0
  116. package/templates/components/organisms/Footer27/Footer27.propTypes.js +105 -0
  117. package/templates/components/organisms/Footer27/index.js +1 -0
  118. package/templates/components/organisms/Footer28/Footer28.jsx +98 -0
  119. package/templates/components/organisms/Footer28/Footer28.propTypes.js +96 -0
  120. package/templates/components/organisms/Footer28/index.js +1 -0
  121. package/templates/components/organisms/Footer29/Footer29.jsx +118 -0
  122. package/templates/components/organisms/Footer29/Footer29.propTypes.js +68 -0
  123. package/templates/components/organisms/Footer29/index.js +1 -0
  124. package/templates/components/organisms/Footer30/Footer30.jsx +92 -0
  125. package/templates/components/organisms/Footer30/Footer30.propTypes.js +51 -0
  126. package/templates/components/organisms/Footer30/index.js +1 -0
  127. package/templates/public/footer/footer02/payment-01.png +0 -0
  128. package/templates/public/footer/footer02/payment-02.png +0 -0
  129. package/templates/public/footer/footer02/payment-03.png +0 -0
  130. package/templates/public/footer/footer02/payment-04.png +0 -0
  131. package/templates/public/footer/footer02/payment-05.png +0 -0
  132. package/templates/public/footer/footer02/payment-06.png +0 -0
  133. package/templates/public/footer/footer02/payment-07.png +0 -0
  134. package/templates/public/footer/footer02/payment-08.png +0 -0
  135. package/templates/public/footer/footer02/payment-09.svg +5 -0
  136. package/templates/public/footer/footer02/payment-10.svg +11 -0
  137. package/templates/public/footer/footer02/payment-11.svg +22 -0
  138. package/templates/public/footer/footer02/payment-12.svg +25 -0
  139. package/templates/public/footer/footer02/payment-13.svg +10 -0
  140. package/templates/public/footer/footer02/payment-14.svg +36 -0
  141. package/templates/public/footer/footer02/payment-15.svg +18 -0
  142. package/templates/public/footer/footer02/payment-sprite-01.png +0 -0
  143. package/templates/public/footer/footer02/payment-sprite-02.png +0 -0
  144. package/templates/public/footer/footer02/payment-sprite-03.png +0 -0
  145. package/templates/public/footer/footer02/payment-sprite-04.png +0 -0
  146. package/templates/public/footer/footer02/payment-sprite-05.png +0 -0
  147. package/templates/public/footer/footer02/payment-sprite-06.png +0 -0
  148. package/templates/public/footer/footer03/logo-mask.png +0 -0
  149. package/templates/public/footer/footer03/logo.png +0 -0
  150. package/templates/public/footer/footer04/logo.svg +45 -0
  151. package/templates/public/footer/footer05/brand-watermark.png +0 -0
  152. package/templates/public/footer/footer07/logo.png +0 -0
  153. package/templates/public/footer/footer07/watch-hero.png +0 -0
  154. package/templates/public/footer/footer07/watch-overlay.png +0 -0
  155. package/templates/public/footer/footer08/logo.png +0 -0
  156. package/templates/public/footer/footer08/logo.svg +3 -0
  157. package/templates/public/footer/footer09/logo.svg +13 -0
  158. package/templates/public/footer/footer10/hero-image.png +0 -0
  159. package/templates/public/footer/footer10/hero-mask-download.svg +3 -0
  160. package/templates/public/footer/footer10/hero-mask.svg +3 -0
  161. package/templates/public/footer/footer12/logo-icon.svg +3 -0
  162. package/templates/public/footer/footer12/refugee-logo.png +0 -0
  163. package/templates/public/footer/footer13/logo.png +0 -0
  164. package/templates/public/footer/footer14/logo.png +0 -0
  165. package/templates/public/footer/footer15/logo.svg +19 -0
  166. package/templates/public/footer/footer16/logo.svg +6 -0
  167. package/templates/public/footer/footer17/logo-left.svg +11 -0
  168. package/templates/public/footer/footer17/logo-right.svg +36 -0
  169. package/templates/public/footer/footer18/logo.png +108 -0
  170. package/templates/public/footer/footer18/logo.svg +108 -0
  171. package/templates/public/footer/footer19/logo.png +0 -0
  172. package/templates/public/footer/footer19/payment-bkash.png +0 -0
  173. package/templates/public/footer/footer19/payment-mastercard.svg +12 -0
  174. package/templates/public/footer/footer19/payment-nagad.png +0 -0
  175. package/templates/public/footer/footer19/payment-nexus.png +0 -0
  176. package/templates/public/footer/footer19/payment-rocket.png +0 -0
  177. package/templates/public/footer/footer19/payment-upay.png +0 -0
  178. package/templates/public/footer/footer19/payment-visa.svg +6 -0
  179. package/templates/public/footer/footer20/bg.png +0 -0
  180. package/templates/public/footer/footer20/logo.png +0 -0
  181. package/templates/public/footer/footer21/logo.png +0 -0
  182. package/templates/public/footer/footer22/logo-icon.svg +10 -0
  183. package/templates/public/footer/footer22/logo-name.svg +5 -0
  184. package/templates/public/footer/footer22/logo-tagline.svg +5 -0
  185. package/templates/public/footer/footer23/logo-icon.svg +10 -0
  186. package/templates/public/footer/footer23/logo-name.svg +20 -0
  187. package/templates/public/footer/footer23/logo-tagline.svg +17 -0
  188. package/templates/public/footer/footer24/logo.svg +46 -0
  189. package/templates/public/footer/footer24/map.png +0 -0
  190. package/templates/public/footer/footer25/logo-icon.svg +15 -0
  191. package/templates/public/footer/footer25/logo-text.svg +42 -0
  192. package/templates/public/footer/footer25/map-pin.svg +7 -0
  193. package/templates/public/footer/footer25/map.png +0 -0
  194. package/templates/public/footer/footer26/logo-jpl.svg +5 -0
  195. package/templates/public/footer/footer26/logo.png +0 -0
  196. package/templates/public/footer/footer27/logo.png +0 -0
  197. package/templates/public/footer/footer28/logo.png +0 -0
@@ -0,0 +1,183 @@
1
+ "use client";
2
+
3
+ import { SafeImage } from "../../atoms/SafeImage";
4
+ import {
5
+ footer08DefaultProps,
6
+ footer08PropTypes,
7
+ } from "./Footer08.propTypes";
8
+
9
+ function FacebookIcon({ className = "" }) {
10
+ return (
11
+ <svg viewBox="0 0 34 34" fill="none" aria-hidden="true" className={className}>
12
+ <circle cx="17" cy="17" r="17" fill="white" />
13
+ <path d="M18.5 10h-2a2 2 0 00-2 2v2h-2v3h2v7h3v-7h2.5l.5-3h-3v-2c0-.55.45-1 1-1h2V10z" fill="#0054a6" />
14
+ </svg>
15
+ );
16
+ }
17
+
18
+ function YoutubeIcon({ className = "" }) {
19
+ return (
20
+ <svg viewBox="0 0 34 34" fill="none" aria-hidden="true" className={className}>
21
+ <circle cx="17" cy="17" r="17" fill="white" />
22
+ <path
23
+ d="M24 12.5a2 2 0 00-1.4-1.4C21 11 17 11 17 11s-4 0-5.6.1A2 2 0 0010 12.5 21 21 0 009 17a21 21 0 00.9 4.5 2 2 0 001.4 1.4C13 23 17 23 17 23s4 0 5.6-.1a2 2 0 001.4-1.4A21 21 0 0025 17a21 21 0 00-1-4.5zM14.5 19.5v-5L19 17l-4.5 2.5z"
24
+ fill="#0054a6"
25
+ />
26
+ </svg>
27
+ );
28
+ }
29
+
30
+ function InstagramIcon({ className = "" }) {
31
+ return (
32
+ <svg viewBox="0 0 34 34" fill="none" aria-hidden="true" className={className}>
33
+ <circle cx="17" cy="17" r="17" fill="white" />
34
+ <rect x="11" y="11" width="12" height="12" rx="3" stroke="#0054a6" strokeWidth="1.2" />
35
+ <circle cx="17" cy="17" r="3" stroke="#0054a6" strokeWidth="1.2" />
36
+ <circle cx="20.5" cy="13.5" r="0.8" fill="#0054a6" />
37
+ </svg>
38
+ );
39
+ }
40
+
41
+ function LinkedinIcon({ className = "" }) {
42
+ return (
43
+ <svg viewBox="0 0 34 34" fill="none" aria-hidden="true" className={className}>
44
+ <circle cx="17" cy="17" r="17" fill="white" />
45
+ <rect x="10" y="14" width="3" height="10" fill="#0054a6" />
46
+ <circle cx="11.5" cy="11" r="1.5" fill="#0054a6" />
47
+ <path
48
+ d="M15 14h2.8v1.2c.5-.9 1.5-1.4 2.6-1.4 2.8 0 3.1 1.8 3.1 4.1V24H20v-4.8c0-1 0-2.3-1.4-2.3-1.4 0-1.6 1.1-1.6 2.2V24h-2.8V14z"
49
+ fill="#0054a6"
50
+ />
51
+ </svg>
52
+ );
53
+ }
54
+
55
+ const SOCIAL_ICONS = {
56
+ facebook: FacebookIcon,
57
+ youtube: YoutubeIcon,
58
+ instagram: InstagramIcon,
59
+ linkedin: LinkedinIcon,
60
+ };
61
+
62
+ function LinkColumn({ column }) {
63
+ return (
64
+ <div className="flex min-w-0 flex-1 flex-col gap-6">
65
+ <p className="text-lg font-medium leading-[1.2] text-white">{column.title}</p>
66
+ <div className="h-px w-full bg-white/20" />
67
+ <ul className="flex flex-col gap-2">
68
+ {column.links.map((link) => (
69
+ <li key={link.label}>
70
+ <a
71
+ href={link.href ?? "#"}
72
+ className="text-sm leading-[1.6] tracking-[0.14px] text-white/80 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
+ </li>
77
+ ))}
78
+ </ul>
79
+ </div>
80
+ );
81
+ }
82
+
83
+ /**
84
+ * Footer08 — Daffodil Group blue multi-column footer.
85
+ * Figma node 32:20519 at 1920px.
86
+ */
87
+ export function Footer08({
88
+ linkColumns = footer08DefaultProps.linkColumns,
89
+ phone = footer08DefaultProps.phone,
90
+ email = footer08DefaultProps.email,
91
+ address = footer08DefaultProps.address,
92
+ socialLinks = footer08DefaultProps.socialLinks,
93
+ privacyHref = footer08DefaultProps.privacyHref,
94
+ termsHref = footer08DefaultProps.termsHref,
95
+ copyright = footer08DefaultProps.copyright,
96
+ className = "",
97
+ }) {
98
+ return (
99
+ <footer
100
+ className={["relative w-full overflow-hidden bg-[#0054a6]", className]
101
+ .filter(Boolean)
102
+ .join(" ")}
103
+ data-footer="footer08"
104
+ >
105
+ <div className="mx-auto flex w-full max-w-[1920px] flex-col gap-10 px-4 py-12 sm:px-6 md:px-10 lg:px-20 xl:gap-10 xl:px-[80px] xl:pb-10 xl:pt-[100px]">
106
+ <div className="flex flex-col gap-10 xl:flex-row xl:gap-14">
107
+ {linkColumns.map((column) => (
108
+ <LinkColumn key={column.title} column={column} />
109
+ ))}
110
+ </div>
111
+
112
+ <div className="h-px w-full bg-white/20" />
113
+
114
+ <div className="flex flex-col gap-8 lg:flex-row lg:items-start lg:justify-between">
115
+ <SafeImage
116
+ src="/footer/footer08/logo.svg"
117
+ alt="Daffodil Group"
118
+ width={373}
119
+ height={94}
120
+ className="h-14 w-auto shrink-0 sm:h-16 xl:h-[94px] xl:w-[373px]"
121
+ />
122
+
123
+ <div className="flex w-full max-w-[1160px] flex-col gap-5 lg:flex-1">
124
+ <div className="flex flex-col gap-6 lg:flex-row lg:items-start lg:justify-between">
125
+ <div className="flex flex-col gap-2 text-sm leading-[1.6] tracking-[0.14px] text-white/80 sm:flex-row sm:gap-[33px]">
126
+ <div className="flex flex-col gap-2">
127
+ <a
128
+ href={`tel:${phone.replace(/\s/g, "")}`}
129
+ className="transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
130
+ >
131
+ {phone}
132
+ </a>
133
+ <a
134
+ href={`mailto:${email}`}
135
+ className="transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
136
+ >
137
+ {email}
138
+ </a>
139
+ </div>
140
+ <p className="max-w-[294px]">{address}</p>
141
+ </div>
142
+ <div className="flex items-center gap-1.5">
143
+ {socialLinks.map((social) => {
144
+ const Icon = SOCIAL_ICONS[social.icon] ?? FacebookIcon;
145
+ return (
146
+ <a
147
+ key={social.label}
148
+ href={social.href ?? "#"}
149
+ aria-label={social.label}
150
+ className="transition-opacity duration-200 ease-out hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2"
151
+ >
152
+ <Icon className="size-[34px]" />
153
+ </a>
154
+ );
155
+ })}
156
+ </div>
157
+ </div>
158
+
159
+ <div className="flex flex-col gap-4 text-sm leading-[1.6] tracking-[0.14px] text-white/80 sm:flex-row sm:items-center sm:justify-between">
160
+ <a
161
+ href={privacyHref ?? "#"}
162
+ className="transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
163
+ >
164
+ Privacy Policy
165
+ </a>
166
+ <a
167
+ href={termsHref ?? "#"}
168
+ className="transition-colors duration-200 ease-out hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2"
169
+ >
170
+ Terms & Condition
171
+ </a>
172
+ <p className="sm:text-right">{copyright}</p>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </footer>
178
+ );
179
+ }
180
+
181
+ Footer08.propTypes = footer08PropTypes;
182
+
183
+ export default Footer08;
@@ -0,0 +1,92 @@
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", "youtube", "instagram", "linkedin"]),
17
+ });
18
+
19
+ export const footer08PropTypes = {
20
+ linkColumns: PropTypes.arrayOf(columnShape),
21
+ phone: PropTypes.string,
22
+ email: PropTypes.string,
23
+ address: PropTypes.string,
24
+ socialLinks: PropTypes.arrayOf(socialShape),
25
+ privacyHref: PropTypes.string,
26
+ termsHref: PropTypes.string,
27
+ copyright: PropTypes.string,
28
+ className: PropTypes.string,
29
+ };
30
+
31
+ export const footer08DefaultProps = {
32
+ linkColumns: [
33
+ {
34
+ title: "About Us",
35
+ links: [
36
+ { label: "Who we are", href: "#" },
37
+ { label: "History and Heritage", href: "#" },
38
+ { label: "Awards & Recognitions", href: "#" },
39
+ { label: "Our Leadership", href: "#" },
40
+ { label: "Global Presence", href: "#" },
41
+ ],
42
+ },
43
+ {
44
+ title: "Business Ventures",
45
+ links: [
46
+ { label: "Education Ventures", href: "#" },
47
+ { label: "ICT & Digital Solutions", href: "#" },
48
+ { label: "Business & Investment", href: "#" },
49
+ { label: "Healthcare & Wellness", href: "#" },
50
+ ],
51
+ },
52
+ {
53
+ title: "Quick Links",
54
+ links: [
55
+ { label: "Awards & Recognitions", href: "#" },
56
+ { label: "Career", href: "#" },
57
+ { label: "Download Resources", href: "#" },
58
+ { label: "Contact us", href: "#" },
59
+ ],
60
+ },
61
+ {
62
+ title: "CSR Initiatives",
63
+ links: [
64
+ { label: "Daffodil Foundation", href: "#" },
65
+ { label: "Daffodil Institute of Social Sciences (DISS)", href: "#" },
66
+ ],
67
+ },
68
+ {
69
+ title: "Media Room",
70
+ links: [
71
+ { label: "Newsletter", href: "#" },
72
+ { label: "Forum", href: "#" },
73
+ { label: "News & Media", href: "#" },
74
+ { label: "Blog", href: "#" },
75
+ { label: "Gallery", href: "#" },
76
+ ],
77
+ },
78
+ ],
79
+ phone: "+88 01811458851",
80
+ email: "info@daffodil.group",
81
+ address: "102/1, Shukrabad, Mirpur Road, Dhanmondi, Dhaka-1207.",
82
+ socialLinks: [
83
+ { label: "Facebook", href: "#", icon: "facebook" },
84
+ { label: "YouTube", href: "#", icon: "youtube" },
85
+ { label: "Instagram", href: "#", icon: "instagram" },
86
+ { label: "LinkedIn", href: "#", icon: "linkedin" },
87
+ ],
88
+ privacyHref: "#",
89
+ termsHref: "#",
90
+ copyright: "© 2026 Daffodil Group.",
91
+ className: "",
92
+ };
@@ -0,0 +1 @@
1
+ export { Footer08, default } from "./Footer08";
@@ -0,0 +1,199 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { SafeImage } from "../../atoms/SafeImage";
5
+ import {
6
+ footer09DefaultProps,
7
+ footer09PropTypes,
8
+ } from "./Footer09.propTypes";
9
+
10
+ function ArrowUpRightIcon({ className = "" }) {
11
+ return (
12
+ <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" className={className}>
13
+ <path
14
+ d="M5 15L15 5M15 5H7M15 5V13"
15
+ stroke="currentColor"
16
+ strokeWidth="1.5"
17
+ strokeLinecap="round"
18
+ strokeLinejoin="round"
19
+ />
20
+ </svg>
21
+ );
22
+ }
23
+
24
+ function SocialIcon({ icon, className = "" }) {
25
+ const paths = {
26
+ facebook: "M10 6h-1.5A1.5 1.5 0 007 7.5V9H5v2h2v5h3v-5h2.5l.5-2H10V7.5c0-.28.22-.5.5-.5H13V6H10z",
27
+ youtube:
28
+ "M19.5 6.2a1.5 1.5 0 00-1.05-1.05C16.4 5 12 5 12 5s-4.4 0-5.95.15A1.5 1.5 0 005.05 6.2 15.7 15.7 0 004.5 12a15.7 15.7 0 00.55 5.8 1.5 1.5 0 001.05 1.05C7.6 19 12 19 12 19s4.4 0 5.95-.15a1.5 1.5 0 001.05-1.05A15.7 15.7 0 0019.5 12a15.7 15.7 0 00-.55-5.8zM9.5 14.5v-5L14 12l-4.5 2.5z",
29
+ instagram:
30
+ "M7 2h6a5 5 0 015 5v6a5 5 0 01-5 5H7a5 5 0 01-5-5V7a5 5 0 015-5zm0 2a3 3 0 00-3 3v6a3 3 0 003 3h6a3 3 0 003-3V7a3 3 0 00-3-3H7zm3 2.5A2.5 2.5 0 1112.5 12 2.5 2.5 0 0110 8.5zm4.75-2.65a.75.75 0 11-.75.75.75.75 0 01.75-.75z",
31
+ linkedin:
32
+ "M5 9H2v11h3V9zm1.5-4.5A1.75 1.75 0 104.75 6 1.75 1.75 0 006.5 4.5zM9 9h3v1.5c.5-.9 1.5-1.5 2.6-1.5 2.8 0 3.4 1.8 3.4 4.2V20h-3v-5.2c0-1.2 0-2.9-1.8-2.9-1.8 0-2.1 1.4-2.1 2.8V20H9V9z",
33
+ x: "M4 4l6.5 8.5L4.3 20h2.2l4.9-5.7L15.5 20H20l-6.8-9L19.4 4h-2.2l-4.5 5.2L8.4 4H4z",
34
+ };
35
+ return (
36
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
37
+ <path d={paths[icon] ?? paths.facebook} />
38
+ </svg>
39
+ );
40
+ }
41
+
42
+ function LinkColumn({ column }) {
43
+ return (
44
+ <div className="flex min-w-0 flex-1 flex-col gap-6">
45
+ <p className="text-xl font-medium tracking-tight text-[#1f1f1f] sm:text-2xl">{column.title}</p>
46
+ <ul className="flex flex-col gap-2">
47
+ {column.links.map((link) => (
48
+ <li key={link.label}>
49
+ <a
50
+ href={link.href ?? "#"}
51
+ className="text-sm text-[#1f1f1f]/80 transition-colors duration-200 ease-out hover:text-[#1f1f1f] focus-visible:outline-2 focus-visible:outline-offset-2"
52
+ >
53
+ {link.label}
54
+ </a>
55
+ </li>
56
+ ))}
57
+ </ul>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ /**
63
+ * Footer09 — Suvastu Properties white footer with newsletter.
64
+ * Figma node 32:20520 at 1920px.
65
+ */
66
+ export function Footer09({
67
+ address = footer09DefaultProps.address,
68
+ phone = footer09DefaultProps.phone,
69
+ email: contactEmail = footer09DefaultProps.email,
70
+ linkColumns = footer09DefaultProps.linkColumns,
71
+ socialLinks = footer09DefaultProps.socialLinks,
72
+ newsletterTitle = footer09DefaultProps.newsletterTitle,
73
+ emailPlaceholder = footer09DefaultProps.emailPlaceholder,
74
+ submitLabel = footer09DefaultProps.submitLabel,
75
+ newsletterEmail: controlledEmail,
76
+ onEmailChange,
77
+ onNewsletterSubmit,
78
+ copyright = footer09DefaultProps.copyright,
79
+ privacyHref = footer09DefaultProps.privacyHref,
80
+ termsHref = footer09DefaultProps.termsHref,
81
+ className = "",
82
+ }) {
83
+ const [internalEmail, setInternalEmail] = useState("");
84
+ const newsletterEmail = controlledEmail ?? internalEmail;
85
+
86
+ const handleEmailChange = (event) => {
87
+ onEmailChange?.(event.target.value);
88
+ if (controlledEmail === undefined) setInternalEmail(event.target.value);
89
+ };
90
+
91
+ const handleSubmit = (event) => {
92
+ event.preventDefault();
93
+ onNewsletterSubmit?.(newsletterEmail);
94
+ };
95
+
96
+ return (
97
+ <footer
98
+ className={["relative w-full overflow-hidden bg-white", className]
99
+ .filter(Boolean)
100
+ .join(" ")}
101
+ data-footer="footer09"
102
+ >
103
+ <div className="mx-auto w-full max-w-[1920px] border-t border-[#1f1f1f]/10 px-4 py-12 sm:px-6 md:px-10 lg:px-20 xl:px-[200px] xl:pb-16 xl:pt-[140px]">
104
+ <div className="flex flex-col gap-12 lg:flex-row lg:items-start lg:gap-16 xl:gap-[150px]">
105
+ <div className="flex max-w-sm flex-col gap-8 pl-0 lg:pl-[30px]">
106
+ <SafeImage
107
+ src="/footer/footer09/logo.svg"
108
+ alt="Suvastu"
109
+ width={303}
110
+ height={64}
111
+ className="h-10 w-auto sm:h-12 md:h-16 md:w-[303px]"
112
+ />
113
+ <div className="flex flex-col gap-3 text-sm text-[#1f1f1f]/80">
114
+ <p>{address}</p>
115
+ <a
116
+ href={`tel:${phone.replace(/\s/g, "")}`}
117
+ className="transition-colors duration-200 ease-out hover:text-[#1f1f1f] focus-visible:outline-2 focus-visible:outline-offset-2"
118
+ >
119
+ {phone}
120
+ </a>
121
+ <a
122
+ href={`mailto:${contactEmail}`}
123
+ className="transition-colors duration-200 ease-out hover:text-[#1f1f1f] focus-visible:outline-2 focus-visible:outline-offset-2"
124
+ >
125
+ {contactEmail}
126
+ </a>
127
+ </div>
128
+ </div>
129
+
130
+ <div className="grid flex-1 grid-cols-1 gap-10 sm:grid-cols-2 lg:grid-cols-3">
131
+ {linkColumns.map((column) => (
132
+ <LinkColumn key={column.title} column={column} />
133
+ ))}
134
+
135
+ <div className="flex flex-col gap-8">
136
+ <div className="flex flex-col gap-6">
137
+ <p className="text-xl font-medium tracking-tight text-[#1f1f1f] sm:text-2xl">
138
+ Follow Us
139
+ </p>
140
+ <div className="flex flex-wrap gap-2">
141
+ {socialLinks.map((social) => (
142
+ <a
143
+ key={social.label}
144
+ href={social.href ?? "#"}
145
+ aria-label={social.label}
146
+ className="text-[#1f1f1f] transition-opacity duration-200 ease-out hover:opacity-70 focus-visible:outline-2 focus-visible:outline-offset-2"
147
+ >
148
+ <SocialIcon icon={social.icon} className="size-6" />
149
+ </a>
150
+ ))}
151
+ </div>
152
+ </div>
153
+
154
+ <form onSubmit={handleSubmit} className="flex flex-col gap-3">
155
+ <p className="text-lg font-medium text-[#1f1f1f]">{newsletterTitle}</p>
156
+ <input
157
+ type="email"
158
+ value={newsletterEmail}
159
+ onChange={handleEmailChange}
160
+ placeholder={emailPlaceholder}
161
+ className="w-full border-b border-[#1f1f1f]/10 bg-[#1f1f1f]/10 px-4 py-3 text-sm text-[#1f1f1f]/80 outline-none transition-colors duration-200 ease-out focus-visible:ring-2 focus-visible:ring-[#1f1f1f]/20"
162
+ />
163
+ <button
164
+ type="submit"
165
+ className="inline-flex h-12 w-max items-center justify-center gap-2.5 rounded-full bg-[#1f1f1f] px-6 text-base font-bold text-white transition-opacity duration-200 ease-out hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2"
166
+ >
167
+ {submitLabel}
168
+ <ArrowUpRightIcon className="size-5" />
169
+ </button>
170
+ </form>
171
+ </div>
172
+ </div>
173
+ </div>
174
+
175
+ <div className="mt-12 flex flex-col gap-4 border-t border-[#1f1f1f]/10 pt-6 sm:flex-row sm:items-center sm:justify-between sm:pl-[30px] xl:mt-20 xl:pl-[230px] xl:pr-[200px]">
176
+ <p className="text-sm text-[#1f1f1f]/80">{copyright}</p>
177
+ <div className="flex flex-wrap gap-8 text-sm text-[#1f1f1f]/80">
178
+ <a
179
+ href={privacyHref ?? "#"}
180
+ className="transition-colors duration-200 ease-out hover:text-[#1f1f1f] focus-visible:outline-2 focus-visible:outline-offset-2"
181
+ >
182
+ Privacy Policy
183
+ </a>
184
+ <a
185
+ href={termsHref ?? "#"}
186
+ className="transition-colors duration-200 ease-out hover:text-[#1f1f1f] focus-visible:outline-2 focus-visible:outline-offset-2"
187
+ >
188
+ Terms & Condition
189
+ </a>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </footer>
194
+ );
195
+ }
196
+
197
+ Footer09.propTypes = footer09PropTypes;
198
+
199
+ export default Footer09;
@@ -0,0 +1,76 @@
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", "youtube", "instagram", "linkedin", "x"]),
17
+ });
18
+
19
+ export const footer09PropTypes = {
20
+ address: PropTypes.string,
21
+ phone: PropTypes.string,
22
+ email: PropTypes.string,
23
+ linkColumns: PropTypes.arrayOf(columnShape),
24
+ socialLinks: PropTypes.arrayOf(socialShape),
25
+ newsletterTitle: PropTypes.string,
26
+ emailPlaceholder: PropTypes.string,
27
+ submitLabel: PropTypes.string,
28
+ newsletterEmail: PropTypes.string,
29
+ onEmailChange: PropTypes.func,
30
+ onNewsletterSubmit: PropTypes.func,
31
+ copyright: PropTypes.string,
32
+ privacyHref: PropTypes.string,
33
+ termsHref: PropTypes.string,
34
+ className: PropTypes.string,
35
+ };
36
+
37
+ export const footer09DefaultProps = {
38
+ address: "Suvastu Imam Square, 5th Floor, 65 Gulshan Ave, Gulshan-1, Dhaka 1212",
39
+ phone: "+880 9639 500 400",
40
+ email: "marketing@suvastu.com",
41
+ linkColumns: [
42
+ {
43
+ title: "Quick Links",
44
+ links: [
45
+ { label: "About us", href: "#" },
46
+ { label: "Land Owner", href: "#" },
47
+ { label: "Career", href: "#" },
48
+ { label: "Blog", href: "#" },
49
+ { label: "Contact us", href: "#" },
50
+ ],
51
+ },
52
+ {
53
+ title: "Projects",
54
+ links: [
55
+ { label: "Ongoing Project", href: "#" },
56
+ { label: "Upcoming Project", href: "#" },
57
+ { label: "Complete Project", href: "#" },
58
+ ],
59
+ },
60
+ ],
61
+ socialLinks: [
62
+ { label: "Facebook", href: "#", icon: "facebook" },
63
+ { label: "YouTube", href: "#", icon: "youtube" },
64
+ { label: "Instagram", href: "#", icon: "instagram" },
65
+ { label: "LinkedIn", href: "#", icon: "linkedin" },
66
+ { label: "X", href: "#", icon: "x" },
67
+ ],
68
+ newsletterTitle: "Subscribe to our newsletter",
69
+ emailPlaceholder: "Your email",
70
+ submitLabel: "Submit",
71
+ newsletterEmail: "",
72
+ copyright: "© 2026 Suvastu Properties. All rights reserved",
73
+ privacyHref: "#",
74
+ termsHref: "#",
75
+ className: "",
76
+ };
@@ -0,0 +1 @@
1
+ export { Footer09, default } from "./Footer09";