Skip to content

v1.1.2#101

Merged
devakesu merged 15 commits intomainfrom
1.1.2
Mar 1, 2026
Merged

v1.1.2#101
devakesu merged 15 commits intomainfrom
1.1.2

Conversation

@devakesu
Copy link
Owner

@devakesu devakesu commented Mar 1, 2026

feat(scroll): improve section snap behavior across desktop and mobile

  • disable custom touch scroll interception on coarse-pointer devices
  • keep mobile/tablet on native smooth scrolling
  • harden desktop wheel/trackpad section snapping with cooldown + inertia handling
  • preserve keyboard-based section navigation
  • remove CSS/JS snap conflicts by disabling global CSS snap mode

chore(release): bump to v1.1.2 and refresh dependencies/docs

  • bump project version to 1.1.2
  • update dependencies
  • update README and SECURITY metadata/version dates

remove unused scroll-related constants and selector block in app/page.tsx

  • resolve eslint no-unused-vars errors
  • keep behavior unchanged; cleanup only

fix(deps): update eslint, autoprefixer, and @types/node versions
@devakesu
devakesu committed 1 minute ago

devakesu and others added 10 commits February 25, 2026 02:32
BREAKING / MIGRATION
- Rename all .js/.jsx source files to .ts/.tsx with full type annotations
- Remove jsconfig.json; add tsconfig.json (strict mode, Next.js plugin)
- Rename proxy.js → proxy.ts (CSP middleware)

FEATURES
- Add floating background icons (hardware: microchip/server/memory/HDD/
  database/network; trading: chart-line/bar/area/bitcoin; physics: atom)
  as fixed, GPU-composited, pointer-events-none layer (opacity 0.10–0.15)
- Add physics easter egg in footer (responsive font via clamp())
- Add RUNTIME_ENV: MEC Kochi line to footer terminal
- Add Galaxy Watch 4 to THE_ARSENAL panel

CI/CD
- Add Lighthouse CI job (guard → lighthouse → audit → build-push-sign)
  with lighthouserc.json: accessibility ≥0.9 error, perf/BP/SEO ≥0.9 warn
- Update dependabot: unified groups (all-dependencies / all-actions),
  ignore eslint ≥ 10 to keep v9 pinned for eslint-config-next compat

PERFORMANCE
- Reduce SCROLL_LOCK_DURATION 1100ms → 800ms (less input lag)
- Add will-change:transform + contain:layout style paint to FloatingBgIcons
  (promotes to own GPU compositor tile, prevents scroll paint invalidation)
- Add contain:layout style to .scroll-snap-section (isolates reflow)
- Restore production caching: remove force-dynamic/revalidate=0/fetchCache
  exports from layout.tsx (was disabling all caching in production)

SECURITY / DEPENDENCIES
- Add minimatch override ^10.2.2 (fixes 5 high CVEs in eslint-config-next
  dependency tree); npm audit now reports 0 vulnerabilities
- Pin eslint@9.39.1 (eslint@10 breaks eslint-config-next@16 plugin stack)

BUG FIXES
- Fix React hydration mismatch: move md:auto-rows-[minmax(18rem,1fr)] from
  JSX className to .explorer-grid CSS class (arbitrary Tailwind values with
  parens/commas were dropped inconsistently between SSR and client)
- Revert explorer card inner scrollbars (panels now expand naturally)
- Fix footer UTC+05:30 / deployed UTC suffix to stay single-line on mobile
- Fix min-h-[44px]/min-w-[44px] → min-h-11/min-w-11; h-[28rem]/w-[28rem]
  → h-112/w-md (eliminate Tailwind arbitrary-value lint warnings)
- Fix bare email links in README.md and SECURITY.md (MD034)
- Fix project structure code fence missing language tag (MD040)
- Fix bold-as-heading in README.md contact section (MD036)

DOCS
- Update README: version badge (v1.1.1), TypeScript 5.9 badge, React Icons
  badge; add floating icons feature; update file tree (.ts/.tsx, proxy.ts,
  tsconfig.json, lighthouserc.json, ErrorHandler.tsx); update tech stack;
  bump Last Updated to February 25 2026
* Initial plan

* fix: reformat layout.tsx with single quotes per Prettier config

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
… legal route layout (#93)

* Initial plan

* SEO improvements: layout.tsx, sitemap.ts, legal/layout.tsx

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

---------

Signed-off-by: Devanarayanan <fusion@devakesu.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
Co-authored-by: Devanarayanan <fusion@devakesu.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Devanarayanan <fusion@devakesu.com>
Signed-off-by: Devanarayanan <fusion@devakesu.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Devanarayanan <fusion@devakesu.com>
… CI to mobile preset (#94)

* Initial plan

* fix: remove global devNoCacheHeaders from /:path* and switch Lighthouse CI to mobile preset

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
* Initial plan

* fix: change Lighthouse CI preset from 'mobile' to 'desktop' to fix GH Actions job failure

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

* feat: add Lighthouse CI mobile testing alongside existing desktop testing

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

* fix: lower mobile Lighthouse performance threshold to 0.7 and document both config files in README

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

* fix: use distinct artifact names for desktop and mobile Lighthouse CI steps to prevent 409 conflict

Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
- disable custom touch scroll interception on coarse-pointer devices
- keep mobile/tablet on native smooth scrolling
- harden desktop wheel/trackpad section snapping with cooldown + inertia handling
- preserve keyboard-based section navigation
- remove CSS/JS snap conflicts by disabling global CSS snap mode

chore(release): bump to v1.1.2 and refresh dependencies/docs
- bump project version to 1.1.2
- update dependencies
- update README and SECURITY metadata/version dates
…ge.tsx

- resolve eslint no-unused-vars errors
- keep behavior unchanged; cleanup only

fix(deps): update eslint, autoprefixer, and @types/node versions
Copilot AI review requested due to automatic review settings March 1, 2026 18:43
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Release-focused PR that updates the site to v1.1.2 while improving scroll section snapping behavior across desktop/mobile, tightening analytics typing/validation, and refreshing project metadata/tooling (Lighthouse CI, docs, deps).

Changes:

  • Reworked section snapping logic (desktop wheel/trackpad cooldown + inertia handling; coarse-pointer devices use native scrolling; removed CSS snap conflicts).
  • Added/updated release + tooling assets (v1.1.2 version bump, Lighthouse CI configs + workflow job, docs/security metadata updates).
  • TypeScript/ESLint hardening across analytics, proxy middleware, and UI components.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tsconfig.json Adds/standardizes TS compiler configuration.
proxy.ts Types the proxy middleware request/response.
package.json Bumps version/deps; updates dev scripts; adds overrides.
package-lock.json Locks updated dependency graph.
next.config.mjs Refines headers/caching behavior with production toggle.
lighthouserc.json Adds Lighthouse CI desktop config.
lighthouserc.mobile.json Adds Lighthouse CI mobile config.
lib/legal.ts Introduces legal policy/terms/cookie notice content/constants.
lib/analytics.ts Adds TS typings for analytics event pipeline/helpers.
lib/analytics-config.ts Types isAnalyticsEnabled() return value.
jsconfig.json Removes JS path config (replaced by TS config).
eslint.config.mjs Adds typescript-eslint recommended rules + ignores.
components/ErrorHandler.tsx Types unhandled rejection event.
components/Analytics.tsx Tightens TS typings and error handling; typed hook return.
app/sitemap.ts Adds typed sitemap with stable lastModified dates.
app/sitemap.js Removes old JS sitemap implementation.
app/page.tsx Major scroll snap changes + UI/layout updates + background icons.
app/not-found.tsx Adds custom 404 page.
app/legal/page.tsx Improves markdown rendering typings for legal content.
app/legal/layout.tsx Adds route-level metadata for the legal page.
app/layout.tsx Updates global metadata + icon declarations + RootLayout typing.
app/globals.css Disables global CSS snap; tweaks layout containment/styles.
app/api/analytics/route.ts Strengthens TS types, origin/IP validation, and rate limiting types.
SECURITY.md Updates security contact formatting + version/date.
README.md Updates badges/docs for v1.1.2 + TS/Lighthouse/tooling notes.
.github/workflows/deploy.yml Adds Lighthouse CI job (desktop + mobile).
.github/dependabot.yml Changes Dependabot cadence/grouping/ignore rules.
Comments suppressed due to low confidence (7)

app/page.tsx:883

  • handlePanelKeyDown uses the React.KeyboardEvent type, but this file only imports named hooks from react and does not import the React namespace. With tsconfig.json using module syntax, this will fail type-checking with "Cannot find namespace 'React'". Prefer importing the needed event type from react (e.g., KeyboardEvent/ReactKeyboardEvent) or import type * as React from 'react' before referencing React.* types.
  const handlePanelKeyDown = useCallback(
    (event: React.KeyboardEvent<HTMLDivElement>, nodeId: NodeId) => {
      // Only handle keyboard events on the panel container itself, not on interactive children
      if (
        (event.key === "Enter" || event.key === " ") &&

app/page.tsx:923

  • The Tailwind classes h-112 and w-md are not part of Tailwind's default utilities, and this repo doesn't define custom spacing tokens in tailwind.config.js. This will result in these styles being silently ignored. Use arbitrary values (e.g., h-[28rem] w-[28rem]) or valid built-in sizing utilities instead.
          className="absolute -bottom-24 -right-24 h-112 w-md rounded-full bg-cyan-400/20 blur-3xl parallax-layer pointer-events-none hidden md:block"
          data-depth="0.25"
        >

app/page.tsx:937

  • Same issue here: h-112 / w-md are not valid Tailwind utilities in this codebase, so the glow blob will lose its intended sizing. Use valid Tailwind sizing (or h-[...] / w-[...]).
        <div className="absolute -top-24 -left-24 h-72 w-72 rounded-full bg-cyan-400/20 blur-3xl pointer-events-none">
        </div>
        <div className="absolute -bottom-24 -right-24 h-112 w-md rounded-full bg-cyan-400/20 blur-3xl pointer-events-none">
        </div>

app/page.tsx:793

  • This effect sets wheelLockTimeoutRef and scrollEndTimeoutRef, but the cleanup only clears unlockTimeoutRef. Those timeouts can still fire after unmount and keep references alive unnecessarily. Clear and null out wheelLockTimeoutRef.current and scrollEndTimeoutRef.current in the cleanup as well.
    return () => {
      window.removeEventListener("wheel", handleWheel);
      window.removeEventListener("keydown", handleKeyDown);
      window.removeEventListener("scroll", handleScroll);
      window.removeEventListener("resize", handleResize);

      if (unlockTimeoutRef.current) {
        clearTimeout(unlockTimeoutRef.current);
        unlockTimeoutRef.current = null;
      }

package.json:7

  • engine-strict=true is enabled in .npmrc, but package-lock.json now includes transitive deps that require Node ^20.19.0 (e.g., eslint-visitor-keys@5.0.1). With engines.node currently set to >=20.9.0, installs will fail for users on 20.9–20.18. Bump the minimum Node engine to >=20.19.0 (and consider aligning CI/runtime docs accordingly).
  "engines": {
    "node": ">=20.9.0"
  },

README.md:16

  • The README still advertises Tailwind CSS 4.1.18, but package.json in this PR bumps Tailwind to 4.2.1. Update this badge/version text to match the actual dependency version so docs stay accurate.
[![Next.js](https://img.shields.io/badge/Next.js-16.1.6-black?logo=next.js)](https://nextjs.org)
[![React](https://img.shields.io/badge/React-19.2-61DAFB?logo=react&logoColor=white)](https://react.dev)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind-4.1.18-38B2AC?logo=tailwind-css&logoColor=white)](https://tailwindcss.com)
[![Node.js](https://img.shields.io/badge/Node.js-20.x-339933?logo=node.js&logoColor=white)](https://nodejs.org)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
[![React Icons](https://img.shields.io/badge/React%20Icons-5.5-e91e63?logo=react&logoColor=white)](https://react-icons.github.io/react-icons/)

README.md:77

  • Tech stack section still says Tailwind CSS 4.1.18, but dependencies were updated to 4.2.1 in this PR. Update the version here as well to avoid drift.
- **Framework**: Next.js 16.1.6 (App Router)
- **Language**: TypeScript 5.9 (strict mode, full coverage)
- **Styling**: Tailwind CSS 4.1.18 (CSS-based configuration)
- **Fonts**: Space Grotesk, JetBrains Mono
- **Icons**: React Icons 5.5.0 (hardware, trading, physics, social)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

app/page.tsx:793

  • The effect cleanup clears unlockTimeoutRef, but it doesn't clear wheelLockTimeoutRef and scrollEndTimeoutRef. Those timeouts can still fire after the listener is removed/unmount happens, mutating refs and potentially causing unexpected scroll-state resets. Please clear both timeouts in the cleanup and set the refs back to null.
    return () => {
      window.removeEventListener("wheel", handleWheel);
      window.removeEventListener("keydown", handleKeyDown);
      window.removeEventListener("scroll", handleScroll);
      window.removeEventListener("resize", handleResize);

      if (unlockTimeoutRef.current) {
        clearTimeout(unlockTimeoutRef.current);
        unlockTimeoutRef.current = null;
      }

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Devanarayanan <fusion@devakesu.com>
Copilot AI review requested due to automatic review settings March 1, 2026 19:08
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (1)

app/page.tsx:796

  • The new scroll timers (wheelLockTimeoutRef / scrollEndTimeoutRef) are never cleared on effect cleanup. If the component unmounts while a timeout is pending, those callbacks will still run later (and keep the JS timers alive longer than needed). Clear both timeouts (and null the refs) in the cleanup block alongside unlockTimeoutRef.
      if (unlockTimeoutRef.current) {
        clearTimeout(unlockTimeoutRef.current);
        unlockTimeoutRef.current = null;
      }

      isAnimatingRef.current = false;
    };

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

app/page.tsx:810

  • The section-snap effect sets wheelLockTimeoutRef and scrollEndTimeoutRef, but the effect cleanup only clears unlockTimeoutRef. This can leave timers running after the effect is torn down (e.g., route change), which is avoidable and can cause hard-to-trace behavior. Clear both timeouts in the cleanup and set the refs back to null.
    return () => {
      window.removeEventListener("wheel", handleWheel);
      window.removeEventListener("keydown", handleKeyDown);
      window.removeEventListener("scroll", handleScroll);
      window.removeEventListener("resize", handleResize);

      if (unlockTimeoutRef.current) {
        clearTimeout(unlockTimeoutRef.current);
        unlockTimeoutRef.current = null;
      }

      isAnimatingRef.current = false;
    };

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@devakesu devakesu merged commit 60331cb into main Mar 1, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants