From 72b5fa7b855a4b115c3cc697aeb2076a0b1fb480 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 22:23:41 +0000 Subject: [PATCH 01/18] chore(deps): bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.2 to 15.3.4 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.2...v15.3.4) --- updated-dependencies: - dependency-name: next dependency-version: 15.3.4 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package-lock.json | 564 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 367 insertions(+), 199 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1e921f..3d0a20b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "i18next": "^24.2.3", "i18next-browser-languagedetector": "^8.1.0", "lucide-react": "^0.485.0", - "next": "^15.3.2", + "next": "^15.3.4", "react": "^19.1.0", "react-dom": "^19.1.0", "react-fast-marquee": "^1.6.5", @@ -31,14 +31,14 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.5", + "@tailwindcss/postcss": "^4.1.6", "@types/node": "^20.17.46", "@types/react": "^19.1.3", "@types/react-dom": "^19.1.3", "eslint": "^9.26.0", "eslint-config-next": "15.1.3", "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", + "tailwindcss": "^4.1.6", "typescript": "^5.8.3" } }, @@ -55,6 +55,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", @@ -736,6 +749,53 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", @@ -772,10 +832,9 @@ } }, "node_modules/@next/env": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz", - "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==", - "license": "MIT" + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.4.tgz", + "integrity": "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==" }, "node_modules/@next/eslint-plugin-next": { "version": "15.1.3", @@ -788,13 +847,12 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz", - "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.4.tgz", + "integrity": "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -804,13 +862,12 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz", - "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz", + "integrity": "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -820,13 +877,12 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz", - "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz", + "integrity": "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -836,13 +892,12 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz", - "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz", + "integrity": "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -852,13 +907,12 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz", - "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.4.tgz", + "integrity": "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -868,13 +922,12 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz", - "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.4.tgz", + "integrity": "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -884,13 +937,12 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz", - "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz", + "integrity": "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -900,13 +952,12 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz", - "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz", + "integrity": "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1088,51 +1139,56 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", "dev": true, - "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1142,14 +1198,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1159,14 +1214,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1176,14 +1230,13 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1193,14 +1246,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1210,14 +1262,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1227,14 +1278,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1244,14 +1294,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1261,14 +1310,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1278,9 +1326,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1293,13 +1341,12 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", + "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, @@ -1307,15 +1354,74 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.4.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.4.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.0", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1325,14 +1431,13 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1342,17 +1447,16 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.5.tgz", - "integrity": "sha512-5lAC2/pzuyfhsFgk6I58HcNy6vPK3dV/PoPxSDuOTVbDvCddYHzHiJZZInGIY0venvzzfrTEUAXJFULAfFmObg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", "dev": true, - "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", "postcss": "^8.4.41", - "tailwindcss": "4.1.5" + "tailwindcss": "4.1.11" } }, "node_modules/@tybys/wasm-util": { @@ -2362,6 +2466,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -2715,11 +2828,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -3801,8 +3913,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -4611,11 +4722,10 @@ } }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, - "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" }, @@ -4627,27 +4737,26 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -4661,14 +4770,13 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -4682,14 +4790,13 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "freebsd" @@ -4703,14 +4810,13 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -4724,14 +4830,13 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -4745,14 +4850,13 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -4766,14 +4870,13 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -4787,14 +4890,13 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -4808,14 +4910,13 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "win32" @@ -4829,14 +4930,13 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "win32" @@ -4893,6 +4993,15 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4996,6 +5105,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5055,12 +5200,11 @@ } }, "node_modules/next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz", - "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==", - "license": "MIT", + "version": "15.3.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.4.tgz", + "integrity": "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==", "dependencies": { - "@next/env": "15.3.2", + "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -5075,14 +5219,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.2", - "@next/swc-darwin-x64": "15.3.2", - "@next/swc-linux-arm64-gnu": "15.3.2", - "@next/swc-linux-arm64-musl": "15.3.2", - "@next/swc-linux-x64-gnu": "15.3.2", - "@next/swc-linux-x64-musl": "15.3.2", - "@next/swc-win32-arm64-msvc": "15.3.2", - "@next/swc-win32-x64-msvc": "15.3.2", + "@next/swc-darwin-arm64": "15.3.4", + "@next/swc-darwin-x64": "15.3.4", + "@next/swc-linux-arm64-gnu": "15.3.4", + "@next/swc-linux-arm64-musl": "15.3.4", + "@next/swc-linux-x64-gnu": "15.3.4", + "@next/swc-linux-x64-musl": "15.3.4", + "@next/swc-win32-arm64-msvc": "15.3.4", + "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { @@ -6371,10 +6515,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", - "license": "MIT" + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==" }, "node_modules/tailwindcss-animate": { "version": "1.0.7", @@ -6386,15 +6529,31 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -6844,6 +7003,15 @@ "dev": true, "license": "ISC" }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 15c0130..d43a153 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "i18next": "^24.2.3", "i18next-browser-languagedetector": "^8.1.0", "lucide-react": "^0.485.0", - "next": "^15.3.2", + "next": "^15.3.4", "react": "^19.1.0", "react-dom": "^19.1.0", "react-fast-marquee": "^1.6.5", From db86ce3277a671f615f52768ffcf2d761dc4bf47 Mon Sep 17 00:00:00 2001 From: Aidan Date: Tue, 8 Jul 2025 02:21:27 -0400 Subject: [PATCH 02/18] bug fixes, cleanup unmaintained pages, content changes, design improvements --- app/about/page.tsx | 93 +++++-- app/device/bonito/page.tsx | 200 ++++++++++++++ app/device/cheetah/page.tsx | 259 ++++++++++++++++++ app/music/page.tsx | 26 -- app/page.tsx | 11 - app/phone/page.tsx | 257 ----------------- app/time-periods/early-summer-2024/page.tsx | 15 - .../what-was-going-on/page.tsx | 15 - app/time-periods/late-summer-2024/page.tsx | 15 - .../what-was-going-on/page.tsx | 15 - components/Header.tsx | 26 +- components/objects/MusicInfo.tsx | 31 --- components/objects/RandomFooterMsg.tsx | 32 ++- .../early-summer-2024/WhatWasGoingOn.tsx | 27 -- .../late-summer-2024/WhatWasGoingOn.tsx | 26 -- components/widgets/FeaturedRepos.tsx | 19 +- components/widgets/Music.tsx | 127 --------- public/data/featured.json | 42 +-- public/data/music.json | 56 ---- public/img/bonito.png | Bin 0 -> 42345 bytes public/locales/en-US.json | 36 +-- 21 files changed, 614 insertions(+), 714 deletions(-) create mode 100644 app/device/bonito/page.tsx create mode 100644 app/device/cheetah/page.tsx delete mode 100644 app/music/page.tsx delete mode 100644 app/phone/page.tsx delete mode 100644 app/time-periods/early-summer-2024/page.tsx delete mode 100644 app/time-periods/early-summer-2024/what-was-going-on/page.tsx delete mode 100644 app/time-periods/late-summer-2024/page.tsx delete mode 100644 app/time-periods/late-summer-2024/what-was-going-on/page.tsx delete mode 100644 components/objects/MusicInfo.tsx delete mode 100644 components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx delete mode 100644 components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx delete mode 100644 components/widgets/Music.tsx delete mode 100644 public/data/music.json create mode 100644 public/img/bonito.png diff --git a/app/about/page.tsx b/app/about/page.tsx index f0b4fed..152572a 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -33,12 +33,12 @@ export default function About() {
-
+
+

+ {t('about.title')} +

-

- {t('about.title')} -

{mainStrings.map((section, index) => { @@ -60,15 +60,15 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(ihatenodejs|LibreCloud Git|aidan)/).map((part, i) => { + {text.split(/(ihatenodejs|p0ntus git|aidan)/).map((part, i) => { if (part === 'ihatenodejs') { - return GitHub + return ihatenodejs } - if (part === 'LibreCloud Git') { - return LibreCloud Git + if (part === 'p0ntus git') { + return p0ntus git } if (part === 'aidan') { - return aidan + return aidan } return part })} @@ -76,17 +76,17 @@ export default function About() { ))} {!imageError && (

- ihatenodejs's Stats setImageError(true)} loading="eager" priority unoptimized /> - ihatenodejs's Top Languages{mainSections[index]} {Object.entries(section).map(([key, value], index) => (
-

{key}

+

{key}

{(value as unknown as string[]).map((text: string, index: number) => (

- {text.split(/(KernelSU-Next|LineageOS microG)/).map((part, i) => { + {text.split(/(KernelSU-Next|LineageOS 22.2|Android 16|NixOS|Xubuntu)/).map((part, i) => { if (part === 'KernelSU-Next') { return KernelSU-Next } - if (part === 'LineageOS microG') { - return LineageOS microG + if (part === 'LineageOS 22.2') { + return LineageOS 22.2 + } + if (part === 'Android 16') { + return Android 16 + } + if (part === 'NixOS') { + return NixOS + } + if (part === 'Xubuntu') { + return Xubuntu } return part })}

))} - {key === "Phone" && ( -
)}
))} @@ -138,12 +153,18 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(my Gitea instance|my phone)/).map((part, i) => { - if (part === 'my Gitea instance') { - return my Gitea instance + {text.split(/(my Forgejo server|my phone|AfC|OnlyNano)/).map((part, i) => { + if (part === 'my Forgejo server') { + return my Forgejo server } if (part === 'my phone') { - return my phone + return my phone + } + if (part === 'AfC') { + return AfC + } + if (part === 'OnlyNano') { + return OnlyNano } return part })} @@ -157,9 +178,21 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(LibreCloud)/).map((part, i) => { - if (part === 'LibreCloud') { - return LibreCloud + {text.split(/(p0ntus|PontusHub|ABOCN|Kowalski|@KowalskiNodeBot)/).map((part, i) => { + if (part === 'p0ntus') { + return p0ntus + } + if (part === 'PontusHub') { + return PontusHub + } + if (part === 'ABOCN') { + return ABOCN + } + if (part === 'Kowalski') { + return Kowalski + } + if (part === '@KowalskiNodeBot') { + return @KowalskiNodeBot } return part })} diff --git a/app/device/bonito/page.tsx b/app/device/bonito/page.tsx new file mode 100644 index 0000000..cf95b1c --- /dev/null +++ b/app/device/bonito/page.tsx @@ -0,0 +1,200 @@ +import Header from "@/components/Header" +import Footer from "@/components/Footer" +import { + Cpu, + MemoryStick, + HardDrive, + Hash, + Hammer, + Music, + Folder, + Layers, +} from "lucide-react" +import { FaGoogle, FaYoutube } from "react-icons/fa" +import { VscTerminalLinux } from "react-icons/vsc" +import { MdOutlineAndroid } from "react-icons/md" +import { LuPackageOpen } from "react-icons/lu" +import { RiTelegram2Fill } from "react-icons/ri" +import Image from "next/image" +import Link from "@/components/objects/Link" + +export default function Bonito() { + return ( +

+
+
+
+
+
+ Google Pixel 3a XL (bonito) +
+
+
+

+ + Pixel 3a XL +

+

bonito

+
+
+
+
+

+ + Specs +

+
+

+ + Chipset: Qualcomm Snapdragon 670 +

+

+ + Storage: 64GB +

+

+ + RAM: 4GB +

+
+
+
+

+ + Modifications +

+
+

+ + Kernel Version: + 4.9.337 +

+

+ + ROM: + + LineageOS 22.2 + +

+

+ + Root: + + Magisk + +

+
+
+
+
+
+

+ + Apps +

+
+

+ + Music: + + Poweramp + +

+

+ + Files: + + MiXplorer Beta + +

+

+ + Telegram Client: + + Nekogram + +

+

+ + YouTube: + + Tubular + +

+
+
+
+

+ + Modules +

+
    +
  • + + bindhosts + +
  • +
  • + + Magisk iOS Emoji + +
  • +
+
+
+
+
+
+
+
+
+
+ ) +} + diff --git a/app/device/cheetah/page.tsx b/app/device/cheetah/page.tsx new file mode 100644 index 0000000..f6d21e6 --- /dev/null +++ b/app/device/cheetah/page.tsx @@ -0,0 +1,259 @@ +import Header from "@/components/Header" +import Footer from "@/components/Footer" +import { + Cpu, + MemoryStick, + HardDrive, + Hash, + Hammer, + Music, + Folder, + Layers, + SquarePen +} from "lucide-react" +import { FaGoogle, FaYoutube } from "react-icons/fa" +import { VscTerminalLinux } from "react-icons/vsc" +import { MdOutlineAndroid } from "react-icons/md" +import { LuPackageOpen } from "react-icons/lu" +import { RiTelegram2Fill } from "react-icons/ri" +import Image from "next/image" +import Link from "@/components/objects/Link" +import { FaStarHalfStroke, FaStar } from "react-icons/fa6" + +export default function Cheetah() { + return ( +
+
+
+
+
+
+ Google Pixel 7 Pro (cheetah) +
+
+
+

+ + Pixel 7 Pro +

+

cheetah

+
+
+
+
+

+ + Specs +

+
+

+ + CPU: Google Tensor G2 +

+

+ + Storage: 128GB +

+

+ + RAM: 12GB +

+
+
+
+

+ + Modifications +

+
+

+ + Kernel: + 6.1.129-android14 +

+

+ + ROM: + + Android 16 QPR1 + +

+

+ + Root: + + KernelSU-Next + +

+
+
+
+
+
+

+ + Apps +

+
+

+ + Music: + + Qobuz + +

+

+ + Files: + + MiXplorer Beta + +

+

+ + TG Client: + + AyuGram + +

+

+ + YouTube: + + ReVanced Extended + +

+
+
+
+

+ + Modules +

+
    +
  • + + Tricky Store + +
  • +
  • + + Yurikey Manager + +
  • +
  • + + Shamiko + +
  • +
  • + + LSPosed JingMatrix + +
  • +
  • + + Zygisk Next + +
  • +
+
+
+
+
+

+ + Review +

+
+

+ Rating: + + + +

+
+

+ Coming from a Galaxy A32 5G, the Pixel 7 Pro is a massive upgrade. The Tensor chip is highly performant, and with 12GB of RAM, the device is extremely snappy. +

+

+ I have had some issues with battery, although this may be due to Play Integrity Fix, which is known to consume battery. However, the camera has been a massive improvement, and the photos it is capable of taking are amazing. +

+

+ While the volume buttons did fall off, I do not discredit them for this, as Android makes it easy to have customizable on-screen volume buttons, something iPhones do not have. +

+
+
+
+
+
+
+
+
+
+
+
+ ) +} + diff --git a/app/music/page.tsx b/app/music/page.tsx deleted file mode 100644 index dacb362..0000000 --- a/app/music/page.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import Header from '@/components/Header' -import MusicWidget from '@/components/widgets/Music' -import MusicInfo from '@/components/objects/MusicInfo' -import Footer from '@/components/Footer' -import { Music as MusicNote } from "lucide-react"; - -export default function Music() { - return ( -
-
-
-
- -
-

- Music and Me -

-
- - -
-
-
-
- ) -} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 2df63fe..9f23faa 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,7 +3,6 @@ import Header from '@/components/Header' import Footer from '@/components/Footer' import Button from '@/components/objects/Button' -import Link from '@/components/objects/Link' import LastPlayed from '@/components/widgets/NowPlaying' import Image from 'next/image' import { CreditCard, Mail, PillBottle, Scale } from 'lucide-react' @@ -53,15 +52,6 @@ export default function Home() { {mainStrings[secIndex].map((text: string, index: number) => (

{text} - {secIndex === 2 && index === 2 && ( - <> - {' '} - - CVE-2025-29927 - - . - - )}

))} @@ -80,7 +70,6 @@ export default function Home() {

{t('home.donation.title')}

{t('home.donation.description')}

-

{t('home.donation.charities.title')}

- ) -} - diff --git a/app/time-periods/early-summer-2024/page.tsx b/app/time-periods/early-summer-2024/page.tsx deleted file mode 100644 index 15869fd..0000000 --- a/app/time-periods/early-summer-2024/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import Header from '@/components/Header' -import WhatWasGoingOn from '@/components/pages/time-periods/early-summer-2024/WhatWasGoingOn' -import Footer from '@/components/Footer' - -export default function EarlySummer2024() { - return ( -
-
-
- -
-
-
- ) -} \ No newline at end of file diff --git a/app/time-periods/early-summer-2024/what-was-going-on/page.tsx b/app/time-periods/early-summer-2024/what-was-going-on/page.tsx deleted file mode 100644 index 31a9ee4..0000000 --- a/app/time-periods/early-summer-2024/what-was-going-on/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import Header from '@/components/Header' -import WhatWasGoingOn from '@/components/pages/time-periods/early-summer-2024/WhatWasGoingOn' -import Footer from '@/components/Footer' - -export default function Music() { - return ( -
-
-
- -
-
-
- ) -} \ No newline at end of file diff --git a/app/time-periods/late-summer-2024/page.tsx b/app/time-periods/late-summer-2024/page.tsx deleted file mode 100644 index d45de92..0000000 --- a/app/time-periods/late-summer-2024/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import Header from '@/components/Header' -import WhatWasGoingOn from '@/components/pages/time-periods/late-summer-2024/WhatWasGoingOn' -import Footer from '@/components/Footer' - -export default function LateSummer2024() { - return ( -
-
-
- -
-
-
- ) -} \ No newline at end of file diff --git a/app/time-periods/late-summer-2024/what-was-going-on/page.tsx b/app/time-periods/late-summer-2024/what-was-going-on/page.tsx deleted file mode 100644 index 353e524..0000000 --- a/app/time-periods/late-summer-2024/what-was-going-on/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import Header from '@/components/Header' -import WhatWasGoingOn from '@/components/pages/time-periods/late-summer-2024/WhatWasGoingOn' -import Footer from '@/components/Footer' - -export default function Music() { - return ( -
-
-
- -
-
-
- ) -} \ No newline at end of file diff --git a/components/Header.tsx b/components/Header.tsx index 4c8efbd..68cc54e 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -2,7 +2,18 @@ import React, { useState, useRef, useEffect } from 'react' import Link from 'next/link' -import { House, Link as LinkIcon, User, Phone, BookOpen, Music, Rss, X, Menu, Globe, ChevronDown } from 'lucide-react' +import { + House, + Link as LinkIcon, + User, + Phone, + BookOpen, + Rss, + X, + Menu, + Globe, + ChevronDown +} from 'lucide-react' import { useTranslation } from 'react-i18next' interface NavItemProps { @@ -25,7 +36,7 @@ const LanguageSelector = () => { const [isOpen, setIsOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); const dropdownRef = useRef(null); - + const languages = [ { code: 'en-US', name: 'English' }, ]; @@ -34,7 +45,7 @@ const LanguageSelector = () => { const checkMobile = () => { setIsMobile(window.innerWidth < 1024); }; - + checkMobile(); window.addEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile); @@ -77,7 +88,7 @@ const LanguageSelector = () => { return (
- {isOpen && ( -
Contact Domains Manifesto - Music Blog
diff --git a/components/objects/MusicInfo.tsx b/components/objects/MusicInfo.tsx deleted file mode 100644 index 450cf8e..0000000 --- a/components/objects/MusicInfo.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import Button from './Button'; - -interface TimePeriod { - title: string; - slug: string; -} - -const timePeriods: TimePeriod[] = [ - { title: 'Late Summer 2024', slug: 'late-summer-2024' }, - { title: 'Early Summer 2024', slug: 'early-summer-2024' }, -]; - -const MusicInfo: React.FC = () => { - return ( -
- {timePeriods.map((period) => ( -
-

{period.title}

-
- ))} -
- ); -}; - -export default MusicInfo; - diff --git a/components/objects/RandomFooterMsg.tsx b/components/objects/RandomFooterMsg.tsx index 41a86a4..5a5a4a4 100644 --- a/components/objects/RandomFooterMsg.tsx +++ b/components/objects/RandomFooterMsg.tsx @@ -1,14 +1,16 @@ +"use client" + import { SiNextdotjs, SiLucide, SiVercel, - SiCloudflarepages, SiSimpleicons, SiFontawesome, SiShadcnui, SiTailwindcss } from "react-icons/si" import Link from 'next/link' +import { useState, useEffect } from 'react' export const footerMessages = [ [ @@ -31,11 +33,6 @@ export const footerMessages = [ "https://vercel.com/font", ], - [ - "Hosted by Cloudflare", - "https://workers.cloudflare.com/", - - ], [ "Icons by Font Awesome", "https://fontawesome.com/", @@ -54,11 +51,30 @@ export const footerMessages = [ ] export default function RandomFooterMsg() { - const randomIndex = Math.floor(Math.random() * footerMessages.length) + const [randomIndex, setRandomIndex] = useState(0) + const [isMounted, setIsMounted] = useState(false) + + useEffect(() => { + setIsMounted(true) + setRandomIndex(Math.floor(Math.random() * footerMessages.length)) + }, []) + + if (!isMounted) { + const [message, url, icon] = footerMessages[0] + return ( + +
+ {icon} + {message} +
+ + ) + } + const [message, url, icon] = footerMessages[randomIndex] return ( - +
{icon} {message} diff --git a/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx b/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx deleted file mode 100644 index 6689389..0000000 --- a/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react' -import BackButton from '@/components/objects/BackButton' - -const WhatWasGoingOnLateSummer2024: React.FC = () => { - return ( -
-

- What was going on during the start of summer 2024? -

-
-

- During Early Summer 2024, I was walking a ton in towns all across Massachusetts. During this time, I would listen to a lot of music. I regret not finding out about LastFM for so long... During this time, I was always happy, especially when I had music or a YouTube video playing. I would also call my friends often during this time. -

-

Context

-

- This summer was the one where I came back from my abusive treatment center. I was finally free from the place that had been holding me back for so long. So as you can imagine, I felt free as a bird. -

-

- With this chance to explore, being in so many different towns, I really had a good time and made good memories, which I will not be writing about. -

- -
-
- ); -}; - -export default WhatWasGoingOnLateSummer2024; \ No newline at end of file diff --git a/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx b/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx deleted file mode 100644 index 9f5b03c..0000000 --- a/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' -import BackButton from '@/components/objects/BackButton' - -const WhatWasGoingOnLateSummer2024: React.FC = () => { - return ( -
-

- What was going on during the end of summer 2024? -

-
-

- During late summer 2024, my depression and the "after effects" of treatment really kicked in. I had quit going to my therapist as I didn't feel like they were doing much of anything for me. I am very happy to say that since I quit my therapist, I have been doing much better. -

-

- At this time, the baseball season was over, so I was walking around much less. I was still listening to a lot of music and I started getting into less depressed songs. I was also starting to get into more "normal" music, which was an interesting phase (which I believe I'm still in). -

-

- A highlight of late summer 2024 was a vacation I took. This vacation has entire albums which remind me of it and I will always cherish those memories deeply. -

- -
-
- ); -}; - -export default WhatWasGoingOnLateSummer2024; diff --git a/components/widgets/FeaturedRepos.tsx b/components/widgets/FeaturedRepos.tsx index 36e76ab..7dc5ef6 100644 --- a/components/widgets/FeaturedRepos.tsx +++ b/components/widgets/FeaturedRepos.tsx @@ -1,9 +1,8 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faGitAlt, faGithub } from '@fortawesome/free-brands-svg-icons' -import { faStar, faCodeBranch } from '@fortawesome/free-solid-svg-icons' -import featuredProjects from '@/public/data/featured.json' -import Link from 'next/link' -import { cn } from '@/lib/utils' +import { SiGithub, SiForgejo } from "react-icons/si" +import { TbStar, TbGitBranch } from "react-icons/tb" +import featuredProjects from "@/public/data/featured.json" +import Link from "next/link" +import { cn } from "@/lib/utils" export default function GitHubFeatured({ className }: { className?: string }) { return ( @@ -11,16 +10,16 @@ export default function GitHubFeatured({ className }: { className?: string }) { {featuredProjects.map((project) => (
-

- {project.name} +

+ {project.github ? : } {project.name}

{project.description}

View Repo
- {project.stars} - {project.forks} + {project.stars} + {project.forks}
diff --git a/components/widgets/Music.tsx b/components/widgets/Music.tsx deleted file mode 100644 index ca3dce3..0000000 --- a/components/widgets/Music.tsx +++ /dev/null @@ -1,127 +0,0 @@ -"use client" - -import { useState, useEffect } from "react" -import Image from "next/image" -import { Play, SkipBack, SkipForward } from "lucide-react" -import LoadingSpinner from "../objects/LoadingSpinner" -import { SeekBar } from "@/components/objects/SeekBar" - -interface Song { - albumArt: string - name: string - artist: string - duration: string - link?: string -} - -interface Period { - timePeriod: string - songs: Song[] -} - -export default function Home() { - const [timePeriod, setTimePeriod] = useState("Early Summer 2024") - const [songs, setSongs] = useState([]) - const [currentIndex, setCurrentIndex] = useState(0) - const [isLoading, setIsLoading] = useState(true) - const [currentPosition, setCurrentPosition] = useState(0) - - useEffect(() => { - setIsLoading(true) - fetch("/data/music.json") - .then((response) => response.json()) - .then((data: Period[]) => { - const selectedPeriod = data.find((period) => period.timePeriod === timePeriod) - const songsList = selectedPeriod ? selectedPeriod.songs : [] - setSongs(songsList) - const newIndex = Math.floor(Math.random() * songsList.length) - setCurrentIndex(newIndex) - // Set initial random position for the selected song - if (songsList.length > 0) { - const durationInSeconds = parseDuration(songsList[newIndex]?.duration || "0:00") - setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) - } - setIsLoading(false) - }) - .catch((error) => { - console.error("Error fetching music data:", error) - setIsLoading(false) - }) - }, [timePeriod]) - - const handleNext = () => { - setCurrentIndex((prevIndex) => { - const nextIndex = (prevIndex + 1) % songs.length - const durationInSeconds = parseDuration(songs[nextIndex].duration) - setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) - return nextIndex - }) - } - - const handlePrevious = () => { - setCurrentIndex((prevIndex) => { - const nextIndex = (prevIndex - 1 + songs.length) % songs.length - const durationInSeconds = parseDuration(songs[nextIndex].duration) - setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) - return nextIndex - }) - } - - const parseDuration = (duration: string): number => { - const [minutes, seconds] = duration.split(":").map(Number) - return minutes * 60 + seconds - } - - return ( -
- -
- ) -} - diff --git a/public/data/featured.json b/public/data/featured.json index f28b2ea..807371e 100644 --- a/public/data/featured.json +++ b/public/data/featured.json @@ -4,35 +4,35 @@ "name": "aidxnCC", "description": "aidxnCC is the third version of my personal website", "github": false, - "url": "https://git.pontusmail.org/aidan/aidxnCC", - "stars": 2, - "forks": 1 + "url": "https://git.p0ntus.com/aidan/aidxnCC", + "stars": 1, + "forks": 0 }, { "id": 2, - "name": "librecloud/web", + "name": "abocn/TelegramBot", "description": "Landing page for p0ntus mail", - "github": false, - "url": "https://git.pontusmail.org/librecloud/web", + "github": true, + "url": "https://github.com/abocn/TelegramBot", + "stars": 13, + "forks": 6 + }, + { + "id": 3, + "name": "mail-connect", + "description": "API bridge for docker-mailserver", + "github": true, + "url": "https://github.com/ihatenodejs/mail-connect", "stars": 0, "forks": 0 }, - { - "id": 3, - "name": "modules", - "description": "An open-source Magisk module and FOSS app store", - "github": false, - "url": "https://git.pontusmail.org/aidan/modules", - "stars": 3, - "forks": 0 - }, { "id": 4, - "name": "AndroidIntegrity/website", - "description": "AIA website source code", - "github": true, - "url": "https://github.com/AndroidIntegrity/website", - "stars": 6, - "forks": 1 + "name": "pontus/pontus-front", + "description": "The frontend and API for p0ntus, my free privacy-focused service provider", + "github": false, + "url": "https://git.p0ntus.com/pontus/pontus-front", + "stars": 1, + "forks": 0 } ] diff --git a/public/data/music.json b/public/data/music.json deleted file mode 100644 index 8c01d75..0000000 --- a/public/data/music.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "timePeriod": "Early Summer 2024", - "songs": [ - { - "albumArt": "https://p0ntus.com/archives/img/noticeme.png", - "name": "Notice Me", - "artist": "tobi lou feat. MIA GLADSTONE", - "duration": "2:35", - "link": "https://www.last.fm/music/tobi+lou/Notice+Me" - }, - { - "albumArt": "https://p0ntus.com/archives/img/comforttexas.webp", - "name": "comfort, texas", - "artist": "Buppy.", - "duration": "2:11", - "link": "https://www.last.fm/music/Buppy./comfort,+texas" - }, - { - "albumArt": "https://p0ntus.com/archives/img/nonperishable.webp", - "name": "Jelly", - "artist": "tobi lou", - "duration": "1:50", - "link": "https://www.last.fm/music/tobi+lou/_/Jelly" - }, - { - "albumArt": "https://p0ntus.com/archives/img/exes.webp", - "name": "exes", - "artist": "Tate McRae", - "duration": "2:39", - "link": "https://www.last.fm/music/Tate+McRae/exes/exes" - }, - { - "albumArt": "https://p0ntus.com/archives/img/ick.webp", - "name": "Ick", - "artist": "Lay Bankz", - "duration": "1:55", - "link": "https://www.last.fm/music/Lay+Bankz/_/Ick" - }, - { - "albumArt": "https://p0ntus.com/archives/img/nani.webp", - "name": "NANi", - "artist": "Saweetie", - "duration": "2:34", - "link": "https://www.last.fm/music/Saweetie/Nani" - }, - { - "albumArt": "https://p0ntus.com/archives/img/killerloverboy.webp", - "name": "killer lover boy", - "artist": "SEB", - "duration": "2:14", - "link": "https://www.last.fm/music/Seb/_/killer+lover+boy" - } - ] - } - ] \ No newline at end of file diff --git a/public/img/bonito.png b/public/img/bonito.png new file mode 100644 index 0000000000000000000000000000000000000000..4b418e7f68f0324791b91cb09566b773596a592e GIT binary patch literal 42345 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

tmI>a33`!E(NSK1M|qg=(Vy4G#Ku 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 z z?YG_fvEeY=8jVJ{T(QPtO?ysc9_A53)#YtwiuVfBdV4z)UUT`Z^}p#g@1{lzTp65q zIPVw^mdFMJciU|@ef)}d+G7em0d|Z#4;=lzCGFRaQ+`B-8A6*iDSB z>zLfD2DK#7mETt0dA#!+KYpC$rR66N9lG`lSG?06Q|Jk>W4!f!@7uiX_LIMI;J^U| zm`o-`AuCMRu`TK{wkf4fD^ z#b2=Iuq}?eoAYXWA13*P(P+fJeJk8{^0r_9sh|3(J_Ec5=m~HSaQ7{D{Q99IhrfQ} z#Pv+_NvQHSc4pRaCrfCj4C*4=zgp4kw|zBP%DX{n1y{Ooc2LW15_^IXgEbcKJzHB_ zWH#g4>#k+rzI|uj@%Fd<8y4z&>9Je%1h@zI;h*}cwQqmJoBr3M#}4PqOUvXg$9Y$j z#avD|!z>cK+T=ISGMk0gE|3;WXcj@d`cb)+b|@0B{-8BKyWHiB$775!EH5u}^vF@Y z^Ugc}#gG2z`<~pRlm2s$o&fg<_ncq<(5*M$@@sdVyaRx(tu4mm=~m(0$Up5CuO`c| zs%tmTqWxyVygJ9W^_xE+s*3ZD$z+1d9huEIdGaL3k6-hr?|IMn{d0OdQ}59L00iVo zL_t*RZ_n_}^b`9{hu`^~-#PZt4}bV04?q6!TORuQ*V*3QM#M544udjC;VM<-pnNMy z%(5DGLbYwKZCN_rZcy(eiB?+0 zW3pX+Ce`z?#)8k8x83@+JMX-c(P)G*u)V#_c$^o7!oXZN^3`fFwbcO@*6)4G_xyM7|GA(0;;v7)$F9)# z0`D>Y=KJ6Ojeq|uzxWeIop}=`E znUGI%M#B^r4sP#_H=Vfj-S^)6_b;yhPrpU)`tCV;7x*gSL%;SbH~sNv@B6n;Jo(fQ zJo?xZa{BaHa-TH)k|hz8QBs*nQ~02**LPlaxM`W}=ngJ`CNZ~Vwv9D-=Pxta(-2Fz z!r{qDeYyF6b@`6xGv^wrF72%Srx>5A;&O+v<+ud#j{W=hbH^QbaO~RSFTM49-uCzY z!T<0NKZNw;cQw!x;8ny&Kl<-hKmW-G|Hp@)c;e^JoIQK!iKm`n?fg0NNhCRI$ZS^J zEagm*dVSn1RBz_0^m=ny8!^s8+TOcZ^VcHnz8i>0p>AyKv=qK+7+gj&y!xs2s-)9A z-|C!_w(BgC5GI^U?(!Xz7>Uf=)@hp)QhnWK(_KK`dor6b7!J7U`V*YE_F8}a_1Ay; z-tYaM|Ndux_V0eB^(1=i33>v&%21I1`pI%5F_G~iDm>}^t0KLR>9N`N=)9YX`|aPqpKGqUh64xp>5(Ic zpML%8UjNVDaQ!X6@|WNL{);=FM32tV6W}X^PkiDZXU{%+;tgN^%2$8#<(E(WrHxCM zPHt{)E=?vm-YL!pt7kHq%p^mYjxjZfp}Ad?q~^JR>DbAwRn^kPjmN0Eywm%u6P)u7 zYwS#-st9Tqlk!xxHKQFY!#W|&bMc$jv`Cnwmn^(l*FTFO)k~{LZF+7j46*@(;ef$l zz;HO!<>lp#BZrSXc*|`!|Htoo^BaHjz3+YBi>*8FvFGRs@Ku2O@Bf{ZC!f4{$K#Jb z{GDgk&fhuS9=~>bd%Ute9_!ZTM#v0Ekd3Ma@l{1~mj`9`%AoWFuMQC_*2oA&bDwWp zGhi~=#w%EpB$}vf({M>8Ov|uYhRcI>7N?LDk7=1PMvOH}0vW=kz+26)SdimS|BHxd z<)XxdxT13|&Ipdg;?lK+RedoruW6BiF}8Y$IwZKO)*G~44EE# ahyNc}Y(#HfMa;VZ0000 Date: Sat, 2 Aug 2025 02:39:24 -0400 Subject: [PATCH 03/18] refactor/feat: ipod nano 7g-style now playing component, discontinue fontawesome, content updates - redesign NowPlaying widget with iPod Nano 7th generation-inspired UI - content updates (home, about) - general code cleanup - bump deps, clean up - update README for self hosting - remove old workflows --- .gitea/workflows/lint.yml | 30 --- .gitea/workflows/push.yml | 41 --- README.md | 27 +- app/about/page.tsx | 28 +- app/contact/page.tsx | 79 +++--- app/domains/page.tsx | 20 +- app/manifesto/page.tsx | 12 +- app/page.tsx | 66 +++-- components/objects/BackButton.tsx | 24 -- components/objects/Button.tsx | 46 ++-- components/objects/ContactButton.tsx | 26 -- components/objects/MusicText.tsx | 37 +++ components/objects/ScrollTxt.tsx | 47 ---- components/widgets/NowPlaying.tsx | 373 ++++++++++++++++++--------- package.json | 37 ++- public/locales/en-US.json | 32 +-- tailwind.config.ts | 1 - 17 files changed, 466 insertions(+), 460 deletions(-) delete mode 100644 .gitea/workflows/lint.yml delete mode 100644 .gitea/workflows/push.yml delete mode 100644 components/objects/BackButton.tsx delete mode 100644 components/objects/ContactButton.tsx create mode 100644 components/objects/MusicText.tsx delete mode 100644 components/objects/ScrollTxt.tsx diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml deleted file mode 100644 index cf3ac00..0000000 --- a/.gitea/workflows/lint.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Run ESLint - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - lint: - name: Run ESLint - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '23' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Run ESLint - run: npm run lint diff --git a/.gitea/workflows/push.yml b/.gitea/workflows/push.yml deleted file mode 100644 index 0ff437f..0000000 --- a/.gitea/workflows/push.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Credits to https://docs.github.com/en/actions/use-cases-and-examples/publishing-packages/publishing-docker-images - -name: Push to Docker Hub - -on: - push: - branches: - - main - -jobs: - push_to_registry: - name: Push Docker image to Docker Hub - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - steps: - - name: Check out the repo - uses: actions/checkout@v4 - - - name: Log in to Docker Hub - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 - with: - images: p0ntus/aidxncc - - - name: Build and push Docker image - id: push - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 - with: - context: . - file: ./Dockerfile - push: true - tags: p0ntus/aidxncc:latest - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/README.md b/README.md index db7bed3..3a3fe14 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,19 @@ # aidxnCC [![License: Unlicense](https://img.shields.io/badge/license-Unlicense-blue.svg)](http://unlicense.org/) -[![Build Status](https://git.pontusmail.org/aidan/aidxnCC/actions/workflows/push.yml/badge.svg)](https://git.pontusmail.org/aidan/aidxnCC/actions/?workflow=push.yml) -[![ESLint Status](https://git.pontusmail.org/aidan/aidxnCC/actions/workflows/lint.yml/badge.svg)](https://git.pontusmail.org/aidan/aidxnCC/actions/?workflow=lint.yml) aidxnCC is the third version of my personal website. It's built with Next.js and Tailwind CSS. aidxnCC will always be a work in progress, though completely functional. -## Deploy +## Deploy with Docker -### Vercel +Docker is the easiest way to deploy aidxnCC. There are two example `docker-compose.yml` files for you to use. -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fihatenodejs%2FaidxnCC&env=BRAINZ_USER_AGENT,LISTENBRAINZ_TOKEN&envDescription=You%20will%20need%20both%20a%20custom%20user%20agent%20(for%20identifying%20yourself%20to%20MusicBrainz)%2C%20and%20a%20ListenBrainz%20User%20Token.%20See%20the%20README%20for%20more%20information.&envLink=https%3A%2F%2Fgithub.com%2Fihatenodejs%2FaidxnCC&project-name=aidxn-cc&repository-name=aidxnCC) +1. `docker-compose.yml` - Default, exposed on port 3000 +2. `docker-compose.nginx.yml` - Helpful for NGINX Proxy Manager usage w/ Docker networks -To deploy with Vercel, simply click the button above. When prompted for environment variables, see the section below. - -### Cloudflare - -I currently host aidxnCC on Cloudflare Pages. They currently don't have a "Deploy to Cloudflare" button for Pages, but you can setup like so: - -1. Fork `aidxnCC` to your own account -2. Deploy to Pages from your fork - -> [!NOTE] -> Make sure to set your environment variables (see below!) -> -> You may also have to set the `nodejs_compat` compatibility flag in the Pages settings. - -### Self-Host - -**Own a server? Deploy on your own!** F*** SaaS, check out [Coolify](https://coolify.io/), a free and open-source alternative to Vercel. +Just create a `.env` file with the below variables, run `docker compose -d --build`, and you'll be all set. ## Contributing diff --git a/app/about/page.tsx b/app/about/page.tsx index 152572a..9427cef 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -33,9 +33,11 @@ export default function About() {

-
- -

+
+
+ +
+

{t('about.title')}

@@ -109,7 +111,7 @@ export default function About() {

{key}

{(value as unknown as string[]).map((text: string, index: number) => (

- {text.split(/(KernelSU-Next|LineageOS 22.2|Android 16|NixOS|Xubuntu)/).map((part, i) => { + {text.split(/(KernelSU-Next|LineageOS 22.2|Android 16|Xubuntu)/).map((part, i) => { if (part === 'KernelSU-Next') { return KernelSU-Next } @@ -119,8 +121,8 @@ export default function About() { if (part === 'Android 16') { return Android 16 } - if (part === 'NixOS') { - return NixOS + if (part === 'OpenCore') { + return OpenCore } if (part === 'Xubuntu') { return Xubuntu @@ -133,14 +135,16 @@ export default function About() {

)}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx index 0edfd2f..ee209ba 100644 --- a/app/contact/page.tsx +++ b/app/contact/page.tsx @@ -2,11 +2,11 @@ import Header from '@/components/Header' import Footer from '@/components/Footer' -import ContactButton from '@/components/objects/ContactButton' +import Button from '@/components/objects/Button' import { Phone } from 'lucide-react' import { useTranslation } from 'react-i18next' -import { faPhone, faEnvelope } from '@fortawesome/free-solid-svg-icons' -import { faGithub, faTelegram, faBluesky, faXTwitter } from '@fortawesome/free-brands-svg-icons' +import { SiGithub, SiForgejo, SiTelegram } from 'react-icons/si' +import { Mail, Smartphone } from 'lucide-react' export default function Contact() { const { t } = useTranslation(); @@ -23,56 +23,65 @@ export default function Contact() { ]; const contactButtonLabels = [ - t('contact.buttons.github'), - t('contact.buttons.telegram'), - t('contact.buttons.bluesky'), - t('contact.buttons.x'), - t('contact.buttons.phone'), - t('contact.buttons.email') + "ihatenodejs", + "aidan", + "p0ntu5", + "+1 802-416-9516", + "aidan@p0ntus.com", ]; const contactButtonHrefs = [ "https://github.com/ihatenodejs", + "https://git.p0ntus.com/aidan", "https://t.me/p0ntu5", - "https://bsky.app/profile/aidxn.cc", - "https://x.com/ihatenodejs", "tel:+18024169516", "mailto:aidan@p0ntus.com" ]; - const contactButtonIcons = [faGithub, faTelegram, faBluesky, faXTwitter, faPhone, faEnvelope]; + const contactButtonIcons = [ + , + , + , + , + + ]; return (
-
- +
+
+ +
+

+ {t('contact.title')} +

-

- {t('contact.title')} -

-
- {contactButtonLabels.map((label, index) => ( - - ))} -
- - {sections.map((section, sectionIndex) => ( -
-

{section.title}

- {section.texts.map((text, index) => ( -

{text}

+
+
+ {contactButtonLabels.map((label, index) => ( + ))}
- ))} + {sections.map((section, sectionIndex) => ( +
+

{section.title}

+ {section.texts.map((text, index) => ( +

{text}

+ ))} +
+ ))} +
diff --git a/app/domains/page.tsx b/app/domains/page.tsx index 63bb165..185c65c 100644 --- a/app/domains/page.tsx +++ b/app/domains/page.tsx @@ -1,8 +1,7 @@ import Header from '@/components/Header' import Footer from '@/components/Footer' import { Link } from "lucide-react" -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import { faBan } from "@fortawesome/free-solid-svg-icons" +import { TbCurrencyDollarOff } from "react-icons/tb"; import domains from "@/public/data/domains.json" export default function Domains() { @@ -11,17 +10,16 @@ export default function Domains() {
-
- +
+
+ +
+

+ My Domains +

-

- My Domains -

- + These domains are not for sale. diff --git a/app/manifesto/page.tsx b/app/manifesto/page.tsx index ab93ff3..5e63e38 100644 --- a/app/manifesto/page.tsx +++ b/app/manifesto/page.tsx @@ -8,12 +8,14 @@ export default function Manifesto() {
-
- +
+
+ +
+

+ Internet Manifesto +

-

- Internet Manifesto -

1. Empathy and Understanding diff --git a/app/page.tsx b/app/page.tsx index 9f23faa..1942c84 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -42,8 +42,18 @@ export default function Home() {

-
- +
+
+
+
+
+ LIVE +
+
+
+
+ +
{mainSections.map((section, secIndex) => ( @@ -62,9 +72,10 @@ export default function Home() {

{t('home.contact.description')}

@@ -73,39 +84,44 @@ export default function Home() {

{t('home.donation.charities.title')}

{t('home.donation.donate.title')}

diff --git a/components/objects/BackButton.tsx b/components/objects/BackButton.tsx deleted file mode 100644 index f1cf8be..0000000 --- a/components/objects/BackButton.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import Link from 'next/link'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faArrowLeft } from '@fortawesome/free-solid-svg-icons'; - -interface BackButtonProps { - href: string; - label?: string; -} - -const BackButton: React.FC = ({ href, label = 'Back' }) => { - return ( - - - {label} - - ); -}; - -export default BackButton; \ No newline at end of file diff --git a/components/objects/Button.tsx b/components/objects/Button.tsx index db6693d..8d3caf6 100644 --- a/components/objects/Button.tsx +++ b/components/objects/Button.tsx @@ -1,30 +1,40 @@ import React from 'react' import Link from 'next/link' -import { cn } from '@/lib/utils' interface ButtonProps { href: string - label: string - icon?: React.ElementType target?: string + variant?: "primary" | "rounded" className?: string + icon?: React.ReactNode + children: React.ReactNode } -const Button: React.FC = ({ href, label, icon, target, className }) => { - return ( - - {icon && React.createElement(icon, { size: 20, className: "mr-2" })} - {label} - - ) +const Button: React.FC = ({ href, target, variant, className, icon, children }) => { + if (!variant || variant === "primary") { + return ( + + {icon} + {children} + + ) + } else if (variant === "rounded") { + return ( + + {icon} + {children} + + ) + } } export default Button \ No newline at end of file diff --git a/components/objects/ContactButton.tsx b/components/objects/ContactButton.tsx deleted file mode 100644 index 53000cc..0000000 --- a/components/objects/ContactButton.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { IconDefinition } from '@fortawesome/fontawesome-svg-core' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import Link from 'next/link'; - -interface ContactButtonProps { - href: string; - icon: IconDefinition; - label: string; - className?: string; -} - -function ContactButton({ href, icon, label, className }: ContactButtonProps) { - return ( - - - {label} - - ) -} - -export default ContactButton; \ No newline at end of file diff --git a/components/objects/MusicText.tsx b/components/objects/MusicText.tsx new file mode 100644 index 0000000..4131b6c --- /dev/null +++ b/components/objects/MusicText.tsx @@ -0,0 +1,37 @@ +"use client" + +import type React from "react" + +interface ScrollTxtProps { + text: string + className?: string + type?: 'artist' | 'track' | 'release' +} + +const ScrollTxt: React.FC = ({ text, className = "", type }) => { + const getTypeClass = (type?: string) => { + switch(type) { + case 'artist': + return 'text-white text-xs opacity-90 font-medium text-[8px]' + case 'track': + return 'text-white text-xs font-bold' + case 'release': + return 'text-white text-xs opacity-90 font-medium text-[8px]' + default: + return '' + } + } + + const textClass = getTypeClass(type) + + return ( +
+
+ {text} +
+
+ ) +} + +export default ScrollTxt + diff --git a/components/objects/ScrollTxt.tsx b/components/objects/ScrollTxt.tsx deleted file mode 100644 index ea5b898..0000000 --- a/components/objects/ScrollTxt.tsx +++ /dev/null @@ -1,47 +0,0 @@ -"use client" - -import type React from "react" -import { useEffect, useRef, useState } from "react" - -interface ScrollTxtProps { - text: string - className?: string -} - -const ScrollTxt: React.FC = ({ text, className = "" }) => { - const containerRef = useRef(null) - const textRef = useRef(null) - const [shouldScroll, setShouldScroll] = useState(false) - - useEffect(() => { - if (containerRef.current && textRef.current) { - const containerWidth = containerRef.current.offsetWidth - const textWidth = textRef.current.offsetWidth - setShouldScroll(textWidth > containerWidth) - } - }, []) // Updated dependency array - - return ( -
-
- {shouldScroll ? ( - <> - {text} - - {text} - - {text} - - ) : ( - text - )} -
-
- ) -} - -export default ScrollTxt - diff --git a/components/widgets/NowPlaying.tsx b/components/widgets/NowPlaying.tsx index a9c98c9..275c125 100644 --- a/components/widgets/NowPlaying.tsx +++ b/components/widgets/NowPlaying.tsx @@ -1,13 +1,17 @@ "use client" import type React from "react" -import { useEffect, useState, useCallback, useRef } from "react" +import { useEffect, useState, useCallback } from "react" import Image from "next/image" -import { Music, ExternalLink, Disc, User, Loader2, AlertCircle } from "lucide-react" -import { TbDiscOff, TbDisc } from "react-icons/tb" -import Marquee from "react-fast-marquee" +import { Loader2, AlertCircle } from "lucide-react" +import { PiMusicNotesFill } from "react-icons/pi"; +import { FaBluetoothB } from "react-icons/fa6"; +import { IoBatteryFullSharp } from "react-icons/io5" +import { IoIosPlay } from "react-icons/io" +import { TbDiscOff } from "react-icons/tb" import { Progress } from "@/components/ui/progress" import Link from "@/components/objects/Link" +import ScrollTxt from "@/components/objects/MusicText" interface Track { track_name: string @@ -16,34 +20,6 @@ interface Track { mbid?: string } -const ScrollableText: React.FC<{ text: string; className?: string }> = ({ text, className = "" }) => { - const containerRef = useRef(null) - const [shouldScroll, setShouldScroll] = useState(false) - - useEffect(() => { - if (containerRef.current) { - setShouldScroll(containerRef.current.scrollWidth > containerRef.current.clientWidth) - console.log("[i] text width checked: ", containerRef.current.scrollWidth, containerRef.current.clientWidth) - } - }, [containerRef]) - - if (shouldScroll) { - console.log("✅ scrolling is active") - return ( - -
{text}
- -
- ) - } - - return ( -
-
{text}
-
- ) -} - const NowPlaying: React.FC = () => { const [track, setTrack] = useState(null) const [coverArt, setCoverArt] = useState(null) @@ -52,6 +28,9 @@ const NowPlaying: React.FC = () => { const [error, setError] = useState(null) const [progress, setProgress] = useState(0) const [steps, setSteps] = useState(0) + const [currentTime, setCurrentTime] = useState(new Date()) + const [volume, setVolume] = useState(25) + const [screenOn, setScreenOn] = useState(true) const updateProgress = useCallback((current: number, total: number, status: string) => { setProgress(current) @@ -141,112 +120,260 @@ const NowPlaying: React.FC = () => { fetchNowPlaying() }, [fetchNowPlaying]) - if (loading) { - console.log("[LastPlayed] Loading state rendered") - return ( -
-
- -

Fetching music data...

-
- 0 ? (progress * 100) / steps : 0} className="mb-4" /> -
-

- {loadingStatus} {steps > 0 && `(${progress}/${steps})`} -

-
-
- ) + useEffect(() => { + const timer = setInterval(() => { + setCurrentTime(new Date()) + }, 1000) + return () => clearInterval(timer) + }, []) + + const formatTime = (date: Date) => { + return date.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true + }) } - if (error) { - console.log("[LastPlayed] Error state rendered") - return ( -
-

Now Playing

-
- -

{error}

+ const renderScreenContent = () => { + if (loading) { + return ( +
+ +
+
{loadingStatus}
+ 0 ? (progress * 100) / steps : 0} className="h-1" /> +
-
- ) - } + ) + } - if (!track) { - console.log("[LastPlayed] Hidden due to no track data") - return ( -
-
- -

Nothing's playing right now

+ if (error) { + return ( +
+ +
{error}
-
-

Can you believe it? I'm not listening to anything on ListenBrainz right now! If you're in the mood, feel free to check out my ListenBrainz.

-
-
- ) - } + ) + } - console.log("[LastPlayed] Rendered track:", track.track_name) - return ( -
-
- -

Now Playing

-
-
- {coverArt ? ( -
+ if (!track) { + return ( +
+ +
+ Nothing playing +
+
+ Check my ListenBrainz +
+
+ ) + } + + // normal state + const currentTrack = track!; + return ( + <> + +
+ + + {currentTrack.release_name && } +
+
+ {/* Album art */} +
+ {coverArt ? ( {track.track_name} -
- ) : ( -
- -
- )} -
-
- - -
- {track.release_name && ( -
- - + ) : ( +
+
)} -
- - +
+ {/* Player controls and seekbar */} +
+
+ +
+ +
+ +
+
+
+
+
+ setVolume(Number(e.target.value))} className="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" /> +
- - - View on MusicBrainz -
-
-
-
-
-

- LIVE data provided by ListenBrainz -

+ + ) + } + + return ( +
+
+ {/* Volume buttons */} +
+
setVolume(v => Math.min(100, v + 5))}>
{/* up */} +
{/* play/pause */} +
setVolume(v => Math.max(0, v - 5))}>
{/* down */} +
+ {/* Top power button */} +
setScreenOn(prev => !prev)}>
+ {/* White bezel (fuses screen+home btn) */} +
+ {/* Virtual screen */} +
+ {screenOn && ( +
+
+ +
{formatTime(currentTime)}
+
+ + +
+
+
+ )} + {screenOn ? renderScreenContent() : ( +
+ )} + {/* Player controls and seekbar */} + {screenOn && track && ( +
+
+ +
+ +
+ +
+
+
+
+
+ setVolume(Number(e.target.value))} className="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" /> +
+
+
+ )} +
+ {/* Home button */} +
+
+
+
+
-

- Last updated: {new Date().toLocaleString()} -

) diff --git a/package.json b/package.json index 15c0130..459aff5 100644 --- a/package.json +++ b/package.json @@ -9,38 +9,33 @@ "lint": "next lint" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-brands-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-fontawesome": "^0.2.2", - "@radix-ui/react-progress": "^1.1.6", + "@radix-ui/react-progress": "^1.1.7", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "geist": "^1.4.2", "i18next": "^24.2.3", - "i18next-browser-languagedetector": "^8.1.0", + "i18next-browser-languagedetector": "^8.2.0", "lucide-react": "^0.485.0", - "next": "^15.3.2", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-fast-marquee": "^1.6.5", - "react-i18next": "^15.5.1", + "next": "^15.4.5", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-i18next": "^15.6.1", "react-icons": "^5.5.0", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", - "tw-animate-css": "^1.2.9" + "tw-animate-css": "^1.3.6" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.6", - "@types/node": "^20.17.46", - "@types/react": "^19.1.3", - "@types/react-dom": "^19.1.3", - "eslint": "^9.26.0", + "@tailwindcss/postcss": "^4.1.11", + "@types/node": "^20.19.9", + "@types/react": "^19.1.9", + "@types/react-dom": "^19.1.7", + "eslint": "^9.32.0", "eslint-config-next": "15.1.3", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.6", - "typescript": "^5.8.3" + "postcss": "^8.5.6", + "tailwindcss": "^4.1.11", + "typescript": "^5.9.2" }, "trustedDependencies": [ "sharp", diff --git a/public/locales/en-US.json b/public/locales/en-US.json index 65c849a..cbabc75 100644 --- a/public/locales/en-US.json +++ b/public/locales/en-US.json @@ -1,20 +1,20 @@ { "home": { "whoAmI": [ - "Hey there! My name is Aidan, and I'm a systems administrator, full-stack developer, and student from the United States. I primarily work with Linux, Docker, Next.js, and Node.js.", - "I primarily focus on Linux system administration with a few servers I run for myself and others. I enjoy working on web development projects on the side, most of which are Unlicensed/CC0.", + "Hey there! My name is Aidan, and I'm a systems administrator, full-stack developer, and student from the United States. I primarily work with Linux, Docker, Next.js, Tailwind CSS and TypeScript.", + "My favorite projects and hobbies include web development and SysAdmin. Most of my work is released into the public domain.", + "I'm also a huge advocate for AI, and it's practical applications to programming and life itself. I am fond of open-source models the most, specifically Qwen3!", "When I'm not programming, I can be found re-flashing my phone with a new custom ROM and jumping between projects." ], "whatIDo": [ - "I'm at my best when I'm doing system administration, which is what I'd say I have the most experience and familiarity with.", - "I host a variety of public-access services and websites on my VPS, most of which can be found on my \"Domains\" page with a short description.", - "My biggest project is LibreCloud, a cloud services provider which I self-host and maintain. It features most services you would find from large companies like Google, although everything is free and open-source.", - "I frequently write and work on a website hosted on a public Linux server, known as a \"tilde.\"" + "I'm at my best when I'm doing system administration and development in TypeScript. I frequently implement AI into my workflow.", + "I manage three servers, including a mailserver (against my better judgement). I'm also crazy enough to self-host LLMs running on CPU.", + "My biggest project is p0ntus, a cloud services provider which I self-host and maintain. It features most services you would find from large companies like Google, although everything is free and open-source." ], "whereYouAre": [ - "I am not here to brag about my accomplishments or plug my cool SaaS product. That's why I've made every effort to make this website as personal and fun as possible.", + "I am not here to brag about my accomplishments or plug my shitty SaaS. That's why I've made every effort to make this website as personal and fun as possible.", "I hope you find this website an interesting place to find more about me, but also learn something new, and inspire a new project or two.", - "In a technical sense, this site is hosted on my NY1 dedicated server, hosted by ColoCrossing out of Buffalo, New York." + "In a technical sense, this site is hosted on my dedicated server hosted in Buffalo, New York by ColoCrossing." ], "sections": { "whoIAm": "Who I am", @@ -23,7 +23,7 @@ }, "contact": { "title": "Send me a message", - "description": "Feel free to reach out for feedback, collaborations, or just a hello :)", + "description": "Feel free to reach out for feedback, collaborations, or just a hello! I aim to answer all of my messages in a timely fashion, but please have patience.", "button": "Contact Me" }, "donation": { @@ -67,14 +67,6 @@ "If you need to get in touch with me, please send me a message on Telegram or an email. I will provide my actual phone number if you have a valid reason." ] } - }, - "buttons": { - "github": "ihatenodejs", - "telegram": "@p0ntu5", - "x": "@ihatenodejs", - "bluesky": "@aidxn.cc", - "phone": "(802) 416-9516", - "email": "aidan@p0ntus.com" } }, "about": { @@ -90,6 +82,7 @@ "projects": [ "I have worked on countless projects over the past five years, for the most part. I started learning to code with Python when I was seven and my interest has only evolved from there. I got into web development due to my uncle, who taught my how to write my first lines of HTML.", "Recently, I have been involved in developing several projects, especially with TypeScript, which is my new favorite language as of a year ago. My biggest project currently is p0ntus, a free service provider for privacy-focused individuals.", + "You will also come to find that I have an addiction to Docker! Almost every project I've made is able to be run in Docker.", "Me and my developer friends operate an organization called ABOCN, where we primarily maintain a Telegram bot called Kowalski. You can find it on Telegram as @KowalskiNodeBot.", "I have learned system administration from the past three years of learning Linux for practical use and fun. I currently operate four servers running in the cloud, ran out of Canada, Germany, and the United States.", "I own a channel called PontusHub on Telegram, where I post updates about my projects, along with commentary and info about my projects related to the Android rooting community." @@ -108,8 +101,9 @@ "I also have a Google Pixel 3a XL (bonito) which I use as a secondary device. It runs LineageOS 22.2 and is also rooted with KernelSU-Next." ], "Laptops": [ - "I use a Lenovo Thinkpad T470s with NixOS unstable as my daily driver. I've had it for about a year now, and it's been a great experience. At the time of writing, I am using KDE Plasma as my desktop environment.", - "I also own two MacBook Airs (2015 and 2013 base model) and a HP Chromebook used as a secondary devices. The 2013 runs unsupported macOS Sequoia Beta, the 2015 runs Xubuntu, and the Chromebook runs Arch Linux." + "I currently daily-drive with a 16-inch MacBook Pro with an M4 Max, 64GB of memory, 2TB of storage, 16 core CPU, and a 40 core GPU.", + "I use a Lenovo Thinkpad T470s with macOS Sequoia (using OpenCore) as my \"side piece,\" if you will. I've had it for about a year now, and it's been a great experience.", + "I also own two MacBook Airs (2015 and 2013 base models) and an HP Chromebook, used as secondary devices. The 2013 runs unsupported macOS Sequoia Beta, the 2015 runs Xubuntu, and the Chromebook runs Arch Linux." ] }, "contributions": [ diff --git a/tailwind.config.ts b/tailwind.config.ts index 667e618..e193912 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -6,7 +6,6 @@ const config: Config = { content: [ "app/**/*.{ts,tsx}", "components/**/*.{ts,tsx}", - "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}", "*.{js,ts,jsx,tsx,mdx}", From 82b102cdfbda7772a4c427e9baa23bcbd8a74c85 Mon Sep 17 00:00:00 2001 From: Aidan Date: Sat, 2 Aug 2025 02:49:52 -0400 Subject: [PATCH 04/18] hf: add lockfile for docker --- package-lock.json | 2300 +++++++++++++++++++-------------------------- 1 file changed, 959 insertions(+), 1341 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1e921f..912450d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,38 +8,33 @@ "name": "aidxncc", "version": "0.1.0", "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-brands-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-fontawesome": "^0.2.2", - "@radix-ui/react-progress": "^1.1.6", + "@radix-ui/react-progress": "^1.1.7", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "geist": "^1.4.2", "i18next": "^24.2.3", - "i18next-browser-languagedetector": "^8.1.0", + "i18next-browser-languagedetector": "^8.2.0", "lucide-react": "^0.485.0", - "next": "^15.3.2", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-fast-marquee": "^1.6.5", - "react-i18next": "^15.5.1", + "next": "^15.4.5", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-i18next": "^15.6.1", "react-icons": "^5.5.0", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", - "tw-animate-css": "^1.2.9" + "tw-animate-css": "^1.3.6" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^20.17.46", - "@types/react": "^19.1.3", - "@types/react-dom": "^19.1.3", - "eslint": "^9.26.0", + "@tailwindcss/postcss": "^4.1.11", + "@types/node": "^20.19.9", + "@types/react": "^19.1.9", + "@types/react-dom": "^19.1.7", + "eslint": "^9.32.0", "eslint-config-next": "15.1.3", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "^5.8.3" + "postcss": "^8.5.6", + "tailwindcss": "^4.1.11", + "typescript": "^5.9.2" } }, "node_modules/@alloc/quick-lru": { @@ -55,10 +50,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -77,9 +86,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "license": "MIT", "optional": true, "dependencies": { @@ -140,9 +149,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -155,9 +164,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -165,9 +174,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -202,13 +211,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", - "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", + "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -222,77 +234,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz", - "integrity": "sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", - "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", - "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -360,9 +314,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", "cpu": [ "arm64" ], @@ -378,13 +332,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "@img/sharp-libvips-darwin-arm64": "1.2.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", "cpu": [ "x64" ], @@ -400,13 +354,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "@img/sharp-libvips-darwin-x64": "1.2.0" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", "cpu": [ "arm64" ], @@ -420,9 +374,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", "cpu": [ "x64" ], @@ -436,9 +390,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", "cpu": [ "arm" ], @@ -452,9 +406,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", "cpu": [ "arm64" ], @@ -468,9 +422,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", "cpu": [ "ppc64" ], @@ -484,9 +438,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", "cpu": [ "s390x" ], @@ -500,9 +454,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", "cpu": [ "x64" ], @@ -516,9 +470,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", "cpu": [ "arm64" ], @@ -532,9 +486,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", "cpu": [ "x64" ], @@ -548,9 +502,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", "cpu": [ "arm" ], @@ -566,13 +520,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "@img/sharp-libvips-linux-arm": "1.2.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", "cpu": [ "arm64" ], @@ -588,13 +542,35 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "@img/sharp-libvips-linux-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", "cpu": [ "s390x" ], @@ -610,13 +586,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "@img/sharp-libvips-linux-s390x": "1.2.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", "cpu": [ "x64" ], @@ -632,13 +608,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "@img/sharp-libvips-linux-x64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", "cpu": [ "arm64" ], @@ -654,13 +630,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", "cpu": [ "x64" ], @@ -676,20 +652,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", "cpu": [ "wasm32" ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.0" + "@emnapi/runtime": "^1.4.4" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -698,10 +674,29 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", "cpu": [ "ia32" ], @@ -718,9 +713,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", "cpu": [ "x64" ], @@ -736,26 +731,56 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", - "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.3", - "eventsource": "^3.0.2", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@napi-rs/wasm-runtime": { @@ -772,9 +797,9 @@ } }, "node_modules/@next/env": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz", - "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.5.tgz", + "integrity": "sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -788,9 +813,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz", - "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.5.tgz", + "integrity": "sha512-84dAN4fkfdC7nX6udDLz9GzQlMUwEMKD7zsseXrl7FTeIItF8vpk1lhLEnsotiiDt+QFu3O1FVWnqwcRD2U3KA==", "cpu": [ "arm64" ], @@ -804,9 +829,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz", - "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.5.tgz", + "integrity": "sha512-CL6mfGsKuFSyQjx36p2ftwMNSb8PQog8y0HO/ONLdQqDql7x3aJb/wB+LA651r4we2pp/Ck+qoRVUeZZEvSurA==", "cpu": [ "x64" ], @@ -820,9 +845,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz", - "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.5.tgz", + "integrity": "sha512-1hTVd9n6jpM/thnDc5kYHD1OjjWYpUJrJxY4DlEacT7L5SEOXIifIdTye6SQNNn8JDZrcN+n8AWOmeJ8u3KlvQ==", "cpu": [ "arm64" ], @@ -836,9 +861,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz", - "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.5.tgz", + "integrity": "sha512-4W+D/nw3RpIwGrqpFi7greZ0hjrCaioGErI7XHgkcTeWdZd146NNu1s4HnaHonLeNTguKnL2Urqvj28UJj6Gqw==", "cpu": [ "arm64" ], @@ -852,9 +877,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz", - "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.5.tgz", + "integrity": "sha512-N6Mgdxe/Cn2K1yMHge6pclffkxzbSGOydXVKYOjYqQXZYjLCfN/CuFkaYDeDHY2VBwSHyM2fUjYBiQCIlxIKDA==", "cpu": [ "x64" ], @@ -868,9 +893,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz", - "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.5.tgz", + "integrity": "sha512-YZ3bNDrS8v5KiqgWE0xZQgtXgCTUacgFtnEgI4ccotAASwSvcMPDLua7BWLuTfucoRv6mPidXkITJLd8IdJplQ==", "cpu": [ "x64" ], @@ -884,9 +909,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz", - "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.5.tgz", + "integrity": "sha512-9Wr4t9GkZmMNcTVvSloFtjzbH4vtT4a8+UHqDoVnxA5QyfWe6c5flTH1BIWPGNWSUlofc8dVJAE7j84FQgskvQ==", "cpu": [ "arm64" ], @@ -900,9 +925,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz", - "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.5.tgz", + "integrity": "sha512-voWk7XtGvlsP+w8VBz7lqp8Y+dYw/MTI4KeS0gTVtfdhdJ5QwhXLmNrndFOin/MDoCvUaLWMkYKATaCoUkt2/A==", "cpu": [ "x64" ], @@ -994,12 +1019,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", - "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.2" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -1017,13 +1042,13 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.6.tgz", - "integrity": "sha512-QzN9a36nKk2eZKMf9EBCia35x3TT+SOgZuzQBVIHyRrmYYi73VYBRK3zKwdJ6az/F5IZ6QlacGJBg7zfB85liA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", "license": "MIT", "dependencies": { "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.2" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -1041,9 +1066,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -1072,12 +1097,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -1088,46 +1107,54 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", "dev": true, "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", "cpu": [ "arm64" ], @@ -1142,9 +1169,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", "cpu": [ "arm64" ], @@ -1159,9 +1186,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", "cpu": [ "x64" ], @@ -1176,9 +1203,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", "cpu": [ "x64" ], @@ -1193,9 +1220,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", "cpu": [ "arm" ], @@ -1210,9 +1237,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", "cpu": [ "arm64" ], @@ -1227,9 +1254,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", "cpu": [ "arm64" ], @@ -1244,9 +1271,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", "cpu": [ "x64" ], @@ -1261,9 +1288,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", "cpu": [ "x64" ], @@ -1278,9 +1305,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1299,7 +1326,7 @@ "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", + "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, @@ -1308,9 +1335,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", "cpu": [ "arm64" ], @@ -1325,9 +1352,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", "cpu": [ "x64" ], @@ -1342,17 +1369,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.5.tgz", - "integrity": "sha512-5lAC2/pzuyfhsFgk6I58HcNy6vPK3dV/PoPxSDuOTVbDvCddYHzHiJZZInGIY0venvzzfrTEUAXJFULAfFmObg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", "postcss": "^8.4.41", - "tailwindcss": "4.1.5" + "tailwindcss": "4.1.11" } }, "node_modules/@tybys/wasm-util": { @@ -1388,19 +1415,19 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.46.tgz", - "integrity": "sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==", + "version": "20.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/react": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz", - "integrity": "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", + "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1408,79 +1435,24 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz", - "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", + "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz", - "integrity": "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.32.0", - "@typescript-eslint/type-utils": "8.32.0", - "@typescript-eslint/utils": "8.32.0", - "@typescript-eslint/visitor-keys": "8.32.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.0.tgz", - "integrity": "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.32.0", - "@typescript-eslint/types": "8.32.0", - "@typescript-eslint/typescript-estree": "8.32.0", - "@typescript-eslint/visitor-keys": "8.32.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.0.tgz", - "integrity": "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.0", - "@typescript-eslint/visitor-keys": "8.32.0" + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1490,34 +1462,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.0.tgz", - "integrity": "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.32.0", - "@typescript-eslint/utils": "8.32.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.0.tgz", - "integrity": "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", "dev": true, "license": "MIT", "engines": { @@ -1528,122 +1476,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.0.tgz", - "integrity": "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.32.0", - "@typescript-eslint/visitor-keys": "8.32.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.0.tgz", - "integrity": "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.32.0", - "@typescript-eslint/types": "8.32.0", - "@typescript-eslint/typescript-estree": "8.32.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.0.tgz", - "integrity": "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1894,24 +1735,10 @@ "win32" ] }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2199,27 +2026,6 @@ "dev": true, "license": "MIT" }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2244,27 +2050,6 @@ "node": ">=8" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2362,6 +2147,16 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -2441,63 +2236,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2642,16 +2380,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -2690,13 +2418,6 @@ "node": ">= 0.4" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2704,20 +2425,10 @@ "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2902,13 +2613,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2923,24 +2627,23 @@ } }, "node_modules/eslint": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", - "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", + "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.13.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.26.0", - "@eslint/plugin-kit": "^0.2.8", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", - "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -2948,9 +2651,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2964,8 +2667,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "zod": "^3.24.2" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -3013,6 +2715,380 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-config-next/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/eslint-config-next/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -3257,9 +3333,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3274,9 +3350,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3287,15 +3363,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3350,98 +3426,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventsource": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", - "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3529,24 +3513,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3601,26 +3567,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3914,23 +3860,6 @@ "void-elements": "3.1.0" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/i18next": { "version": "24.2.3", "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", @@ -3963,27 +3892,14 @@ } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.1.0.tgz", - "integrity": "sha512-mHZxNx1Lq09xt5kCauZ/4bsXOEA2pfpwSoU11/QTJB+pD94iONFwp+ohqi///PwiFvjFOxe1akYCdHyFo1ng5Q==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4021,13 +3937,6 @@ "node": ">=0.8.19" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -4043,16 +3952,6 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4303,13 +4202,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4501,6 +4393,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4611,9 +4504,9 @@ } }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -4627,22 +4520,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -4661,9 +4554,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -4682,9 +4575,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -4703,9 +4596,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -4724,9 +4617,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -4745,9 +4638,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -4766,9 +4659,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -4787,9 +4680,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -4808,9 +4701,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -4829,9 +4722,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -4876,6 +4769,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4893,6 +4787,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4903,29 +4807,6 @@ "node": ">= 0.4" } }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4950,29 +4831,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4996,6 +4854,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5044,26 +4941,14 @@ "dev": true, "license": "MIT" }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz", - "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==", + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/next/-/next-15.4.5.tgz", + "integrity": "sha512-nJ4v+IO9CPmbmcvsPebIoX3Q+S7f6Fu08/dEWu0Ttfa+wVwQRh9epcmsyCPjmL2b8MxC+CkBR97jgDhUUztI3g==", "license": "MIT", "dependencies": { - "@next/env": "15.3.2", - "@swc/counter": "0.1.3", + "@next/env": "15.4.5", "@swc/helpers": "0.5.15", - "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -5075,19 +4960,19 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.2", - "@next/swc-darwin-x64": "15.3.2", - "@next/swc-linux-arm64-gnu": "15.3.2", - "@next/swc-linux-arm64-musl": "15.3.2", - "@next/swc-linux-x64-gnu": "15.3.2", - "@next/swc-linux-x64-musl": "15.3.2", - "@next/swc-win32-arm64-msvc": "15.3.2", - "@next/swc-win32-x64-msvc": "15.3.2", - "sharp": "^0.34.1" + "@next/swc-darwin-arm64": "15.4.5", + "@next/swc-darwin-x64": "15.4.5", + "@next/swc-linux-arm64-gnu": "15.4.5", + "@next/swc-linux-arm64-musl": "15.4.5", + "@next/swc-linux-x64-gnu": "15.4.5", + "@next/swc-linux-x64-musl": "15.4.5", + "@next/swc-win32-arm64-msvc": "15.4.5", + "@next/swc-win32-x64-msvc": "15.4.5", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", @@ -5140,6 +5025,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5258,29 +5144,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5362,16 +5225,6 @@ "node": ">=6" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5399,16 +5252,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5428,16 +5271,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -5449,9 +5282,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -5469,7 +5302,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5491,6 +5324,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5498,20 +5332,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5522,22 +5342,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5559,70 +5363,34 @@ ], "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-fast-marquee": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.5.tgz", - "integrity": "sha512-swDnPqrT2XISAih0o74zQVE2wQJFMvkx+9VZXYYNSLb/CUcAzU9pNj637Ar2+hyRw6b4tP6xh4GQZip2ZCpQpg==", - "license": "MIT", - "peerDependencies": { - "react": ">= 16.8.0 || ^18.0.0", - "react-dom": ">= 16.8.0 || ^18.0.0" + "react": "^19.1.1" } }, "node_modules/react-i18next": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.1.tgz", - "integrity": "sha512-C8RZ7N7H0L+flitiX6ASjq9p5puVJU1Z8VyL3OgM/QOMRf40BMZX+5TkpxzZVcTmOLPX5zlti4InEX5pFyiVeA==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.6.1.tgz", + "integrity": "sha512-uGrzSsOUUe2sDBG/+FJq2J1MM+Y4368/QW8OLEKSFvnDflHBbZhSd1u3UkW0Z06rMhZmnB/AQrhCpYfE5/5XNg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.0", + "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { @@ -5655,6 +5423,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, "license": "MIT" }, "node_modules/reflect.getprototypeof": { @@ -5753,23 +5522,6 @@ "node": ">=0.10.0" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5814,27 +5566,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -5870,13 +5601,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -5884,9 +5608,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "devOptional": true, "license": "ISC", "bin": { @@ -5896,45 +5620,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5984,24 +5669,17 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, "node_modules/sharp": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.7.1" + "detect-libc": "^2.0.4", + "semver": "^7.7.2" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -6010,26 +5688,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.1", - "@img/sharp-darwin-x64": "0.34.1", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.1", - "@img/sharp-linux-arm64": "0.34.1", - "@img/sharp-linux-s390x": "0.34.1", - "@img/sharp-linux-x64": "0.34.1", - "@img/sharp-linuxmusl-arm64": "0.34.1", - "@img/sharp-linuxmusl-x64": "0.34.1", - "@img/sharp-wasm32": "0.34.1", - "@img/sharp-win32-ia32": "0.34.1", - "@img/sharp-win32-x64": "0.34.1" + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" } }, "node_modules/shebang-command": { @@ -6157,24 +5837,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6361,9 +6023,9 @@ } }, "node_modules/tailwind-merge": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.2.0.tgz", - "integrity": "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", "license": "MIT", "funding": { "type": "github", @@ -6371,9 +6033,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", "license": "MIT" }, "node_modules/tailwindcss-animate": { @@ -6386,15 +6048,33 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -6453,16 +6133,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -6496,9 +6166,9 @@ "license": "0BSD" }, "node_modules/tw-animate-css": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.9.tgz", - "integrity": "sha512-9O4k1at9pMQff9EAcCEuy1UNO43JmaPQvq+0lwza9Y0BQ6LB38NiMj+qHqjoQf40355MX+gs6wtlR6H9WsSXFg==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.3.6.tgz", + "integrity": "sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Wombosvideo" @@ -6517,21 +6187,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -6611,9 +6266,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -6644,22 +6299,12 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unrs-resolver": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", @@ -6703,16 +6348,6 @@ "punycode": "^2.1.0" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -6837,12 +6472,15 @@ "node": ">=0.10.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/yocto-queue": { "version": "0.1.0", @@ -6856,26 +6494,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } } } } From a37938e8c75cd58a3ef1a0351419babe27e784a3 Mon Sep 17 00:00:00 2001 From: Aidan Date: Sat, 2 Aug 2025 02:53:05 -0400 Subject: [PATCH 05/18] fix: remove fontawesome in layout --- app/layout.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index a682861..884a71f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,13 +2,9 @@ import React, { useEffect } from 'react' import './globals.css' -import '@fortawesome/fontawesome-svg-core/styles.css' -import { config } from '@fortawesome/fontawesome-svg-core' import { GeistSans } from 'geist/font/sans' import '../i18n' -config.autoAddCss = false - export default function RootLayout({ children, }: { From 5dc930bcbbb8ec0a9d6c445e020a9cf05fce147d Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 4 Aug 2025 02:27:38 -0400 Subject: [PATCH 06/18] feat: better metadata, robots, and sitemap; simplify layout w/ AnimatedTitle and I18nProvider components --- app/layout.tsx | 111 +++++++++++++++++------------------ app/robots.ts | 9 +++ app/sitemap.ts | 36 ++++++++++++ components/AnimatedTitle.tsx | 29 +++++++++ components/I18nProvider.tsx | 8 +++ 5 files changed, 136 insertions(+), 57 deletions(-) create mode 100644 app/robots.ts create mode 100644 app/sitemap.ts create mode 100644 components/AnimatedTitle.tsx create mode 100644 components/I18nProvider.tsx diff --git a/app/layout.tsx b/app/layout.tsx index 884a71f..853653d 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,70 +1,67 @@ -"use client" - -import React, { useEffect } from 'react' +import React from 'react' +import { Metadata } from 'next' +import Head from 'next/head' import './globals.css' import { GeistSans } from 'geist/font/sans' -import '../i18n' +import AnimatedTitle from '../components/AnimatedTitle' +import I18nProvider from '../components/I18nProvider' + +export const metadata: Metadata = { + description: "The Internet home of Aidan. Come on in!", + openGraph: { + type: "website", + url: "https://aidxn.cc", + title: "aidxn.cc", + description: "The Internet home of Aidan. Come on in!", + siteName: "aidxn.cc", + images: [ + { + url: "https://aidxn.cc/android-icon-192x192.png", + width: 192, + height: 192, + }, + ], + }, +} export default function RootLayout({ children, }: { children: React.ReactNode }) { - useEffect(() => { - const title = 'aidxn.cc'; - let index = 1; - let forward = true; - const interval = setInterval(() => { - document.title = title.substring(0, index); - if (forward) { - index++; - if (index > title.length) { - forward = false; - index = title.length - 1; - } - } else { - index--; - if (index < 1) { - forward = true; - index = 1; - } - } - }, 500); - return () => clearInterval(interval); - }, []); - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + {children} - - + + + ); } diff --git a/app/robots.ts b/app/robots.ts new file mode 100644 index 0000000..e429c8f --- /dev/null +++ b/app/robots.ts @@ -0,0 +1,9 @@ +import type { MetadataRoute } from 'next' + +export const robots: MetadataRoute.Robots = { + rules: { + userAgent: '*', + allow: '/', + }, + sitemap: 'https://aidxn.cc/sitemap.xml', +} \ No newline at end of file diff --git a/app/sitemap.ts b/app/sitemap.ts new file mode 100644 index 0000000..c792039 --- /dev/null +++ b/app/sitemap.ts @@ -0,0 +1,36 @@ +import type { MetadataRoute } from 'next' + +export default function sitemap(): MetadataRoute.Sitemap { + return [ + { + url: 'https://aidxn.cc', + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 1.0, + }, + { + url: 'https://aidxn.cc/about', + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8, + }, + { + url: 'https://aidxn.cc/contact', + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.8, + }, + { + url: 'https://aidxn.cc/domains', + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.8, + }, + { + url: 'https://aidxn.cc/manifesto', + lastModified: new Date(), + changeFrequency: 'yearly', + priority: 0.7, + }, + ] +} \ No newline at end of file diff --git a/components/AnimatedTitle.tsx b/components/AnimatedTitle.tsx new file mode 100644 index 0000000..ea8346c --- /dev/null +++ b/components/AnimatedTitle.tsx @@ -0,0 +1,29 @@ +"use client" + +import { useEffect } from "react"; + +export default function AnimatedTitle() { + useEffect(() => { + const title = 'aidxn.cc'; + let index = 1; + let forward = true; + const interval = setInterval(() => { + document.title = title.substring(0, index); + if (forward) { + index++; + if (index > title.length) { + forward = false; + index = title.length - 1; + } + } else { + index--; + if (index < 1) { + forward = true; + index = 1; + } + } + }, 500); + return () => clearInterval(interval); + }, []); + return null; +} diff --git a/components/I18nProvider.tsx b/components/I18nProvider.tsx new file mode 100644 index 0000000..3ddf176 --- /dev/null +++ b/components/I18nProvider.tsx @@ -0,0 +1,8 @@ +"use client"; + +import { ReactNode } from "react"; +import "../i18n"; + +export default function I18nProvider({ children }: { children: ReactNode }) { + return <>{children}; +} From dfbb2fdfc40739d61705c5e2b902a9826be69297 Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 4 Aug 2025 02:36:23 -0400 Subject: [PATCH 07/18] rf/fix: use bun instead of node, fix robots --- Dockerfile | 23 ++++++----------------- app/robots.ts | 4 ++++ 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/Dockerfile b/Dockerfile index 61d6aa7..2c57fdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,10 @@ -FROM node:23-alpine AS base +FROM oven/bun:latest AS base FROM base AS deps -RUN apk add --no-cache libc6-compat WORKDIR /app -COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ -RUN \ - if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ - elif [ -f package-lock.json ]; then npm ci; \ - elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ - else echo "Lockfile not found." && exit 1; \ - fi +COPY package.json bun.lockb* ./ +RUN bun install --frozen-lockfile FROM base AS builder WORKDIR /app @@ -19,12 +13,7 @@ COPY . . ENV NEXT_TELEMETRY_DISABLED=1 -RUN \ - if [ -f yarn.lock ]; then yarn run build; \ - elif [ -f package-lock.json ]; then npm run build; \ - elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ - else echo "Lockfile not found." && exit 1; \ - fi +RUN bun run build FROM base AS runner WORKDIR /app @@ -32,8 +21,8 @@ WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs +RUN groupadd --system --gid 1001 nodejs +RUN useradd --system --uid 1001 nextjs COPY --from=builder /app/public ./build/public diff --git a/app/robots.ts b/app/robots.ts index e429c8f..8451432 100644 --- a/app/robots.ts +++ b/app/robots.ts @@ -6,4 +6,8 @@ export const robots: MetadataRoute.Robots = { allow: '/', }, sitemap: 'https://aidxn.cc/sitemap.xml', +} + +export default function handler(): MetadataRoute.Robots { + return robots } \ No newline at end of file From c06d27c17a9f4533acccd1570360c4ae5bb294c6 Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 4 Aug 2025 04:10:29 -0400 Subject: [PATCH 08/18] content/fix: device content updates, index device pages --- app/device/bonito/page.tsx | 30 +++++++++++++++-------------- app/device/cheetah/page.tsx | 38 ++++++++++++++----------------------- app/sitemap.ts | 12 ++++++++++++ 3 files changed, 42 insertions(+), 38 deletions(-) diff --git a/app/device/bonito/page.tsx b/app/device/bonito/page.tsx index cf95b1c..0bca8bc 100644 --- a/app/device/bonito/page.tsx +++ b/app/device/bonito/page.tsx @@ -82,12 +82,12 @@ export default function Bonito() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://wiki.lineageos.org/devices/bonito/" + href="https://www.ubuntu-touch.io" > - LineageOS 22.2 + Ubuntu Touch

-

+ {/*

Root: Magisk -

+ N/A +

*/}
@@ -116,12 +117,12 @@ export default function Bonito() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://powerampapp.com/" + href="https://github.com/arubislander/uSonic" > - Poweramp + uSonic

-

+ {/*

Files: MiXplorer Beta -

+ N/A +

*/}

Telegram Client: @@ -140,12 +142,12 @@ export default function Bonito() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://nekogram.app/" + href="https://open-store.io/app/teleports.ubports" > - Nekogram + TELEports

-

+ {/*

YouTube: Tubular -

+

*/}
-
+ {/*

Modules @@ -186,7 +188,7 @@ export default function Bonito() { -

+
*/}
diff --git a/app/device/cheetah/page.tsx b/app/device/cheetah/page.tsx index f6d21e6..40600a4 100644 --- a/app/device/cheetah/page.tsx +++ b/app/device/cheetah/page.tsx @@ -75,7 +75,7 @@ export default function Cheetah() {

Kernel: - 6.1.129-android14 + 6.1.99-android14

@@ -84,9 +84,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://developer.android.com/about/versions/16/get-qpr" + href="https://crdroid.net" > - Android 16 QPR1 + crDroid Android 11.6

@@ -118,9 +118,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://qobuz.com" + href="https://tidal.com" > - Qobuz + Tidal

@@ -132,7 +132,7 @@ export default function Cheetah() { rel="noopener noreferrer" href="https://mixplorer.com/" > - MiXplorer Beta + MiXplorer

@@ -154,9 +154,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://github.com/NoName-exe/revanced-extended" + href="https://revanced.app" > - ReVanced Extended + ReVanced

@@ -172,9 +172,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://github.com/5ec1cff/TrickyStore" + href="https://github.com/bindhosts/bindhosts" > - Tricky Store + bindhosts
  • @@ -182,9 +182,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://github.com/dpejoh/yurikey" + href="https://github.com/EmojiReplacer/Emoji-Replacer" > - Yurikey Manager + Emoji Replacer
  • @@ -192,9 +192,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://github.com/LSPosed/LSPosed.github.io/releases" + href="https://github.com/PerformanC/ReZygisk" > - Shamiko + ReZygisk
  • @@ -207,16 +207,6 @@ export default function Cheetah() { LSPosed JingMatrix
  • -
  • - - Zygisk Next - -
  • diff --git a/app/sitemap.ts b/app/sitemap.ts index c792039..926ed38 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -26,6 +26,18 @@ export default function sitemap(): MetadataRoute.Sitemap { changeFrequency: 'monthly', priority: 0.8, }, + { + url: 'https://aidxn.cc/device/cheetah', + lastModified: new Date(), + changeFrequency: 'weekly' /* yes, i really re-flash roms this often */, + priority: 0.8, + }, + { + url: 'https://aidxn.cc/device/bonito', + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8, + }, { url: 'https://aidxn.cc/manifesto', lastModified: new Date(), From 3e91220ea0046730fc0eea94521a14a84db21765 Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 4 Aug 2025 04:17:59 -0400 Subject: [PATCH 09/18] fix: cleanup unused imports --- app/device/bonito/page.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/device/bonito/page.tsx b/app/device/bonito/page.tsx index 0bca8bc..2ba4125 100644 --- a/app/device/bonito/page.tsx +++ b/app/device/bonito/page.tsx @@ -5,12 +5,9 @@ import { MemoryStick, HardDrive, Hash, - Hammer, Music, - Folder, - Layers, } from "lucide-react" -import { FaGoogle, FaYoutube } from "react-icons/fa" +import { FaGoogle } from "react-icons/fa" import { VscTerminalLinux } from "react-icons/vsc" import { MdOutlineAndroid } from "react-icons/md" import { LuPackageOpen } from "react-icons/lu" From 2f5b86111c821ef3d0439d41a568e2c130520678 Mon Sep 17 00:00:00 2001 From: Aidan Date: Thu, 21 Aug 2025 23:51:29 -0400 Subject: [PATCH 10/18] clean up mobile design, bump, update content --- app/about/page.tsx | 29 +++-- app/device/komodo/page.tsx | 247 +++++++++++++++++++++++++++++++++++++ package.json | 16 +-- public/data/domains.json | 22 ++-- public/data/featured.json | 8 +- public/img/komodo.png | Bin 0 -> 40083 bytes public/locales/en-US.json | 6 +- 7 files changed, 291 insertions(+), 37 deletions(-) create mode 100644 app/device/komodo/page.tsx create mode 100644 public/img/komodo.png diff --git a/app/about/page.tsx b/app/about/page.tsx index 9427cef..05f223c 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -7,7 +7,8 @@ import Button from '@/components/objects/Button' import FeaturedRepos from '@/components/widgets/FeaturedRepos' import Image from 'next/image' import { useState } from 'react' -import { User, Smartphone } from 'lucide-react' +import { User } from 'lucide-react' +import { SiGoogle } from 'react-icons/si' import { useTranslation } from 'react-i18next' import { cn } from '@/lib/utils' @@ -32,21 +33,19 @@ export default function About() { return (
    -
    -
    -
    +
    +
    +
    -

    - {t('about.title')} -

    +

    {t('about.title')}

    {mainStrings.map((section, index) => { if (mainSections[index] === t('about.sections.featuredProjects')) { return ( -
    +

    {mainSections[index]}

    {section.map((text, index) => (

    @@ -87,6 +86,7 @@ export default function About() { loading="eager" priority unoptimized + className="max-w-full h-auto" />

    )} @@ -132,16 +133,22 @@ export default function About() {

    ))} {key === "Mobile Devices" && ( -
    +
    + diff --git a/app/device/komodo/page.tsx b/app/device/komodo/page.tsx new file mode 100644 index 0000000..53af991 --- /dev/null +++ b/app/device/komodo/page.tsx @@ -0,0 +1,247 @@ +import Header from "@/components/Header" +import Footer from "@/components/Footer" +import { + Cpu, + MemoryStick, + HardDrive, + Hash, + Hammer, + Music, + Folder, + Layers, +} from "lucide-react" +import { FaGoogle, FaYoutube } from "react-icons/fa" +import { VscTerminalLinux } from "react-icons/vsc" +import { MdOutlineAndroid } from "react-icons/md" +import { LuPackageOpen } from "react-icons/lu" +import { RiTelegram2Fill } from "react-icons/ri" +import Image from "next/image" +import Link from "@/components/objects/Link" + +export default function Cheetah() { + return ( +
    +
    +
    +
    +
    +
    + Google Pixel 9 Pro XL (komodo) +
    +
    +
    +

    + + Pixel 9 Pro XL +

    +

    komodo

    +
    +
    +
    +
    +

    + + Specs +

    +
    +

    + + CPU: Google Tensor G4 +

    +

    + + Storage: 128GB +

    +

    + + RAM: 16GB +

    +
    +
    +
    +

    + + Modifications +

    +
    +

    + + Kernel: + + 6.1.134-android14-SUSFS-Wild + +

    +

    + + ROM: + + Android 16 QPR1 + +

    +

    + + Root: + + KernelSU-Next + +

    +
    +
    +
    +
    +
    +

    + + Apps +

    +
    +

    + + Music: + + Tidal + +

    +

    + + Files: + + MiXplorer + +

    +

    + + TG Client: + + AyuGram + +

    +

    + + YouTube: + + ReVanced + +

    +
    +
    +
    +

    + + Modules +

    +
      +
    • + + bindhosts + +
    • +
    • + + Emoji Replacer + +
    • +
    • + + F-Droid Privileged Extension + +
    • +
    • + + SUSFS-FOR-KERNELSU + +
    • +
    • + + Tricky Store + +
    • +
    • + + Yuri Keybox Manager + +
    • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + ) +} + diff --git a/package.json b/package.json index 459aff5..cab8a2b 100644 --- a/package.json +++ b/package.json @@ -16,25 +16,25 @@ "i18next": "^24.2.3", "i18next-browser-languagedetector": "^8.2.0", "lucide-react": "^0.485.0", - "next": "^15.4.5", + "next": "^15.5.0", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.6.1", + "react-i18next": "^15.7.1", "react-icons": "^5.5.0", "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", - "tw-animate-css": "^1.3.6" + "tw-animate-css": "^1.3.7" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.11", - "@types/node": "^20.19.9", - "@types/react": "^19.1.9", + "@tailwindcss/postcss": "^4.1.12", + "@types/node": "^20.19.11", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "eslint-config-next": "15.1.3", "postcss": "^8.5.6", - "tailwindcss": "^4.1.11", + "tailwindcss": "^4.1.12", "typescript": "^5.9.2" }, "trustedDependencies": [ diff --git a/public/data/domains.json b/public/data/domains.json index c29b608..8ab1592 100644 --- a/public/data/domains.json +++ b/public/data/domains.json @@ -6,23 +6,23 @@ }, { "id": 2, - "domain": "aidxn.fun", - "usage": "My alternative homepage (Version 2)" + "domain": "pontushost.com", + "usage": "My hosting provider project" }, { "id": 3, - "domain": "librecloud.cc", - "usage": "LibreCloud's root domain" - }, - { - "id": 4, "domain": "disfunction.blog", "usage": "My blog's official home" }, { - "id": 5, + "id": 4, "domain": "androidintegrity.org", - "usage": "A team project to improve Play Integrity" + "usage": "A project to fix Play Integrity" + }, + { + "id": 5, + "domain": "librecloud.cc", + "usage": "My old cloud services provider project" }, { "id": 6, @@ -47,12 +47,12 @@ { "id": 10, "domain": "dontbeevil.lol", - "usage": "A Google meme domain used for p0ntus mail" + "usage": "Another fun domain for p0ntus mail" }, { "id": 11, "domain": "wikitools.cloud", - "usage": "Tools I've made for Wikipedia" + "usage": "Unused (for now!)" }, { "id": 12, diff --git a/public/data/featured.json b/public/data/featured.json index 807371e..508476a 100644 --- a/public/data/featured.json +++ b/public/data/featured.json @@ -19,11 +19,11 @@ }, { "id": 3, - "name": "mail-connect", - "description": "API bridge for docker-mailserver", + "name": "modules", + "description": "A Magisk/KernelSU module repository", "github": true, - "url": "https://github.com/ihatenodejs/mail-connect", - "stars": 0, + "url": "https://github.com/abocn/modules", + "stars": 5, "forks": 0 }, { diff --git a/public/img/komodo.png b/public/img/komodo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf09fa1a5c55c12930cc0457d249e014efe9d13 GIT binary patch literal 40083 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 literal 0 HcmV?d00001 diff --git a/public/locales/en-US.json b/public/locales/en-US.json index cbabc75..00b944c 100644 --- a/public/locales/en-US.json +++ b/public/locales/en-US.json @@ -96,9 +96,9 @@ ], "devices": { "Mobile Devices": [ - "I use a Google Pixel 7 Pro (cheetah) as my daily driver. It runs Android 16 and is proudly rooted with KernelSU-Next.", - "It's back is shattered and missing volume buttons, but it continues to thrive and survive as my daily driver.", - "I also have a Google Pixel 3a XL (bonito) which I use as a secondary device. It runs LineageOS 22.2 and is also rooted with KernelSU-Next." + "I use a Google Pixel 9 Pro XL (komodo) as my daily driver. It runs Android 16 and is proudly rooted with KernelSU-Next.", + "My previous phone, the Google Pixel 7 Pro (cheetah), is still in use as my secondary WiFi-only device. It runs Android 16 and is proudly rooted with KernelSU-Next.", + "I also have a Google Pixel 3a XL (bonito) which I use as a tertiary device. It runs LineageOS 22.2 and is rooted with Magisk." ], "Laptops": [ "I currently daily-drive with a 16-inch MacBook Pro with an M4 Max, 64GB of memory, 2TB of storage, 16 core CPU, and a 40 core GPU.", From 7a9f907661a9753e3b149042d0d26e3cae25b887 Mon Sep 17 00:00:00 2001 From: Aidan Date: Fri, 22 Aug 2025 01:28:36 -0400 Subject: [PATCH 11/18] add ai pages, cc usage --- app/ai/claude/page.tsx | 337 ++++++++++++++++++++ app/ai/components/AIStack.tsx | 73 +++++ app/ai/components/FavoriteModels.tsx | 39 +++ app/ai/components/ToolReviews.tsx | 54 ++++ app/ai/components/TopPick.tsx | 49 +++ app/ai/data.tsx | 125 ++++++++ app/ai/page.tsx | 40 +++ app/ai/types.ts | 24 ++ components/Header.tsx | 4 +- package.json | 1 + public/data/cc.json | 459 +++++++++++++++++++++++++++ 11 files changed, 1204 insertions(+), 1 deletion(-) create mode 100644 app/ai/claude/page.tsx create mode 100644 app/ai/components/AIStack.tsx create mode 100644 app/ai/components/FavoriteModels.tsx create mode 100644 app/ai/components/ToolReviews.tsx create mode 100644 app/ai/components/TopPick.tsx create mode 100644 app/ai/data.tsx create mode 100644 app/ai/page.tsx create mode 100644 app/ai/types.ts create mode 100644 public/data/cc.json diff --git a/app/ai/claude/page.tsx b/app/ai/claude/page.tsx new file mode 100644 index 0000000..cafdc55 --- /dev/null +++ b/app/ai/claude/page.tsx @@ -0,0 +1,337 @@ +"use client" + +import Header from '@/components/Header' +import Footer from '@/components/Footer' +import { useState, useEffect } from 'react' +import { SiClaude } from 'react-icons/si' +import { + Line, + BarChart, + Bar, + PieChart, + Pie, + Cell, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + Legend, + ResponsiveContainer, + Area, + AreaChart, + ComposedChart, +} from 'recharts' + +interface ModelBreakdown { + modelName: string + inputTokens: number + outputTokens: number + cacheCreationTokens: number + cacheReadTokens: number + cost: number +} + +interface DailyData { + date: string + inputTokens: number + outputTokens: number + cacheCreationTokens: number + cacheReadTokens: number + totalTokens: number + totalCost: number + modelsUsed: string[] + modelBreakdowns: ModelBreakdown[] +} + +interface CCData { + daily: DailyData[] + totals: { + inputTokens: number + outputTokens: number + cacheCreationTokens: number + cacheReadTokens: number + totalCost: number + totalTokens: number + } +} + +const COLORS = ['#c15f3c', '#b1ada1', '#f4f3ee', '#c15f3c', '#b1ada1', '#f4f3ee'] + +export default function AI() { + const [data, setData] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const [selectedMetric, setSelectedMetric] = useState<'cost' | 'tokens'>('cost') + + useEffect(() => { + fetch('/data/cc.json') + .then(res => { + if (!res.ok) throw new Error('Failed to fetch data') + return res.json() + }) + .then(data => { + setData(data) + setLoading(false) + }) + .catch(err => { + setError(err.message) + setLoading(false) + }) + }, []) + + if (loading) { + return ( +
    +
    +
    +
    Loading Claude metrics...
    +
    +
    +
    + ) + } + + if (error || !data) { + return ( +
    +
    +
    +
    Error loading data: {error}
    +
    +
    +
    + ) + } + + const modelUsageData = data.daily.reduce((acc, day) => { + day.modelBreakdowns.forEach(model => { + const existing = acc.find(m => m.name === model.modelName) + if (existing) { + existing.value += model.cost + } else { + acc.push({ name: model.modelName, value: model.cost }) + } + }) + return acc + }, [] as { name: string; value: number }[]) + + const tokenTypeData = [ + { name: 'Input', value: data.totals.inputTokens }, + { name: 'Output', value: data.totals.outputTokens }, + { name: 'Cache Creation', value: data.totals.cacheCreationTokens }, + { name: 'Cache Read', value: data.totals.cacheReadTokens }, + ] + + const dailyTrendData = data.daily.map(day => ({ + date: new Date(day.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), + cost: day.totalCost, + tokens: day.totalTokens / 1000000, + inputTokens: day.inputTokens / 1000, + outputTokens: day.outputTokens / 1000, + cacheTokens: (day.cacheCreationTokens + day.cacheReadTokens) / 1000000, + })) + + const formatCurrency = (value: number) => `$${value.toFixed(2)}` + const formatTokens = (value: number) => `${value.toFixed(1)}M` + + return ( +
    +
    +
    +
    +
    + +
    +

    Claude Code Usage

    +

    How much I use Claude Code!

    +
    + +
    +
    +

    Total Cost

    +

    ${data.totals.totalCost.toFixed(2)}

    +
    +
    +

    Total Tokens

    +

    {(data.totals.totalTokens / 1000000).toFixed(1)}M

    +
    +
    +

    Days Active

    +

    {data.daily.length}

    +
    +
    +

    Avg Daily Cost

    +

    ${(data.totals.totalCost / data.daily.length).toFixed(2)}

    +
    +
    + +
    +
    +

    Daily Usage Trend

    +
    + + +
    + + + + + + selectedMetric === 'cost' ? formatCurrency(value) : formatTokens(value)} + /> + + + +
    + +
    +

    Model Usage Distribution

    +
    + + + + {modelUsageData.map((entry, index) => ( + + ))} + + formatCurrency(value)} + /> + + +
    + {modelUsageData.map((model, index) => { + const percentage = ((model.value / data.totals.totalCost) * 100).toFixed(1) + return ( +
    +
    +
    + {model.name} +
    +
    + {percentage}% + ${model.value.toFixed(2)} +
    +
    + ) + })} +
    +
    + Total Models Used + {modelUsageData.length} +
    +
    + Most Used + + {modelUsageData[0]?.name} + +
    +
    +
    +
    +
    + +
    +

    Token Type Breakdown

    + + + + + `${(value / 1000000).toFixed(0)}M`} /> + `${(value / 1000000).toFixed(2)}M tokens`} + /> + + + +
    + +
    +

    Daily Token Composition

    + + + + + `${value}K`} /> + `${value.toFixed(1)}K tokens`} + /> + + + + + + +
    +
    + +
    +
    +

    Recent Sessions

    +
    + + + + + + + + + + + {data.daily.slice(-5).reverse().map((day, index) => ( + + + + + + + ))} + +
    DateModels UsedTotal TokensCost
    {new Date(day.date).toLocaleDateString()} + {day.modelsUsed.join(', ')} + {(day.totalTokens / 1000000).toFixed(2)}M${day.totalCost.toFixed(2)}
    +
    +
    +
    +
    +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/components/AIStack.tsx b/app/ai/components/AIStack.tsx new file mode 100644 index 0000000..c24cd91 --- /dev/null +++ b/app/ai/components/AIStack.tsx @@ -0,0 +1,73 @@ +import { Bot } from 'lucide-react' +import Link from '@/components/objects/Link' +import type { AITool } from '../types' + +interface AIStackProps { + tools: AITool[] +} + +export default function AIStack({ tools }: AIStackProps) { + const getStatusColor = (status: string) => { + switch(status) { + case 'primary': return 'text-green-400 border-green-400 bg-green-400/10' + case 'active': return 'text-blue-400 border-blue-400 bg-blue-400/10' + case 'occasional': return 'text-yellow-400 border-yellow-400 bg-yellow-400/10' + default: return 'text-gray-400 border-gray-400' + } + } + + const getStatusLabel = (status: string) => { + switch(status) { + case 'primary': return 'Primary' + case 'active': return 'Active Use' + case 'occasional': return 'Occasional Use' + default: return status + } + } + + return ( +
    +

    + + My AI Stack +

    +
    + {tools.map((tool, index) => ( +
    +
    +
    + {tool.icon && } + {tool.svg && ( +
    + {tool.svg} +
    + )} +
    +

    {tool.name}

    +

    {tool.description}

    +
    +
    +
    +
    + + {getStatusLabel(tool.status)} + + + {tool.link && ( + + View → + + )} + {tool.usage && ( + + Usage → + + )} + +
    +
    + ))} +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/components/FavoriteModels.tsx b/app/ai/components/FavoriteModels.tsx new file mode 100644 index 0000000..9212d0d --- /dev/null +++ b/app/ai/components/FavoriteModels.tsx @@ -0,0 +1,39 @@ +import { Star } from 'lucide-react' +import type { FavoriteModel } from '../types' + +interface FavoriteModelsProps { + models: FavoriteModel[] +} + +export default function FavoriteModels({ models }: FavoriteModelsProps) { + return ( +
    +

    + + Favorite Models +

    +
    + {models.map((model, index) => ( +
    +
    +
    +

    {model.name}

    +

    {model.provider}

    +
    +
    + {[...Array(5)].map((_, i) => ( + + ))} +
    +
    +

    {model.review}

    +
    + ))} +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/components/ToolReviews.tsx b/app/ai/components/ToolReviews.tsx new file mode 100644 index 0000000..2dff2f4 --- /dev/null +++ b/app/ai/components/ToolReviews.tsx @@ -0,0 +1,54 @@ +import { MessageSquare, Star } from 'lucide-react' +import type { AIReview } from '../types' + +interface ToolReviewsProps { + reviews: AIReview[] +} + +export default function ToolReviews({ reviews }: ToolReviewsProps) { + return ( +
    +

    + + Tool Reviews +

    +
    + {reviews.map((review, index) => ( +
    +
    +

    {review.tool}

    +
    + {[...Array(5)].map((_, i) => ( + + ))} +
    +
    +
    +
    +

    Pros:

    +
      + {review.pros.map((pro, i) => ( +
    • • {pro}
    • + ))} +
    +
    +
    +

    Cons:

    +
      + {review.cons.map((con, i) => ( +
    • • {con}
    • + ))} +
    +
    +
    +

    {review.verdict}

    +
    + ))} +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/components/TopPick.tsx b/app/ai/components/TopPick.tsx new file mode 100644 index 0000000..0ec8dd2 --- /dev/null +++ b/app/ai/components/TopPick.tsx @@ -0,0 +1,49 @@ +import { Trophy, ChevronRight } from 'lucide-react' +import { SiClaude } from 'react-icons/si' +import Link from '@/components/objects/Link' + +export default function TopPick() { + return ( +
    +

    + + Top Pick of 2025 +

    +
    +
    +
    + +
    +

    Claude

    +

    by Anthropic

    +
    + + View My Usage + +
    +
    +
    +
    +

    + Claude has become my go-to AI assistant for coding, writing, and learning very quickly. + I believe their Max 5x ($100/mo) is the best value for budget-conscious consumers like myself. +

    +
    +
    + Claude Code + Best Tool Calling + High Value in Max Plan + Quite Fast Interface +
    +
    + + Top Overall Pick + +
    +
    +
    +
    +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/data.tsx b/app/ai/data.tsx new file mode 100644 index 0000000..1e121be --- /dev/null +++ b/app/ai/data.tsx @@ -0,0 +1,125 @@ +import { + SiClaude, + SiGithubcopilot, + SiGooglegemini +} from 'react-icons/si' +import type { AITool, FavoriteModel, AIReview } from './types' + +export const aiTools: AITool[] = [ + { + name: "Claude Max 5x", + icon: SiClaude, + description: "My favorite model provider for general use and coding", + status: "primary", + usage: "/ai/claude", + link: "https://claude.ai/" + }, + { + name: "GitHub Copilot Pro", + icon: SiGithubcopilot, + description: "Random edits when I don't want to start a Claude session", + status: "active", + link: "https://github.com/features/copilot" + }, + { + name: "Gemini Pro", + icon: SiGooglegemini, + description: "Chatting, asking questions, and image generation", + status: "occasional", + link: "https://gemini.google.com/" + }, + { + name: "v0 Free", + svg: v0, + description: "Generating boilerplate UIs", + status: "occasional", + link: "https://v0.dev/" + }, + { + name: "Qwen", + svg: ( + + + + + + + + + + + + + + + + ), + description: "My favorite open source LLM for chatting", + status: "occasional", + link: "https://chat.qwen.ai/" + }, +] + +export const favoriteModels: FavoriteModel[] = [ + { + name: "Claude 4 Sonnet", + provider: "Anthropic", + review: "The perfect balance of capability, speed, and price. Perfect for development with React.", + rating: 5 + }, + { + name: "Claude 4.1 Opus", + provider: "Anthropic", + review: "Amazing planner, useful for Plan Mode in Claude Code. Useful in code generation too.", + rating: 5 + }, + { + name: "Qwen3-235B-A22B", + provider: "Alibaba", + review: "The OG thinking model. Amazing, funny, and smart for chats. Surprisingly good at coding too.", + rating: 5 + }, + { + name: "Gemini 2.5 Pro", + provider: "Google", + review: "Amazing for Deep Research and reasoning tasks. I hate it for coding.", + rating: 4 + }, + { + name: "gemma3 27B", + provider: "Google", + review: "My favorite for playing around with AI or creating a project. Easy to run locally and open weight!", + rating: 4 + }, +] + +export const aiReviews: AIReview[] = [ + { + tool: "Claude Code", + rating: 5, + pros: ["Flagship models", "High usage limits", "Exceptional Claude integration"], + cons: ["Can be slow", "High investment cost to get value"], + verdict: "Best overall for Claude lovers" + }, + { + tool: "Cursor", + rating: 4, + pros: ["Works like magic", "Lots of model support", "Huge ecosystem and community"], + cons: ["Expensive", "Hype around it is dying", "Unclear/manipulative pricing"], + verdict: "Great all-rounder, slowly dying" + }, + { + tool: "Trae", + rating: 4, + pros: ["Good UI/UX", "Very budget-friendly", "Fantastic premium usage limits"], + cons: ["No thinking", "Occasional parsing issues"], + verdict: "Essential for productivity" + }, + { + tool: "GitHub Copilot", + rating: 3, + pros: ["Latest models", "Great autocomplete", "Budget-friendly subscription price"], + cons: ["No thinking", "Low quality output", "Bad support for other IDEs"], + verdict: "Good for casual use" + }, +] \ No newline at end of file diff --git a/app/ai/page.tsx b/app/ai/page.tsx new file mode 100644 index 0000000..077b779 --- /dev/null +++ b/app/ai/page.tsx @@ -0,0 +1,40 @@ +"use client" + +import Header from '@/components/Header' +import Footer from '@/components/Footer' +import { Brain } from 'lucide-react' +import TopPick from './components/TopPick' +import AIStack from './components/AIStack' +import FavoriteModels from './components/FavoriteModels' +import ToolReviews from './components/ToolReviews' +import { aiTools, favoriteModels, aiReviews } from './data' + +export default function AI() { + + return ( +
    +
    +
    +
    +
    + +
    +

    AI

    +

    My journey with using LLMs

    +
    + + + +
    + +
    + +
    + + +
    +
    +
    +
    + ) +} \ No newline at end of file diff --git a/app/ai/types.ts b/app/ai/types.ts new file mode 100644 index 0000000..034db85 --- /dev/null +++ b/app/ai/types.ts @@ -0,0 +1,24 @@ +export interface AITool { + name: string; + icon?: React.ElementType; + svg?: React.ReactNode; + description: string; + status: 'primary' | 'active' | 'occasional' | string; + link?: string; + usage?: string; +} + +export interface FavoriteModel { + name: string; + provider: string; + review: string; + rating: number; +} + +export interface AIReview { + tool: string; + rating: number; + pros: string[]; + cons: string[]; + verdict: string; +} \ No newline at end of file diff --git a/components/Header.tsx b/components/Header.tsx index 68cc54e..11eb756 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -12,7 +12,8 @@ import { X, Menu, Globe, - ChevronDown + ChevronDown, + Brain } from 'lucide-react' import { useTranslation } from 'react-i18next' @@ -145,6 +146,7 @@ export default function Header() {
      Home About + AI Contact Domains Manifesto diff --git a/package.json b/package.json index cab8a2b..5aea997 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "react-dom": "^19.1.1", "react-i18next": "^15.7.1", "react-icons": "^5.5.0", + "recharts": "^3.1.2", "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", "tw-animate-css": "^1.3.7" diff --git a/public/data/cc.json b/public/data/cc.json new file mode 100644 index 0000000..87d27ab --- /dev/null +++ b/public/data/cc.json @@ -0,0 +1,459 @@ +{ + "daily": [ + { + "date": "2025-08-08", + "inputTokens": 14919, + "outputTokens": 23378, + "cacheCreationTokens": 480031, + "cacheReadTokens": 11034031, + "totalTokens": 11552359, + "totalCost": 6.777273749999996, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 4837, + "outputTokens": 20788, + "cacheCreationTokens": 443453, + "cacheReadTokens": 10661975, + "cost": 5.18787225 + }, + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 10082, + "outputTokens": 2590, + "cacheCreationTokens": 36578, + "cacheReadTokens": 372056, + "cost": 1.5894014999999997 + } + ] + }, + { + "date": "2025-08-09", + "inputTokens": 3142, + "outputTokens": 20594, + "cacheCreationTokens": 513312, + "cacheReadTokens": 13270007, + "totalTokens": 13807055, + "totalCost": 20.561232300000007, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 373, + "outputTokens": 10485, + "cacheCreationTokens": 294339, + "cacheReadTokens": 7740261, + "cost": 17.92121775 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 2769, + "outputTokens": 10109, + "cacheCreationTokens": 218973, + "cacheReadTokens": 5529746, + "cost": 2.640014549999999 + } + ] + }, + { + "date": "2025-08-10", + "inputTokens": 2384, + "outputTokens": 33087, + "cacheCreationTokens": 752268, + "cacheReadTokens": 12833548, + "totalTokens": 13621287, + "totalCost": 24.83825640000001, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 983, + "outputTokens": 24065, + "cacheCreationTokens": 320876, + "cacheReadTokens": 9495745, + "cost": 22.079662499999998 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 1401, + "outputTokens": 9022, + "cacheCreationTokens": 431392, + "cacheReadTokens": 3337803, + "cost": 2.7585938999999993 + } + ] + }, + { + "date": "2025-08-11", + "inputTokens": 1127, + "outputTokens": 23663, + "cacheCreationTokens": 746606, + "cacheReadTokens": 10310633, + "totalTokens": 11082029, + "totalCost": 31.256441999999993, + "modelsUsed": [ + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 1127, + "outputTokens": 23663, + "cacheCreationTokens": 746606, + "cacheReadTokens": 10310633, + "cost": 31.256441999999993 + } + ] + }, + { + "date": "2025-08-12", + "inputTokens": 17245, + "outputTokens": 164864, + "cacheCreationTokens": 2646250, + "cacheReadTokens": 49767559, + "totalTokens": 52595918, + "totalCost": 85.49760780000005, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 13710, + "outputTokens": 77330, + "cacheCreationTokens": 1413354, + "cacheReadTokens": 26762148, + "cost": 72.64900950000008 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 3535, + "outputTokens": 87534, + "cacheCreationTokens": 1232896, + "cacheReadTokens": 23005411, + "cost": 12.848598300000004 + } + ] + }, + { + "date": "2025-08-13", + "inputTokens": 29365, + "outputTokens": 23237, + "cacheCreationTokens": 1034891, + "cacheReadTokens": 7332169, + "totalTokens": 8419662, + "totalCost": 9.039594749999997, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 24909, + "outputTokens": 18462, + "cacheCreationTokens": 935307, + "cacheReadTokens": 6758235, + "cost": 5.886528749999999 + }, + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 4456, + "outputTokens": 4775, + "cacheCreationTokens": 99584, + "cacheReadTokens": 573934, + "cost": 3.1530659999999995 + } + ] + }, + { + "date": "2025-08-14", + "inputTokens": 4984, + "outputTokens": 20654, + "cacheCreationTokens": 676409, + "cacheReadTokens": 8769252, + "totalTokens": 9471299, + "totalCost": 13.503454350000002, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 282, + "outputTokens": 6364, + "cacheCreationTokens": 260989, + "cacheReadTokens": 3092770, + "cost": 10.014228749999996 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 4702, + "outputTokens": 14290, + "cacheCreationTokens": 415420, + "cacheReadTokens": 5676482, + "cost": 3.489225600000001 + } + ] + }, + { + "date": "2025-08-15", + "inputTokens": 6744, + "outputTokens": 53509, + "cacheCreationTokens": 1315474, + "cacheReadTokens": 18699807, + "totalTokens": 20075534, + "totalCost": 37.771287000000015, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 3739, + "outputTokens": 36231, + "cacheCreationTokens": 818888, + "cacheReadTokens": 9919502, + "cost": 33.00681300000001 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 3005, + "outputTokens": 17278, + "cacheCreationTokens": 496586, + "cacheReadTokens": 8780305, + "cost": 4.764474 + } + ] + }, + { + "date": "2025-08-16", + "inputTokens": 67226, + "outputTokens": 230912, + "cacheCreationTokens": 4693459, + "cacheReadTokens": 126251857, + "totalTokens": 131243454, + "totalCost": 67.51195695000014, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 66858, + "outputTokens": 225159, + "cacheCreationTokens": 4442992, + "cacheReadTokens": 122698549, + "cost": 57.048743700000024 + }, + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 368, + "outputTokens": 5753, + "cacheCreationTokens": 250467, + "cacheReadTokens": 3553308, + "cost": 10.463213249999994 + } + ] + }, + { + "date": "2025-08-17", + "inputTokens": 5258, + "outputTokens": 107279, + "cacheCreationTokens": 2065168, + "cacheReadTokens": 40221095, + "totalTokens": 42398800, + "totalCost": 46.292036099999905, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 1306, + "outputTokens": 37998, + "cacheCreationTokens": 568961, + "cacheReadTokens": 11688668, + "cost": 31.07046074999999 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 3952, + "outputTokens": 69281, + "cacheCreationTokens": 1496207, + "cacheReadTokens": 28532427, + "cost": 15.221575350000005 + } + ] + }, + { + "date": "2025-08-18", + "inputTokens": 26822, + "outputTokens": 158126, + "cacheCreationTokens": 4162794, + "cacheReadTokens": 85133032, + "totalTokens": 89480774, + "totalCost": 98.36223149999994, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 1334, + "outputTokens": 59577, + "cacheCreationTokens": 1226868, + "cacheReadTokens": 27304867, + "cost": 68.4493605 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 25488, + "outputTokens": 98549, + "cacheCreationTokens": 2935926, + "cacheReadTokens": 57828165, + "cost": 29.912871000000024 + } + ] + }, + { + "date": "2025-08-19", + "inputTokens": 25035, + "outputTokens": 192422, + "cacheCreationTokens": 2749046, + "cacheReadTokens": 86412205, + "totalTokens": 89378708, + "totalCost": 120.90988019999996, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 6500, + "outputTokens": 120014, + "cacheCreationTokens": 1447294, + "cacheReadTokens": 43939676, + "cost": 102.14482650000001 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 18535, + "outputTokens": 72408, + "cacheCreationTokens": 1301752, + "cacheReadTokens": 42472529, + "cost": 18.76505370000004 + } + ] + }, + { + "date": "2025-08-20", + "inputTokens": 1777, + "outputTokens": 45019, + "cacheCreationTokens": 1288952, + "cacheReadTokens": 18847679, + "totalTokens": 20183427, + "totalCost": 46.130642700000024, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 1472, + "outputTokens": 29172, + "cacheCreationTokens": 1017913, + "cacheReadTokens": 14937895, + "cost": 43.702691249999994 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 305, + "outputTokens": 15847, + "cacheCreationTokens": 271039, + "cacheReadTokens": 3909784, + "cost": 2.4279514499999997 + } + ] + }, + { + "date": "2025-08-21", + "inputTokens": 81, + "outputTokens": 3400, + "cacheCreationTokens": 57191, + "cacheReadTokens": 406935, + "totalTokens": 467607, + "totalCost": 1.0935505500000002, + "modelsUsed": [ + "claude-sonnet-4-20250514", + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 37, + "outputTokens": 826, + "cacheCreationTokens": 29950, + "cacheReadTokens": 172089, + "cost": 0.882201 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 44, + "outputTokens": 2574, + "cacheCreationTokens": 27241, + "cacheReadTokens": 234846, + "cost": 0.21134955 + } + ] + }, + { + "date": "2025-08-22", + "inputTokens": 201, + "outputTokens": 26357, + "cacheCreationTokens": 182770, + "cacheReadTokens": 1764101, + "totalTokens": 1973429, + "totalCost": 8.052878999999999, + "modelsUsed": [ + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 201, + "outputTokens": 26357, + "cacheCreationTokens": 182770, + "cacheReadTokens": 1764101, + "cost": 8.052878999999999 + } + ] + } + ], + "totals": { + "inputTokens": 206310, + "outputTokens": 1126501, + "cacheCreationTokens": 23364621, + "cacheReadTokens": 491053910, + "totalCost": 617.5983253500001, + "totalTokens": 515751342 + } +} From 570767390501599bfbd1cfe649465f8b2060d526 Mon Sep 17 00:00:00 2001 From: Aidan Date: Fri, 22 Aug 2025 01:34:57 -0400 Subject: [PATCH 12/18] update sitemap --- app/sitemap.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/sitemap.ts b/app/sitemap.ts index 926ed38..b620df9 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -14,6 +14,18 @@ export default function sitemap(): MetadataRoute.Sitemap { changeFrequency: 'weekly', priority: 0.8, }, + { + url: 'https://aidxn.cc/ai', + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.9, + }, + { + url: 'https://aidxn.cc/ai/claude', + lastModified: new Date(), + changeFrequency: 'daily', + priority: 0.9, + }, { url: 'https://aidxn.cc/contact', lastModified: new Date(), @@ -38,6 +50,12 @@ export default function sitemap(): MetadataRoute.Sitemap { changeFrequency: 'weekly', priority: 0.8, }, + { + url: 'https://aidxn.cc/device/komodo', + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8, + }, { url: 'https://aidxn.cc/manifesto', lastModified: new Date(), From cac9b00b308db7442b457d1d40a2d315e2b1ab2d Mon Sep 17 00:00:00 2001 From: Aidan Date: Fri, 22 Aug 2025 01:40:05 -0400 Subject: [PATCH 13/18] cleanup bun process in builds --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2c57fdb..0e2d1be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,8 @@ FROM oven/bun:latest AS base FROM base AS deps WORKDIR /app -COPY package.json bun.lockb* ./ -RUN bun install --frozen-lockfile +COPY package.json ./ +RUN bun install FROM base AS builder WORKDIR /app From 3fe4b7b369a6194783f459474079aec04e4a2da1 Mon Sep 17 00:00:00 2001 From: Aidan Date: Fri, 22 Aug 2025 14:15:39 -0400 Subject: [PATCH 14/18] no blog on header --- components/Header.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/Header.tsx b/components/Header.tsx index 11eb756..7898fd5 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -8,7 +8,6 @@ import { User, Phone, BookOpen, - Rss, X, Menu, Globe, @@ -150,7 +149,6 @@ export default function Header() { Contact Domains Manifesto - Blog
      From dee931f3a872e08b23160deebbbd7ab407768ea9 Mon Sep 17 00:00:00 2001 From: Aidan Date: Sat, 23 Aug 2025 23:39:05 -0400 Subject: [PATCH 15/18] better padding, bump p-4 will now be the default for small screens (mobile devices), and p-8 for sm+ sized devices. this does not apply everywhere, like in the TopPick.tsx component --- app/about/page.tsx | 16 ++++++++-------- app/ai/components/AIStack.tsx | 8 ++++---- app/ai/components/FavoriteModels.tsx | 4 ++-- app/ai/components/ToolReviews.tsx | 4 ++-- app/ai/components/TopPick.tsx | 4 ++-- app/page.tsx | 8 ++++---- components/Header.tsx | 13 +++++++++---- components/widgets/NowPlaying.tsx | 4 ++-- package.json | 6 +++--- 9 files changed, 36 insertions(+), 31 deletions(-) diff --git a/app/about/page.tsx b/app/about/page.tsx index 05f223c..1414c4c 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -45,7 +45,7 @@ export default function About() { {mainStrings.map((section, index) => { if (mainSections[index] === t('about.sections.featuredProjects')) { return ( -
      +

      {mainSections[index]}

      {section.map((text, index) => (

      @@ -57,7 +57,7 @@ export default function About() { ) } else if (mainSections[index] === t('about.sections.contributions')) { return ( -

      +

      {mainSections[index]}

      {section.map((text, index) => (

      @@ -78,7 +78,7 @@ export default function About() { {!imageError && (

      ihatenodejs's Stats ihatenodejs's Top Languages +

      {mainSections[index]}

      {Object.entries(section).map(([key, value], index) => (
      @@ -160,7 +160,7 @@ export default function About() { ) } else if (mainSections[index] === t('about.sections.hobbies')) { return ( -
      +

      {mainSections[index]}

      {section.map((text, index) => (

      @@ -185,7 +185,7 @@ export default function About() { ) } else if (mainSections[index] === t('about.sections.projects')) { return ( -

      +

      {mainSections[index]}

      {section.map((text, index) => (

      @@ -213,7 +213,7 @@ export default function About() { ) } else { return ( -

      +

      {mainSections[index]}

      {section.map((text, index) => (

      diff --git a/app/ai/components/AIStack.tsx b/app/ai/components/AIStack.tsx index c24cd91..7bf51d5 100644 --- a/app/ai/components/AIStack.tsx +++ b/app/ai/components/AIStack.tsx @@ -8,7 +8,7 @@ interface AIStackProps { export default function AIStack({ tools }: AIStackProps) { const getStatusColor = (status: string) => { - switch(status) { + switch (status) { case 'primary': return 'text-green-400 border-green-400 bg-green-400/10' case 'active': return 'text-blue-400 border-blue-400 bg-blue-400/10' case 'occasional': return 'text-yellow-400 border-yellow-400 bg-yellow-400/10' @@ -17,7 +17,7 @@ export default function AIStack({ tools }: AIStackProps) { } const getStatusLabel = (status: string) => { - switch(status) { + switch (status) { case 'primary': return 'Primary' case 'active': return 'Active Use' case 'occasional': return 'Occasional Use' @@ -26,7 +26,7 @@ export default function AIStack({ tools }: AIStackProps) { } return ( -

      +

      My AI Stack @@ -70,4 +70,4 @@ export default function AIStack({ tools }: AIStackProps) {

      ) -} \ No newline at end of file +} diff --git a/app/ai/components/FavoriteModels.tsx b/app/ai/components/FavoriteModels.tsx index 9212d0d..12ea967 100644 --- a/app/ai/components/FavoriteModels.tsx +++ b/app/ai/components/FavoriteModels.tsx @@ -7,7 +7,7 @@ interface FavoriteModelsProps { export default function FavoriteModels({ models }: FavoriteModelsProps) { return ( -
      +

      Favorite Models @@ -36,4 +36,4 @@ export default function FavoriteModels({ models }: FavoriteModelsProps) {

      ) -} \ No newline at end of file +} diff --git a/app/ai/components/ToolReviews.tsx b/app/ai/components/ToolReviews.tsx index 2dff2f4..88d77a5 100644 --- a/app/ai/components/ToolReviews.tsx +++ b/app/ai/components/ToolReviews.tsx @@ -7,7 +7,7 @@ interface ToolReviewsProps { export default function ToolReviews({ reviews }: ToolReviewsProps) { return ( -
      +

      Tool Reviews @@ -51,4 +51,4 @@ export default function ToolReviews({ reviews }: ToolReviewsProps) {

    ) -} \ No newline at end of file +} diff --git a/app/ai/components/TopPick.tsx b/app/ai/components/TopPick.tsx index 0ec8dd2..2faccd3 100644 --- a/app/ai/components/TopPick.tsx +++ b/app/ai/components/TopPick.tsx @@ -9,7 +9,7 @@ export default function TopPick() { Top Pick of 2025 -
    +
    @@ -46,4 +46,4 @@ export default function TopPick() {
    ) -} \ No newline at end of file +} diff --git a/app/page.tsx b/app/page.tsx index 1942c84..f40b23e 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -57,7 +57,7 @@ export default function Home() {
    {mainSections.map((section, secIndex) => ( -
    +

    {section}

    {mainStrings[secIndex].map((text: string, index: number) => (

    @@ -67,7 +67,7 @@ export default function Home() {

    ))} -
    +

    {t('home.contact.title')}

    {t('home.contact.description')}

    -
    +

    {t('home.donation.title')}

    {t('home.donation.description')}

    {t('home.donation.charities.title')}

    @@ -129,4 +129,4 @@ export default function Home() {
    ); -} \ No newline at end of file +} diff --git a/components/Header.tsx b/components/Header.tsx index 7898fd5..69b35df 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -134,15 +134,21 @@ export default function Header() { const toggleMenu = () => setIsOpen(!isOpen); return ( -
    -
    @@ -114,6 +210,7 @@ export default function AI() { }) return acc }, [] as { name: string; value: number }[]) + .sort((a, b) => b.value - a.value) const tokenTypeData = [ { name: 'Input', value: data.totals.inputTokens }, @@ -123,7 +220,7 @@ export default function AI() { ] const dailyTrendData = data.daily.map(day => ({ - date: new Date(day.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), + date: new Date(day.date + 'T00:00:00').toLocaleDateString('en-US', { month: 'short', day: 'numeric' }), cost: day.totalCost, tokens: day.totalTokens / 1000000, inputTokens: day.inputTokens / 1000, @@ -137,7 +234,13 @@ export default function AI() { return (
    -
    +
    + + ← Back to AI +
    @@ -227,6 +330,8 @@ export default function AI() { formatCurrency(value)} + labelStyle={{ color: '#fff' }} + itemStyle={{ color: '#fff' }} /> @@ -273,10 +378,13 @@ export default function AI() { `${(value / 1000000).toFixed(0)}M`} /> `${(value / 1000000).toFixed(2)}M tokens`} /> - + @@ -317,7 +425,7 @@ export default function AI() { {data.daily.slice(-5).reverse().map((day, index) => ( - {new Date(day.date).toLocaleDateString()} + {new Date(day.date + 'T00:00:00').toLocaleDateString()} {day.modelsUsed.join(', ')} diff --git a/app/manifesto/page.tsx b/app/manifesto/page.tsx index 5e63e38..4f13d49 100644 --- a/app/manifesto/page.tsx +++ b/app/manifesto/page.tsx @@ -16,8 +16,8 @@ export default function Manifesto() { Internet Manifesto
    -
    -

    +
    +

    1. Empathy and Understanding

    @@ -28,6 +28,7 @@ export default function Manifesto() {

  • Suspend judgment and seek to understand
  • Recognize the humanity in every digital interaction
  • +

    2. Unconditional Sharing!

    @@ -40,12 +41,14 @@ export default function Manifesto() {
  • Support open-source principles
  • Create extensive documentation on all of my projects
  • +

    3. Genuine Human Connection

    I aim to create a genuine human connection with all people I meet, regardless of who or where they are from.

    +

    4. Privacy & Self-Hosted Services

    @@ -62,6 +65,7 @@ export default function Manifesto() {
  • Focus my services on being free and open
  • Suggest and support privacy-focused software
  • +

    I Commit

    diff --git a/app/page.tsx b/app/page.tsx index f40b23e..c6f7e8f 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,11 +4,26 @@ import Header from '@/components/Header' import Footer from '@/components/Footer' import Button from '@/components/objects/Button' import LastPlayed from '@/components/widgets/NowPlaying' + import Image from 'next/image' -import { CreditCard, Mail, PillBottle, Scale } from 'lucide-react' + +import {CreditCard, Mail, PillBottle, Scale, UserCircle} from 'lucide-react' +import { BsArrowClockwise } from "react-icons/bs"; import { FaHandcuffs } from "react-icons/fa6" +import { + SiGithubsponsors, + SiNextdotjs, + SiTailwindcss, + SiDocker, + SiLinux, + SiTypescript, + SiClaude, + SiPostgresql +} from 'react-icons/si' + import { useTranslation } from 'react-i18next' -import { SiGithubsponsors } from 'react-icons/si' +import {TbHeartHandshake, TbUserHeart, TbMessage} from "react-icons/tb"; +import {BiDonateHeart} from "react-icons/bi"; export default function Home() { const { t } = useTranslation() @@ -58,7 +73,33 @@ export default function Home() { {mainSections.map((section, secIndex) => (
    -

    {section}

    +

    {section === t('home.sections.whereYouAre') ? ( +
    + + {section} +
    + ) : section === t('home.sections.whoIAm') ? ( +
    + + {section} +
    + ) : section === t('home.sections.whatIDo') ? ( +
    + + {section} +
    + ) : (section)}

    + {section === t('home.sections.whatIDo') && ( +
    + + + + + + + +
    + )} {mainStrings[secIndex].map((text: string, index: number) => (

    {text} @@ -68,7 +109,10 @@ export default function Home() { ))}

    -

    {t('home.contact.title')}

    +

    + + {t('home.contact.title')} +

    {t('home.contact.description')}

    +

    {t('home.donation.donate.title')}

    diff --git a/components/Header.tsx b/components/Header.tsx index 69b35df..0edfcd7 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -12,8 +12,11 @@ import { Menu, Globe, ChevronDown, - Brain + ChevronRight, + Brain, + Smartphone } from 'lucide-react' +import { SiClaude, SiGoogle } from 'react-icons/si' import { useTranslation } from 'react-i18next' interface NavItemProps { @@ -31,6 +34,181 @@ const NavItem = ({ href, icon, children }: NavItemProps) => (
    ); +interface DropdownNavItemProps { + id: string; + href: string; + icon: React.ElementType; + children: React.ReactNode; + dropdownContent: React.ReactNode; + isMobile?: boolean; + isOpen?: boolean; + onOpenChange?: (id: string | null) => void; +} + +const DropdownNavItem = ({ id, href, icon, children, dropdownContent, isMobile = false, isOpen = false, onOpenChange }: DropdownNavItemProps) => { + const dropdownRef = useRef(null); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + onOpenChange?.(null); + } + }; + + if (isMobile && isOpen) { + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + } + }, [isMobile, isOpen, onOpenChange]); + + const handleMouseEnter = () => { + if (!isMobile) { + onOpenChange?.(id); + } + }; + + const handleMouseLeave = (e: React.MouseEvent) => { + if (!isMobile) { + const relatedTarget = e.relatedTarget as HTMLElement; + if (relatedTarget && dropdownRef.current?.contains(relatedTarget)) { + return; + } + onOpenChange?.(null); + } + }; + + const handleClick = (e: React.MouseEvent) => { + if (isMobile) { + e.preventDefault(); + onOpenChange?.(isOpen ? null : id); + } + }; + + return ( +
    + + {React.createElement(icon, { className: "text-md mr-2", strokeWidth: 2.5, size: 20 })} + {children} + + + {isOpen && ( + <> + {/* Invisible bridge to handle gap */} + {!isMobile && ( +
    + )} +
    + {dropdownContent} +
    + + )} +
    + ); +}; + +interface NestedDropdownItemProps { + children: React.ReactNode; + nestedContent: React.ReactNode; + isMobile?: boolean; +} + +const NestedDropdownItem = ({ children, nestedContent, isMobile = false }: NestedDropdownItemProps) => { + const [isOpen, setIsOpen] = useState(false); + const itemRef = useRef(null); + + const handleMouseEnter = () => { + if (!isMobile) { + setIsOpen(true); + } + }; + + const handleMouseLeave = (e: React.MouseEvent) => { + if (!isMobile) { + const relatedTarget = e.relatedTarget as HTMLElement; + if (relatedTarget && itemRef.current?.contains(relatedTarget)) { + return; + } + setIsOpen(false); + } + }; + + const handleClick = (e: React.MouseEvent) => { + if (isMobile) { + e.preventDefault(); + setIsOpen(!isOpen); + } + }; + + if (isMobile) { + return ( +
    + + {isOpen && ( +
    + {nestedContent} +
    + )} +
    + ); + } + + return ( +
    + + {isOpen && ( + <> + {/* Invisible bridge to handle gap */} +
    +
    + {nestedContent} +
    + + )} +
    + ); +}; + const LanguageSelector = () => { const { i18n } = useTranslation(); const [isOpen, setIsOpen] = useState(false); @@ -63,9 +241,33 @@ const LanguageSelector = () => { } }; - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, []); + if (isMobile) { + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + } + }, [isMobile]); + + const handleMouseEnter = () => { + if (!isMobile) { + setIsOpen(true); + } + }; + + const handleMouseLeave = (e: React.MouseEvent) => { + if (!isMobile) { + const relatedTarget = e.relatedTarget as HTMLElement; + if (relatedTarget && dropdownRef.current?.contains(relatedTarget)) { + return; + } + setIsOpen(false); + } + }; + + const handleClick = () => { + if (isMobile) { + setIsOpen(!isOpen); + } + }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') { @@ -76,53 +278,56 @@ const LanguageSelector = () => { } }; - const buttonContent = ( - <> - - {languages.find(lang => lang.code === i18n.language)?.name || 'English'} - {!isMobile && ( - - )} - - ); - return ( -
    +
    {isOpen && ( -
    - {languages.map((lang) => ( - - ))} -
    + <> + {/* Invisible bridge to handle gap */} + {!isMobile && ( +
    + )} +
    + {languages.map((lang) => ( + + ))} +
    + )}
    ); @@ -130,39 +335,125 @@ const LanguageSelector = () => { export default function Header() { const [isOpen, setIsOpen] = useState(false); + const [isMobile, setIsMobile] = useState(false); + const [activeDropdown, setActiveDropdown] = useState(null); const toggleMenu = () => setIsOpen(!isOpen); - return ( -
    - {isOpen && ( -
    - )} - -
    + +
    + ); } diff --git a/components/widgets/NowPlaying.tsx b/components/widgets/NowPlaying.tsx index de349b6..ade90cd 100644 --- a/components/widgets/NowPlaying.tsx +++ b/components/widgets/NowPlaying.tsx @@ -181,10 +181,10 @@ const NowPlaying: React.FC = () => { rel="noopener noreferrer" className="bg-gradient-to-b from-gray-700 to-gray-900 border-b border-gray-700 px-2 py-0 block" style={{background: 'linear-gradient(to bottom, #4b5563 0%, #374151 30%, #1f2937 70%, #111827 100%)'}} > -
    - - - {currentTrack.release_name && } +
    + + + {currentTrack.release_name && }
    {/* Album art */} @@ -202,70 +202,6 @@ const NowPlaying: React.FC = () => {
    )}
    - {/* Player controls and seekbar */} -
    -
    - -
    - -
    - -
    -
    -
    -
    -
    - setVolume(Number(e.target.value))} className="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" /> -
    -
    -
    ) } @@ -283,89 +219,89 @@ const NowPlaying: React.FC = () => {
    setScreenOn(prev => !prev)}>
    {/* White bezel (fuses screen+home btn) */}
    - {/* Virtual screen */} + {/* Virtual screen */}
    - {screenOn && ( -
    -
    - -
    {formatTime(currentTime)}
    -
    - - -
    + {screenOn && ( +
    +
    + +
    {formatTime(currentTime)}
    +
    + +
    - )} - {screenOn ? renderScreenContent() : ( -
    - )} - {/* Player controls and seekbar */} - {screenOn && track && ( -
    -
    - -
    - -
    - -
    -
    -
    -
    -
    - setVolume(Number(e.target.value))} className="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" /> -
    +
    + )} + {screenOn ? renderScreenContent() : ( +
    + )} + {/* Player controls and seekbar */} + {screenOn && track && ( +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    + setVolume(Number(e.target.value))} className="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" />
    - )} +
    + )}
    {/* Home button */}
    diff --git a/package.json b/package.json index a152f5d..8d0f34d 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "next": "^15.5.2", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.7.2", + "react-i18next": "^15.7.3", "react-icons": "^5.5.0", "recharts": "^3.1.2", "tailwind-merge": "^3.3.1", @@ -30,8 +30,8 @@ "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.12", "@types/node": "^20.19.11", - "@types/react": "^19.1.11", - "@types/react-dom": "^19.1.8", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", "eslint": "^9.34.0", "eslint-config-next": "15.1.3", "postcss": "^8.5.6", diff --git a/public/data/cc.json b/public/data/cc.json index 87d27ab..d12fc26 100644 --- a/public/data/cc.json +++ b/public/data/cc.json @@ -446,14 +446,142 @@ "cost": 8.052878999999999 } ] + }, + { + "date": "2025-08-23", + "inputTokens": 114, + "outputTokens": 6030, + "cacheCreationTokens": 408902, + "cacheReadTokens": 2606990, + "totalTokens": 3022036, + "totalCost": 11.605633500000005, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 88, + "outputTokens": 5424, + "cacheCreationTokens": 387862, + "cacheReadTokens": 2545780, + "cost": 11.499202500000006 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 26, + "outputTokens": 606, + "cacheCreationTokens": 21040, + "cacheReadTokens": 61210, + "cost": 0.106431 + } + ] + }, + { + "date": "2025-08-26", + "inputTokens": 2836, + "outputTokens": 22779, + "cacheCreationTokens": 465292, + "cacheReadTokens": 11182259, + "totalTokens": 11673166, + "totalCost": 25.288227900000006, + "modelsUsed": [ + "claude-opus-4-1-20250805", + "claude-sonnet-4-20250514" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 2745, + "outputTokens": 19221, + "cacheCreationTokens": 405641, + "cacheReadTokens": 10473081, + "cost": 24.798140250000003 + }, + { + "modelName": "claude-sonnet-4-20250514", + "inputTokens": 91, + "outputTokens": 3558, + "cacheCreationTokens": 59651, + "cacheReadTokens": 709178, + "cost": 0.49008765 + } + ] + }, + { + "date": "2025-08-30", + "inputTokens": 151, + "outputTokens": 63263, + "cacheCreationTokens": 430727, + "cacheReadTokens": 4992045, + "totalTokens": 5486186, + "totalCost": 20.311188749999992, + "modelsUsed": [ + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 151, + "outputTokens": 63263, + "cacheCreationTokens": 430727, + "cacheReadTokens": 4992045, + "cost": 20.311188749999992 + } + ] + }, + { + "date": "2025-08-31", + "inputTokens": 108, + "outputTokens": 777, + "cacheCreationTokens": 40539, + "cacheReadTokens": 305195, + "totalTokens": 346619, + "totalCost": 1.2777937499999998, + "modelsUsed": [ + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 108, + "outputTokens": 777, + "cacheCreationTokens": 40539, + "cacheReadTokens": 305195, + "cost": 1.2777937499999998 + } + ] + }, + { + "date": "2025-09-01", + "inputTokens": 592, + "outputTokens": 28240, + "cacheCreationTokens": 712734, + "cacheReadTokens": 12698327, + "totalTokens": 13439893, + "totalCost": 34.53813299999999, + "modelsUsed": [ + "claude-opus-4-1-20250805" + ], + "modelBreakdowns": [ + { + "modelName": "claude-opus-4-1-20250805", + "inputTokens": 592, + "outputTokens": 28240, + "cacheCreationTokens": 712734, + "cacheReadTokens": 12698327, + "cost": 34.53813299999999 + } + ] } ], "totals": { - "inputTokens": 206310, - "outputTokens": 1126501, - "cacheCreationTokens": 23364621, - "cacheReadTokens": 491053910, - "totalCost": 617.5983253500001, - "totalTokens": 515751342 + "inputTokens": 210111, + "outputTokens": 1247590, + "cacheCreationTokens": 25422815, + "cacheReadTokens": 522838726, + "totalCost": 710.6193022500001, + "totalTokens": 549719242 } } diff --git a/public/locales/en-US.json b/public/locales/en-US.json index 00b944c..cc99f8b 100644 --- a/public/locales/en-US.json +++ b/public/locales/en-US.json @@ -1,10 +1,10 @@ { "home": { "whoAmI": [ - "Hey there! My name is Aidan, and I'm a systems administrator, full-stack developer, and student from the United States. I primarily work with Linux, Docker, Next.js, Tailwind CSS and TypeScript.", - "My favorite projects and hobbies include web development and SysAdmin. Most of my work is released into the public domain.", - "I'm also a huge advocate for AI, and it's practical applications to programming and life itself. I am fond of open-source models the most, specifically Qwen3!", - "When I'm not programming, I can be found re-flashing my phone with a new custom ROM and jumping between projects." + "Hey there! My name is Aidan, and I'm a systems administrator, full-stack developer, and student from the Boston area. I primarily work with Linux, Docker, Next.js, Tailwind CSS and TypeScript.", + "My favorite projects and hobbies revolve around web development and SysAdmin. Most of my work is released into the public domain.", + "I'm also a huge advocate for AI and it's practical applications to programming and life itself. I am fond of open-source models the most, specifically Qwen3!", + "When I'm not programming, I can be found re-flashing my phone with a new custom ROM and jumping between projects. I tend to be quite depressed, but I make do." ], "whatIDo": [ "I'm at my best when I'm doing system administration and development in TypeScript. I frequently implement AI into my workflow.", @@ -13,7 +13,7 @@ ], "whereYouAre": [ "I am not here to brag about my accomplishments or plug my shitty SaaS. That's why I've made every effort to make this website as personal and fun as possible.", - "I hope you find this website an interesting place to find more about me, but also learn something new, and inspire a new project or two.", + "I hope you find this website an interesting place to find more about me, but also learn something new; maybe inspire a new project or two.", "In a technical sense, this site is hosted on my dedicated server hosted in Buffalo, New York by ColoCrossing." ], "sections": { @@ -31,10 +31,10 @@ "description": "Feeling generous? Support me or one of the causes I support!", "charities": { "title": "Charities", - "description": "I support the following charities:", "unsilenced": "Unsilenced", "drugpolicy": "Drug Policy Alliance", - "aclu": "ACLU" + "aclu": "ACLU", + "epic-restart": "EPIC Restart Foundation" }, "donate": { "title": "Donate to Me", From 9edf78595d0cad1fc2604552be39a49d5f0b9b25 Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 1 Sep 2025 19:37:24 -0400 Subject: [PATCH 18/18] content: update komodo data --- app/device/komodo/page.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/device/komodo/page.tsx b/app/device/komodo/page.tsx index 53af991..4753336 100644 --- a/app/device/komodo/page.tsx +++ b/app/device/komodo/page.tsx @@ -79,9 +79,9 @@ export default function Cheetah() { rel="noopener noreferrer" href="https://github.com/WildKernels/GKI_KernelSU_SUSFS" > - 6.1.134-android14-SUSFS-Wild + 6.1.138-android14-SUSFS-Wild -

    +

    ;

    ROM: @@ -89,9 +89,9 @@ export default function Cheetah() { className="underline hover:glow transition-all" target="_blank" rel="noopener noreferrer" - href="https://developer.android.com/about/versions/16/get#google-pixel-devices" + href="https://developer.android.com/about/versions/16/qpr2" > - Android 16 QPR1 + Android 16 Beta QPR2