diff --git a/package-lock.json b/package-lock.json index 889a246..21929bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "portfolio-new", "version": "0.0.0", "dependencies": { + "@emailjs/browser": "^4.4.1", "@react-three/drei": "^10.7.4", "@react-three/fiber": "^9.3.0", "@tailwindcss/vite": "^4.1.12", @@ -345,6 +346,15 @@ "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "license": "Apache-2.0" }, + "node_modules/@emailjs/browser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-4.4.1.tgz", + "integrity": "sha512-DGSlP9sPvyFba3to2A50kDtZ+pXVp/0rhmqs2LmbMS3I5J8FSOgLwzY2Xb4qfKlOVHh29EAutLYwe5yuEZmEFg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", diff --git a/package.json b/package.json index 0b8dcf7..18cee32 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@emailjs/browser": "^4.4.1", "@react-three/drei": "^10.7.4", "@react-three/fiber": "^9.3.0", "@tailwindcss/vite": "^4.1.12", diff --git a/src/App.jsx b/src/App.jsx index eaf741d..8eab6cf 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -4,6 +4,7 @@ import Hero from './sections/Hero' import About from './sections/About' import Projects from './sections/Projects' import Experiences from './sections/Experiences' +import Testimonial from './sections/Testimonial' const App = () => { return ( @@ -14,13 +15,15 @@ const App = () => { +
- + {/* service_g8pia9k */} + {/* template_lrhppet */} {/*experinec*/} {/*testimonial*/} {/*contact*/} diff --git a/src/components/Marquee.jsx b/src/components/Marquee.jsx new file mode 100644 index 0000000..a6cc6bb --- /dev/null +++ b/src/components/Marquee.jsx @@ -0,0 +1,40 @@ +import { twMerge } from "tailwind-merge"; +export default function Marquee({ + className, + reverse = false, + pauseOnHover = false, + children, + vertical = false, + repeat = 4, + ...props +}) { + return ( +
+ {Array(repeat) + .fill(0) + .map((_, i) => ( +
+ {children} +
+ ))} +
+ ); +} \ No newline at end of file diff --git a/src/sections/Testimonial.jsx b/src/sections/Testimonial.jsx new file mode 100644 index 0000000..5e62d34 --- /dev/null +++ b/src/sections/Testimonial.jsx @@ -0,0 +1,54 @@ +import { twMerge } from "tailwind-merge"; +import Marquee from "../components/Marquee"; +import { reviews } from "../constants"; +const firstRow = reviews.slice(0, reviews.length / 2); +const secondRow = reviews.slice(reviews.length / 2); + +const ReviewCard = ({ img, name, username, body }) => { + return ( +
+
+ +
+
+ {name} +
+

{username}

+
+
+
{body}
+
+ ); +}; + +export default function Testimonial() { + return ( +
+

Hear From My Clients

+
+ + {firstRow.map((review) => ( + + ))} + + + {secondRow.map((review) => ( + + ))} + +
+
+
+
+ ); +} \ No newline at end of file