aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist/assets/index-CaOZZ3TZ.js (renamed from dist/assets/index-BVnSCDze.js)2
-rw-r--r--dist/index.html2
-rw-r--r--src/components/Contact.jsx3
3 files changed, 5 insertions, 2 deletions
diff --git a/dist/assets/index-BVnSCDze.js b/dist/assets/index-CaOZZ3TZ.js
index 7206278..ac2bba7 100644
--- a/dist/assets/index-BVnSCDze.js
+++ b/dist/assets/index-CaOZZ3TZ.js
@@ -69,4 +69,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
missionStatement:
"Learn from data. Always keep creating!"
-};`})}),C.jsx(B.div,{className:"floating-card",animate:{y:[0,-10,0],rotate:[0,2,0]},transition:{duration:4,repeat:1/0,ease:"easeInOut"},children:C.jsxs("div",{className:"card-content",children:[C.jsx("span",{className:"card-icon",children:" 💻 "}),C.jsxs("span",{className:"card-text",children:[" ","Currently working on something awesome!"]})]})})]})]})}),Fr={initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.6}},WG={animate:{transition:{staggerChildren:.1}}},YG=()=>C.jsxs(B.section,{id:"projects",className:"projects",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:[C.jsx(B.h2,{variants:Fr,initial:"initial",whileInView:"animate",viewport:{once:!0},children:"My Projects"}),C.jsxs(B.div,{className:"project-grid",variants:WG,initial:"initial",whileInView:"animate",viewport:{once:!0},children:[C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://app.powerbi.com/view?r=eyJrIjoiZWVlNmI0MzUtMmVlOC00OTY4LWExODAtYzljYThjNjU5M2JkIiwidCI6ImE5ZjM5NjdkLTQwOWItNDNmNy05MjQ2LTY2YjljNTQzYTRkNSJ9","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/robert-de-niro-project.jpg')"},whileHover:{scale:1.05,transition:{duration:.2}}}),C.jsx("h3",{children:"Robert De Niro: A Data-Driven Filmography"}),C.jsx("p",{children:"An interactive deep dive into Robert De Niro's film career through a crunching the data from Movie Database APIs."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"SQL"}),C.jsx("span",{children:"Python"}),C.jsx("span",{children:"PowerBI"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://app.powerbi.com/view?r=eyJrIjoiMTdmMzVlNGMtYzhkMS00OTFkLWIwYzEtZmY2ODIyYjJkOGY1IiwidCI6ImE5ZjM5NjdkLTQwOWItNDNmNy05MjQ2LTY2YjljNTQzYTRkNSJ9&pageName=b178d00c0c03a7a3409e","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/little-dictionary-of-fashion.jpg')"},whileHover:{scale:1.05},transition:{duration:.2}}),C.jsx("h3",{children:"Little Dictionary of Fashion by Christian Dior"}),C.jsx("p",{children:"An interactive Power BI applet allowing for exploration of Christian Dior's fashion from the 50s."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"PowerBI"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://github.com/millyz2023/Brown-Housing-Notification/","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/brown-housing-notifications.jpg')"},whileHover:{scale:1.05},transition:{duration:.2}}),C.jsx("h3",{children:"Brown Housing Notifications"}),C.jsx("p",{children:"A python script that scrapes Brown University's off-campus housing website and sends notifications via email when new housing options become available."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"RESTful APIs"}),C.jsx("span",{children:"SMTP"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://github.com/millyz2023/Find-your-flight","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/find-your-flight.jpg')"},whileHover:{scale:1.05,transition:{duration:.2}}}),C.jsx("h3",{children:"Find Your Flight"}),C.jsx("p",{children:"Uses the Flight Search APIs to ease the process of making a perfect travel plan."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"RESTful APIs"})]})]})]})]});class Ga{constructor(t=0,n="Network Error"){this.status=t,this.text=n}}const KG=()=>{if(!(typeof localStorage>"u"))return{get:e=>Promise.resolve(localStorage.getItem(e)),set:(e,t)=>Promise.resolve(localStorage.setItem(e,t)),remove:e=>Promise.resolve(localStorage.removeItem(e))}},ve={origin:"https://api.emailjs.com",blockHeadless:!1,storageProvider:KG()},Mm=e=>e?typeof e=="string"?{publicKey:e}:e.toString()==="[object Object]"?e:{}:{},XG=(e,t="https://api.emailjs.com")=>{if(!e)return;const n=Mm(e);ve.publicKey=n.publicKey,ve.blockHeadless=n.blockHeadless,ve.storageProvider=n.storageProvider,ve.blockList=n.blockList,ve.limitRate=n.limitRate,ve.origin=n.origin||t},QI=async(e,t,n={})=>{const r=await fetch(ve.origin+e,{method:"POST",headers:n,body:t}),a=await r.text(),i=new Ga(r.status,a);if(r.ok)return i;throw i},JI=(e,t,n)=>{if(!e||typeof e!="string")throw"The public key is required. Visit https://dashboard.emailjs.com/admin/account";if(!t||typeof t!="string")throw"The service ID is required. Visit https://dashboard.emailjs.com/admin";if(!n||typeof n!="string")throw"The template ID is required. Visit https://dashboard.emailjs.com/admin/templates"},ZG=e=>{if(e&&e.toString()!=="[object Object]")throw"The template params have to be the object. Visit https://www.emailjs.com/docs/sdk/send/"},eN=e=>e.webdriver||!e.languages||e.languages.length===0,tN=()=>new Ga(451,"Unavailable For Headless Browser"),QG=(e,t)=>{if(!Array.isArray(e))throw"The BlockList list has to be an array";if(typeof t!="string")throw"The BlockList watchVariable has to be a string"},JG=e=>{var t;return!((t=e.list)!=null&&t.length)||!e.watchVariable},eq=(e,t)=>e instanceof FormData?e.get(t):e[t],nN=(e,t)=>{if(JG(e))return!1;QG(e.list,e.watchVariable);const n=eq(t,e.watchVariable);return typeof n!="string"?!1:e.list.includes(n)},rN=()=>new Ga(403,"Forbidden"),tq=(e,t)=>{if(typeof e!="number"||e<0)throw"The LimitRate throttle has to be a positive number";if(t&&typeof t!="string")throw"The LimitRate ID has to be a non-empty string"},nq=async(e,t,n)=>{const r=Number(await n.get(e)||0);return t-Date.now()+r},aN=async(e,t,n)=>{if(!t.throttle||!n)return!1;tq(t.throttle,t.id);const r=t.id||e;return await nq(r,t.throttle,n)>0?!0:(await n.set(r,Date.now().toString()),!1)},iN=()=>new Ga(429,"Too Many Requests"),rq=async(e,t,n,r)=>{const a=Mm(r),i=a.publicKey||ve.publicKey,o=a.blockHeadless||ve.blockHeadless,s=a.storageProvider||ve.storageProvider,l={...ve.blockList,...a.blockList},u={...ve.limitRate,...a.limitRate};return o&&eN(navigator)?Promise.reject(tN()):(JI(i,e,t),ZG(n),n&&nN(l,n)?Promise.reject(rN()):await aN(location.pathname,u,s)?Promise.reject(iN()):QI("/api/v1.0/email/send",JSON.stringify({lib_version:"4.4.1",user_id:i,service_id:e,template_id:t,template_params:n}),{"Content-type":"application/json"}))},aq=e=>{if(!e||e.nodeName!=="FORM")throw"The 3rd parameter is expected to be the HTML form element or the style selector of the form"},iq=e=>typeof e=="string"?document.querySelector(e):e,oq=async(e,t,n,r)=>{const a=Mm(r),i=a.publicKey||ve.publicKey,o=a.blockHeadless||ve.blockHeadless,s=ve.storageProvider||a.storageProvider,l={...ve.blockList,...a.blockList},u={...ve.limitRate,...a.limitRate};if(o&&eN(navigator))return Promise.reject(tN());const c=iq(n);JI(i,e,t),aq(c);const d=new FormData(c);return nN(l,d)?Promise.reject(rN()):await aN(location.pathname,u,s)?Promise.reject(iN()):(d.append("lib_version","4.4.1"),d.append("service_id",e),d.append("template_id",t),d.append("user_id",i),QI("/api/v1.0/email/send-form",d))},oN={init:XG,send:rq,sendForm:oq,EmailJSResponseStatus:Ga},RA={initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.6}},sq=()=>{const[e,t]=U.useState({name:"",email:"",message:""}),[n,r]=U.useState({submitting:!1,success:!1,error:!1,message:""}),a=o=>{const{name:s,value:l}=o.target;t(u=>({...u,[s]:l}))},i=async o=>{o.preventDefault(),r({submitting:!0,success:!1,error:!1,message:""});try{await oN.send("service_y5at6vo","template_tdv5oou",{name:e.name,email:e.email,message:e.message}),r({submitting:!1,success:!0,error:!1,message:"Message sent successfully!"}),t({name:"",email:"",message:""})}catch(s){r({submitting:!1,success:!1,error:!0,message:"Failed to send message. Please try again."}),console.error("EmailJS Error:",s)}};return C.jsxs(B.section,{id:"contact",className:"contact",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:[C.jsx(B.h2,{variants:RA,initial:"initial",animate:"animate",viewport:{once:!0},children:"Get in Touch"}),C.jsx(B.div,{className:"contact-content",variants:RA,children:C.jsxs(B.form,{className:"contact-form",onSubmit:i,children:[C.jsx(B.input,{type:"text",name:"name",placeholder:"Your Name...",required:!0,whileFocus:{scale:1.02},onChange:a}),C.jsx(B.input,{type:"email",name:"email",placeholder:"Your Email...",required:!0,whileFocus:{scale:1.02},onChange:a}),C.jsx(B.textarea,{name:"message",placeholder:"Your Message...",required:!0,whileFocus:{scale:1.02},onChange:a}),C.jsx(B.button,{className:"submit-btn",type:"submit",whileHover:{scale:1.05},whileTap:{scale:.95},disabled:n.submitting,children:n.submitting?"Sending...":"Send Message"}),n.message&&C.jsx(B.div,{className:`form-status ${n.success?"success":"error"} `,children:n.message})]})})]})};function lq(){const[e,t]=U.useState(!1);return U.useEffect(()=>{t(!0),oN.init("3qyN2OaW55VtCE_zw")},[]),C.jsxs("div",{className:`app ${e?"loaded":""}`,children:[C.jsx(b0,{}),C.jsx(HG,{}),C.jsx(YG,{}),C.jsx(sq,{}),C.jsx(B.footer,{className:"footer",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:C.jsx("p",{children:" © 2025 Meiling Zhao"})})]})}Sp.createRoot(document.getElementById("root")).render(C.jsx(Nt.StrictMode,{children:C.jsx(lq,{})}));
+};`})}),C.jsx(B.div,{className:"floating-card",animate:{y:[0,-10,0],rotate:[0,2,0]},transition:{duration:4,repeat:1/0,ease:"easeInOut"},children:C.jsxs("div",{className:"card-content",children:[C.jsx("span",{className:"card-icon",children:" 💻 "}),C.jsxs("span",{className:"card-text",children:[" ","Currently working on something awesome!"]})]})})]})]})}),Fr={initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.6}},WG={animate:{transition:{staggerChildren:.1}}},YG=()=>C.jsxs(B.section,{id:"projects",className:"projects",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:[C.jsx(B.h2,{variants:Fr,initial:"initial",whileInView:"animate",viewport:{once:!0},children:"My Projects"}),C.jsxs(B.div,{className:"project-grid",variants:WG,initial:"initial",whileInView:"animate",viewport:{once:!0},children:[C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://app.powerbi.com/view?r=eyJrIjoiZWVlNmI0MzUtMmVlOC00OTY4LWExODAtYzljYThjNjU5M2JkIiwidCI6ImE5ZjM5NjdkLTQwOWItNDNmNy05MjQ2LTY2YjljNTQzYTRkNSJ9","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/robert-de-niro-project.jpg')"},whileHover:{scale:1.05,transition:{duration:.2}}}),C.jsx("h3",{children:"Robert De Niro: A Data-Driven Filmography"}),C.jsx("p",{children:"An interactive deep dive into Robert De Niro's film career through a crunching the data from Movie Database APIs."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"SQL"}),C.jsx("span",{children:"Python"}),C.jsx("span",{children:"PowerBI"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://app.powerbi.com/view?r=eyJrIjoiMTdmMzVlNGMtYzhkMS00OTFkLWIwYzEtZmY2ODIyYjJkOGY1IiwidCI6ImE5ZjM5NjdkLTQwOWItNDNmNy05MjQ2LTY2YjljNTQzYTRkNSJ9&pageName=b178d00c0c03a7a3409e","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/little-dictionary-of-fashion.jpg')"},whileHover:{scale:1.05},transition:{duration:.2}}),C.jsx("h3",{children:"Little Dictionary of Fashion by Christian Dior"}),C.jsx("p",{children:"An interactive Power BI applet allowing for exploration of Christian Dior's fashion from the 50s."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"PowerBI"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://github.com/millyz2023/Brown-Housing-Notification/","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/brown-housing-notifications.jpg')"},whileHover:{scale:1.05},transition:{duration:.2}}),C.jsx("h3",{children:"Brown Housing Notifications"}),C.jsx("p",{children:"A python script that scrapes Brown University's off-campus housing website and sends notifications via email when new housing options become available."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"RESTful APIs"}),C.jsx("span",{children:"SMTP"})]})]}),C.jsxs(B.div,{className:"project-card",variants:Fr,whileHover:{y:-10,transition:{duration:.2},cursor:"alias"},onClick:()=>window.open("https://github.com/millyz2023/Find-your-flight","_blank"),children:[C.jsx(B.div,{className:"project-image",style:{backgroundImage:"url('/projects/find-your-flight.jpg')"},whileHover:{scale:1.05,transition:{duration:.2}}}),C.jsx("h3",{children:"Find Your Flight"}),C.jsx("p",{children:"Uses the Flight Search APIs to ease the process of making a perfect travel plan."}),C.jsxs("div",{className:"project-tech",children:[C.jsx("span",{children:"Python"}),C.jsx("span",{children:"RESTful APIs"})]})]})]})]});class Ga{constructor(t=0,n="Network Error"){this.status=t,this.text=n}}const KG=()=>{if(!(typeof localStorage>"u"))return{get:e=>Promise.resolve(localStorage.getItem(e)),set:(e,t)=>Promise.resolve(localStorage.setItem(e,t)),remove:e=>Promise.resolve(localStorage.removeItem(e))}},ve={origin:"https://api.emailjs.com",blockHeadless:!1,storageProvider:KG()},Mm=e=>e?typeof e=="string"?{publicKey:e}:e.toString()==="[object Object]"?e:{}:{},XG=(e,t="https://api.emailjs.com")=>{if(!e)return;const n=Mm(e);ve.publicKey=n.publicKey,ve.blockHeadless=n.blockHeadless,ve.storageProvider=n.storageProvider,ve.blockList=n.blockList,ve.limitRate=n.limitRate,ve.origin=n.origin||t},QI=async(e,t,n={})=>{const r=await fetch(ve.origin+e,{method:"POST",headers:n,body:t}),a=await r.text(),i=new Ga(r.status,a);if(r.ok)return i;throw i},JI=(e,t,n)=>{if(!e||typeof e!="string")throw"The public key is required. Visit https://dashboard.emailjs.com/admin/account";if(!t||typeof t!="string")throw"The service ID is required. Visit https://dashboard.emailjs.com/admin";if(!n||typeof n!="string")throw"The template ID is required. Visit https://dashboard.emailjs.com/admin/templates"},ZG=e=>{if(e&&e.toString()!=="[object Object]")throw"The template params have to be the object. Visit https://www.emailjs.com/docs/sdk/send/"},eN=e=>e.webdriver||!e.languages||e.languages.length===0,tN=()=>new Ga(451,"Unavailable For Headless Browser"),QG=(e,t)=>{if(!Array.isArray(e))throw"The BlockList list has to be an array";if(typeof t!="string")throw"The BlockList watchVariable has to be a string"},JG=e=>{var t;return!((t=e.list)!=null&&t.length)||!e.watchVariable},eq=(e,t)=>e instanceof FormData?e.get(t):e[t],nN=(e,t)=>{if(JG(e))return!1;QG(e.list,e.watchVariable);const n=eq(t,e.watchVariable);return typeof n!="string"?!1:e.list.includes(n)},rN=()=>new Ga(403,"Forbidden"),tq=(e,t)=>{if(typeof e!="number"||e<0)throw"The LimitRate throttle has to be a positive number";if(t&&typeof t!="string")throw"The LimitRate ID has to be a non-empty string"},nq=async(e,t,n)=>{const r=Number(await n.get(e)||0);return t-Date.now()+r},aN=async(e,t,n)=>{if(!t.throttle||!n)return!1;tq(t.throttle,t.id);const r=t.id||e;return await nq(r,t.throttle,n)>0?!0:(await n.set(r,Date.now().toString()),!1)},iN=()=>new Ga(429,"Too Many Requests"),rq=async(e,t,n,r)=>{const a=Mm(r),i=a.publicKey||ve.publicKey,o=a.blockHeadless||ve.blockHeadless,s=a.storageProvider||ve.storageProvider,l={...ve.blockList,...a.blockList},u={...ve.limitRate,...a.limitRate};return o&&eN(navigator)?Promise.reject(tN()):(JI(i,e,t),ZG(n),n&&nN(l,n)?Promise.reject(rN()):await aN(location.pathname,u,s)?Promise.reject(iN()):QI("/api/v1.0/email/send",JSON.stringify({lib_version:"4.4.1",user_id:i,service_id:e,template_id:t,template_params:n}),{"Content-type":"application/json"}))},aq=e=>{if(!e||e.nodeName!=="FORM")throw"The 3rd parameter is expected to be the HTML form element or the style selector of the form"},iq=e=>typeof e=="string"?document.querySelector(e):e,oq=async(e,t,n,r)=>{const a=Mm(r),i=a.publicKey||ve.publicKey,o=a.blockHeadless||ve.blockHeadless,s=ve.storageProvider||a.storageProvider,l={...ve.blockList,...a.blockList},u={...ve.limitRate,...a.limitRate};if(o&&eN(navigator))return Promise.reject(tN());const c=iq(n);JI(i,e,t),aq(c);const d=new FormData(c);return nN(l,d)?Promise.reject(rN()):await aN(location.pathname,u,s)?Promise.reject(iN()):(d.append("lib_version","4.4.1"),d.append("service_id",e),d.append("template_id",t),d.append("user_id",i),QI("/api/v1.0/email/send-form",d))},oN={init:XG,send:rq,sendForm:oq,EmailJSResponseStatus:Ga},RA={initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.6}},sq=()=>{const[e,t]=U.useState({name:"",email:"",message:""}),[n,r]=U.useState({submitting:!1,success:!1,error:!1,message:""}),a=o=>{const{name:s,value:l}=o.target;t(u=>({...u,[s]:l}))},i=async o=>{o.preventDefault(),r({submitting:!0,success:!1,error:!1,message:""});try{await oN.send("service_y5at6vo","template_tdv5oou",{name:e.name,email:e.email,message:e.message}),r({submitting:!1,success:!0,error:!1,message:"Message sent successfully!"}),t({name:"",email:"",message:""})}catch(s){r({submitting:!1,success:!1,error:!0,message:"Failed to send message. Please try again."}),console.error("EmailJS Error:",s)}};return C.jsxs(B.section,{id:"contact",className:"contact",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:[C.jsx(B.h2,{variants:RA,initial:"initial",animate:"animate",viewport:{once:!0},children:"Get in Touch"}),C.jsx(B.div,{className:"contact-content",variants:RA,children:C.jsxs(B.form,{className:"contact-form",onSubmit:i,children:[C.jsx(B.input,{type:"text",name:"name",placeholder:"Your Name...",required:!0,whileFocus:{scale:1.02},onChange:a,value:e.name}),C.jsx(B.input,{type:"email",name:"email",placeholder:"Your Email...",required:!0,whileFocus:{scale:1.02},onChange:a,value:e.email}),C.jsx(B.textarea,{name:"message",placeholder:"Your Message...",required:!0,whileFocus:{scale:1.02},onChange:a,value:e.message}),C.jsx(B.button,{className:"submit-btn",type:"submit",whileHover:{scale:1.05},whileTap:{scale:.95},disabled:n.submitting,children:n.submitting?"Sending...":"Send Message"}),n.message&&C.jsx(B.div,{className:`form-status ${n.success?"success":"error"} `,children:n.message})]})})]})};function lq(){const[e,t]=U.useState(!1);return U.useEffect(()=>{t(!0),oN.init("3qyN2OaW55VtCE_zw")},[]),C.jsxs("div",{className:`app ${e?"loaded":""}`,children:[C.jsx(b0,{}),C.jsx(HG,{}),C.jsx(YG,{}),C.jsx(sq,{}),C.jsx(B.footer,{className:"footer",initial:{opacity:0},whileInView:{opacity:1},viewport:{once:!0},transition:{duration:.6},children:C.jsx("p",{children:" © 2025 Meiling Zhao"})})]})}Sp.createRoot(document.getElementById("root")).render(C.jsx(Nt.StrictMode,{children:C.jsx(lq,{})}));
diff --git a/dist/index.html b/dist/index.html
index f0b6166..a677870 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -13,7 +13,7 @@
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&display=swap"
/>
- <script type="module" crossorigin src="/assets/index-BVnSCDze.js"></script>
+ <script type="module" crossorigin src="/assets/index-CaOZZ3TZ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-D79haWr_.css">
</head>
<body>
diff --git a/src/components/Contact.jsx b/src/components/Contact.jsx
index a3a8ebe..570c0b5 100644
--- a/src/components/Contact.jsx
+++ b/src/components/Contact.jsx
@@ -101,6 +101,7 @@ export const Contact = () => {
required
whileFocus={{ scale: 1.02 }}
onChange={handleInputChange}
+ value={formData.name}
/>
<motion.input
type="email"
@@ -109,6 +110,7 @@ export const Contact = () => {
required
whileFocus={{ scale: 1.02 }}
onChange={handleInputChange}
+ value={formData.email}
/>
<motion.textarea
name="message"
@@ -116,6 +118,7 @@ export const Contact = () => {
required
whileFocus={{ scale: 1.02 }}
onChange={handleInputChange}
+ value={formData.message}
/>
<motion.button