From 8b00d426de858c8ea2286ee50c28d44e8be9b3a0 Mon Sep 17 00:00:00 2001 From: Erfan Ahmadi Date: Wed, 23 Sep 2026 09:38:53 +0400 Subject: [PATCH 1/3] add testimonial --- app/components/Partners.tsx | 2 +- app/components/ProjectsSection.tsx | 2 +- app/components/TestimonialsSection.tsx | 15 ++++++++++++++- public/testimonials/sven.jpg | Bin 0 -> 57719 bytes 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 public/testimonials/sven.jpg diff --git a/app/components/Partners.tsx b/app/components/Partners.tsx index b0d78f0..51a7202 100644 --- a/app/components/Partners.tsx +++ b/app/components/Partners.tsx @@ -11,7 +11,7 @@ export type Partner = { const partners: Partner[] = [ { name: "Applications in CADD", initials: "AC", logo: "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/partners/appscadd.png", url: "https://appsincadd.co.uk/" }, - { name: "Synera", initials: "SY", logo: "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/partners/synera.png", url: "https://www.synera.io/", logoTone: "invert" }, + { name: "Synera", initials: "SY", logo: "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/partners/synera.png", url: "https://www.synera.ai/", logoTone: "invert" }, { name: "Ditt Officemakers", initials: "DT", logo: "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/partners/ditt.png", url: "https://www.ditt.nl/" }, { name: "Imverse", initials: "IM", logo: "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/partners/imverse.png", url: "https://www.imverse.com/" }, { name: "Wild Software Inc", initials: "WI", logo: "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/partners/wild.jpg", url: "https://factionsvr.com/" }, diff --git a/app/components/ProjectsSection.tsx b/app/components/ProjectsSection.tsx index f816d7d..065b972 100644 --- a/app/components/ProjectsSection.tsx +++ b/app/components/ProjectsSection.tsx @@ -115,7 +115,7 @@ const projects: Project[] = [ { slug: "synera", company: "Synera", - url: "https://www.synera.io/", + url: "https://www.synera.ai/", title: "Renderer Performance Analysis & Design", summary: "Performance diagnosis and renderer architecture planning for complex engineering scenes.", bullets: [ diff --git a/app/components/TestimonialsSection.tsx b/app/components/TestimonialsSection.tsx index 1463523..a901f13 100644 --- a/app/components/TestimonialsSection.tsx +++ b/app/components/TestimonialsSection.tsx @@ -6,6 +6,7 @@ type Testimonial = { profileUrl: string; profilePicture: string; companyIcon: string; + companyIconTone?: "normal" | "invert"; testimonial: string; }; @@ -28,6 +29,16 @@ const testimonials: Testimonial[] = [ testimonial: "The DevSH team transformed our CPU render farm for architectural visualization into a scalable GPU-based system with outstanding performance and reliability. Their expertise and commitment to achieving the best results were clear throughout the project. They maintained full backward compatibility, ensuring a smooth transition with minimal disruption to our workflows.", }, + { + name: "Sven Seele", + role: "Techlead at Synera", + profileUrl: "https://www.linkedin.com/in/sven-seele-09433a41/", + profilePicture: "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/testimonials/sven.jpg", + companyIcon: "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/partners/synera.png", + companyIconTone: "invert", + testimonial: + "We were looking for performance improvements for our integrated viewer technology and DevSH brought exactly the expertise we needed. They worked independently, asked the right questions, and delivered a report that was thorough and easy to follow, with the required performance analysis and concrete improvement strategies. They also gave us sound technical guidance on rendering strategy that helped align our team internally. We'd definitely work with them again.", + }, ]; export default function TestimonialsSection() { @@ -80,7 +91,9 @@ export default function TestimonialsSection() { src={testimonial.companyIcon} alt="" fill - className="object-contain" + className={`object-contain ${ + testimonial.companyIconTone === "invert" ? "invert" : "" + }`} sizes="(min-width: 64rem) 4.5rem, 3.25rem" /> diff --git a/public/testimonials/sven.jpg b/public/testimonials/sven.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab4511dcf1d154961bc74f529e6a554ed6d823a4 GIT binary patch literal 57719 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%0A>a&}2r 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 Date: Wed, 23 Sep 2026 09:53:01 +0400 Subject: [PATCH 2/3] carousel thing for testimonials --- app/components/TestimonialsSection.tsx | 352 +++++++++++++++++++++---- app/globals.css | 86 +++++- 2 files changed, 379 insertions(+), 59 deletions(-) diff --git a/app/components/TestimonialsSection.tsx b/app/components/TestimonialsSection.tsx index a901f13..e2fc301 100644 --- a/app/components/TestimonialsSection.tsx +++ b/app/components/TestimonialsSection.tsx @@ -1,4 +1,7 @@ +"use client"; + import Image from "next/image"; +import { useCallback, useEffect, useRef, useState } from "react"; type Testimonial = { name: string; @@ -41,7 +44,230 @@ const testimonials: Testimonial[] = [ }, ]; +// Continuous drift of the desktop carousel, in pixels per second. +const DRIFT_SPEED = 16; +// How sharply an arrow press is eased into the drift; higher settles faster. +const NUDGE_DAMPING = 6; +// Halt the drift while the pointer is anywhere over the carousel, so a quote +// can be read without it sliding away. The arrow controls pause regardless of +// this flag; see the note on them below. +const PAUSE_ON_HOVER = false; + +function useMediaQuery(query: string) { + const [matches, setMatches] = useState(false); + + useEffect(() => { + const mql = window.matchMedia(query); + const update = () => setMatches(mql.matches); + + update(); + mql.addEventListener("change", update); + return () => mql.removeEventListener("change", update); + }, [query]); + + return matches; +} + +function TestimonialCard({ + testimonial, + clone, +}: { + testimonial: Testimonial; + clone?: boolean; +}) { + return ( + + ); +} + export default function TestimonialsSection() { + const trackRef = useRef(null); + const viewportRef = useRef(null); + // Current scroll position of the track, and any pending arrow movement + // still being eased in. Both live in refs so the rAF loop can drive the + // transform directly instead of re-rendering every frame. + const offsetRef = useRef(0); + const nudgeRef = useRef(0); + const cycleRef = useRef(0); + const centredRef = useRef(false); + const [paused, setPaused] = useState(false); + + const isDesktop = useMediaQuery("(min-width: 64rem)"); + const reducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)"); + + const trackGap = useCallback((track: HTMLDivElement) => { + return parseFloat(getComputedStyle(track).columnGap || "0") || 0; + }, []); + + // The track renders the list twice, so one full cycle is half its width. + // scrollWidth omits the trailing gap, hence the correction. + const measure = useCallback(() => { + const track = trackRef.current; + if (!track) return; + + const cycle = (track.scrollWidth + trackGap(track)) / 2; + cycleRef.current = cycle; + + // Open with the first quote centred rather than flush against the left + // edge. Done once per activation so a resize does not yank the track back + // to the start mid-drift. + if (centredRef.current || cycle <= 0) return; + + const viewport = viewportRef.current; + const card = track.querySelector(".testimonial-quote"); + if (!viewport || !card) return; + + const start = card.offsetWidth / 2 - viewport.clientWidth / 2; + offsetRef.current = ((start % cycle) + cycle) % cycle; + track.style.transform = `translate3d(${-offsetRef.current}px, 0, 0)`; + centredRef.current = true; + }, [trackGap]); + + useEffect(() => { + if (!isDesktop) { + // Leaving desktop: drop the inline transform so the stacked layout is + // clean, and re-centre if the carousel comes back. + offsetRef.current = 0; + nudgeRef.current = 0; + centredRef.current = false; + if (trackRef.current) trackRef.current.style.transform = ""; + return; + } + + measure(); + const track = trackRef.current; + const observer = new ResizeObserver(measure); + if (track) observer.observe(track); + + return () => observer.disconnect(); + }, [isDesktop, measure]); + + useEffect(() => { + if (!isDesktop) return; + + let frame = 0; + let last = performance.now(); + + const tick = (now: number) => { + // Clamp dt so a backgrounded tab does not jump the track on return. + const dt = Math.min((now - last) / 1000, 0.05); + last = now; + + const cycle = cycleRef.current; + if (cycle > 0) { + const drift = paused || reducedMotion ? 0 : DRIFT_SPEED * dt; + + // Exponential easing approaches zero without reaching it, so close the + // final sub-pixel outright and let the card settle exactly centred. + let catchUp = nudgeRef.current * (1 - Math.exp(-dt * NUDGE_DAMPING)); + if (Math.abs(nudgeRef.current - catchUp) < 0.5) { + catchUp = nudgeRef.current; + } + nudgeRef.current -= catchUp; + + const next = offsetRef.current + drift + catchUp; + offsetRef.current = ((next % cycle) + cycle) % cycle; + + const track = trackRef.current; + if (track) { + track.style.transform = `translate3d(${-offsetRef.current}px, 0, 0)`; + } + } + + frame = requestAnimationFrame(tick); + }; + + frame = requestAnimationFrame(tick); + return () => cancelAnimationFrame(frame); + }, [isDesktop, paused, reducedMotion]); + + // Move to the adjacent card and land it dead centre in the viewport, rather + // than shifting by a fixed amount and inheriting whatever fractional + // position the drift happened to leave behind. + const goTo = useCallback( + (direction: 1 | -1) => { + const track = trackRef.current; + const viewport = viewportRef.current; + const card = track?.querySelector(".testimonial-quote"); + if (!track || !viewport || !card) return; + + const stride = card.offsetWidth + trackGap(track); + if (stride <= 0) return; + + // Offset at which card `index` is centred. + const centreFor = (index: number) => + index * stride + card.offsetWidth / 2 - viewport.clientWidth / 2; + + // Include any movement still easing in, so rapid presses queue up + // instead of fighting each other. + const pending = offsetRef.current + nudgeRef.current; + const current = (pending - centreFor(0)) / stride; + + // Land on the first card boundary strictly past the current position, so + // a press never skips a card mid-drift and never stalls when one is + // already centred. The epsilon is well under a pixel of stride. + const target = + direction === 1 + ? Math.floor(current + 1e-3) + 1 + : Math.ceil(current - 1e-3) - 1; + + nudgeRef.current += centreFor(target) - pending; + }, + [trackGap], + ); + return (
@@ -49,61 +275,79 @@ export default function TestimonialsSection() {

What our partners say

-
- {testimonials.map((testimonial) => ( -
-
-
-
- {testimonial.name} -
- -
- -

- {testimonial.name} -

- -
-

- {testimonial.role} -

-
-
- -
- setPaused(true) : undefined} + onMouseLeave={PAUSE_ON_HOVER ? () => setPaused(false) : undefined} + > +
+
+ {testimonials.map((testimonial) => ( + + ))} + {/* The second set only exists to close the desktop loop. It is + rendered after mount so mobile never ships a duplicate copy, + and so the server and first client render agree. */} + {isDesktop && + testimonials.map((testimonial) => ( + -
-
- -

- “{testimonial.testimonial}” -

-
- ))} + ))} +
+ + + {/* The controls pause regardless of PAUSE_ON_HOVER: stepping is + pointless if the drift immediately carries the card away. Hover + is covered as well as focus because Safari does not focus a + button on click. */} +
setPaused(true)} + onMouseLeave={() => setPaused(false)} + onFocusCapture={() => setPaused(true)} + onBlurCapture={() => setPaused(false)} + > + + +
diff --git a/app/globals.css b/app/globals.css index c1db918..d40fb23 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1687,12 +1687,24 @@ body { position: relative; } - .testimonial-quotes { - display: grid; - align-items: start; + .testimonial-carousel { + position: relative; + } + + .testimonial-viewport { + overflow: hidden; + } + + .testimonial-track { + display: flex; + flex-direction: column; gap: clamp(1.25rem, 2.4vw, 2rem); } + .testimonial-controls { + display: none; + } + .testimonial-quote { position: relative; display: flex; @@ -1833,14 +1845,78 @@ body { } @media (min-width: 64rem) { - .testimonial-quotes { - grid-template-columns: repeat(2, minmax(0, 1fr)); + /* Fade the edges so cards enter and leave the loop instead of being cut. */ + .testimonial-viewport { + --testimonial-fade: clamp(2rem, 5vw, 5rem); + -webkit-mask-image: linear-gradient( + to right, + transparent 0, + #000 var(--testimonial-fade), + #000 calc(100% - var(--testimonial-fade)), + transparent 100% + ); + mask-image: linear-gradient( + to right, + transparent 0, + #000 var(--testimonial-fade), + #000 calc(100% - var(--testimonial-fade)), + transparent 100% + ); + } + + .testimonial-track { + flex-direction: row; + align-items: stretch; gap: clamp(2.75rem, 5vw, 4.5rem); + will-change: transform; } .testimonial-quote { + width: clamp(26rem, 33vw, 34rem); + flex: 0 0 auto; padding-inline: clamp(0.75rem, 1.6vw, 1.35rem); } + + .testimonial-controls { + display: flex; + justify-content: center; + gap: 0.85rem; + margin-top: clamp(1.75rem, 3vw, 2.75rem); + } + + .testimonial-arrow { + display: grid; + place-items: center; + width: 2.9rem; + aspect-ratio: 1; + border: 1px solid rgba(255, 255, 255, 0.18); + border-radius: 999px; + background: rgba(255, 255, 255, 0.04); + color: rgb(210 218 218); + cursor: pointer; + transition: + background-color 220ms ease, + border-color 220ms ease, + color 220ms ease, + transform 220ms ease; + } + + .testimonial-arrow svg { + width: 1.15rem; + height: 1.15rem; + } + + .testimonial-arrow:hover { + border-color: rgba(125, 205, 185, 0.6); + background: rgba(125, 205, 185, 0.14); + color: #fff; + transform: translateY(-0.08rem); + } + + .testimonial-arrow:focus-visible { + outline: 2px solid rgba(125, 205, 185, 0.68); + outline-offset: 0.24rem; + } } @media (max-width: 39.98rem) { From e1c00ddbe5295f394d5559ab09d2fe65dea4d4d8 Mon Sep 17 00:00:00 2001 From: Erfan Ahmadi Date: Wed, 23 Sep 2026 10:01:41 +0400 Subject: [PATCH 3/3] testimonial pause carousel on hover --- app/components/TestimonialsSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/TestimonialsSection.tsx b/app/components/TestimonialsSection.tsx index e2fc301..cf2efa3 100644 --- a/app/components/TestimonialsSection.tsx +++ b/app/components/TestimonialsSection.tsx @@ -51,7 +51,7 @@ const NUDGE_DAMPING = 6; // Halt the drift while the pointer is anywhere over the carousel, so a quote // can be read without it sliding away. The arrow controls pause regardless of // this flag; see the note on them below. -const PAUSE_ON_HOVER = false; +const PAUSE_ON_HOVER = true; function useMediaQuery(query: string) { const [matches, setMatches] = useState(false);