diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 72f8ea4..04f85ec 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -66,7 +66,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '20' + node-version: '20.19.0' - name: Install dependencies run: npm ci diff --git a/app/globals.css b/app/globals.css index 94382b2..b43b852 100644 --- a/app/globals.css +++ b/app/globals.css @@ -8,8 +8,8 @@ html { text-rendering: optimizeLegibility; } -/* Desktop-only scroll behavior — avoids killing iOS momentum / rubber-band scrolling */ -@media (pointer: fine) { +/* Desktop-only scroll behavior — avoids killing iOS momentum / rubber-band scrolling on touch/hybrid devices */ +@media (pointer: fine) and (not (any-pointer: coarse)) { html { scroll-behavior: smooth; /* Improve mouse wheel scrolling smoothness */ diff --git a/public/js/reactive-glow.js b/public/js/reactive-glow.js index 6265f20..b0e2000 100644 --- a/public/js/reactive-glow.js +++ b/public/js/reactive-glow.js @@ -48,9 +48,14 @@ ); // Skip scroll pulse effect on touch devices (causes jank during mobile scroll) - const isTouchDevice = + const hasAnyCoarsePointer = typeof window.matchMedia === 'function' && - window.matchMedia('(pointer: coarse)').matches; + window.matchMedia('(any-pointer: coarse)').matches; + const hasTouchPoints = + typeof navigator !== 'undefined' && + typeof navigator.maxTouchPoints === 'number' && + navigator.maxTouchPoints > 0; + const isTouchDevice = hasAnyCoarsePointer || hasTouchPoints; // Scroll velocity → pulse strength (throttled with rAF) if (!isTouchDevice) {