11"use client" ;
2- import React from ' react' ;
3- import Link from ' next/link' ;
4- import { useState } from ' react' ;
2+ import React from " react" ;
3+ import Link from " next/link" ;
4+ import { useState } from " react" ;
55import PrivacyPolicyModal from "@/app/components/PrivacyPolicyModal" ;
6+ import { GoHomeFill } from "react-icons/go" ;
7+ import { MdAnimation } from "react-icons/md" ;
8+ import { IoMdInformationCircle } from "react-icons/io" ;
9+ import { HiSparkles } from "react-icons/hi2" ;
10+ import { RiQuestionLine } from "react-icons/ri" ;
611
712const Footer = ( ) => {
813 const [ showPolicyModal , setShowPolicyModal ] = useState ( false ) ;
914
1015 const quickLinks = [
11- { href : "/" , text : "Home" } ,
12- { href : "/#features" , text : "Features" } ,
13- { href : "/visualizer" , text : "Visualizer" } ,
14- { href : "/#about" , text : "About" } ,
15- { href : "/#faq" , text : "FAQs" }
16+ { href : "/" , text : "Home" , icon : GoHomeFill } ,
17+ { href : "/#features" , text : "Features" , icon : HiSparkles } ,
18+ { href : "/visualizer" , text : "Visualizer" , icon : MdAnimation } ,
19+ { href : "/#about" , text : "About" , icon : IoMdInformationCircle } ,
20+ { href : "/#faq" , text : "FAQs" , icon : RiQuestionLine } ,
1621 ] ;
1722
1823 const socialLinks = [
1924 {
2025 href : "https://twitter.com" ,
2126 icon : (
2227 < svg className = "w-5 h-5" fill = "currentColor" viewBox = "0 0 24 24" >
23- < path d = "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" />
28+ < path d = "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" />
2429 </ svg >
2530 ) ,
26- label : "Twitter"
31+ label : "Twitter" ,
2732 } ,
2833 {
2934 href : "https://linkedin.com" ,
3035 icon : (
3136 < svg className = "w-5 h-5" fill = "currentColor" viewBox = "0 0 24 24" >
32- < path d = "M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z" />
37+ < path d = "M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z" />
3338 </ svg >
3439 ) ,
35- label : "LinkedIn"
40+ label : "LinkedIn" ,
3641 } ,
3742 {
3843 href : "https://github.com" ,
3944 icon : (
4045 < svg className = "w-5 h-5" fill = "currentColor" viewBox = "0 0 24 24" >
41- < path fillRule = "evenodd" d = "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule = "evenodd" />
46+ < path
47+ fillRule = "evenodd"
48+ d = "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
49+ clipRule = "evenodd"
50+ />
4251 </ svg >
4352 ) ,
44- label : "GitHub"
53+ label : "GitHub" ,
4554 } ,
4655 {
4756 href : "https://instagram.com" ,
4857 icon : (
4958 < svg className = "w-5 h-5" fill = "currentColor" viewBox = "0 0 24 24" >
50- < path fillRule = "evenodd" d = "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z" clipRule = "evenodd" />
59+ < path
60+ fillRule = "evenodd"
61+ d = "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"
62+ clipRule = "evenodd"
63+ />
5164 </ svg >
5265 ) ,
53- label : "Instagram"
54- }
66+ label : "Instagram" ,
67+ } ,
5568 ] ;
5669
57- const legalLinks = [
58- { href : "/privacy" , text : "Privacy Policy" , type : "modal" } ,
59- { href : "/terms" , text : "Terms of Service" , type : "link" } ,
60- { href : "/cookies" , text : "Cookies" , type : "link" }
61- ] ;
70+ const legalLinks = [
71+ { href : "/privacy" , text : "Privacy Policy" , type : "modal" } ,
72+ { href : "/terms" , text : "Terms of Service" , type : "link" } ,
73+ { href : "/cookies" , text : "Cookies" , type : "link" } ,
74+ ] ;
6275
6376 return (
6477 < footer className = "bg-black text-gray-400" >
@@ -67,18 +80,31 @@ const legalLinks = [
6780 { /* Brand Column */ }
6881 < div className = "md:col-span-2 space-y-6" >
6982 < div className = "flex items-center" >
70- < span className = "text-2xl font-bold text-white" > DSA< span className = "text-blue-500" > Visualizer</ span > </ span >
83+ < span className = "text-2xl font-bold text-white" >
84+ DSA< span className = "text-blue-500" > Visualizer</ span >
85+ </ span >
7186 </ div >
7287 < p className = "text-gray-500 leading-relaxed" >
73- Interactive visualization tools for mastering data structures and algorithms.
88+ Interactive visualization tools for mastering data structures and
89+ algorithms.
7490 </ p >
7591 < div className = "space-y-3" >
7692 < div className = "flex items-start" >
77- < svg className = "w-5 h-5 mt-0.5 mr-3 flex-shrink-0" fill = "red" viewBox = "0 0 24 24" >
78- < path d = "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 6 4 4 6.5 4c1.74 0 3.41 1.01 4.13 2.44h1.74C14.09 5.01 15.76 4 17.5 4 20 4 22 6 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
93+ < svg
94+ className = "w-5 h-5 mt-0.5 mr-3 flex-shrink-0"
95+ fill = "red"
96+ viewBox = "0 0 24 24"
97+ >
98+ < path d = "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 6 4 4 6.5 4c1.74 0 3.41 1.01 4.13 2.44h1.74C14.09 5.01 15.76 4 17.5 4 20 4 22 6 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
7999 </ svg >
80100 < span >
81- Made with ♥ by < a href = "https://www.linkedin.com/in/sohan-rout/" className = "text-blue-400 hover:text-blue-300" > Sohan Rout</ a >
101+ Made with ♥ by{ " " }
102+ < a
103+ href = "https://www.linkedin.com/in/sohan-rout/"
104+ className = "text-blue-400 hover:text-blue-300"
105+ >
106+ Sohan Rout
107+ </ a >
82108 </ span >
83109 </ div >
84110 { /*
@@ -89,19 +115,38 @@ const legalLinks = [
89115 <a href="mailto:[email protected] " className="hover:text-blue-400 transition">[email protected] </a> 90116 </div>
91117 */ }
118+ < div className = "flex justify-left" >
119+ < a
120+ className = "border rounded-xl"
121+ href = "https://www.producthunt.com/products/dsa-visualizer?embed=true& utm_source = badge - featured & utm_medium = badge & utm_source = badge - dsa & #0045 ; visualizer "
122+ target = "_blank"
123+ rel = "noopener noreferrer"
124+ >
125+ < img
126+ src = { `https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=974127&theme=dark&t=1749182745821` }
127+ alt = "DSA Visualizer - Visualize & learn dsa the smart way | Product Hunt"
128+ style = { { width : 250 , height : 54 } }
129+ width = "250"
130+ height = "54"
131+ />
132+ </ a >
133+ </ div >
92134 </ div >
93135 </ div >
94136
95137 { /* Quick Links */ }
96138 < div >
97- < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" > Navigation</ h3 >
139+ < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" >
140+ Navigation
141+ </ h3 >
98142 < ul className = "space-y-3" >
99143 { quickLinks . map ( ( link , index ) => (
100144 < li key = { index } >
101- < Link href = { link . href } className = "hover:text-blue-400 transition flex items-center group" >
102- < svg className = "w-4 h-4 mr-2 opacity-0 group-hover:opacity-100 transition" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
103- < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = "2" d = "M9 5l7 7-7 7" />
104- </ svg >
145+ < Link
146+ href = { link . href }
147+ className = "hover:text-blue-400 transition flex items-center gap-2 group"
148+ >
149+ { link . icon && < link . icon className = "text-xl" /> }
105150 { link . text }
106151 </ Link >
107152 </ li >
@@ -112,41 +157,45 @@ const legalLinks = [
112157 { /* Legal + Social */ }
113158 < div className = "space-y-8" >
114159 < div >
115- < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" > Legal</ h3 >
160+ < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" >
161+ Legal
162+ </ h3 >
116163 < ul className = "space-y-3" >
117- { legalLinks . map ( ( link , index ) => (
118- < li key = { index } >
119- { link . type === "modal" ? (
120- < button
121- onClick = { ( ) => setShowPolicyModal ( true ) }
122- className = "text-gray-500 hover:text-blue-400 transition"
123- >
124- { link . text }
125- </ button >
126- ) : (
127- < Link
128- href = { link . href }
129- className = "text-gray-500 hover:text-blue-400 transition"
130- >
131- { link . text }
132- </ Link >
133- ) }
134- </ li >
135- ) ) }
136- </ ul >
164+ { legalLinks . map ( ( link , index ) => (
165+ < li key = { index } >
166+ { link . type === "modal" ? (
167+ < button
168+ onClick = { ( ) => setShowPolicyModal ( true ) }
169+ className = "text-gray-500 hover:text-blue-400 transition"
170+ >
171+ { link . text }
172+ </ button >
173+ ) : (
174+ < Link
175+ href = { link . href }
176+ className = "text-gray-500 hover:text-blue-400 transition"
177+ >
178+ { link . text }
179+ </ Link >
180+ ) }
181+ </ li >
182+ ) ) }
183+ </ ul >
137184 </ div >
138185
139186 { /* Render the modal */ }
140- < PrivacyPolicyModal
141- isOpen = { showPolicyModal }
142- onClose = { ( ) => setShowPolicyModal ( false ) }
143- />
187+ < PrivacyPolicyModal
188+ isOpen = { showPolicyModal }
189+ onClose = { ( ) => setShowPolicyModal ( false ) }
190+ />
144191
145192 < div >
146- < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" > Connect</ h3 >
193+ < h3 className = "text-sm font-semibold text-white uppercase tracking-wider mb-4" >
194+ Connect
195+ </ h3 >
147196 < div className = "flex space-x-4" >
148197 { socialLinks . map ( ( social , index ) => (
149- < a
198+ < a
150199 key = { index }
151200 href = { social . href }
152201 aria-label = { social . label }
@@ -164,11 +213,22 @@ const legalLinks = [
164213 < div className = "mt-16 pt-8 border-t border-gray-900" >
165214 < div className = "flex flex-col md:flex-row justify-between items-center" >
166215 < p className = "text-sm text-gray-500" >
167- © { new Date ( ) . getFullYear ( ) } DSAVisualizer. All rights reserved.
216+ © { new Date ( ) . getFullYear ( ) } DSAVisualizer. All rights
217+ reserved.
168218 </ p >
169219 < div className = "flex space-x-6 mt-4 md:mt-0" >
170- < Link href = "/sitemap-0.xml" className = "text-sm text-gray-500 hover:text-blue-400 transition" > Sitemap</ Link >
171- < Link href = "/#review" className = "text-sm text-gray-500 hover:text-blue-400 transition" > Contact</ Link >
220+ < Link
221+ href = "/sitemap-0.xml"
222+ className = "text-sm text-gray-500 hover:text-blue-400 transition"
223+ >
224+ Sitemap
225+ </ Link >
226+ < Link
227+ href = "/#review"
228+ className = "text-sm text-gray-500 hover:text-blue-400 transition"
229+ >
230+ Contact
231+ </ Link >
172232 </ div >
173233 </ div >
174234 </ div >
@@ -177,4 +237,4 @@ const legalLinks = [
177237 ) ;
178238} ;
179239
180- export default Footer ;
240+ export default Footer ;
0 commit comments