diff --git a/components/footer.html b/components/footer.html
index 115aadd..31b7fc2 100644
--- a/components/footer.html
+++ b/components/footer.html
@@ -53,7 +53,7 @@
Careers
Our Locations
Log In
- Contact Us
+ Contact Us
diff --git a/css/testing.css b/css/testing.css
index 8772872..16af31d 100644
--- a/css/testing.css
+++ b/css/testing.css
@@ -1,56 +1,50 @@
/* Base setup */
:root {
- --font-primary: 'Open Sans', sans-serif;
- /* default body font */
- --font-secondary: 'Larken', serif;
- /* decorative font */
- --font-tertiary: 'Inter', sans-serif;
- /* for headings or special text */
+ --font-primary: "Open Sans", sans-serif;
+ /* default body font */
+ --font-secondary: "Larken", serif;
+ /* decorative font */
+ --font-tertiary: "Inter", sans-serif;
+ /* for headings or special text */
}
section.ask-advantage-scroll {
- padding: 60px 0 0 0;
+ padding: 60px 0 0 0;
}
-.ask-advantage-scroll h2
-
- {
- font-family: var(--font-secondary);
- font-weight: 400;
- font-style: Regular;
- font-size: 40px;
- line-height: 100%;
- letter-spacing: 0%;
- color: #033A49;
+.ask-advantage-scroll h2 {
+ font-family: var(--font-secondary);
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 40px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #033a49;
}
.ask-advantage-scroll p.lead {
- font-family: var(--font-primary);
- font-weight: 400;
- font-size: 18px;
- line-height: 100%;
- letter-spacing: 0%;
- color: #3E3F3F;
- margin-bottom: 40px;
- margin-top: 15px;
+ font-family: var(--font-primary);
+ font-weight: 400;
+ font-size: 18px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #3e3f3f;
+ margin-bottom: 40px;
+ margin-top: 15px;
}
-
.cards-wrapper {
display: flex;
gap: 20px;
flex-wrap: wrap;
justify-content: center;
margin-top: 60px;
-
}
-
.card-scroll {
background-image: url("../assests/images/desbackcard-scroll.svg");
background-repeat: no-repeat;
- background-size: cover;
-
-
+ background-size: cover;
+
background-position: center center; /* centers it horizontally and vertically */
border-radius: 30px;
@@ -59,61 +53,56 @@ section.ask-advantage-scroll {
display: flex;
flex-direction: row;
- border: 1px solid #E6E7E8;
- box-shadow: 0px 5px 14px 0px #0000000D;
+ border: 1px solid #e6e7e8;
+ box-shadow: 0px 5px 14px 0px #0000000d;
/* reduce side padding so image aligns better */
- padding: 50px 80px 0px 80px;
+ padding: 50px 80px 0px 80px;
gap: 60px;
- transition: transform 0.3s ease;
+ transition: transform 0.3s ease;
}
.card-content {
- width: 60%;
- margin-bottom: 50px;
+ width: 60%;
+ margin-bottom: 50px;
}
.card-image {
- width: 40%;
- display: flex;
- align-items: end;
+ width: 40%;
+ display: flex;
+ align-items: end;
}
-
-
-
.card-label span {
- color: #B18C4A;
- font-family: var(--font-primary);
- font-weight: 400;
- font-size: 24px;
- line-height: 21.9px;
- letter-spacing: 0px;
- vertical-align: middle;
- text-transform: capitalize;
+ color: #b18c4a;
+ font-family: var(--font-primary);
+ font-weight: 400;
+ font-size: 24px;
+ line-height: 21.9px;
+ letter-spacing: 0px;
+ vertical-align: middle;
+ text-transform: capitalize;
}
.scroll-tiile {
- margin: 20px 0 10px 0;
- color: #033A49;
- font-family: var(--font-secondary);
- font-weight: 400;
- font-size: 32px;
- line-height: 100%;
- letter-spacing: 2px;
+ margin: 20px 0 10px 0;
+ color: #033a49;
+ font-family: var(--font-secondary);
+ font-weight: 400;
+ font-size: 32px;
+ line-height: 100%;
+ letter-spacing: 2px;
}
-.scroll-desc{
-font-family: var(--font-primary);
-font-weight: 400;
-
-font-size: 18px;
-line-height: 100%;
-color: #3E3F3F;
-
+.scroll-desc {
+ font-family: var(--font-primary);
+ font-weight: 400;
+ font-size: 18px;
+ line-height: 100%;
+ color: #3e3f3f;
}
.scroll-ul {
- margin-left: 15px;
+ margin-left: 15px;
padding-left: 20px;
font-size: 14px;
color: #555;
@@ -121,98 +110,79 @@ color: #3E3F3F;
}
.scroll-ul .scroll-li {
-
- font-family: var(--font-primary);
- font-weight: 400;
- font-size: 16px;
- line-height: 32px;
+ font-family: var(--font-primary);
+ font-weight: 400;
+ font-size: 16px;
+ line-height: 32px;
}
-
-
.card-image img {
width: 316px;
display: block;
}
@media (max-width: 768px) {
- .card-scroll {
- background-image: url("../assests/images/mobilebackcard-scroll.svg") ;
- background-repeat: no-repeat;
- background-size: cover; /* fills card area */
- background-position: center center; /* show from top */
+ .card-scroll {
+ background-image: url("../assests/images/mobilebackcard-scroll.svg");
+ background-repeat: no-repeat;
+ background-size: cover; /* fills card area */
+ background-position: center center; /* show from top */
- border-radius: 30px;
- width: 100%;
- overflow: hidden;
+ border-radius: 30px;
+ width: 100%;
+ overflow: hidden;
- display: flex;
- flex-direction: column;
- border: 1px solid #E6E7E8;
- box-shadow: 0px 0px 14px 0px #0000000D;
- padding: 30px 20px 0px 20px;
- gap: 30px;
-}
+ display: flex;
+ flex-direction: column;
+ border: 1px solid #e6e7e8;
+ box-shadow: 0px 0px 14px 0px #0000000d;
+ padding: 30px 20px 0px 20px;
+ gap: 30px;
+ }
-.card-content {
+ .card-content {
width: 100%;
margin-bottom: 0px;
-}
-.card-image {
+ }
+ .card-image {
width: 100%;
text-align: center;
justify-content: center;
display: flex;
-}
-.card-image img {
+ }
+ .card-image img {
width: 220px;
display: block;
-}
-.card-label span {
-
+ }
+ .card-label span {
font-size: 18px;
-
-}
-.scroll-tiile {
-
+ }
+ .scroll-tiile {
font-size: 18px;
letter-spacing: 0.5px;
-}
-.cards-wrapper {
-
+ }
+ .cards-wrapper {
margin-top: 30px;
-}
-.scroll-desc {
-
+ }
+ .scroll-desc {
font-size: 13px;
-
-}
-.scroll-ul {
-
+ }
+ .scroll-ul {
display: none;
-}
-.ask-advantage-scroll h2
-
- {
-
+ }
+ .ask-advantage-scroll h2 {
font-size: 26px;
line-height: 36px;
-
-}
-.ask-advantage-scroll p.lead {
-
-
+ }
+ .ask-advantage-scroll p.lead {
font-size: 14px;
line-height: 22px;
-
-
+ }
}
-}
-
.cards-wrapper {
position: relative;
- height: 530px; /* ya jitna aapko chahiye ho */
+ height: 530px; /* ya jitna aapko chahiye ho */
overflow: hidden;
}
@@ -232,8 +202,7 @@ color: #3E3F3F;
}
@media (max-width: 991px) {
- section.ask-advantage-scroll.container {
+ section.ask-advantage-scroll.container {
padding: 60px 25px 0 25px !important;
+ }
}
-}
-
diff --git a/js/main.js b/js/main.js
index b3cb0b1..742faf9 100644
--- a/js/main.js
+++ b/js/main.js
@@ -329,48 +329,183 @@ window.openDrawer = function (name, role, img, desc) {
let cards = [];
let currentIndex = 0;
let animating = false;
-let isInsideSection = false;
+let isSectionPinned = false;
+let scrollTrigger;
+let allowNormalScroll = false;
+let scrollLockPosition = 0;
+// ===============================
+// ✅ GSAP Stack Scroll with Section Pinning
+// ===============================
function initGsapStackScroll() {
- const section = document.querySelector(".cards-wrapper");
+ const section = document.querySelector(".ask-advantage-scroll");
if (!section) return;
- cards = Array.from(section.querySelectorAll(".card-scroll"));
+ const cardsWrapper = document.querySelector(".cards-wrapper");
+ if (!cardsWrapper) return;
+
+ cards = Array.from(cardsWrapper.querySelectorAll(".card-scroll"));
if (!cards.length) return;
// Initial setup
gsap.set(cards, { opacity: 0, y: "100%", zIndex: 0 });
gsap.set(cards[0], { opacity: 1, y: "60px", zIndex: 5 });
currentIndex = 0;
+ allowNormalScroll = false;
- // Section hover control
- section.addEventListener("mouseenter", () => (isInsideSection = true));
- section.addEventListener("mouseleave", () => (isInsideSection = false));
+ // Calculate exact pinning distance
+ const cardHeight = cardsWrapper.offsetHeight;
+ const totalCards = cards.length;
+ const pinningDistance = cardHeight * totalCards * 0.4;
- // Remove previous wheel listener if any
- window.removeEventListener("wheel", window._gsapStackHandler);
+ // Scroll pinning logic
+ scrollTrigger = ScrollTrigger.create({
+ trigger: cardsWrapper,
+ start: "top top",
+ end: `+=${pinningDistance}`,
+ pin: true,
+ anticipatePin: 1,
+ pinSpacing: true,
+ onEnter: () => {
+ isSectionPinned = true;
+ allowNormalScroll = false;
+ if (currentIndex !== 0) {
+ resetToFirstCard();
+ }
+ },
+ onLeave: () => {
+ isSectionPinned = false;
+ allowNormalScroll = true;
+ },
+ onEnterBack: () => {
+ isSectionPinned = true;
+ allowNormalScroll = false;
+ },
+ onLeaveBack: () => {
+ isSectionPinned = false;
+ allowNormalScroll = true;
+ }
+ });
- // Add new wheel scroll handler
+ // deepseek today code: Enhanced scroll prevention with visible scrollbar
window._gsapStackHandler = function (e) {
- if (!isInsideSection || animating) return;
- e.preventDefault();
-
- if (e.deltaY > 0) {
- showNextGsapCard();
- } else {
- showPrevGsapCard();
+ if (isSectionPinned && !allowNormalScroll) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (animating) {
+ // If already animating, just prevent scroll completely
+ return;
+ }
+
+ if (e.deltaY > 0) {
+ showNextGsapCard();
+ } else if (e.deltaY < 0) {
+ showPrevGsapCard();
+ }
}
};
- window.addEventListener("wheel", window._gsapStackHandler, {
- passive: false,
+ // Add wheel event listener
+ window.addEventListener("wheel", window._gsapStackHandler, {
+ passive: false
+ });
+
+ // deepseek today code: Active scroll position locking during animations
+ window._scrollLockHandler = function() {
+ if (isSectionPinned && !allowNormalScroll && animating) {
+ // Immediately restore to locked position
+ window.scrollTo(0, scrollLockPosition);
+ }
+ };
+
+ window.addEventListener("scroll", window._scrollLockHandler, { passive: false });
+
+ // Prevent keyboard scrolling during animations
+ window.addEventListener("keydown", function(e) {
+ if (isSectionPinned && !allowNormalScroll && (e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === " " || e.key === "PageDown" || e.key === "PageUp")) {
+ e.preventDefault();
+
+ if (animating) return;
+
+ if (e.key === "ArrowDown" || e.key === "PageDown" || e.key === " ") {
+ showNextGsapCard();
+ } else if (e.key === "ArrowUp" || e.key === "PageUp") {
+ showPrevGsapCard();
+ }
+ }
+ });
+}
+
+// deepseek today code: Enhanced scroll locking without hiding scrollbar
+function lockScrollDuringAnimation() {
+ animating = true;
+ scrollLockPosition = window.scrollY; // Store current scroll position
+
+ // Keep scrollbar visible but prevent any scroll movement
+ document.documentElement.style.overscrollBehavior = 'none';
+ document.body.style.overscrollBehavior = 'none';
+
+ // Use requestAnimationFrame to continuously lock scroll position
+ function maintainScrollLock() {
+ if (animating && isSectionPinned && !allowNormalScroll) {
+ if (window.scrollY !== scrollLockPosition) {
+ window.scrollTo(0, scrollLockPosition);
+ }
+ requestAnimationFrame(maintainScrollLock);
+ }
+ }
+
+ maintainScrollLock();
+}
+
+function unlockScrollAfterAnimation() {
+ animating = false;
+
+ // Restore normal scroll behavior
+ document.documentElement.style.overscrollBehavior = '';
+ document.body.style.overscrollBehavior = '';
+}
+
+// Reset to first card function
+function resetToFirstCard() {
+ lockScrollDuringAnimation();
+
+ // Hide all cards
+ gsap.set(cards, { opacity: 0, y: "100%", zIndex: 0 });
+
+ // Show first card
+ gsap.set(cards[0], {
+ opacity: 1,
+ y: "60px",
+ zIndex: 5,
+ onComplete: () => {
+ currentIndex = 0;
+ unlockScrollAfterAnimation();
+ allowNormalScroll = false;
+ }
});
}
// ✅ Show next card
function showNextGsapCard() {
- if (currentIndex >= cards.length - 1) return;
- animating = true;
+ if (currentIndex >= cards.length - 1) {
+ allowNormalScroll = true;
+ unlockScrollAfterAnimation();
+
+ const lastCard = cards[currentIndex];
+ gsap.to(lastCard, {
+ y: "50px",
+ duration: 0.3,
+ ease: "power2.out",
+ yoyo: true,
+ repeat: 1
+ });
+
+ return;
+ }
+
+ lockScrollDuringAnimation();
const current = cards[currentIndex];
const next = cards[currentIndex + 1];
@@ -398,7 +533,11 @@ function showNextGsapCard() {
onComplete: () => {
currentIndex++;
adjustVisibleCards();
- animating = false;
+ unlockScrollAfterAnimation();
+
+ if (currentIndex >= cards.length - 1) {
+ allowNormalScroll = true;
+ }
},
}
);
@@ -406,8 +545,13 @@ function showNextGsapCard() {
// ✅ Show previous card
function showPrevGsapCard() {
- if (currentIndex <= 0) return;
- animating = true;
+ if (currentIndex <= 0) {
+ allowNormalScroll = true;
+ unlockScrollAfterAnimation();
+ return;
+ }
+
+ lockScrollDuringAnimation();
const current = cards[currentIndex];
const prev = cards[currentIndex - 1];
@@ -431,7 +575,11 @@ function showPrevGsapCard() {
onComplete: () => {
currentIndex--;
adjustVisibleCards();
- animating = false;
+ unlockScrollAfterAnimation();
+
+ if (currentIndex > 0) {
+ allowNormalScroll = false;
+ }
},
});
}
@@ -455,8 +603,8 @@ function adjustVisibleCards() {
for (let i = 1; i <= 2; i++) {
const prevIndex = currentIndex - i;
if (prevIndex >= 0) {
- const yOffset = 60 - i * 25; // e.g., 60px, 35px
- const scale = 1 - i * 0.05; // e.g., 1, 0.95, 0.9
+ const yOffset = 60 - i * 25;
+ const scale = 1 - i * 0.05;
const zIndex = 5 - i;
gsap.set(cards[prevIndex], {