From adb800a4cecd97c8cb7505e83ed66f65482426ee Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Fri, 16 Jan 2026 17:16:33 -0500 Subject: [PATCH 01/11] refactor(solutions-carousel): switch to using embla --- next.config.ts | 13 +- package.json | 1 + pnpm-lock.yaml | 12 ++ src/app/home/page.tsx | 7 +- src/app/home/solutions-carousel.tsx | 232 ---------------------- src/app/home/solutions-carousel/data.ts | 63 ++++++ src/app/home/solutions-carousel/index.tsx | 38 ++++ src/app/page.tsx | 1 + src/css/embla.css | 114 +++++++++++ 9 files changed, 247 insertions(+), 234 deletions(-) delete mode 100644 src/app/home/solutions-carousel.tsx create mode 100644 src/app/home/solutions-carousel/data.ts create mode 100644 src/app/home/solutions-carousel/index.tsx create mode 100644 src/css/embla.css diff --git a/next.config.ts b/next.config.ts index 4f95361..4c5003e 100644 --- a/next.config.ts +++ b/next.config.ts @@ -10,7 +10,18 @@ const nextConfig: NextConfig = { // typedRoutes: true, allowedDevOrigins: ["tillisoftware.local"], images: { - remotePatterns: [new URL("https://placecats.com/**")], + remotePatterns: [ + { + protocol: "https", + hostname: "placecats.com", + pathname: "/**", + }, + { + protocol: "https", + hostname: "picsum.photos", + pathname: "/**", + }, + ], // dangerouslyAllowSVG: true, }, experimental: { diff --git a/package.json b/package.json index c1df37e..b755eab 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "date-fns": "^4.1.0", "embla-carousel-auto-scroll": "^8.6.0", "embla-carousel-autoplay": "^8.6.0", + "embla-carousel-class-names": "^8.6.0", "embla-carousel-react": "^8.6.0", "gsap": "^3.13.0", "hast-util-to-jsx-runtime": "^2.3.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5539b1b..18c900a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,6 +116,9 @@ importers: embla-carousel-autoplay: specifier: ^8.6.0 version: 8.6.0(embla-carousel@8.6.0) + embla-carousel-class-names: + specifier: ^8.6.0 + version: 8.6.0(embla-carousel@8.6.0) embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.2.0) @@ -1454,6 +1457,11 @@ packages: peerDependencies: embla-carousel: 8.6.0 + embla-carousel-class-names@8.6.0: + resolution: {integrity: sha512-l1hm1+7GxQ+zwdU2sea/LhD946on7XO2qk3Xq2XWSwBaWfdgchXdK567yzLtYSHn4sWYdiX+x4nnaj+saKnJkw==} + peerDependencies: + embla-carousel: 8.6.0 + embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} peerDependencies: @@ -3206,6 +3214,10 @@ snapshots: dependencies: embla-carousel: 8.6.0 + embla-carousel-class-names@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-react@8.6.0(react@19.2.0): dependencies: embla-carousel: 8.6.0 diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index f8007a3..53b1d03 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -10,6 +10,7 @@ import { ContainerTextFlip } from "@/components/ui/text/container-flip-text"; import { BusinessCarousel } from "./business-carousel"; import { HeroImage } from "./hero"; import { SolutionsCarousel } from "./solutions-carousel"; +// import { EmblaOptionsType } from "embla-carousel"; import "@wooorm/starry-night/style/both"; import { @@ -21,6 +22,10 @@ import { sampleRubyCode, } from "./sample-code"; +// const OPTIONS: EmblaOptionsType = {}; +const SLIDE_COUNT = 5; +const SLIDES = Array.from(Array(SLIDE_COUNT).keys()); + export default function Home() { return ( <> @@ -386,7 +391,7 @@ export default function Home() { /> - +
diff --git a/src/app/home/solutions-carousel.tsx b/src/app/home/solutions-carousel.tsx deleted file mode 100644 index e8795d1..0000000 --- a/src/app/home/solutions-carousel.tsx +++ /dev/null @@ -1,232 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; - -const industries = [ - { - name: "Banking and Finance", - description: - "Transform your company's financial solutions. Improve AML and KYC compliance and reduce operating costs while increasing customer satisfaction.", - image: - "https://www.figma.com/api/mcp/asset/d48da3a6-7db6-4d57-8d1c-8bd157cf220c", - }, - { - name: "Education and Universities", - description: - "Streamline tuition payments, campus services, and student billing with automated workflows designed for educational institutions.", - image: - "https://www.figma.com/api/mcp/asset/f6cc94b0-8742-4fc3-8476-965bdae60183", - }, - { - name: "Insurance", - description: - "Simplify premium collections, claims processing, and policy management with intelligent automation built for insurance providers.", - image: - "https://www.figma.com/api/mcp/asset/3204408a-bf6c-48d3-a62d-64e82699389f", - }, - { - name: "Utilities", - description: - "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", - image: - "https://www.figma.com/api/mcp/asset/ae6da2ac-178b-49bb-881f-a6098a7710d9", - }, -]; - -export function SolutionsCarousel() { - const [activeIndex, setActiveIndex] = useState(0); - - useEffect(() => { - const interval = setInterval(() => { - setActiveIndex((current) => (current + 1) % industries.length); - }, 5000); // Rotate every 5 seconds - - return () => clearInterval(interval); - }, []); - - const handleIndustryClick = (index: number) => { - setActiveIndex(index); - }; - - // Create an extended array for continuous scrolling effect - const getVisibleItems = () => { - const items = []; - // Show current and next 3 items (or more depending on viewport) - for (let i = 0; i < industries.length + 2; i++) { - const index = (activeIndex + i) % industries.length; - items.push({ ...industries[index], displayIndex: i }); - } - return items; - }; - - const visibleItems = getVisibleItems(); - - return ( - <> -
-

Solutions for

-
- {visibleItems.map((item, idx) => { - const isActive = item.displayIndex === 0; - const offset = item.displayIndex; - - // Calculate translateX based on size differences - let translateX = 0; - if (offset === 0) { - translateX = 0; - } else if (offset === 1) { - // Position after the active text + arrow + some gap - translateX = 550; // Adjust based on active text width - } else if (offset === 2) { - translateX = 900; - } else if (offset === 3) { - translateX = 1200; - } - - const opacity = offset === 0 ? 1 : offset <= 3 ? 1 : 0; - - return ( - - ); - })} -
-
- -

{industries[activeIndex].description}

- -
- {visibleItems.map((item, idx) => { - const isActive = item.displayIndex === 0; - const offset = item.displayIndex; - - // Position items: active at 0, others spaced to the right - const translateX = offset * 650; - const scale = isActive ? 1 : 0.6; - // Show active (1.0), next 2 items (0.3), third item fading (0.15) - const opacity = - offset === 0 - ? 1 - : offset === 1 - ? 0.3 - : offset === 2 - ? 0.3 - : offset === 3 - ? 0.15 - : 0; - const zIndex = isActive - ? 10 - : offset === 1 - ? 5 - : offset === 2 - ? 4 - : 1; - - return ( -
-
- {item.name} -
- {isActive && ( - - )} -
- ); - })} -
- - ); -} diff --git a/src/app/home/solutions-carousel/data.ts b/src/app/home/solutions-carousel/data.ts new file mode 100644 index 0000000..4111afa --- /dev/null +++ b/src/app/home/solutions-carousel/data.ts @@ -0,0 +1,63 @@ +const images = [ + "data:image/jpeg;base64,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", + "data:image/jpeg;base64,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", +]; + +export const industries = [ + { + name: "Banking and Finance", + description: + "Transform your company's financial solutions. Improve AML and KYC compliance and reduce operating costs while increasing customer satisfaction.", + image: images[0], + }, + { + name: "Education and Universities", + description: + "Streamline tuition payments, campus services, and student billing with automated workflows designed for educational institutions.", + image: images[1], + }, + { + name: "Insurance", + description: + "Simplify premium collections, claims processing, and policy management with intelligent automation built for insurance providers.", + image: images[0], + }, + { + name: "Utilities", + description: + "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", + image: images[1], + }, +]; + +// TODO: delete above and uncomment this +// const industries = [ +// { +// name: "Banking and Finance", +// description: +// "Transform your company's financial solutions. Improve AML and KYC compliance and reduce operating costs while increasing customer satisfaction.", +// image: +// "https://www.figma.com/api/mcp/asset/d48da3a6-7db6-4d57-8d1c-8bd157cf220c", +// }, +// { +// name: "Education and Universities", +// description: +// "Streamline tuition payments, campus services, and student billing with automated workflows designed for educational institutions.", +// image: +// "https://www.figma.com/api/mcp/asset/f6cc94b0-8742-4fc3-8476-965bdae60183", +// }, +// { +// name: "Insurance", +// description: +// "Simplify premium collections, claims processing, and policy management with intelligent automation built for insurance providers.", +// image: +// "https://www.figma.com/api/mcp/asset/3204408a-bf6c-48d3-a62d-64e82699389f", +// }, +// { +// name: "Utilities", +// description: +// "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", +// image: +// "https://www.figma.com/api/mcp/asset/ae6da2ac-178b-49bb-881f-a6098a7710d9", +// }, +// ]; diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx new file mode 100644 index 0000000..4cce992 --- /dev/null +++ b/src/app/home/solutions-carousel/index.tsx @@ -0,0 +1,38 @@ +"use client"; + +import Autoplay from "embla-carousel-autoplay"; +// import { EmblaOptionsType } from "embla-carousel"; +import ClassNames from "embla-carousel-class-names"; +import useEmblaCarousel from "embla-carousel-react"; +import Image from "next/image"; +import type React from "react"; + +type PropType = { + slides: number[]; + // options?: EmblaOptionsType; +}; + +export const SolutionsCarousel: React.FC = (props) => { + const { slides } = props; + const [emblaRef, emblaApi] = useEmblaCarousel({}, [ClassNames(), Autoplay()]); + + return ( +
+
+
+ {slides.map((index) => ( +
+ Your alt text +
+ ))} +
+
+
+ ); +}; diff --git a/src/app/page.tsx b/src/app/page.tsx index 186a7f3..643d198 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,3 +1,4 @@ import Home from "./home/page"; +import "../css/embla.css"; export default Home; diff --git a/src/css/embla.css b/src/css/embla.css new file mode 100644 index 0000000..d8f31aa --- /dev/null +++ b/src/css/embla.css @@ -0,0 +1,114 @@ +.embla { + max-width: 48rem; + margin: auto; + --slide-height: 19rem; + --slide-spacing: 1rem; + --slide-size: 70%; +} +.embla__viewport { + overflow: hidden; +} +.embla__container { + display: flex; + touch-action: pan-y pinch-zoom; + margin-left: calc(var(--slide-spacing) * -1); +} +.embla__slide { + transform: translate3d(0, 0, 0); + flex: 0 0 var(--slide-size); + min-width: 0; + padding-left: var(--slide-spacing); +} +.embla__slide__img { + border-radius: 1.8rem; + display: block; + height: var(--slide-height); + width: 100%; + object-fit: cover; +} +.embla__controls { + display: grid; + grid-template-columns: auto 1fr; + justify-content: space-between; + gap: 1.2rem; + margin-top: 1.8rem; +} +.embla__buttons { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.6rem; + align-items: center; +} +.embla__button { + -webkit-tap-highlight-color: rgba(var(--text-high-contrast-rgb-value), 0.5); + -webkit-appearance: none; + appearance: none; + background-color: transparent; + touch-action: manipulation; + display: inline-flex; + text-decoration: none; + cursor: pointer; + border: 0; + padding: 0; + margin: 0; + box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); + width: 3.6rem; + height: 3.6rem; + z-index: 1; + border-radius: 50%; + color: var(--text-body); + display: flex; + align-items: center; + justify-content: center; +} +.embla__button:disabled { + color: var(--detail-high-contrast); +} +.embla__button__svg { + width: 35%; + height: 35%; +} +.embla__dots { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + align-items: center; + margin-right: calc((2.6rem - 1.4rem) / 2 * -1); +} +.embla__dot { + -webkit-tap-highlight-color: rgba(var(--text-high-contrast-rgb-value), 0.5); + -webkit-appearance: none; + appearance: none; + background-color: transparent; + touch-action: manipulation; + display: inline-flex; + text-decoration: none; + cursor: pointer; + border: 0; + padding: 0; + margin: 0; + width: 2.6rem; + height: 2.6rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; +} +.embla__dot:after { + box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); + width: 1.4rem; + height: 1.4rem; + border-radius: 50%; + display: flex; + align-items: center; + content: ''; +} +.embla__dot--selected:after { + box-shadow: inset 0 0 0 0.2rem var(--text-body); +} +.embla__slide { + transition: opacity 0.2s ease-in-out; +} +.embla__slide:not(.is-snapped) { + opacity: 0.16; +} From 3da8bb19e964d90bbc346643c432aa9383df5934 Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Mon, 19 Jan 2026 16:54:11 -0500 Subject: [PATCH 02/11] refactor(home): simplify solutions carousel and update image handling --- src/app/home/page.tsx | 9 +- src/app/home/solutions-carousel/data.ts | 13 +-- src/app/home/solutions-carousel/index.tsx | 40 +++++---- src/css/embla.css | 100 ++-------------------- 4 files changed, 37 insertions(+), 125 deletions(-) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 53b1d03..ff8b50e 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -10,7 +10,6 @@ import { ContainerTextFlip } from "@/components/ui/text/container-flip-text"; import { BusinessCarousel } from "./business-carousel"; import { HeroImage } from "./hero"; import { SolutionsCarousel } from "./solutions-carousel"; -// import { EmblaOptionsType } from "embla-carousel"; import "@wooorm/starry-night/style/both"; import { @@ -22,10 +21,6 @@ import { sampleRubyCode, } from "./sample-code"; -// const OPTIONS: EmblaOptionsType = {}; -const SLIDE_COUNT = 5; -const SLIDES = Array.from(Array(SLIDE_COUNT).keys()); - export default function Home() { return ( <> @@ -383,7 +378,7 @@ export default function Home() {
-
+
- +
diff --git a/src/app/home/solutions-carousel/data.ts b/src/app/home/solutions-carousel/data.ts index 4111afa..72c2df1 100644 --- a/src/app/home/solutions-carousel/data.ts +++ b/src/app/home/solutions-carousel/data.ts @@ -1,32 +1,27 @@ -const images = [ - "data:image/jpeg;base64,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", - "data:image/jpeg;base64,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", -]; - export const industries = [ { name: "Banking and Finance", description: "Transform your company's financial solutions. Improve AML and KYC compliance and reduce operating costs while increasing customer satisfaction.", - image: images[0], + image: "https://picsum.photos/600/350?v=4", }, { name: "Education and Universities", description: "Streamline tuition payments, campus services, and student billing with automated workflows designed for educational institutions.", - image: images[1], + image: "https://picsum.photos/600/350?v=3", }, { name: "Insurance", description: "Simplify premium collections, claims processing, and policy management with intelligent automation built for insurance providers.", - image: images[0], + image: "https://picsum.photos/600/350?v=2", }, { name: "Utilities", description: "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", - image: images[1], + image: "https://picsum.photos/600/350?v=1", }, ]; diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index 4cce992..24a8600 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -1,38 +1,42 @@ "use client"; import Autoplay from "embla-carousel-autoplay"; -// import { EmblaOptionsType } from "embla-carousel"; import ClassNames from "embla-carousel-class-names"; import useEmblaCarousel from "embla-carousel-react"; import Image from "next/image"; -import type React from "react"; +import { industries } from "./data"; -type PropType = { - slides: number[]; - // options?: EmblaOptionsType; -}; - -export const SolutionsCarousel: React.FC = (props) => { - const { slides } = props; - const [emblaRef, emblaApi] = useEmblaCarousel({}, [ClassNames(), Autoplay()]); +export function SolutionsCarousel() { + const [emblaRef] = useEmblaCarousel( + { + containScroll: "trimSnaps", + align: "start", + loop: true, + }, + [Autoplay(), ClassNames({ snapped: "is-snapped" })], + ); return ( -
+
- {slides.map((index) => ( -
+ {industries.map((industry) => ( +
Your alt text +

{industry.name}

))}
-
+
); -}; +} diff --git a/src/css/embla.css b/src/css/embla.css index d8f31aa..2b6639f 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -1,9 +1,8 @@ .embla { max-width: 48rem; - margin: auto; --slide-height: 19rem; - --slide-spacing: 1rem; - --slide-size: 70%; + --slide-spacing: 2rem; + --slide-size: 60%; } .embla__viewport { overflow: hidden; @@ -18,97 +17,16 @@ flex: 0 0 var(--slide-size); min-width: 0; padding-left: var(--slide-spacing); + transition: opacity 0.2s ease-in-out; +} +.embla__slide:not(.is-snapped) { + opacity: 0.16; } + .embla__slide__img { - border-radius: 1.8rem; - display: block; height: var(--slide-height); + box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); + border-radius: 1.35rem; width: 100%; object-fit: cover; } -.embla__controls { - display: grid; - grid-template-columns: auto 1fr; - justify-content: space-between; - gap: 1.2rem; - margin-top: 1.8rem; -} -.embla__buttons { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 0.6rem; - align-items: center; -} -.embla__button { - -webkit-tap-highlight-color: rgba(var(--text-high-contrast-rgb-value), 0.5); - -webkit-appearance: none; - appearance: none; - background-color: transparent; - touch-action: manipulation; - display: inline-flex; - text-decoration: none; - cursor: pointer; - border: 0; - padding: 0; - margin: 0; - box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); - width: 3.6rem; - height: 3.6rem; - z-index: 1; - border-radius: 50%; - color: var(--text-body); - display: flex; - align-items: center; - justify-content: center; -} -.embla__button:disabled { - color: var(--detail-high-contrast); -} -.embla__button__svg { - width: 35%; - height: 35%; -} -.embla__dots { - display: flex; - flex-wrap: wrap; - justify-content: flex-end; - align-items: center; - margin-right: calc((2.6rem - 1.4rem) / 2 * -1); -} -.embla__dot { - -webkit-tap-highlight-color: rgba(var(--text-high-contrast-rgb-value), 0.5); - -webkit-appearance: none; - appearance: none; - background-color: transparent; - touch-action: manipulation; - display: inline-flex; - text-decoration: none; - cursor: pointer; - border: 0; - padding: 0; - margin: 0; - width: 2.6rem; - height: 2.6rem; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; -} -.embla__dot:after { - box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); - width: 1.4rem; - height: 1.4rem; - border-radius: 50%; - display: flex; - align-items: center; - content: ''; -} -.embla__dot--selected:after { - box-shadow: inset 0 0 0 0.2rem var(--text-body); -} -.embla__slide { - transition: opacity 0.2s ease-in-out; -} -.embla__slide:not(.is-snapped) { - opacity: 0.16; -} From fd5c23a277ec832ae5d9ed3fb98d76a8f7cfc92b Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Tue, 20 Jan 2026 12:24:07 -0500 Subject: [PATCH 03/11] feat(solutions-carousel): implement unidirectional carousel behavior via custom hook --- .../solutions-carousel/TextContentSection.tsx | 61 +++++++++++++++++++ src/app/home/solutions-carousel/data.ts | 24 ++++++++ src/app/home/solutions-carousel/index.tsx | 23 ++++--- .../useUnidirectionalEmbla.ts | 56 +++++++++++++++++ src/css/embla.css | 19 +++--- 5 files changed, 166 insertions(+), 17 deletions(-) create mode 100644 src/app/home/solutions-carousel/TextContentSection.tsx create mode 100644 src/app/home/solutions-carousel/useUnidirectionalEmbla.ts diff --git a/src/app/home/solutions-carousel/TextContentSection.tsx b/src/app/home/solutions-carousel/TextContentSection.tsx new file mode 100644 index 0000000..9c8590c --- /dev/null +++ b/src/app/home/solutions-carousel/TextContentSection.tsx @@ -0,0 +1,61 @@ +"use client"; + +export default function TextContentSection({ + activeIndustry, + selectedIndex, + handleIndustryClick, +}: { + activeIndustry: { name: string; description: string }; + selectedIndex: number; + handleIndustryClick: (index: number) => void; +}) { + return ( +
+
+

Solutions for

+
+ +
+
+

{activeIndustry.description}

+
+ ); +} diff --git a/src/app/home/solutions-carousel/data.ts b/src/app/home/solutions-carousel/data.ts index 72c2df1..15b3834 100644 --- a/src/app/home/solutions-carousel/data.ts +++ b/src/app/home/solutions-carousel/data.ts @@ -23,6 +23,30 @@ export const industries = [ "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", image: "https://picsum.photos/600/350?v=1", }, + { + name: "Banking and Finance", + description: + "Transform your company's financial solutions. Improve AML and KYC compliance and reduce operating costs while increasing customer satisfaction.", + image: "https://picsum.photos/600/350?v=4", + }, + { + name: "Education and Universities", + description: + "Streamline tuition payments, campus services, and student billing with automated workflows designed for educational institutions.", + image: "https://picsum.photos/600/350?v=3", + }, + { + name: "Insurance", + description: + "Simplify premium collections, claims processing, and policy management with intelligent automation built for insurance providers.", + image: "https://picsum.photos/600/350?v=2", + }, + { + name: "Utilities", + description: + "Modernize utility billing, meter-to-cash workflows, and customer payments with real-time tracking and automated reminders.", + image: "https://picsum.photos/600/350?v=1", + }, ]; // TODO: delete above and uncomment this diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index 24a8600..b623881 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -2,19 +2,22 @@ import Autoplay from "embla-carousel-autoplay"; import ClassNames from "embla-carousel-class-names"; -import useEmblaCarousel from "embla-carousel-react"; +import useEmblaCarousel, { type EmblaOptionsType } from "embla-carousel-react"; import Image from "next/image"; import { industries } from "./data"; +import { useUnidirectionalEmbla } from "./useUnidirectionalEmbla"; export function SolutionsCarousel() { - const [emblaRef] = useEmblaCarousel( - { - containScroll: "trimSnaps", - align: "start", - loop: true, - }, - [Autoplay(), ClassNames({ snapped: "is-snapped" })], - ); + const options: Partial = { + align: "start", + loop: true, + containScroll: "trimSnaps", + }; + + const plugins = [Autoplay(), ClassNames({ snapped: "is-snapped" })]; + const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins); + + useUnidirectionalEmbla(emblaApi); return (
@@ -32,7 +35,7 @@ export function SolutionsCarousel() { src={industry.image} width={600} /> -

{industry.name}

+

{industry.name}

))} diff --git a/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts new file mode 100644 index 0000000..37341df --- /dev/null +++ b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts @@ -0,0 +1,56 @@ +import type { UseEmblaCarouselType } from "embla-carousel-react"; +import { useEffect, useRef } from "react"; + +export function useUnidirectionalEmbla( + emblaApi: UseEmblaCarouselType[1] | undefined, +) { + const startXRef = useRef(null); + const startIndexRef = useRef(0); + const isBlockingRef = useRef(false); + + useEffect(() => { + if (!emblaApi) return; + + const viewport = emblaApi.rootNode(); + + const onPointerDown = (e: PointerEvent) => { + startXRef.current = e.clientX; + startIndexRef.current = emblaApi.selectedScrollSnap(); + isBlockingRef.current = false; + }; + + const onPointerMove = (e: PointerEvent) => { + if (startXRef.current === null) return; + + const deltaX = e.clientX - startXRef.current; + + // block backward scrolling + if (deltaX > 0) { + isBlockingRef.current = true; + + e.preventDefault(); + e.stopImmediatePropagation(); + + // scroll to the start index + emblaApi.scrollTo(startIndexRef.current, false); + } + }; + + const onPointerUp = () => { + startXRef.current = null; + isBlockingRef.current = false; + }; + + viewport.addEventListener("pointerdown", onPointerDown, { passive: false }); + viewport.addEventListener("pointermove", onPointerMove, { passive: false }); + viewport.addEventListener("pointerup", onPointerUp); + viewport.addEventListener("pointercancel", onPointerUp); + + return () => { + viewport.removeEventListener("pointerdown", onPointerDown); + viewport.removeEventListener("pointermove", onPointerMove); + viewport.removeEventListener("pointerup", onPointerUp); + viewport.removeEventListener("pointercancel", onPointerUp); + }; + }, [emblaApi]); +} diff --git a/src/css/embla.css b/src/css/embla.css index 2b6639f..0d766b4 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -1,32 +1,37 @@ .embla { - max-width: 48rem; + max-width: 100rem; --slide-height: 19rem; --slide-spacing: 2rem; - --slide-size: 60%; + --slide-size: 30%; } + .embla__viewport { overflow: hidden; } + .embla__container { display: flex; - touch-action: pan-y pinch-zoom; margin-left: calc(var(--slide-spacing) * -1); + transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1); } + .embla__slide { - transform: translate3d(0, 0, 0); flex: 0 0 var(--slide-size); min-width: 0; padding-left: var(--slide-spacing); - transition: opacity 0.2s ease-in-out; } + +.embla__slide.is-snapped { + transition: opacity 0.25s cubic-bezier(0.22, 1, 0.36, 1); +} + .embla__slide:not(.is-snapped) { opacity: 0.16; } .embla__slide__img { height: var(--slide-height); - box-shadow: inset 0 0 0 0.2rem var(--detail-medium-contrast); - border-radius: 1.35rem; width: 100%; object-fit: cover; + border-radius: 1.35rem; } From 9cc77355f13d3981723ba239a013324421af9306 Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Tue, 20 Jan 2026 14:32:29 -0500 Subject: [PATCH 04/11] refactor(solutions-carousel): update types and enhance CSS for embla carousel --- .../home/solutions-carousel/useUnidirectionalEmbla.ts | 4 ++-- src/css/embla.css | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts index 37341df..5613621 100644 --- a/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts +++ b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts @@ -1,8 +1,8 @@ -import type { UseEmblaCarouselType } from "embla-carousel-react"; +import type { EmblaCarouselType } from "embla-carousel-react"; import { useEffect, useRef } from "react"; export function useUnidirectionalEmbla( - emblaApi: UseEmblaCarouselType[1] | undefined, + emblaApi: EmblaCarouselType | undefined, ) { const startXRef = useRef(null); const startIndexRef = useRef(0); diff --git a/src/css/embla.css b/src/css/embla.css index 0d766b4..3ba5805 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -1,12 +1,15 @@ .embla { max-width: 100rem; + min-height: 40rem; --slide-height: 19rem; - --slide-spacing: 2rem; + --slide-spacing: 4rem; --slide-size: 30%; + display: flex; + align-items: center; + justify-content: center; } .embla__viewport { - overflow: hidden; } .embla__container { @@ -22,7 +25,7 @@ } .embla__slide.is-snapped { - transition: opacity 0.25s cubic-bezier(0.22, 1, 0.36, 1); + transform: translateY(-100px) !important; } .embla__slide:not(.is-snapped) { From 79a5f02fa6acd1d2eadffcc453648a54ad7bde78 Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Tue, 20 Jan 2026 15:25:06 -0500 Subject: [PATCH 05/11] refactor(solutions-carousel): styling for carousel --- src/app/home/solutions-carousel/index.tsx | 5 +++-- src/app/home/solutions-carousel/useUnidirectionalEmbla.ts | 1 - src/css/embla.css | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index b623881..fb25529 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -10,8 +10,9 @@ import { useUnidirectionalEmbla } from "./useUnidirectionalEmbla"; export function SolutionsCarousel() { const options: Partial = { align: "start", - loop: true, + loop: true, // for some reason this is buggy, but we need this containScroll: "trimSnaps", + skipSnaps: true, }; const plugins = [Autoplay(), ClassNames({ snapped: "is-snapped" })]; @@ -20,7 +21,7 @@ export function SolutionsCarousel() { useUnidirectionalEmbla(emblaApi); return ( -
+
{industries.map((industry) => ( diff --git a/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts index 5613621..f93310d 100644 --- a/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts +++ b/src/app/home/solutions-carousel/useUnidirectionalEmbla.ts @@ -45,7 +45,6 @@ export function useUnidirectionalEmbla( viewport.addEventListener("pointermove", onPointerMove, { passive: false }); viewport.addEventListener("pointerup", onPointerUp); viewport.addEventListener("pointercancel", onPointerUp); - return () => { viewport.removeEventListener("pointerdown", onPointerDown); viewport.removeEventListener("pointermove", onPointerMove); diff --git a/src/css/embla.css b/src/css/embla.css index 3ba5805..21727c3 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -2,11 +2,12 @@ max-width: 100rem; min-height: 40rem; --slide-height: 19rem; - --slide-spacing: 4rem; + --slide-spacing: 3rem; --slide-size: 30%; display: flex; align-items: center; justify-content: center; + overflow: hidden; } .embla__viewport { @@ -25,7 +26,7 @@ } .embla__slide.is-snapped { - transform: translateY(-100px) !important; + transform: translateY(-60px) !important; } .embla__slide:not(.is-snapped) { @@ -37,4 +38,5 @@ width: 100%; object-fit: cover; border-radius: 1.35rem; + user-select: none; } From d6946a454cad956f37ec7ce905a10e12ff5643ec Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Wed, 21 Jan 2026 10:14:40 -0500 Subject: [PATCH 06/11] refactor(solutions-carousel): TextContentSection styling --- .../solutions-carousel/TextContentSection.tsx | 61 +++++-------------- src/app/home/solutions-carousel/index.tsx | 49 +++++++++------ 2 files changed, 45 insertions(+), 65 deletions(-) diff --git a/src/app/home/solutions-carousel/TextContentSection.tsx b/src/app/home/solutions-carousel/TextContentSection.tsx index 9c8590c..042e365 100644 --- a/src/app/home/solutions-carousel/TextContentSection.tsx +++ b/src/app/home/solutions-carousel/TextContentSection.tsx @@ -1,60 +1,31 @@ "use client"; +import { ChevronRight } from "lucide-react"; +import { Button } from "@/components/ui/button"; + export default function TextContentSection({ activeIndustry, - selectedIndex, handleIndustryClick, }: { activeIndustry: { name: string; description: string }; - selectedIndex: number; handleIndustryClick: (index: number) => void; }) { return ( -
-
+
+

Solutions for

-
- -
+ +
+

{activeIndustry.description}

); diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index fb25529..eb4764a 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -5,6 +5,7 @@ import ClassNames from "embla-carousel-class-names"; import useEmblaCarousel, { type EmblaOptionsType } from "embla-carousel-react"; import Image from "next/image"; import { industries } from "./data"; +import TextContentSection from "./TextContentSection"; import { useUnidirectionalEmbla } from "./useUnidirectionalEmbla"; export function SolutionsCarousel() { @@ -21,26 +22,34 @@ export function SolutionsCarousel() { useUnidirectionalEmbla(emblaApi); return ( -
-
-
- {industries.map((industry) => ( -
- {industry.name} -

{industry.name}

-
- ))} +
+ {}} + /> + + {/* Carousel */} +
+
+
+ {industries.map((industry) => ( +
+ {industry.name} +

{industry.name}

+
+ ))} +
-
-
+
+ ); } From 4b5deb85f5540672f2f174248e9aa800bd915b4f Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Wed, 21 Jan 2026 11:10:42 -0500 Subject: [PATCH 07/11] feat(solutions-carousel): add responsiveness for md and xl breakpoints and add animation to industry text when it changes --- .../solutions-carousel/TextContentSection.tsx | 58 ++++++++++++++----- src/app/home/solutions-carousel/index.tsx | 32 +++++++--- src/css/embla.css | 1 - 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/app/home/solutions-carousel/TextContentSection.tsx b/src/app/home/solutions-carousel/TextContentSection.tsx index 042e365..1a19ab4 100644 --- a/src/app/home/solutions-carousel/TextContentSection.tsx +++ b/src/app/home/solutions-carousel/TextContentSection.tsx @@ -1,32 +1,64 @@ "use client"; import { ChevronRight } from "lucide-react"; +import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; +type ActiveIndustry = { + name: string; + description: string; + // route: string; +}; + export default function TextContentSection({ activeIndustry, - handleIndustryClick, }: { - activeIndustry: { name: string; description: string }; - handleIndustryClick: (index: number) => void; + activeIndustry: ActiveIndustry; }) { + const [isAnimating, setIsAnimating] = useState(false); + const [displayIndustry, setDisplayIndustry] = useState(activeIndustry); + + useEffect(() => { + if (activeIndustry.name !== displayIndustry.name) { + setIsAnimating(true); + // wait for fade out, then update content and fade in + const timer = setTimeout(() => { + setDisplayIndustry(activeIndustry); + setIsAnimating(false); + }, 150); // half of transition duration + + return () => clearTimeout(timer); + } + }, [activeIndustry, displayIndustry.name]); + return ( -
+
-

Solutions for

- -
-

{activeIndustry.description}

+

+ {displayIndustry.description} +

); } diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index eb4764a..166575a 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -4,11 +4,14 @@ import Autoplay from "embla-carousel-autoplay"; import ClassNames from "embla-carousel-class-names"; import useEmblaCarousel, { type EmblaOptionsType } from "embla-carousel-react"; import Image from "next/image"; +import { useEffect, useState } from "react"; import { industries } from "./data"; import TextContentSection from "./TextContentSection"; import { useUnidirectionalEmbla } from "./useUnidirectionalEmbla"; export function SolutionsCarousel() { + const [selectedIdx, setSelectedIdx] = useState(0); + const options: Partial = { align: "start", loop: true, // for some reason this is buggy, but we need this @@ -21,21 +24,36 @@ export function SolutionsCarousel() { useUnidirectionalEmbla(emblaApi); + // sync carousel changes with selected idx + useEffect(() => { + if (!emblaApi) return; + + const onSelect = () => { + setSelectedIdx(emblaApi.selectedScrollSnap()); + }; + + emblaApi.on("select", onSelect); + onSelect(); // set initial idx + + return () => { + emblaApi.off("select", onSelect); + }; + }, [emblaApi]); + + const currentIndustry = industries[selectedIdx % industries.length]; + return ( -
- {}} - /> +
+ {/* Carousel */}
- {industries.map((industry) => ( + {industries.map((industry, idx) => (
{industry.name} Date: Wed, 21 Jan 2026 11:32:15 -0500 Subject: [PATCH 08/11] refactor(solutions-carousel): replace JS animation state with keyed CSS animations in TextContentSection --- .../solutions-carousel/TextContentSection.tsx | 36 ++++--------------- src/css/embla.css | 15 ++++++++ 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/app/home/solutions-carousel/TextContentSection.tsx b/src/app/home/solutions-carousel/TextContentSection.tsx index 1a19ab4..a992e8b 100644 --- a/src/app/home/solutions-carousel/TextContentSection.tsx +++ b/src/app/home/solutions-carousel/TextContentSection.tsx @@ -1,13 +1,11 @@ "use client"; import { ChevronRight } from "lucide-react"; -import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; type ActiveIndustry = { name: string; description: string; - // route: string; }; export default function TextContentSection({ @@ -15,22 +13,6 @@ export default function TextContentSection({ }: { activeIndustry: ActiveIndustry; }) { - const [isAnimating, setIsAnimating] = useState(false); - const [displayIndustry, setDisplayIndustry] = useState(activeIndustry); - - useEffect(() => { - if (activeIndustry.name !== displayIndustry.name) { - setIsAnimating(true); - // wait for fade out, then update content and fade in - const timer = setTimeout(() => { - setDisplayIndustry(activeIndustry); - setIsAnimating(false); - }, 150); // half of transition duration - - return () => clearTimeout(timer); - } - }, [activeIndustry, displayIndustry.name]); - return (
@@ -38,26 +20,22 @@ export default function TextContentSection({ Solutions for

-

- {displayIndustry.description} + {activeIndustry.description}

); diff --git a/src/css/embla.css b/src/css/embla.css index f61220e..9a816f4 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -39,3 +39,18 @@ border-radius: 1.35rem; user-select: none; } + +@keyframes fadeSlide { + from { + opacity: 0; + transform: translateX(16px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.animate-fade-slide { + animation: fadeSlide 300ms ease; +} From 18e8fe361fc803088b91bae3ee1d8906db761c45 Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Wed, 21 Jan 2026 14:34:07 -0500 Subject: [PATCH 09/11] feat(solutions-carousel): implement responsive styling for TextContentSection at sm breakpoint --- src/app/home/page.tsx | 4 ++-- .../home/solutions-carousel/TextContentSection.tsx | 11 ++++++----- src/app/home/solutions-carousel/index.tsx | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index ff8b50e..591dcca 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -377,8 +377,8 @@ export default function Home() {
- -
+ {/* TODO: make a set mx for mobile */} +
+ // dont want to hardcode pixels here. just want this text width to remain the same +
-

+

Solutions for

{activeIndustry.description} diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index 166575a..8e62e22 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -47,7 +47,7 @@ export function SolutionsCarousel() { {/* Carousel */} -

+ {/*
{industries.map((industry, idx) => ( @@ -67,7 +67,7 @@ export function SolutionsCarousel() { ))}
-
+
*/}
); } From ef8f1147891254374f9ed15fd6eb29237bd3664b Mon Sep 17 00:00:00 2001 From: Claudia Aziz Date: Thu, 22 Jan 2026 10:15:38 -0500 Subject: [PATCH 10/11] feat(solution-carousel): work on small breakpoint --- .../solutions-carousel/TextContentSection.tsx | 8 ++-- src/app/home/solutions-carousel/index.tsx | 6 +-- src/css/embla.css | 45 ++++++++++++------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/app/home/solutions-carousel/TextContentSection.tsx b/src/app/home/solutions-carousel/TextContentSection.tsx index 0b5f2eb..15515cf 100644 --- a/src/app/home/solutions-carousel/TextContentSection.tsx +++ b/src/app/home/solutions-carousel/TextContentSection.tsx @@ -1,6 +1,6 @@ "use client"; -import { ChevronRight } from "lucide-react"; +import { ChevronRightIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; type ActiveIndustry = { @@ -15,20 +15,20 @@ export default function TextContentSection({ }) { return ( // dont want to hardcode pixels here. just want this text width to remain the same -
+

Solutions for

-
diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index 8e62e22..a1382b1 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -43,11 +43,11 @@ export function SolutionsCarousel() { const currentIndustry = industries[selectedIdx % industries.length]; return ( -
+
{/* Carousel */} - {/*
+
{industries.map((industry, idx) => ( @@ -67,7 +67,7 @@ export function SolutionsCarousel() { ))}
-
*/} +
); } diff --git a/src/css/embla.css b/src/css/embla.css index 9a816f4..ae7693b 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -1,13 +1,33 @@ .embla { - max-width: 100rem; - min-height: 40rem; - --slide-height: 19rem; - --slide-spacing: 3rem; - --slide-size: 30%; + min-height: 25rem; + --slide-height: 12rem; + --slide-spacing: 1rem; + --slide-size: 25%; display: flex; align-items: center; justify-content: center; overflow: hidden; + /* background-color: red; */ +} + +@media (min-width: 768px) { + .embla { + max-width: 100rem; + min-height: 30rem; + --slide-height: 16rem; + --slide-spacing: 2rem; + --slide-size: 50%; + } +} + +@media (min-width: 1024px) { + .embla { + max-width: 100rem; + min-height: 40rem; + --slide-height: 19rem; + --slide-spacing: 3rem; + --slide-size: 30%; + } } .embla__viewport { @@ -25,7 +45,9 @@ } .embla__slide.is-snapped { - transform: translateY(-60px) !important; + transform: translateY(-48px) !important; + --slide-height: 25rem; + --slide-size: 40%; } .embla__slide:not(.is-snapped) { @@ -40,16 +62,7 @@ user-select: none; } -@keyframes fadeSlide { - from { - opacity: 0; - transform: translateX(16px); - } - to { - opacity: 1; - transform: translateX(0); - } -} + .animate-fade-slide { animation: fadeSlide 300ms ease; From a9f9ea52ee1d992047a1ed7b22307bd31c38ef4a Mon Sep 17 00:00:00 2001 From: Ibrahim Saberi Date: Thu, 22 Jan 2026 10:56:53 -0500 Subject: [PATCH 11/11] feat: tween scaling --- package.json | 11 +- pnpm-lock.yaml | 75 +++++++------ src/app/home/page.tsx | 4 +- src/app/home/solutions-carousel/index.tsx | 106 +++++++++++++++++- .../useUnidirectionalEmbla.ts | 6 +- src/css/embla.css | 11 +- 6 files changed, 157 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index b755eab..22d2772 100644 --- a/package.json +++ b/package.json @@ -44,10 +44,11 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", - "embla-carousel-auto-scroll": "^8.6.0", - "embla-carousel-autoplay": "^8.6.0", - "embla-carousel-class-names": "^8.6.0", - "embla-carousel-react": "^8.6.0", + "embla-carousel": "9.0.0-rc01", + "embla-carousel-auto-scroll": "9.0.0-rc01", + "embla-carousel-autoplay": "9.0.0-rc01", + "embla-carousel-class-names": "9.0.0-rc01", + "embla-carousel-react": "9.0.0-rc01", "gsap": "^3.13.0", "hast-util-to-jsx-runtime": "^2.3.6", "input-otp": "^1.4.2", @@ -81,4 +82,4 @@ "tw-animate-css": "^1.4.0", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18c900a..f50a859 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,18 +110,21 @@ importers: date-fns: specifier: ^4.1.0 version: 4.1.0 + embla-carousel: + specifier: 9.0.0-rc01 + version: 9.0.0-rc01 embla-carousel-auto-scroll: - specifier: ^8.6.0 - version: 8.6.0(embla-carousel@8.6.0) + specifier: 9.0.0-rc01 + version: 9.0.0-rc01(embla-carousel@9.0.0-rc01) embla-carousel-autoplay: - specifier: ^8.6.0 - version: 8.6.0(embla-carousel@8.6.0) + specifier: 9.0.0-rc01 + version: 9.0.0-rc01(embla-carousel@9.0.0-rc01) embla-carousel-class-names: - specifier: ^8.6.0 - version: 8.6.0(embla-carousel@8.6.0) + specifier: 9.0.0-rc01 + version: 9.0.0-rc01(embla-carousel@9.0.0-rc01) embla-carousel-react: - specifier: ^8.6.0 - version: 8.6.0(react@19.2.0) + specifier: 9.0.0-rc01 + version: 9.0.0-rc01(react@19.2.0) gsap: specifier: ^3.13.0 version: 3.13.0 @@ -1447,33 +1450,33 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - embla-carousel-auto-scroll@8.6.0: - resolution: {integrity: sha512-WT9fWhNXFpbQ6kP+aS07oF5IHYLZ1Dx4DkwgCY8Hv2ZyYd2KMCPfMV1q/cA3wFGuLO7GMgKiySLX90/pQkcOdQ==} + embla-carousel-auto-scroll@9.0.0-rc01: + resolution: {integrity: sha512-9lMYoiriEwy2foZ0i7lHG9rU8TMPxSgw3jXmZr4de/UXzqB/fv+z8deHIOORSlA/5Po+6r6+mov3g2tT3T0S4w==} peerDependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-autoplay@8.6.0: - resolution: {integrity: sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==} + embla-carousel-autoplay@9.0.0-rc01: + resolution: {integrity: sha512-gl7jUe0X9xd5v7IiyFF2FCR+KTBesnutM0gQ3S75oo9EizZi5tJMNdVaFwvzepz6kGzDkkSbKMWitQvAbFVfdQ==} peerDependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-class-names@8.6.0: - resolution: {integrity: sha512-l1hm1+7GxQ+zwdU2sea/LhD946on7XO2qk3Xq2XWSwBaWfdgchXdK567yzLtYSHn4sWYdiX+x4nnaj+saKnJkw==} + embla-carousel-class-names@9.0.0-rc01: + resolution: {integrity: sha512-3REWZOQGpc5cpbusftwghFle8yvINlCIqIj0QlonWRGsrgh6W+m4bAYeF0gKY9iGbuKfCRxDTBqdWQGA/DDzpA==} peerDependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-react@8.6.0: - resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + embla-carousel-react@9.0.0-rc01: + resolution: {integrity: sha512-2ik9QtVm3UXJWkVdEEm6bInmxNSmxq9Z2q5GWuJx3v2vZvujmlDzcrIE6bvh+wWgPmDn6jekJCRHm1eEl/N0SA==} peerDependencies: react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - embla-carousel-reactive-utils@8.6.0: - resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + embla-carousel-reactive-utils@9.0.0-rc01: + resolution: {integrity: sha512-RnW0NMrL7wVAQb9jro+l96hLI2JairyFHS2Jv+fvXakveD/c5aD9aoNH94YRbTmi0G7PxrKSxydmCpTy5eFmrA==} peerDependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel@8.6.0: - resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + embla-carousel@9.0.0-rc01: + resolution: {integrity: sha512-4BTERU1gAXgg4Vl0m7hQ1GzePGLNNfM2j030ww8i9idiPXumyRUpaNUDfT2zx1Hv8um1Ew7QKBy/HdNPz8L30g==} enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} @@ -3206,29 +3209,29 @@ snapshots: '@babel/runtime': 7.28.4 csstype: 3.1.3 - embla-carousel-auto-scroll@8.6.0(embla-carousel@8.6.0): + embla-carousel-auto-scroll@9.0.0-rc01(embla-carousel@9.0.0-rc01): dependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-autoplay@8.6.0(embla-carousel@8.6.0): + embla-carousel-autoplay@9.0.0-rc01(embla-carousel@9.0.0-rc01): dependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-class-names@8.6.0(embla-carousel@8.6.0): + embla-carousel-class-names@9.0.0-rc01(embla-carousel@9.0.0-rc01): dependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel-react@8.6.0(react@19.2.0): + embla-carousel-react@9.0.0-rc01(react@19.2.0): dependencies: - embla-carousel: 8.6.0 - embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + embla-carousel: 9.0.0-rc01 + embla-carousel-reactive-utils: 9.0.0-rc01(embla-carousel@9.0.0-rc01) react: 19.2.0 - embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + embla-carousel-reactive-utils@9.0.0-rc01(embla-carousel@9.0.0-rc01): dependencies: - embla-carousel: 8.6.0 + embla-carousel: 9.0.0-rc01 - embla-carousel@8.6.0: {} + embla-carousel@9.0.0-rc01: {} enhanced-resolve@5.18.3: dependencies: diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 591dcca..f33de0c 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -303,7 +303,7 @@ export default function Home() {
- + /> */}
diff --git a/src/app/home/solutions-carousel/index.tsx b/src/app/home/solutions-carousel/index.tsx index a1382b1..1a390c4 100644 --- a/src/app/home/solutions-carousel/index.tsx +++ b/src/app/home/solutions-carousel/index.tsx @@ -1,14 +1,25 @@ "use client"; +import type { + EmblaCarouselType, + EmblaEventListType, + EmblaEventModelType, + EmblaOptionsType, +} from "embla-carousel"; import Autoplay from "embla-carousel-autoplay"; import ClassNames from "embla-carousel-class-names"; -import useEmblaCarousel, { type EmblaOptionsType } from "embla-carousel-react"; +import useEmblaCarousel from "embla-carousel-react"; import Image from "next/image"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { industries } from "./data"; import TextContentSection from "./TextContentSection"; import { useUnidirectionalEmbla } from "./useUnidirectionalEmbla"; +const TWEEN_FACTOR_BASE = 0.4; + +const clamp = (number: number, min: number, max: number): number => + Math.min(Math.max(number, min), max); + export function SolutionsCarousel() { const [selectedIdx, setSelectedIdx] = useState(0); @@ -19,17 +30,20 @@ export function SolutionsCarousel() { skipSnaps: true, }; - const plugins = [Autoplay(), ClassNames({ snapped: "is-snapped" })]; + const plugins = [ + Autoplay(), + ClassNames({ snapped: "is-snapped", active: true }), + ]; const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins); useUnidirectionalEmbla(emblaApi); - // sync carousel changes with selected idx + // // sync carousel changes with selected idx useEffect(() => { if (!emblaApi) return; const onSelect = () => { - setSelectedIdx(emblaApi.selectedScrollSnap()); + setSelectedIdx(emblaApi.selectedSnap()); }; emblaApi.on("select", onSelect); @@ -40,6 +54,84 @@ export function SolutionsCarousel() { }; }, [emblaApi]); + const tweenFactor = useRef(0); + const tweenNodes = useRef([]); + + const setTweenNodes = useCallback((emblaApi: EmblaCarouselType): void => { + tweenNodes.current = emblaApi.slideNodes().map((slideNode) => { + return slideNode.querySelector(".embla__slide__img") as HTMLElement; + }); + console.log(tweenNodes.current); + }, []); + + const setTweenFactor = useCallback((emblaApi: EmblaCarouselType) => { + tweenFactor.current = TWEEN_FACTOR_BASE * emblaApi.snapList().length; + }, []); + + const tweenScale = useCallback( + ( + emblaApi: EmblaCarouselType, + event?: EmblaEventModelType, + ) => { + const engine = emblaApi.internalEngine(); + const scrollProgress = emblaApi.scrollProgress(); + const slidesInView = emblaApi.slidesInView(); + const isScrollEvent = event?.type === "scroll"; + + emblaApi.snapList().forEach((scrollSnap, snapIndex) => { + let diffToTarget = scrollSnap - scrollProgress; + const slidesInSnap = engine.scrollSnapList.slidesBySnap[snapIndex]; + + slidesInSnap.forEach((slideIndex) => { + if (isScrollEvent && !slidesInView.includes(slideIndex)) return; + + if (engine.options.loop) { + engine.slideLooper.loopPoints.forEach((loopItem) => { + const target = loopItem.target(); + + if (slideIndex === loopItem.index && target !== 0) { + const sign = Math.sign(target); + + if (sign === -1) { + diffToTarget = scrollSnap - (1 + scrollProgress); + } + if (sign === 1) { + diffToTarget = scrollSnap + (1 - scrollProgress); + } + } + }); + } + + const tweenValue = 1 - Math.abs(diffToTarget * tweenFactor.current); + const scale = clamp(tweenValue, 0, 1).toString(); + const tweenNode = tweenNodes.current[slideIndex]; + if (!tweenNode) { + console.log("missing tween node for slide index", slideIndex); + return; + } + tweenNode.style.transform = `scale(${scale})`; + }); + }); + }, + [], + ); + + // biome-ignore lint/correctness/useExhaustiveDependencies: + useEffect(() => { + if (!emblaApi) return; + + setTweenNodes(emblaApi); + setTweenFactor(emblaApi); + tweenScale(emblaApi); + + emblaApi + .on("reinit", setTweenNodes) + .on("reinit", setTweenFactor) + .on("reinit", tweenScale) + .on("scroll", tweenScale) + .on("slidefocus", tweenScale); + }, [emblaApi]); + const currentIndustry = industries[selectedIdx % industries.length]; return ( @@ -52,7 +144,9 @@ export function SolutionsCarousel() {
{industries.map((industry, idx) => (
{ startXRef.current = e.clientX; - startIndexRef.current = emblaApi.selectedScrollSnap(); + startIndexRef.current = emblaApi.selectedSnap(); isBlockingRef.current = false; }; @@ -32,7 +32,7 @@ export function useUnidirectionalEmbla( e.stopImmediatePropagation(); // scroll to the start index - emblaApi.scrollTo(startIndexRef.current, false); + // emblaApi.scrollTo(startIndexRef.current, false); } }; diff --git a/src/css/embla.css b/src/css/embla.css index ae7693b..7f1a180 100644 --- a/src/css/embla.css +++ b/src/css/embla.css @@ -2,7 +2,7 @@ min-height: 25rem; --slide-height: 12rem; --slide-spacing: 1rem; - --slide-size: 25%; + --slide-size: 33%; display: flex; align-items: center; justify-content: center; @@ -31,12 +31,15 @@ } .embla__viewport { + overflow: hidden; + width: 100%; } .embla__container { display: flex; margin-left: calc(var(--slide-spacing) * -1); transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1); + touch-action: pan-y pinch-zoom; } .embla__slide { @@ -45,9 +48,9 @@ } .embla__slide.is-snapped { - transform: translateY(-48px) !important; - --slide-height: 25rem; - --slide-size: 40%; + /* transform: translateY(-48px) !important; */ + /* --slide-height: 25rem; */ + /* --slide-size: 40%; */ } .embla__slide:not(.is-snapped) {