diff --git a/assets/scss/_browser.scss b/assets/scss/_browser.scss index 1ecfded8..d08d8e51 100644 --- a/assets/scss/_browser.scss +++ b/assets/scss/_browser.scss @@ -1,4 +1,3 @@ - .browser { position: relative; --browser-blue: #00B39F; @@ -46,7 +45,8 @@ display: flex; align-items: center; gap: 18px; - padding: 1.8cqi 2.2cqi; /* scale padding proportionally */ + padding: 1.8cqi 2.2cqi; + /* scale padding proportionally */ background: #1a1b1d; border-bottom: 1px solid rgba(100, 100, 100, 0.06); } @@ -84,7 +84,8 @@ color: #cbd2d9; background: rgba(200, 200, 200, 0.08); margin: 0 auto; - font-size: clamp(0.6rem, 1.2cqi, 0.9rem); /* Scale font size slightly */ + font-size: clamp(0.6rem, 1.2cqi, 0.9rem); + /* Scale font size slightly */ } .browser-body { @@ -116,8 +117,7 @@ - 980px = baseline width - min scale = 0.2 (matches previous <=196px rule) - max scale = 1 (no upscaling above baseline) */ - --browser-scale: clamp(0.2, calc(100cqi / 980), 1); - --browser-scale: 1; + --browser-scale: clamp(0.2, calc(100cqi / 980px), 1); scale: var(--browser-scale, 1); transition: scale 0.08s linear; } @@ -138,7 +138,7 @@ display: grid; place-items: center; perspective: 900px; - z-index: 4; + z-index: 4; } .cube { @@ -200,13 +200,11 @@ position: absolute; inset: -60% -20%; border-radius: inherit; - background: radial-gradient( - 100% 100% at right, - rgba(12, 16, 28, 0.9), - rgba(178, 255, 240, 0.9) 8%, - rgba(0, 211, 169, 0.5) 40%, - transparent 80% - ); + background: radial-gradient(100% 100% at right, + rgba(12, 16, 28, 0.9), + rgba(178, 255, 240, 0.9) 8%, + rgba(0, 211, 169, 0.5) 40%, + transparent 80%); offset-path: inset(0 round 999px); offset-anchor: 100% 50%; animation: trail 10s infinite linear; @@ -244,13 +242,13 @@ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), - box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1), - border-color 0.3s ease; + box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1), + border-color 0.3s ease; &:hover { transform: translateY(-3px); box-shadow: 0 24px 60px rgba(8, 20, 60, 0.6), - 0 0 20px rgba(0, 211, 169, 0.12); + 0 0 20px rgba(0, 211, 169, 0.12); border-color: rgba(0, 211, 169, 0.7); } @@ -276,7 +274,8 @@ .cta-hexagon { width: 18px; - height: 18px; /* (width * tan(60deg)) to maintain aspect ratio */ + height: 18px; + /* (width * tan(60deg)) to maintain aspect ratio */ background: radial-gradient(circle, rgba(158, 255, 236, 0.9), rgba(0, 211, 169, 0.55)); box-shadow: 0 0 12px rgba(0, 211, 169, 0.6); clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); @@ -333,7 +332,7 @@ border-radius: 4px; // background: linear-gradient(180deg, #0d100d, #050805); // box-shadow: inset 0 0 10px rgba(250, 250, 250, 0.45); - background: linear-gradient(to right,rgba(170, 204, 172, 0.082),color-mix(in srgb,#000 88%,#fff),rgba(170, 204, 172, 0.082)); + background: linear-gradient(to right, rgba(170, 204, 172, 0.082), color-mix(in srgb, #000 88%, #fff), rgba(170, 204, 172, 0.082)); } .browser-shadow { @@ -344,4 +343,4 @@ width: 100%; pointer-events: none; z-index: -1; -} +} \ No newline at end of file diff --git a/assets/scss/_scroll-cube.scss b/assets/scss/_scroll-cube.scss index 79da480b..4e0f4721 100644 --- a/assets/scss/_scroll-cube.scss +++ b/assets/scss/_scroll-cube.scss @@ -104,33 +104,33 @@ // 3D depth offsets — front/mid/back pairs .reunited-piece--0 { - transform: translateZ(2px); + transform: translateZ(0); filter: drop-shadow(0 4px 20px rgba(0, 211, 169, 0.25)); } .reunited-piece--1 { - transform: translateZ(18px); + transform: translateZ(0); filter: drop-shadow(0 4px 16px rgba(0, 211, 169, 0.22)); } .reunited-piece--2 { - transform: translateZ(14px); + transform: translateZ(0); filter: drop-shadow(0 2px 12px rgba(0, 179, 159, 0.25)); } .reunited-piece--3 { - transform: translateZ(10px); + transform: translateZ(0); filter: drop-shadow(0 2px 10px rgba(0, 179, 159, 0.18)); } .reunited-piece--4 { - transform: translateZ(-2px); + transform: translateZ(0); filter: drop-shadow(0 0 8px rgba(0, 179, 159, 0.2)); opacity: 0.85; } .reunited-piece--5 { - transform: translateZ(-18px) rotateY(-1deg); + transform: translateZ(0) rotateY(-1deg); filter: drop-shadow(0 0 6px rgba(0, 211, 169, 0.08)); opacity: 0.78; } @@ -198,6 +198,12 @@ // ─── Responsive ─── @media (max-width: 768px) { + + body .scroll-piece-stage .scroll-piece-body svg, + body .reunited-logo-inner .reunited-piece { + filter: none; + } + .scroll-piece-stage { width: 50px; height: 50px; @@ -208,12 +214,12 @@ height: 180px; } - .reunited-piece--0 { transform: translateZ(14px); } - .reunited-piece--1 { transform: translateZ(10px); } - .reunited-piece--2 { transform: translateZ(2px); } - .reunited-piece--3 { transform: translateZ(0px); } - .reunited-piece--4 { transform: translateZ(-8px); } - .reunited-piece--5 { transform: translateZ(-12px); } + .reunited-piece--0 { transform: translateZ(0); } + .reunited-piece--1 { transform: translateZ(0); } + .reunited-piece--2 { transform: translateZ(0); } + .reunited-piece--3 { transform: translateZ(0); } + .reunited-piece--4 { transform: translateZ(0); } + .reunited-piece--5 { transform: translateZ(0); } .reunited-glow { width: 200px; diff --git a/static/scripts/main.js b/static/scripts/main.js index 19aefeef..a5116f12 100644 --- a/static/scripts/main.js +++ b/static/scripts/main.js @@ -73,7 +73,7 @@ const scrubEach = (elements, props, triggerEl, startBase, endBase, offsetPer) => trigger: triggerEl, start: 'top ' + (startBase - i * offsetPer) + '%', end: 'top ' + (endBase - i * offsetPer) + '%', - scrub: 1, + scrub: true, } })); }); @@ -115,10 +115,10 @@ const initScrollPieces = () => { const introSchedule = [ { pieceIdx: 0, section: '.capabilities-section', startX: '-20vw', startY: '30vh', rotation: -30 }, { pieceIdx: 2, section: '.customers-section', startX: '80vw', startY: '60vh', rotation: 20 }, - { pieceIdx: 5, section: '.hero-section', startX: '-15vw', startY: '40vh', rotation: -15 }, - { pieceIdx: 1, section: '.demo-section', startX: '85vw', startY: '55vh', rotation: 25 }, + { pieceIdx: 5, section: '.hero-section', startX: '-15vw', startY: '40vh', rotation: -15 }, + { pieceIdx: 1, section: '.demo-section', startX: '85vw', startY: '55vh', rotation: 25 }, { pieceIdx: 3, section: '.capabilities-section', startX: '18vw', startY: '45vh', rotation: -20 }, - { pieceIdx: 4, section: '.community-section', startX: '82vw', startY: '35vh', rotation: 30 }, + { pieceIdx: 4, section: '.community-section', startX: '82vw', startY: '35vh', rotation: 30 }, ]; // Create DOM for each floating piece @@ -131,12 +131,12 @@ const initScrollPieces = () => { anchor.setAttribute('data-piece', i); anchor.innerHTML = '
' + - '
' + - '' + - '' + - '' + - '
' + - '
' + + '
' + + '' + + '' + + '' + + '
' + + '
' + '
'; document.body.appendChild(anchor); anchors.push(anchor); @@ -149,7 +149,7 @@ const initScrollPieces = () => { if (reunitedInner) { reunitedInner.innerHTML = pieces.map((p, i) => '' + - '' + + '' + '' ).join(''); } @@ -163,6 +163,16 @@ const initScrollPieces = () => { // ── Per-piece scroll journeys ── // Store journey triggers so we can kill the scrubs when convergence fires const journeyTriggers = []; + const initialLogoEl = document.querySelector('.reunited-logo'); + const getTargetScale = () => { + const floatEl = document.querySelector('.reunited-float'); + if (!floatEl) return 5.6; + const oldAnim = floatEl.style.animation; + floatEl.style.animation = 'none'; + const w = floatEl.getBoundingClientRect().width; + floatEl.style.animation = oldAnim; + return w / 50 || 5.6; + }; const browserSection = document.querySelector('.browser'); const sections = [ @@ -192,7 +202,7 @@ const initScrollPieces = () => { trigger: triggerEl, start: 'top 85%', end: 'top 50%', - scrub: 1, + scrub: true, } }); @@ -220,7 +230,8 @@ const initScrollPieces = () => { start: 'top 80%', endTrigger: '.browser', end: 'top 40%', - scrub: 2, + scrub: true, + invalidateOnRefresh: true, } }); journeyTriggers.push(journey.scrollTrigger); @@ -231,12 +242,13 @@ const initScrollPieces = () => { const targetY = parseFloat(startY) + (orbit.y - parseFloat(startY)) * progress; const wobbleX = Math.sin(pieceIdx * 1.5 + s * 2) * 5; const wobbleY = Math.cos(pieceIdx * 1.2 + s * 1.8) * 3; - const targetScale = 1 + progress * 4.6; - journey.to(anchor, { x: targetX + wobbleX + 'vw', y: targetY + wobbleY + 'vh', - scale: targetScale, + scale: () => { + const currentScaleFactor = getTargetScale() - 1; + return 1 + progress * currentScaleFactor; + }, duration: 1, ease: 'none', }, s > 0 ? '>' : 0); journey.to(body, { @@ -252,104 +264,132 @@ const initScrollPieces = () => { ScrollTrigger.create({ trigger: browserSection, start: 'top 85%', - once: true, onEnter: () => { anchors.forEach(a => { a.style.zIndex = '10'; const svg = a.querySelector('svg'); if (svg) gsap.to(svg, { opacity: 0.85, duration: 0.6, overwrite: true }); }); + }, + onLeaveBack: () => { + anchors.forEach(a => { + a.style.zIndex = '-1'; + const svg = a.querySelector('svg'); + if (svg) gsap.to(svg, { clearProps: 'opacity', duration: 0.6, overwrite: true }); + }); } }); } - // ── Step 2: Convergence — pieces swoop from orbit into the browser screen ── + // ── Step 2: Convergence — fully scrubbed, high performance ── if (reunitedFloat && browserSection) { + const sections = [ + '.customers-section', '.hero-section', '.demo-section', + '.capabilities-section', '.community-section', '.browser' + ]; + + const orbitTargets = [ + { x: 35, y: 30 }, { x: 65, y: 30 }, { x: 70, y: 52 }, + { x: 60, y: 70 }, { x: 30, y: 52 }, { x: 48, y: 22 } + ]; + + const startPositions = []; + introSchedule.forEach((intro) => { + const { pieceIdx, section } = intro; + const steps = sections.slice(sections.indexOf(section) + 1).length + 1; + const s = steps - 1; + startPositions[pieceIdx] = { + x: orbitTargets[pieceIdx].x + Math.sin(pieceIdx * 1.5 + s * 2) * 5, + y: orbitTargets[pieceIdx].y + Math.cos(pieceIdx * 1.2 + s * 1.8) * 3, + }; + }); + + const logoEl = document.querySelector('.reunited-logo'); + const easeFn = gsap.parseEase('power2.inOut'); + const bounceFn = gsap.parseEase('bounce.out'); + + let docLogoCenterX = 0; + let docLogoCenterY = 0; + let cachedDynamicScale = 5.6; + ScrollTrigger.create({ trigger: browserSection, - start: 'top 30%', - once: true, - onEnter: () => { - requestAnimationFrame(() => { - // Kill scroll-driven journeys before taking over with time-based tweens - journeyTriggers.forEach(t => { - if (t) { - if (t.animation) t.animation.kill(); - t.kill(); - } - }); - anchors.forEach(a => { - gsap.killTweensOf(a); - a.style.zIndex = '100'; // above everything during swoop - }); - bodies.forEach(b => gsap.killTweensOf(b)); - - const logoEl = document.querySelector('.reunited-logo'); - if (!logoEl) return; - - const logoRect = logoEl.getBoundingClientRect(); - const logoCenterX = logoRect.left + logoRect.width / 2; - const finalLogoYOffset = -24; - const logoCenterY = logoRect.top + logoRect.height / 2 + finalLogoYOffset; - - let arrived = 0; - introSchedule.forEach(({ pieceIdx }, order) => { - const anchor = anchors[pieceIdx]; - const body = bodies[pieceIdx]; - const svg = anchor.querySelector('svg'); - const glow = anchor.querySelector('.scroll-piece-glow'); - - if (glow) gsap.to(glow, { opacity: 0, duration: 0.15, overwrite: true }); - if (svg) gsap.set(svg, { opacity: 1 }); - - gsap.to(anchor, { - x: logoCenterX, - y: logoCenterY, - scale: 5.6, - opacity: 1, - duration: 0.25, - delay: order * 0.045, - ease: 'power2.inOut', - overwrite: true, - onComplete: () => { - arrived++; - if (arrived === introSchedule.length) { - gsap.to(anchors, { - scale: 5.72, duration: 0.14, ease: 'sine.out', - overwrite: true, - onComplete: () => { - gsap.to(anchors, { - scale: 5.6, duration: 0.2, ease: 'sine.inOut', - onComplete: () => { - gsap.set(reunitedFloat, { opacity: 1 }); - gsap.fromTo(logoEl, - { y: finalLogoYOffset - 40, scale: 0.94 }, - { - y: finalLogoYOffset, - scale: 1, - duration: 0.9, - ease: 'bounce.out', - overwrite: true, - } - ); - anchors.forEach(a => { - gsap.set(a, { opacity: 0 }); - a.style.zIndex = '-1'; - }); - } - }); - } - }); - } - } - }); - - gsap.to(body, { - rotateY: 0, rotateX: 0, - duration: 0.5, delay: order * 0.045, ease: 'sine.inOut', - overwrite: true, - }); + start: 'top 40%', + end: 'top 10%', + scrub: true, + onRefresh: () => { + if (!logoEl) return; + + // Temporarily disable the float animation to get the true untransformed center + const oldAnim = reunitedFloat.style.animation; + reunitedFloat.style.animation = 'none'; + + const floatRect = reunitedFloat.getBoundingClientRect(); + const scrollY = window.scrollY || document.documentElement.scrollTop; + const scrollX = window.scrollX || document.documentElement.scrollLeft; + + docLogoCenterX = floatRect.left + scrollX + floatRect.width / 2; + docLogoCenterY = floatRect.top + scrollY + floatRect.height / 2 - 24; + cachedDynamicScale = floatRect.width / 50 || 5.6; + + // Restore the float animation + reunitedFloat.style.animation = oldAnim; + }, + onUpdate: (self) => { + if (!logoEl) return; + const progress = self.progress; + const eased = easeFn(progress); + + const vw = window.innerWidth / 100; + const vh = window.innerHeight / 100; + const scrollY = window.scrollY || document.documentElement.scrollTop; + const scrollX = window.scrollX || document.documentElement.scrollLeft; + + // Dynamically find viewport-relative position using fast O(1) math + const logoCenterX = docLogoCenterX - scrollX; + const logoCenterY = docLogoCenterY - scrollY; + + introSchedule.forEach(({ pieceIdx }) => { + const anchor = anchors[pieceIdx]; + const body = bodies[pieceIdx]; + const svg = anchor.querySelector('svg'); + const glow = anchor.querySelector('.scroll-piece-glow'); + + const startX = startPositions[pieceIdx].x * vw; + const startY = startPositions[pieceIdx].y * vh; + + const currentX = startX + (logoCenterX - startX) * eased; + const currentY = startY + (logoCenterY - startY) * eased; + + let anchorOpacity = 1; + if (progress > 0.8) { + anchorOpacity = 1 - ((progress - 0.8) / 0.2); + } + + anchor.style.position = 'fixed'; + anchor.style.top = '0px'; + + gsap.set(anchor, { + x: currentX + 'px', + y: currentY + 'px', + scale: cachedDynamicScale, + opacity: anchorOpacity, + zIndex: progress > 0.8 ? -1 : 100 }); + + gsap.set(body, { rotateY: 0, rotateX: 0 }); + + if (glow) gsap.set(glow, { opacity: 0.5 * (1 - progress) }); + if (svg) gsap.set(svg, { opacity: 0.85 + 0.15 * progress }); + }); + + let logoOpacity = progress > 0.8 ? (progress - 0.8) / 0.2 : 0; + gsap.set(reunitedFloat, { opacity: logoOpacity }); + + const bounced = bounceFn(progress); + gsap.set(logoEl, { + scale: 0.94 + 0.06 * bounced, + y: -64 + 40 * bounced }); } }); @@ -370,15 +410,15 @@ const initScrollAnimations = () => { gsap.to('.scroll-orb--1', { y: '-60vh', x: '15vw', scale: 1.4, opacity: 0.5, - scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: 2 } + scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: true } }); gsap.to('.scroll-orb--2', { y: '-40vh', x: '-20vw', scale: 0.8, - scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: 3 } + scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: true } }); gsap.to('.scroll-orb--3', { y: '-80vh', x: '10vw', scale: 1.2, opacity: 0.7, - scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: 2.5 } + scrollTrigger: { trigger: 'body', start: 'top top', end: 'bottom bottom', scrub: true } }); // ── Scroll Logo Pieces Journey ── @@ -401,7 +441,7 @@ const initScrollAnimations = () => { trigger: wrapper, start: 'bottom 30%', // recession begins when bottom of hero reaches 60% viewport end: 'bottom top', - scrub: 1, + scrub: true, } }); } @@ -411,7 +451,7 @@ const initScrollAnimations = () => { if (customersSection) { gsap.from('.customers-title', { y: 30, opacity: 0, - scrollTrigger: { trigger: customersSection, start: 'top 90%', end: 'top 55%', scrub: 1 } + scrollTrigger: { trigger: customersSection, start: 'top 90%', end: 'top 55%', scrub: true } }); } @@ -420,19 +460,19 @@ const initScrollAnimations = () => { if (heroSection) { gsap.from('.hero-badge', { y: 40, opacity: 0, - scrollTrigger: { trigger: heroSection, start: 'top 90%', end: 'top 50%', scrub: 1 } + scrollTrigger: { trigger: heroSection, start: 'top 90%', end: 'top 50%', scrub: true } }); gsap.from('.hero-title', { y: 80, opacity: 0, - scrollTrigger: { trigger: heroSection, start: 'top 88%', end: 'top 40%', scrub: 1 } + scrollTrigger: { trigger: heroSection, start: 'top 88%', end: 'top 40%', scrub: true } }); gsap.from('.hero-subtitle', { y: 100, opacity: 0, - scrollTrigger: { trigger: heroSection, start: 'top 85%', end: 'top 35%', scrub: 1 } + scrollTrigger: { trigger: heroSection, start: 'top 85%', end: 'top 35%', scrub: true } }); gsap.from('.hero-actions', { y: 60, opacity: 0, - scrollTrigger: { trigger: heroSection, start: 'top 80%', end: 'top 35%', scrub: 1 } + scrollTrigger: { trigger: heroSection, start: 'top 80%', end: 'top 35%', scrub: true } }); const statItems = heroSection.querySelectorAll('.stat-item'); @@ -450,7 +490,7 @@ const initScrollAnimations = () => { // Recession — only after scrolling well past gsap.to(heroSection, { opacity: 0.4, y: -30, - scrollTrigger: { trigger: heroSection, start: 'bottom 10%', end: 'bottom top', scrub: 1 } + scrollTrigger: { trigger: heroSection, start: 'bottom 10%', end: 'bottom top', scrub: true } }); } @@ -459,14 +499,14 @@ const initScrollAnimations = () => { if (demoSection) { gsap.from('.demo-header', { y: 50, opacity: 0, - scrollTrigger: { trigger: demoSection, start: 'top 88%', end: 'top 50%', scrub: 1 } + scrollTrigger: { trigger: demoSection, start: 'top 88%', end: 'top 50%', scrub: true } }); const demoContainer = document.querySelector('.demo-container'); if (demoContainer) { gsap.from(demoContainer, { scale: 0.88, opacity: 0, y: 60, - scrollTrigger: { trigger: demoContainer, start: 'top 90%', end: 'top 35%', scrub: 1 } + scrollTrigger: { trigger: demoContainer, start: 'top 90%', end: 'top 35%', scrub: true } }); } @@ -477,7 +517,7 @@ const initScrollAnimations = () => { gsap.to(demoSection, { opacity: 0.5, y: -20, - scrollTrigger: { trigger: demoSection, start: 'bottom 40%', end: 'bottom top', scrub: 1 } + scrollTrigger: { trigger: demoSection, start: 'bottom 40%', end: 'bottom top', scrub: true } }); } @@ -500,7 +540,7 @@ const initScrollAnimations = () => { if (ctaBox) { gsap.from(ctaBox, { y: 40, opacity: 0, scale: 0.96, - scrollTrigger: { trigger: ctaBox, start: 'top 90%', end: 'top 55%', scrub: 1 } + scrollTrigger: { trigger: ctaBox, start: 'top 90%', end: 'top 55%', scrub: true } }); } } @@ -512,7 +552,7 @@ const initScrollAnimations = () => { communitySection.querySelector('.community-badge'), communitySection.querySelector('.community-title'), communitySection.querySelector('.community-subtitle') || - communitySection.querySelector('.capabilities-subtitle'), + communitySection.querySelector('.capabilities-subtitle'), ].filter(Boolean); scrubEach(comHeaderEls, { y: 40, opacity: 0 }, communitySection, 88, 50, 4); @@ -527,7 +567,7 @@ const initScrollAnimations = () => { if (browserShell) { gsap.from(browserShell, { scale: 0.82, opacity: 0, y: 80, - scrollTrigger: { trigger: '.browser', start: 'top 90%', end: 'top 30%', scrub: 1 } + scrollTrigger: { trigger: '.browser', start: 'top 90%', end: 'top 30%', scrub: true } }); } @@ -546,31 +586,30 @@ const initScrollAnimations = () => { gsap.from(divider, { opacity: 0, scaleX: 0.3, - scrollTrigger: { trigger: divider, start: 'top 90%', end: 'top 70%', scrub: 1 } + scrollTrigger: { trigger: divider, start: 'top 90%', end: 'top 70%', scrub: true } }); }); }; const initVideoHandler = () => { - const wrapper = document.getElementById('video-wrapper'); - const btn = document.getElementById('play-button-trigger'); + const wrapper = document.getElementById('video-wrapper'); + const btn = document.getElementById('play-button-trigger'); - if (btn && wrapper) { - btn.addEventListener('click', () => { - const videoId = btn.getAttribute('data-video-id'); - wrapper.innerHTML = ` + if (btn && wrapper) { + btn.addEventListener('click', () => { + const videoId = btn.getAttribute('data-video-id'); + wrapper.innerHTML = ` `; - }); - } + }); + } }; document.addEventListener("DOMContentLoaded", () => { initMarquee(); - initScrollAnimations(); initVideoHandler(); const header = document.querySelector(".site-header"); @@ -583,17 +622,21 @@ document.addEventListener("DOMContentLoaded", () => { } }); +window.addEventListener("load", () => { + initScrollAnimations(); +}); + document.addEventListener("scroll", function () { - const btn = document.getElementById("button-scroll-to-up"); + const btn = document.getElementById("button-scroll-to-up"); - if (window.scrollY > 100) { - btn.classList.add("show"); - } else { - btn.classList.remove("show"); - } + if (window.scrollY > 100) { + btn.classList.add("show"); + } else { + btn.classList.remove("show"); + } }); document.getElementById("button-scroll-to-up").addEventListener("click", function (e) { - e.preventDefault(); - window.scrollTo({ top: 0, behavior: "smooth" }); + e.preventDefault(); + window.scrollTo({ top: 0, behavior: "smooth" }); }); \ No newline at end of file