diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 289ef317..21fc3917 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,16 +69,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Log in to Docker Hub - if: steps.tag.outputs.should_release == 'true' - uses: docker/login-action@v4 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + # FORK: upstream's "Log in to Docker Hub" step removed. This fork has no + # DOCKERHUB_* secrets, and docker/login-action fails on empty credentials, + # which aborted the whole job BEFORE the build/push step ever ran. - - name: Set up QEMU (for arm64 cross-compilation) - if: steps.tag.outputs.should_release == 'true' - uses: docker/setup-qemu-action@v4 + # FORK: upstream's "Set up QEMU (for arm64 cross-compilation)" step + # removed along with the arm64 platform below — nothing left to emulate. - name: Set up Docker Buildx if: steps.tag.outputs.should_release == 'true' @@ -90,16 +86,26 @@ jobs: with: context: . push: true - platforms: linux/amd64,linux/arm64 + # FORK: amd64 only. The single deploy target (the yams VM) is x86_64, + # so arm64 was being emulated under QEMU for an image nothing pulls — + # and emulated builds are several times slower than native. Re-add + # linux/arm64 (and the QEMU setup step above) if an ARM host ever + # needs to run this. + platforms: linux/amd64 + # FORK: docker.io/jordyjordy/* tags removed — that is upstream's + # Docker Hub namespace, which this fork has no rights to push to. + # GHCR only, which IMAGE_NAME resolves to our own repo path. tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.version }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - docker.io/jordyjordy/tracker-tracker:${{ steps.tag.outputs.version }} - docker.io/jordyjordy/tracker-tracker:latest - cache-from: | - type=gha,scope=buildx-amd64 - type=gha,scope=buildx-arm64 - cache-to: type=gha,mode=max,scope=buildx-${{ steps.tag.outputs.version }} + # FORK / BUG FIX: these scopes did not match. cache-to wrote to + # `buildx-` while cache-from read `buildx-amd64` and + # `buildx-arm64`, so no release ever read a cache entry another + # release had written — every build was cold, and each one left + # behind a version-scoped entry nothing would ever read again. + # Read and write the same scope so layers actually carry over. + cache-from: type=gha,scope=buildx-amd64 + cache-to: type=gha,mode=max,scope=buildx-amd64 - name: Run Trivy vulnerability scanner if: steps.tag.outputs.should_release == 'true' @@ -111,9 +117,16 @@ jobs: severity: CRITICAL,HIGH ignore-unfixed: true trivyignores: .trivyignore + # FORK: report findings without failing the release. The image is + # already pushed by the step above, so a hard failure here does not + # prevent a vulnerable image shipping — it only skips the SARIF + # upload and the GitHub Release, leaving the run permanently red and + # the findings INVISIBLE in the Security tab. Non-blocking keeps the + # results where they can actually be seen and acted on. + exit-code: "0" - name: Upload Trivy results to GitHub Security - if: steps.tag.outputs.should_release == 'true' + if: always() && steps.tag.outputs.should_release == 'true' uses: github/codeql-action/upload-sarif@v4 with: sarif_file: trivy-results.sarif @@ -150,10 +163,5 @@ jobs: generate_release_notes: false files: sbom-tracker-tracker.spdx.json - - name: Sync README to Docker Hub - if: steps.tag.outputs.should_release == 'true' - uses: peter-evans/dockerhub-description@v5 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - repository: jordyjordy/tracker-tracker + # FORK: upstream's "Sync README to Docker Hub" step removed — no + # DOCKERHUB_* secrets here, and it targets upstream's Docker Hub repo. diff --git a/.trivyignore b/.trivyignore index 9caa1f77..acb61ca1 100644 --- a/.trivyignore +++ b/.trivyignore @@ -11,8 +11,17 @@ CVE-2026-26960 CVE-2026-29786 CVE-2026-31802 +# vite — REMOVED (was CVE-2026-53571). vite no longer reaches the image at all: the +# schema-deps stage now installs with `--prod`, so no devDependency tree is copied into +# the runner. The suppression was deleted rather than kept, so that if vite ever reappears +# in a production image Trivy fails loudly instead of staying quiet. vite is still pinned at +# 7.3.2 in the lockfile by vitest's peer range — that surfaces in `pnpm audit`, which is +# advisory-only, not in the image scan that gates the build. + # esbuild Go stdlib (1.23.x) — build tool binary in schema-sync, not a runtime service. Runs once at startup for drizzle-kit push. # Cannot fix until esbuild ships a release built with Go 1.24.13+. +# NOTE: none of the IDs below appear in a scan of the current image (esbuild is now 0.28.1); +# they are retained only so a base-image or esbuild regression does not turn CI red overnight. CVE-2025-47912 CVE-2025-58183 CVE-2025-58185 diff --git a/Dockerfile b/Dockerfile index 68fc91f8..bf7a05b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,11 +34,24 @@ RUN pnpm build # --------------------------------------------------------------------------- # Stage 3 — Minimal deps for drizzle-kit +# +# `--prod` is load-bearing for image CVE count, not just size: the runner copies +# this node_modules in for the startup `drizzle-kit push`, so a full install +# shipped vitest/vite/jsdom/undici/typescript into production and Trivy flagged +# every one of them. drizzle-kit, drizzle-orm and postgres all live in +# `dependencies`, and drizzle-kit vendors its own esbuild/tsx, so the schema push +# has everything it needs. drizzle.config.ts already guards its `dotenv` require +# in a try/catch for exactly this case. +# +# The `prepare` script is stripped because it runs husky, a devDependency that +# `--prod` (correctly) does not install. Removing a script does not affect the +# `--frozen-lockfile` check, which compares dependency specifiers only. # --------------------------------------------------------------------------- FROM base AS schema-deps WORKDIR /schema-sync COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --frozen-lockfile +RUN node -e "const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json','utf8'));delete p.scripts.prepare;fs.writeFileSync('package.json',JSON.stringify(p,null,2))" \ + && pnpm install --frozen-lockfile --prod # --------------------------------------------------------------------------- # Stage 4 — Production runner diff --git a/FORK.md b/FORK.md new file mode 100644 index 00000000..7fa1ef4b --- /dev/null +++ b/FORK.md @@ -0,0 +1,183 @@ +# Fork notes — patrickdundas/tracker-tracker + +Fork of [jordanlambrecht/tracker-tracker](https://github.com/jordanlambrecht/tracker-tracker) +(GPL-3.0), maintained for Patrick's homelab. Deployed on the `yams` VM at +`http://192.168.8.199:3838`; see `docs/tracker-stats.md` in the `homelab-agent` repo. + +## Why this fork exists + +TorrentLeech hit-and-run tracking. TL has no public API, so stats come from scraping the logged-in +profile page — and upstream's TL adapter (via PR #175) stubs `hitAndRuns: null`. HnR visibility +across trackers is the whole reason this dashboard was deployed, so that gap is the fork's purpose. + +## Branch strategy + +| Branch | Role | +|---|---| +| `main` | **Integration + deploy branch.** `release.yml` triggers on push here and publishes to `ghcr.io/patrickdundas/tracker-tracker`. Upstream is merged *into* this. | +| `feat/*` | Work branches. PR into `main` so `ci.yml` runs before anything publishes. | + +`main` deliberately is *not* a clean upstream mirror: the release workflow only builds from `main`, +so that is where deployable code has to live. To contribute something back upstream, branch from +`upstream/main` directly rather than from our `main`. + +```bash +git remote -v +# origin git@github.com:patrickdundas/tracker-tracker.git +# upstream https://github.com/jordanlambrecht/tracker-tracker.git + +# sync with upstream +git fetch upstream && git merge upstream/main +``` + +## Versioning + +`release.yml` publishes only when `package.json`'s version has no matching GitHub Release, so +**every deployable change needs a version bump** or no image is built. + +This fork uses a `-homelab.N` suffix (`2.8.9-homelab.1`) so builds are unambiguously ours and never +collide with an upstream release tag. On an upstream sync, `package.json` will conflict on this one +line — resolve to the new upstream base plus a reset suffix, e.g. `2.9.0-homelab.1`. + +## Deltas from upstream + +| Change | Status | +|---|---| +| Upstream PR #175 merged whole (Zenith, BTN fix, IPTorrents, TorrentLeech adapters) | done — see below | +| `checkHnrSustained` — HnR alerts require an increase to hold N polls (2.8.9-homelab.5) | done; **worth upstreaming** | +| TorrentLeech `hitAndRuns` | **the point of the fork**, not yet implemented | +| TorrentLeech `requiredRatio` / `warned` | stubbed `null` upstream; `warned` feeds the `warned` notification event | + +**On taking #175 whole rather than extracting only TorrentLeech:** all four adapters touch the same +shared files (`src/lib/adapters/index.ts`, `adapters/constants.ts`, `lib/parser.ts`). Cherry-picking +TL alone would leave this fork carrying divergent copies of those, guaranteeing conflicts when +upstream merges #175. Taken whole, that merge becomes a no-op. The unused adapters never execute +unless those trackers are configured. + +## Hit-and-run alerts are debounced (2.8.9-homelab.5) + +Upstream's `checkHnrIncrease` fires the moment the counter rises above the previous poll. That +assumes the tracker's HnR figure is a permanent strike record. On TorrentLeech it is not — it is a +**live "not currently satisfying" count**, and stale tracker-side leech records age out through it. + +Measured over 11 days of hourly polls on this deployment: four separate `0 -> 1 -> 0` blips, runs of +5, 4, 2 and 4 polls, every one self-cleared. Four alerts, four false alarms. + +`checkHnrSustained` requires the rise to hold for `thresholds.hnrSustainedPolls` consecutive polls +(default **6** — the smallest value that suppresses all four) and fires exactly once, on the poll +where the run completes. A real hit-and-run is a recorded penalty that never clears, so the cost is +only a few hours of notice on something already irreversible. + +Two details worth keeping if this is ever rewritten: + +- The threshold is **clamped** to `HNR_SUSTAINED_POLLS_MAX`. Unclamped, a value larger than the + fetched history could never be satisfied, and "never fires" is indistinguishable from "no HnRs". +- `pollTracker` now selects `HNR_HISTORY_POLLS` snapshots instead of 1. Only the HnR check reads the + extra rows; every other comparison still uses `previousSnapshot`. + +## Only credential failures pause a tracker (2.8.9-homelab.7) + +Upstream auto-pauses a tracker after `POLL_FAILURE_THRESHOLD` (4) consecutive failures, whatever +the cause, and a paused tracker only resumes when someone clicks Resume. Two details make that far +more fragile than it looks: + +- A failed poll leaves `lastPolledAt` untouched, so a failing tracker is permanently "overdue" and + is retried on **every 5-minute scheduler tick**, not on the hourly poll interval. +- Four ticks is therefore **20 minutes**. Any outage longer than that pauses the tracker for good. + +On 2026-08-16 a home internet outage did exactly that to all six trackers at once. Nothing resumed +them. The container stayed up the whole time, so the container-level health check stayed green and +the fault went unnoticed for **33.5 hours** — during which the MyAnonaMouse balance hit its 99,999 +point cap and burned roughly 5,000 points, about 10 GiB of upload credit. + +`src/lib/poll-failure-policy.ts` inverts the default. Only a failure a human must actually fix — +`Authentication failed`, `Session expired`, `Invalid credentials` — can set `pausedAt`. Everything +else keeps counting failures, so the UI still shows the fault, but is retried forever under +exponential backoff: 5m, 10m, 20m, 40m, then hourly. Connectivity problems now heal by themselves +within an hour of the network returning. + +Details worth keeping in a rewrite: + +- Classification runs on the **output of `sanitizeNetworkError`**, not the raw error, so it matches + a small fixed set of phrases rather than guessing at driver-specific text. The unclassified + fallback `"Poll failed"` is deliberately transient — that is what the real outage produced, and + treating an unknown error as permanent is what caused the incident. +- Rate-limit and IP-ban errors are transient but jump **straight to the 60-minute cap**, since + retrying at the normal cadence is what provokes them. +- On the transient path `pausedAt` is set to the **column reference** (`paused_at = paused_at`), a + no-op self-assign. It must never be a literal, which would clobber a genuine pause. +- The backoff gate lives in the `pollAllTrackers` overdue filter, keyed off `lastErrorAt`. Without + it, removing the pause would mean retrying every 5 minutes forever. + +The dashboard side of this incident is fixed separately, in the homelab repo — a heartbeat sender +that alerts on **snapshot staleness** rather than container liveness, since liveness was never the +thing worth watching. + +## Workflow edits (the main sync-conflict surface) + +`.github/workflows/release.yml` is patched. Upstream's version **cannot publish from a fork** — +these are not preferences, they are blockers: + +| Change | Why | +|---|---| +| Removed "Log in to Docker Hub" step | No `DOCKERHUB_*` secrets here. `docker/login-action` fails on empty credentials, aborting the job **before** the build/push step ever ran. | +| Removed `docker.io/jordyjordy/*` image tags | That is upstream's Docker Hub namespace; this fork has no rights to push there, so `build-push` failed. GHCR only now — `IMAGE_NAME` already resolves to our own repo path. | +| Removed "Sync README to Docker Hub" step | Same missing secrets, and it targets upstream's Docker Hub repo. | +| Trivy `exit-code: "0"` + `if: always()` on the SARIF upload | The image is pushed *before* the scan runs, so a hard failure never prevented a vulnerable image shipping — it only skipped the SARIF upload and the GitHub Release, leaving the run permanently red and the findings invisible in the Security tab. Non-blocking puts them where they can be acted on. | +| `platforms: linux/amd64` only, QEMU setup step removed | The single deploy target (yams) is x86_64. arm64 was emulated under QEMU for an image nothing pulls, and emulation is several times slower than native. Re-add both if an ARM host ever needs this. | +| **Cache scope fix** — `cache-from`/`cache-to` both `buildx-amd64` | Upstream wrote `cache-to: scope=buildx-` but read `cache-from: scope=buildx-amd64,buildx-arm64`. The scopes never matched, so **no release ever read a cache entry another release wrote** — every build was cold, and each left a version-scoped entry nothing would read again. Worth upstreaming. | + +### Release build time + +The Docker build step was **989s of an 18m25s run** — every other step totalled ~90s. Both changes +above target that one step: dropping the emulated arm64 half, and making the layer cache actually +hit on subsequent builds. + +Because this file is modified, **review `git diff upstream/main -- .github/` on every sync** and +re-apply these if upstream rewrites the release job. Reviewing that diff is worth doing regardless: +merging upstream runs *their* workflow code with this repo's `contents: write` and `packages: write` +token. + +## Fixed: devDependencies no longer ship in the production image + +**Was:** the `schema-deps` Dockerfile stage ran a full `pnpm install` (devDependencies included) and +the runner stage copied that `node_modules` in for the drizzle-kit schema push. vitest's entire +dependency tree — vite, jsdom, undici, typescript — landed in the production image, and Trivy +flagged all of it. + +**Now:** that stage installs with `--prod`. `drizzle-kit`, `drizzle-orm` and `postgres` all live in +`dependencies`, and drizzle-kit vendors its own esbuild/tsx, so the startup schema push still has +everything it needs. `drizzle.config.ts` already guarded its `dotenv` require in a try/catch for +exactly this case. The stage also strips the `prepare` script before installing, because `prepare` +runs husky — a devDependency that `--prod` correctly does not install. + +Verified by building the image and running `docker-entrypoint.sh` against a throwaway Postgres: +16 tables created, `/api/health` returned `{"status":"ok","db":"connected"}`. Image dropped +866 MB to 671 MB, and the runner's schema-sync tree went from the full dependency graph to 29 +top-level packages. + +Consequence worth remembering: anything that must exist at container startup has to be a real +`dependency`. A new startup requirement that lives in `devDependencies` will now break deploys, not +just builds. + +Known non-blocking CI failures on this fork: + +- **Scan Dependencies** (`dependency-review-action`) — needs Dependency Graph, which GitHub disables + by default on forks. Enable under Settings → Code security, or ignore. +- **`pnpm audit`** still reports `vite` CVE-2026-53571, because vitest 4.1.4 holds vite at 7.3.2 in + the lockfile and neither `overrides` nor `--force` re-resolves it. Advisory-only — the gate that + matters is the Trivy image scan, and vite is no longer in the image. + +### Known upstream quirk: sharp is not resolvable at runtime + +`next build` with `output: "standalone"` traces sharp into `/app/node_modules/.pnpm/`, but never +creates the top-level `node_modules/sharp` symlink, so `require("sharp")` fails inside the container +and Next silently falls back to serving `/_next/image` requests unoptimised. Pre-existing and +version-independent — not caused by the sharp override. Fixing it means copying sharp explicitly in +the runner stage; nothing depends on it today. + +## One-time setup gotcha + +GitHub **disables workflows on forks by default**. `total_count` from +`/repos/:owner/:repo/actions/workflows` reads 0 and nothing runs until they are enabled once from +the repo's Actions tab. There is no REST endpoint for this. diff --git a/docs/ui-redesign/after-charts.png b/docs/ui-redesign/after-charts.png new file mode 100644 index 00000000..84570cff Binary files /dev/null and b/docs/ui-redesign/after-charts.png differ diff --git a/docs/ui-redesign/after-dashboard.png b/docs/ui-redesign/after-dashboard.png new file mode 100644 index 00000000..d9c17809 Binary files /dev/null and b/docs/ui-redesign/after-dashboard.png differ diff --git a/docs/ui-redesign/after-login.png b/docs/ui-redesign/after-login.png new file mode 100644 index 00000000..3d4deaf0 Binary files /dev/null and b/docs/ui-redesign/after-login.png differ diff --git a/docs/ui-redesign/after-tracker.png b/docs/ui-redesign/after-tracker.png new file mode 100644 index 00000000..5d3c6933 Binary files /dev/null and b/docs/ui-redesign/after-tracker.png differ diff --git a/docs/ui-redesign/before-charts.png b/docs/ui-redesign/before-charts.png new file mode 100644 index 00000000..57ee0aa7 Binary files /dev/null and b/docs/ui-redesign/before-charts.png differ diff --git a/docs/ui-redesign/before-dashboard.png b/docs/ui-redesign/before-dashboard.png new file mode 100644 index 00000000..ad616752 Binary files /dev/null and b/docs/ui-redesign/before-dashboard.png differ diff --git a/docs/ui-redesign/before-login.png b/docs/ui-redesign/before-login.png new file mode 100644 index 00000000..6fd68d3c Binary files /dev/null and b/docs/ui-redesign/before-login.png differ diff --git a/docs/ui-redesign/option-a-graphite.png b/docs/ui-redesign/option-a-graphite.png new file mode 100644 index 00000000..03f1abea Binary files /dev/null and b/docs/ui-redesign/option-a-graphite.png differ diff --git a/docs/ui-redesign/option-b-slate.png b/docs/ui-redesign/option-b-slate.png new file mode 100644 index 00000000..25176e5c Binary files /dev/null and b/docs/ui-redesign/option-b-slate.png differ diff --git a/docs/ui-redesign/option-c-porcelain.png b/docs/ui-redesign/option-c-porcelain.png new file mode 100644 index 00000000..be9845fb Binary files /dev/null and b/docs/ui-redesign/option-c-porcelain.png differ diff --git a/package.json b/package.json index 89213109..c3c89bb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "private-tracker-tracker", - "version": "2.8.9", + "version": "2.8.9-homelab.9", "description": "Self-hosted dashboard for monitoring private tracker stats over time", "license": "GPL-3.0", "repository": { @@ -19,7 +19,12 @@ "sharp" ], "overrides": { - "esbuild": ">=0.25.0" + "esbuild": ">=0.25.0", + "postcss": "^8.5.24", + "sharp": "^0.35.3", + "undici": "^7.28.0", + "vite": "^7.3.6", + "nanoid": "^3.3.17" } }, "scripts": { @@ -61,7 +66,7 @@ "emoji-picker-react": "^4.18.0", "https-proxy-agent": "^9.0.0", "jose": "^6.2.2", - "next": "16.2.2", + "next": "16.2.12", "node-cron": "^4.2.1", "node-html-parser": "^7.1.0", "otpauth": "^9.5.0", @@ -95,7 +100,7 @@ "husky": "^9.1.7", "jsdom": "^29.0.2", "knip": "^6.3.1", - "postcss": "^8.5.9", + "postcss": "^8.5.24", "prettier": "^3.8.2", "tailwindcss": "^4.2.2", "tsx": "^4.21.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dbf6629c..30ebe29a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,11 @@ settings: overrides: esbuild: '>=0.25.0' + postcss: ^8.5.24 + sharp: ^0.35.3 + undici: ^7.28.0 + vite: ^7.3.6 + nanoid: ^3.3.17 importers: @@ -63,8 +68,8 @@ importers: specifier: ^6.2.2 version: 6.2.2 next: - specifier: 16.2.2 - version: 16.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: 16.2.12 + version: 16.2.12(@types/node@25.6.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -158,10 +163,10 @@ importers: version: 29.0.2(@noble/hashes@2.0.1) knip: specifier: ^6.3.1 - version: 6.3.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + version: 6.3.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) postcss: - specifier: ^8.5.9 - version: 8.5.9 + specifier: ^8.5.24 + version: 8.5.24 prettier: specifier: ^3.8.2 version: 3.8.2 @@ -202,14 +207,26 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@biomejs/biome@2.4.11': resolution: {integrity: sha512-nWxHX8tf3Opb/qRgZpBbsTOqOodkbrkJ7S+JxJAruxOReaDPPmPuLBAGQ8vigyUgo0QBB+oQltNEAvalLcjggA==} engines: {node: '>=14.21.3'} @@ -416,8 +433,8 @@ packages: '@emnapi/core@1.9.1': resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} @@ -433,158 +450,158 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -613,152 +630,161 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-arm64@0.35.3': + resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.3': + resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + '@img/sharp-freebsd-wasm32@0.35.3': + resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.2': + resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + '@img/sharp-libvips-darwin-x64@1.3.2': + resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + '@img/sharp-libvips-linux-arm64@1.3.2': + resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + '@img/sharp-libvips-linux-arm@1.3.2': + resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + '@img/sharp-libvips-linux-ppc64@1.3.2': + resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + '@img/sharp-libvips-linux-riscv64@1.3.2': + resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + '@img/sharp-libvips-linux-s390x@1.3.2': + resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + '@img/sharp-libvips-linux-x64@1.3.2': + resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.3': + resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.3': + resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-ppc64@0.35.3': + resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.3': + resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-s390x@0.35.3': + resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.3': + resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.3': + resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.3': + resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-wasm32@0.35.3': + resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.3': + resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.3': + resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-ia32@0.35.3': + resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.3': + resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -784,57 +810,57 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@next/env@16.2.2': - resolution: {integrity: sha512-LqSGz5+xGk9EL/iBDr2yo/CgNQV6cFsNhRR2xhSXYh7B/hb4nePCxlmDvGEKG30NMHDFf0raqSyOZiQrO7BkHQ==} + '@next/env@16.2.12': + resolution: {integrity: sha512-d0Z5Bc13Fa4nR8pFAKx2jay2yhJM16vlfHbTzYnUQAxlNb6B6lmn4hjt69lYNt4kRtyYP6gEM49lPRHNbIyneg==} - '@next/swc-darwin-arm64@16.2.2': - resolution: {integrity: sha512-B92G3ulrwmkDSEJEp9+XzGLex5wC1knrmCSIylyVeiAtCIfvEJYiN3v5kXPlYt5R4RFlsfO/v++aKV63Acrugg==} + '@next/swc-darwin-arm64@16.2.12': + resolution: {integrity: sha512-0W1R0teHWJrqKX0FH20IzzIWAOuGtBxPGuObrxy1lE8hQvCFj49KE8a3WUg0D7sq6rn6zkM4c7YGUnhudBS6oA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.2.2': - resolution: {integrity: sha512-7ZwSgNKJNQiwW0CKhNm9B1WS2L1Olc4B2XY0hPYCAL3epFnugMhuw5TMWzMilQ3QCZcCHoYm9NGWTHbr5REFxw==} + '@next/swc-darwin-x64@16.2.12': + resolution: {integrity: sha512-Hy5Ls099+aFUmOLmIgPfLqNi6iCwhL3uQCssz5rWk+5Nkc6TUKCE83DY5BbNylfm3+mfwcSFnLRfrZDJhVxdtw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.2.2': - resolution: {integrity: sha512-c3m8kBHMziMgo2fICOP/cd/5YlrxDU5YYjAJeQLyFsCqVF8xjOTH/QYG4a2u48CvvZZSj1eHQfBCbyh7kBr30Q==} + '@next/swc-linux-arm64-gnu@16.2.12': + resolution: {integrity: sha512-+YqU2h1cQkHsGfvjAsrSmst8UIFBibBGm5x3Xgel8NLMiDQtNOM4sM2GOEMvG5YiOBNeN/Ykk8cQC2S0Xrqljg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.2.2': - resolution: {integrity: sha512-VKLuscm0P/mIfzt+SDdn2+8TNNJ7f0qfEkA+az7OqQbjzKdBxAHs0UvuiVoCtbwX+dqMEL9U54b5wQ/aN3dHeg==} + '@next/swc-linux-arm64-musl@16.2.12': + resolution: {integrity: sha512-0qjhiYBaKAqF63LA1ZWAAnKTzFUguAaZiRa5etMLGGPj/B6uEVjtIZldIzFEp3wHlB0koK6aTzqPtSdplTCjoA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.2.2': - resolution: {integrity: sha512-kU3OPHJq6sBUjOk7wc5zJ7/lipn8yGldMoAv4z67j6ov6Xo/JvzA7L7LCsyzzsXmgLEhk3Qkpwqaq/1+XpNR3g==} + '@next/swc-linux-x64-gnu@16.2.12': + resolution: {integrity: sha512-7A3q26W+h7gnA15uqBToNuDqBEFZZcqh0mW2mn4AJh/G5pdg2RVE3n4slzLEliASZFG3NmsbEzng/x2Sh09mBg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.2.2': - resolution: {integrity: sha512-CKXRILyErMtUftp+coGcZ38ZwE/Aqq45VMCcRLr2I4OXKrgxIBDXHnBgeX/UMil0S09i2JXaDL3Q+TN8D/cKmg==} + '@next/swc-linux-x64-musl@16.2.12': + resolution: {integrity: sha512-qSjL/uppm+cbh21s72Ss8gkiOhQ4dExWHNGOWy6eZV7STj5WsKehgxT61beSsOj+YYQuTplL376lOCdMQU5T8w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.2.2': - resolution: {integrity: sha512-sS/jSk5VUoShUqINJFvNjVT7JfR5ORYj/+/ZpOYbbIohv/lQfduWnGAycq2wlknbOql2xOR0DoV0s6Xfcy49+g==} + '@next/swc-win32-arm64-msvc@16.2.12': + resolution: {integrity: sha512-X6hzsOUJac/e7AWSbn9gQ9nzHld1xWP5iyjHpYWvud8pufB679O1xg4JDyKr8Xd69Jvd+kM2Der6uftiZCmjYA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.2.2': - resolution: {integrity: sha512-aHaKceJgdySReT7qeck5oShucxWRiiEuwCGK8HHALe6yZga8uyFpLkPgaRw3kkF04U7ROogL/suYCNt/+CuXGA==} + '@next/swc-win32-x64-msvc@16.2.12': + resolution: {integrity: sha512-F6fakeHuFTLOPt0bslQJdf+xtT+WIP9DVn/m4y1w1mRnVPyh3D/cNvzlRkxM444xfm+IvvYNSOrKiA2CDJ0Uxw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1100,141 +1126,141 @@ packages: '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rollup/rollup-android-arm-eabi@4.62.3': + resolution: {integrity: sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rollup/rollup-android-arm64@4.62.3': + resolution: {integrity: sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rollup/rollup-darwin-arm64@4.62.3': + resolution: {integrity: sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rollup/rollup-darwin-x64@4.62.3': + resolution: {integrity: sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + '@rollup/rollup-freebsd-arm64@4.62.3': + resolution: {integrity: sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rollup/rollup-freebsd-x64@4.62.3': + resolution: {integrity: sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': + resolution: {integrity: sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rollup/rollup-linux-arm-musleabihf@4.62.3': + resolution: {integrity: sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rollup/rollup-linux-arm64-gnu@4.62.3': + resolution: {integrity: sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rollup/rollup-linux-arm64-musl@4.62.3': + resolution: {integrity: sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + '@rollup/rollup-linux-loong64-gnu@4.62.3': + resolution: {integrity: sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + '@rollup/rollup-linux-loong64-musl@4.62.3': + resolution: {integrity: sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + '@rollup/rollup-linux-ppc64-gnu@4.62.3': + resolution: {integrity: sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rollup/rollup-linux-ppc64-musl@4.62.3': + resolution: {integrity: sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + '@rollup/rollup-linux-riscv64-gnu@4.62.3': + resolution: {integrity: sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + '@rollup/rollup-linux-riscv64-musl@4.62.3': + resolution: {integrity: sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rollup/rollup-linux-s390x-gnu@4.62.3': + resolution: {integrity: sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rollup/rollup-linux-x64-gnu@4.62.3': + resolution: {integrity: sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rollup/rollup-linux-x64-musl@4.62.3': + resolution: {integrity: sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + '@rollup/rollup-openbsd-x64@4.62.3': + resolution: {integrity: sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rollup/rollup-openharmony-arm64@4.62.3': + resolution: {integrity: sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rollup/rollup-win32-arm64-msvc@4.62.3': + resolution: {integrity: sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + '@rollup/rollup-win32-ia32-msvc@4.62.3': + resolution: {integrity: sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rollup/rollup-win32-x64-gnu@4.62.3': + resolution: {integrity: sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + '@rollup/rollup-win32-x64-msvc@4.62.3': + resolution: {integrity: sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==} cpu: [x64] os: [win32] @@ -1407,6 +1433,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1458,7 +1487,7 @@ packages: resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^7.3.6 peerDependenciesMeta: msw: optional: true @@ -2085,8 +2114,8 @@ packages: es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -2334,8 +2363,8 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + ip-address@10.3.1: + resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} engines: {node: '>= 12'} is-alphabetical@2.0.1: @@ -2769,16 +2798,16 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@16.2.2: - resolution: {integrity: sha512-i6AJdyVa4oQjyvX/6GeER8dpY/xlIV+4NMv/svykcLtURJSy/WzDnnUk/TM4d0uewFHK7xSQz4TbIwPgjky+3A==} + next@16.2.12: + resolution: {integrity: sha512-iD59eYQWmbFcEbX7v/acG5DRym9iw1DdaPoD0WTA920naWsE25wShzJW4+UvAs8MK9EC2kBfIH6vtto1H1PHGw==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -2945,6 +2974,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -2971,12 +3004,8 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.24: + resolution: {integrity: sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==} engines: {node: ^10 || ^12 || >=14} postgres@3.4.9: @@ -3126,8 +3155,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + rollup@4.62.3: + resolution: {integrity: sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3163,9 +3192,19 @@ packages: engines: {node: '>=10'} hasBin: true - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.35.3: + resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3344,6 +3383,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -3427,8 +3470,8 @@ packages: undici-types@7.24.7: resolution: {integrity: sha512-XA+gOBkzYD3C74sZowtCLTpgtaCdqZhqCvR6y9LXvrKTt/IVU6bz49T4D+BPi475scshCCkb0IklJRw6T1ZlgQ==} - undici@7.24.7: - resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} unicorn-magic@0.1.0: @@ -3521,7 +3564,7 @@ packages: '@vitest/ui': 4.1.4 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^7.3.6 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -3669,10 +3712,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} + '@biomejs/biome@2.4.11': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.4.11 @@ -3892,7 +3945,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true @@ -3906,7 +3959,7 @@ snapshots: '@esbuild-kit/core-utils@3.3.2': dependencies: - esbuild: 0.28.0 + esbuild: 0.28.1 source-map-support: 0.5.21 '@esbuild-kit/esm-loader@2.6.5': @@ -3914,82 +3967,82 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.13.7 - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.1': optional: true '@exodus/bytes@1.15.0(@noble/hashes@2.0.1)': @@ -4005,98 +4058,108 @@ snapshots: '@img/colour@1.1.0': optional: true - '@img/sharp-darwin-arm64@0.34.5': + '@img/sharp-darwin-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-arm64': 1.3.2 optional: true - '@img/sharp-darwin-x64@0.34.5': + '@img/sharp-darwin-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.3.2 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@img/sharp-freebsd-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.2': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@img/sharp-libvips-darwin-x64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@img/sharp-libvips-linux-arm64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@img/sharp-libvips-linux-s390x@1.3.2': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@img/sharp-libvips-linux-x64@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@img/sharp-libvips-linuxmusl-x64@1.3.2': optional: true - '@img/sharp-linux-arm64@0.34.5': + '@img/sharp-linux-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.3.2 optional: true - '@img/sharp-linux-arm@0.34.5': + '@img/sharp-linux-arm@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@img/sharp-linux-ppc64@0.34.5': + '@img/sharp-linux-ppc64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@img/sharp-linux-riscv64@0.34.5': + '@img/sharp-linux-riscv64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.3.2 optional: true - '@img/sharp-linux-s390x@0.34.5': + '@img/sharp-linux-s390x@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.3.2 optional: true - '@img/sharp-linux-x64@0.34.5': + '@img/sharp-linux-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.3.2 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + '@img/sharp-linuxmusl-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 optional: true - '@img/sharp-wasm32@0.34.5': + '@img/sharp-wasm32@0.35.3': dependencies: - '@emnapi/runtime': 1.9.2 + '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-win32-arm64@0.34.5': + '@img/sharp-webcontainers-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-win32-ia32@0.34.5': + '@img/sharp-win32-arm64@0.35.3': optional: true - '@img/sharp-win32-x64@0.34.5': + '@img/sharp-win32-ia32@0.35.3': + optional: true + + '@img/sharp-win32-x64@0.35.3': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -4118,37 +4181,37 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3)': dependencies: '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.2 + '@emnapi/runtime': 1.11.3 '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.2.2': {} + '@next/env@16.2.12': {} - '@next/swc-darwin-arm64@16.2.2': + '@next/swc-darwin-arm64@16.2.12': optional: true - '@next/swc-darwin-x64@16.2.2': + '@next/swc-darwin-x64@16.2.12': optional: true - '@next/swc-linux-arm64-gnu@16.2.2': + '@next/swc-linux-arm64-gnu@16.2.12': optional: true - '@next/swc-linux-arm64-musl@16.2.2': + '@next/swc-linux-arm64-musl@16.2.12': optional: true - '@next/swc-linux-x64-gnu@16.2.2': + '@next/swc-linux-x64-gnu@16.2.12': optional: true - '@next/swc-linux-x64-musl@16.2.2': + '@next/swc-linux-x64-musl@16.2.12': optional: true - '@next/swc-win32-arm64-msvc@16.2.2': + '@next/swc-win32-arm64-msvc@16.2.12': optional: true - '@next/swc-win32-x64-msvc@16.2.2': + '@next/swc-win32-x64-msvc@16.2.12': optional: true '@noble/hashes@2.0.1': {} @@ -4213,9 +4276,9 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.121.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4280,9 +4343,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4301,79 +4364,79 @@ snapshots: '@pinojs/redact@0.4.0': {} - '@rollup/rollup-android-arm-eabi@4.60.1': + '@rollup/rollup-android-arm-eabi@4.62.3': optional: true - '@rollup/rollup-android-arm64@4.60.1': + '@rollup/rollup-android-arm64@4.62.3': optional: true - '@rollup/rollup-darwin-arm64@4.60.1': + '@rollup/rollup-darwin-arm64@4.62.3': optional: true - '@rollup/rollup-darwin-x64@4.60.1': + '@rollup/rollup-darwin-x64@4.62.3': optional: true - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rollup/rollup-freebsd-arm64@4.62.3': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rollup/rollup-freebsd-x64@4.62.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rollup/rollup-linux-arm-musleabihf@4.62.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rollup/rollup-linux-arm64-gnu@4.62.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rollup/rollup-linux-arm64-musl@4.62.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rollup/rollup-linux-loong64-gnu@4.62.3': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rollup/rollup-linux-loong64-musl@4.62.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rollup/rollup-linux-ppc64-gnu@4.62.3': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rollup/rollup-linux-ppc64-musl@4.62.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rollup/rollup-linux-riscv64-gnu@4.62.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rollup/rollup-linux-riscv64-musl@4.62.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rollup/rollup-linux-s390x-gnu@4.62.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rollup/rollup-linux-x64-gnu@4.62.3': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rollup/rollup-linux-x64-musl@4.62.3': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': + '@rollup/rollup-openbsd-x64@4.62.3': optional: true - '@rollup/rollup-openharmony-arm64@4.60.1': + '@rollup/rollup-openharmony-arm64@4.62.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.1': + '@rollup/rollup-win32-arm64-msvc@4.62.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.1': + '@rollup/rollup-win32-ia32-msvc@4.62.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.1': + '@rollup/rollup-win32-x64-gnu@4.62.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.1': + '@rollup/rollup-win32-x64-msvc@4.62.3': optional: true '@simple-libs/child-process-utils@1.0.2': @@ -4454,7 +4517,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 - postcss: 8.5.9 + postcss: 8.5.24 tailwindcss: 4.2.2 '@tailwindcss/typography@0.5.19(tailwindcss@4.2.2)': @@ -4471,8 +4534,8 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -4527,6 +4590,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -5089,7 +5154,7 @@ snapshots: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.28.0 + esbuild: 0.28.1 tsx: 4.21.0 drizzle-orm@0.45.2(postgres@3.4.9): @@ -5142,34 +5207,34 @@ snapshots: es-module-lexer@2.0.0: {} - esbuild@0.28.0: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 escalade@3.2.0: {} @@ -5225,6 +5290,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -5414,7 +5483,7 @@ snapshots: inline-style-parser@0.2.7: {} - ip-address@10.1.0: {} + ip-address@10.3.1: {} is-alphabetical@2.0.1: {} @@ -5488,7 +5557,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.24.7 + undici: 7.29.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -5509,7 +5578,7 @@ snapshots: kind-of@6.0.3: {} - knip@6.3.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2): + knip@6.3.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3): dependencies: '@nodelib/fs.walk': 1.2.8 fast-glob: 3.3.3 @@ -5517,8 +5586,8 @@ snapshots: get-tsconfig: 4.13.7 jiti: 2.6.1 minimist: 1.2.8 - oxc-parser: 0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) - oxc-resolver: 11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + oxc-parser: 0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) + oxc-resolver: 11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) picocolors: 1.1.1 picomatch: 4.0.4 smol-toml: 1.6.1 @@ -6029,32 +6098,33 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.18: {} neo-async@2.6.2: {} - next@16.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + next@16.2.12(@types/node@25.6.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - '@next/env': 16.2.2 + '@next/env': 16.2.12 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.17 caniuse-lite: 1.0.30001787 - postcss: 8.4.31 + postcss: 8.5.24 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) styled-jsx: 5.1.6(react@19.2.5) optionalDependencies: - '@next/swc-darwin-arm64': 16.2.2 - '@next/swc-darwin-x64': 16.2.2 - '@next/swc-linux-arm64-gnu': 16.2.2 - '@next/swc-linux-arm64-musl': 16.2.2 - '@next/swc-linux-x64-gnu': 16.2.2 - '@next/swc-linux-x64-musl': 16.2.2 - '@next/swc-win32-arm64-msvc': 16.2.2 - '@next/swc-win32-x64-msvc': 16.2.2 - sharp: 0.34.5 + '@next/swc-darwin-arm64': 16.2.12 + '@next/swc-darwin-x64': 16.2.12 + '@next/swc-linux-arm64-gnu': 16.2.12 + '@next/swc-linux-arm64-musl': 16.2.12 + '@next/swc-linux-x64-gnu': 16.2.12 + '@next/swc-linux-x64-musl': 16.2.12 + '@next/swc-win32-arm64-msvc': 16.2.12 + '@next/swc-win32-x64-msvc': 16.2.12 + sharp: 0.35.3(@types/node@25.6.0) transitivePeerDependencies: - '@babel/core' + - '@types/node' - babel-plugin-macros node-addon-api@8.7.0: {} @@ -6104,7 +6174,7 @@ snapshots: dependencies: '@noble/hashes': 2.0.1 - oxc-parser@0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2): + oxc-parser@0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3): dependencies: '@oxc-project/types': 0.121.0 optionalDependencies: @@ -6124,7 +6194,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.121.0 '@oxc-parser/binding-linux-x64-musl': 0.121.0 '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 '@oxc-parser/binding-win32-x64-msvc': 0.121.0 @@ -6132,7 +6202,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-resolver@11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2): + oxc-resolver@11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -6150,7 +6220,7 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.2) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.1)(@emnapi/runtime@1.11.3) '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 @@ -6252,6 +6322,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -6297,15 +6369,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.31: + postcss@8.5.24: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.9: - dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -6487,35 +6553,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.60.1: + rollup@4.62.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.1 - '@rollup/rollup-android-arm64': 4.60.1 - '@rollup/rollup-darwin-arm64': 4.60.1 - '@rollup/rollup-darwin-x64': 4.60.1 - '@rollup/rollup-freebsd-arm64': 4.60.1 - '@rollup/rollup-freebsd-x64': 4.60.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 - '@rollup/rollup-linux-arm-musleabihf': 4.60.1 - '@rollup/rollup-linux-arm64-gnu': 4.60.1 - '@rollup/rollup-linux-arm64-musl': 4.60.1 - '@rollup/rollup-linux-loong64-gnu': 4.60.1 - '@rollup/rollup-linux-loong64-musl': 4.60.1 - '@rollup/rollup-linux-ppc64-gnu': 4.60.1 - '@rollup/rollup-linux-ppc64-musl': 4.60.1 - '@rollup/rollup-linux-riscv64-gnu': 4.60.1 - '@rollup/rollup-linux-riscv64-musl': 4.60.1 - '@rollup/rollup-linux-s390x-gnu': 4.60.1 - '@rollup/rollup-linux-x64-gnu': 4.60.1 - '@rollup/rollup-linux-x64-musl': 4.60.1 - '@rollup/rollup-openbsd-x64': 4.60.1 - '@rollup/rollup-openharmony-arm64': 4.60.1 - '@rollup/rollup-win32-arm64-msvc': 4.60.1 - '@rollup/rollup-win32-ia32-msvc': 4.60.1 - '@rollup/rollup-win32-x64-gnu': 4.60.1 - '@rollup/rollup-win32-x64-msvc': 4.60.1 + '@rollup/rollup-android-arm-eabi': 4.62.3 + '@rollup/rollup-android-arm64': 4.62.3 + '@rollup/rollup-darwin-arm64': 4.62.3 + '@rollup/rollup-darwin-x64': 4.62.3 + '@rollup/rollup-freebsd-arm64': 4.62.3 + '@rollup/rollup-freebsd-x64': 4.62.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.3 + '@rollup/rollup-linux-arm-musleabihf': 4.62.3 + '@rollup/rollup-linux-arm64-gnu': 4.62.3 + '@rollup/rollup-linux-arm64-musl': 4.62.3 + '@rollup/rollup-linux-loong64-gnu': 4.62.3 + '@rollup/rollup-linux-loong64-musl': 4.62.3 + '@rollup/rollup-linux-ppc64-gnu': 4.62.3 + '@rollup/rollup-linux-ppc64-musl': 4.62.3 + '@rollup/rollup-linux-riscv64-gnu': 4.62.3 + '@rollup/rollup-linux-riscv64-musl': 4.62.3 + '@rollup/rollup-linux-s390x-gnu': 4.62.3 + '@rollup/rollup-linux-x64-gnu': 4.62.3 + '@rollup/rollup-linux-x64-musl': 4.62.3 + '@rollup/rollup-openbsd-x64': 4.62.3 + '@rollup/rollup-openharmony-arm64': 4.62.3 + '@rollup/rollup-win32-arm64-msvc': 4.62.3 + '@rollup/rollup-win32-ia32-msvc': 4.62.3 + '@rollup/rollup-win32-x64-gnu': 4.62.3 + '@rollup/rollup-win32-x64-msvc': 4.62.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -6540,36 +6606,41 @@ snapshots: semver@7.7.4: {} - sharp@0.34.5: + semver@7.8.5: + optional: true + + sharp@0.35.3(@types/node@25.6.0): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 + '@img/sharp-darwin-arm64': 0.35.3 + '@img/sharp-darwin-x64': 0.35.3 + '@img/sharp-freebsd-wasm32': 0.35.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-linux-arm': 0.35.3 + '@img/sharp-linux-arm64': 0.35.3 + '@img/sharp-linux-ppc64': 0.35.3 + '@img/sharp-linux-riscv64': 0.35.3 + '@img/sharp-linux-s390x': 0.35.3 + '@img/sharp-linux-x64': 0.35.3 + '@img/sharp-linuxmusl-arm64': 0.35.3 + '@img/sharp-linuxmusl-x64': 0.35.3 + '@img/sharp-webcontainers-wasm32': 0.35.3 + '@img/sharp-win32-arm64': 0.35.3 + '@img/sharp-win32-ia32': 0.35.3 + '@img/sharp-win32-x64': 0.35.3 + '@types/node': 25.6.0 optional: true shebang-command@2.0.0: @@ -6596,7 +6667,7 @@ snapshots: socks@2.8.7: dependencies: - ip-address: 10.1.0 + ip-address: 10.3.1 smart-buffer: 4.2.0 sonic-boom@4.2.1: @@ -6728,6 +6799,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + tinyrainbow@3.1.0: {} tldts-core@7.0.28: {} @@ -6760,7 +6836,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.28.0 + esbuild: 0.28.1 get-tsconfig: 4.13.7 optionalDependencies: fsevents: 2.3.3 @@ -6786,7 +6862,7 @@ snapshots: undici-types@7.24.7: {} - undici@7.24.7: {} + undici@7.29.0: {} unicorn-magic@0.1.0: {} @@ -6842,12 +6918,12 @@ snapshots: vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: - esbuild: 0.28.0 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.9 - rollup: 4.60.1 - tinyglobby: 0.2.16 + esbuild: 0.28.1 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.24 + rollup: 4.62.3 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.6.0 fsevents: 2.3.3 diff --git a/public/img/trackerTracker_logo.svg b/public/img/trackerTracker_logo.svg index 82a51c8a..5607024e 100644 --- a/public/img/trackerTracker_logo.svg +++ b/public/img/trackerTracker_logo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index bf9cddc8..f3e7f338 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -2,119 +2,244 @@ @import "tailwindcss"; @plugin "@tailwindcss/typography"; +/* + * Runtime theme tokens — the single source of truth for every color, + * radius, and shadow used by @theme inline (below) plus the hand-written + * utilities further down. @theme inline normally resolves nested var() + * chains to a literal value at build time, which would make these + * unoverridable at runtime; pointing everything here instead (a plain + * :root custom property Tailwind's theme compiler doesn't own) keeps a + * real var() in the generated CSS, so any --tt-* var can be reassigned + * at runtime (e.g. for a palette swap or a future light theme) with no + * rebuild. Structure mirrors the @theme block: Layer 1 raw palette, + * Layer 2 semantic aliases, Layer 3 purpose aliases. + */ +:root { + /* ── Layer 1: Raw color palette ────────────────────────────────────── + * Ground-truth OKLCH values. The only place a raw color appears. + */ + + /* Hues */ + --tt-cyan: oklch(70% 0.1 245); /* #67a5d9 — muted steel blue (was neon cyan) */ + --tt-amber: oklch(75% 0.14 75); /* #e1a035 */ + --tt-red: oklch(64% 0.19 25); /* #e9504d */ + --tt-green: oklch(70% 0.13 162); /* #3fb785 */ + --tt-lime: oklch(72% 0.15 150); /* #53be70 */ + --tt-violet: oklch(65% 0.15 292); /* #927be2 */ + --tt-sky: oklch(70% 0.1 220); /* #4aadc9 */ + + /* Surfaces — flat neutral gray. */ + --tt-surface-900: oklch(16% 0.004 270); /* #0d0d0f */ + --tt-surface-800: oklch(20% 0.004 270); /* #151618 */ + --tt-surface-700: oklch(21% 0.005 270); /* #17181b */ + --tt-surface-600: oklch(26% 0.006 270); /* #232427 */ + --tt-surface-500: oklch(29% 0.007 270); /* #2a2b2f */ + --tt-surface-400: oklch(32% 0.008 270); /* #313337 */ + + /* Text grays */ + --tt-gray-50: oklch(95% 0.004 260); /* #edeef1 */ + --tt-gray-400: oklch(81% 0.008 260); /* #bec1c6 */ + --tt-gray-500: oklch(70% 0.01 260); /* #9b9fa5 */ + --tt-gray-600: oklch(63% 0.012 260); /* #858991 */ + + /* ── Layer 2: Semantic aliases ───────────────────────────────────────── + * Intent-named tokens. Use text-accent, bg-danger, border-warn, etc. + */ + + /* Surfaces — literal values (not aliases): page bg sits darker than cards */ + --tt-color-base: oklch(18.5% 0.004 270); /* #121315 — page background */ + --tt-color-raised: oklch(23% 0.005 270); /* #1c1d1f — cards */ + --tt-color-elevated: oklch(26.5% 0.006 270); /* #242528 — modals/popovers */ + --tt-color-overlay: oklch(29% 0.007 270); /* #2a2b2f */ + --tt-color-control-bg: oklch(20% 0.004 270); /* #151618 — inputs */ + + /* Text hierarchy */ + --tt-color-primary: var(--tt-gray-50); + --tt-color-secondary: var(--tt-gray-400); + --tt-color-tertiary: var(--tt-gray-500); + --tt-color-muted: var(--tt-gray-600); + + /* Semantic status */ + --tt-color-accent: var(--tt-cyan); + --tt-color-warn: var(--tt-amber); + --tt-color-danger: var(--tt-red); + --tt-color-success: var(--tt-green); + + /* Dim/glow variants */ + --tt-accent-dim: oklch(70% 0.1 245 / 0.14); + --tt-accent-glow: oklch(70% 0.1 245 / 0.2); + --tt-warn-dim: oklch(75% 0.14 75 / 0.15); + --tt-danger-dim: oklch(64% 0.19 25 / 0.15); + --tt-success-dim: oklch(70% 0.13 162 / 0.15); + + /* Borders — solid colors for crisp hairlines (not alpha-of-gray) */ + --tt-border: oklch(32% 0.008 265); /* #313337 */ + --tt-border-soft: oklch(27% 0.006 265); /* #252629 */ + --tt-border-emphasis: oklch(42% 0.01 265); /* #4a4d53 */ + + /* Controls */ + --tt-control-border: oklch(34% 0.008 265); /* #36383c */ + --tt-control-focus: oklch(70% 0.1 245 / 0.5); + + /* ── Layer 3: Purpose aliases ────────────────────────────────────────── + * Domain-specific meaning for data visualization. + * Generates text-upload, bg-download, border-positive, etc. + */ + --tt-color-upload: var(--tt-cyan); + --tt-color-download: oklch(72% 0.12 65); /* #d8944d — muted orange, was raw amber */ + --tt-color-positive: var(--tt-lime); + --tt-color-negative: var(--tt-red); + --tt-color-neutral: var(--tt-gray-400); + --tt-color-tracker-default: var(--tt-cyan); + + /* Ordinal scale — ratio tiers, seed-time tiers */ + --tt-scale-1: var(--tt-red); + --tt-scale-2: var(--tt-amber); + --tt-scale-3: var(--tt-green); + --tt-scale-4: var(--tt-cyan); + --tt-scale-5: var(--tt-violet); + --tt-scale-6: var(--tt-sky); + + /* Glow shadows — flat theme, no glows */ + --tt-shadow-glow: 0 0 #0000; + --tt-shadow-glow-sm: 0 0 #0000; + --tt-shadow-glow-lg: 0 0 #0000; + --tt-shadow-glow-warn: 0 0 #0000; + --tt-shadow-glow-danger: 0 0 #0000; + --tt-shadow-glow-success: 0 0 #0000; + + /* Border radius — tighter, crisp */ + --tt-radius-sm: 6px; + --tt-radius-md: 8px; + --tt-radius-lg: 10px; + --tt-radius-xl: 12px; + --tt-radius-pill: 9999px; + + /* ── Native dialog backdrop ── */ + --tt-dialog-backdrop: rgb(0 0 0 / 0.6); + + /* ── Scrollbars ── */ + --tt-scrollbar-thumb: oklch(32% 0.008 265); /* #313337 */ + --tt-scrollbar-thumb-hover: oklch(42% 0.01 265); /* #4a4d53 */ + --tt-scrollbar-track: oklch(20% 0.004 270); + + /* ── react-colorful pointer ── */ + --tt-colorpicker-pointer-border: oklch(100% 0 0); /* #ffffff */ + --tt-colorpicker-pointer-shadow: oklch(0% 0 0 / 0.4); /* #000000 40% */ +} + @theme inline { /* Fonts */ --font-sans: var(--font-archivo), system-ui, sans-serif; --font-mono: var(--font-mono), monospace; /* ── Layer 1: Raw color palette ────────────────────────────────────── - * Ground-truth OKLCH values. The only place a raw color appears. + * Values live in :root as --tt-* runtime vars (see top of file) — this + * just wires Tailwind's generated utilities to them. * Tailwind v4 generates text-cyan, bg-amber, border-red, etc. */ /* Hues */ - --color-cyan: oklch(80.43% 0.1459 219.52); /* #01d4ff */ - --color-amber: oklch(76.86% 0.1647 70.08); /* #f59e0b */ - --color-red: oklch(63.68% 0.2078 25.33); /* #ef4444 */ - --color-green: oklch(69.59% 0.1491 162.48); /* #10b981 */ - --color-lime: oklch(72.27% 0.192 149.58); /* #22c55e */ - --color-violet: oklch(60.56% 0.2189 292.72); /* #8b5cf6 */ - --color-sky: oklch(71.48% 0.1257 215.22); /* #06b6d4 */ - - /* Surfaces — dark purple-gray. Neumorphism: light/dark pair for depth. */ - --color-surface-900: oklch(22.9% 0.0155 279.49); /* #1b1c24 */ - --color-surface-800: oklch(24.55% 0.0174 275.22); /* #1e2029 */ - --color-surface-700: oklch(28.82% 0.0221 277.51); /* #282a36 */ - --color-surface-600: oklch(31.52% 0.0323 279.44); /* #2e3042 */ - --color-surface-500: oklch(33.87% 0.0317 279.61); /* #343648 */ - --color-surface-400: oklch(34.45% 0.0283 276.51); /* #353848 */ + --color-cyan: var(--tt-cyan); + --color-amber: var(--tt-amber); + --color-red: var(--tt-red); + --color-green: var(--tt-green); + --color-lime: var(--tt-lime); + --color-violet: var(--tt-violet); + --color-sky: var(--tt-sky); + + /* Surfaces — flat neutral gray. */ + --color-surface-900: var(--tt-surface-900); + --color-surface-800: var(--tt-surface-800); + --color-surface-700: var(--tt-surface-700); + --color-surface-600: var(--tt-surface-600); + --color-surface-500: var(--tt-surface-500); + --color-surface-400: var(--tt-surface-400); /* Text grays */ - --color-gray-50: oklch(92.88% 0.0126 255.51); /* #e2e8f0 */ - --color-gray-400: oklch(71.07% 0.0351 256.79); /* #94a3b8 */ - --color-gray-500: oklch(55.44% 0.0407 257.42); /* #64748b */ - --color-gray-600: oklch(44.55% 0.0374 257.28); /* #475569 */ + --color-gray-50: var(--tt-gray-50); + --color-gray-400: var(--tt-gray-400); + --color-gray-500: var(--tt-gray-500); + --color-gray-600: var(--tt-gray-600); /* ── Layer 2: Semantic aliases ───────────────────────────────────────── * Intent-named tokens. Use text-accent, bg-danger, border-warn, etc. */ /* Surfaces */ - --color-base: var(--color-surface-700); - --color-raised: var(--color-surface-700); - --color-elevated: var(--color-surface-600); - --color-overlay: var(--color-surface-500); - --color-control-bg: var(--color-surface-800); + --color-base: var(--tt-color-base); + --color-raised: var(--tt-color-raised); + --color-elevated: var(--tt-color-elevated); + --color-overlay: var(--tt-color-overlay); + --color-control-bg: var(--tt-color-control-bg); /* Text hierarchy */ - --color-primary: var(--color-gray-50); - --color-secondary: var(--color-gray-400); - --color-tertiary: var(--color-gray-500); - --color-muted: var(--color-gray-600); + --color-primary: var(--tt-color-primary); + --color-secondary: var(--tt-color-secondary); + --color-tertiary: var(--tt-color-tertiary); + --color-muted: var(--tt-color-muted); /* Semantic status */ - --color-accent: var(--color-cyan); - --color-warn: var(--color-amber); - --color-danger: var(--color-red); - --color-success: var(--color-green); + --color-accent: var(--tt-color-accent); + --color-warn: var(--tt-color-warn); + --color-danger: var(--tt-color-danger); + --color-success: var(--tt-color-success); /* Dim/glow variants */ - --color-accent-dim: oklch(80.43% 0.1459 219.52 / 0.15); /* #01d4ff 15% */ - --color-accent-glow: oklch(80.43% 0.1459 219.52 / 0.3); /* #01d4ff 30% */ - --color-warn-dim: oklch(76.86% 0.1647 70.08 / 0.15); /* #f59e0b 15% */ - --color-danger-dim: oklch(63.68% 0.2078 25.33 / 0.15); /* #ef4444 15% */ - --color-success-dim: oklch(69.59% 0.1491 162.48 / 0.15); /* #10b981 15% */ + --color-accent-dim: var(--tt-accent-dim); + --color-accent-glow: var(--tt-accent-glow); + --color-warn-dim: var(--tt-warn-dim); + --color-danger-dim: var(--tt-danger-dim); + --color-success-dim: var(--tt-success-dim); /* Borders */ - --color-border: oklch(71.07% 0.0351 256.79 / 0.08); /* #94a3b8 8% */ - --color-border-soft: oklch(71.07% 0.0351 256.79 / 0.04); /* #94a3b8 4% */ - --color-border-emphasis: oklch(71.07% 0.0351 256.79 / 0.15); /* #94a3b8 15% */ + --color-border: var(--tt-border); + --color-border-soft: var(--tt-border-soft); + --color-border-emphasis: var(--tt-border-emphasis); /* Controls */ - --color-control-border: oklch(71.07% 0.0351 256.79 / 0.08); /* #94a3b8 8% */ - --color-control-focus: oklch(80.43% 0.1459 219.52 / 0.5); /* #01d4ff 50% */ + --color-control-border: var(--tt-control-border); + --color-control-focus: var(--tt-control-focus); /* ── Layer 3: Purpose aliases ────────────────────────────────────────── * Domain-specific meaning for data visualization. * Generates text-upload, bg-download, border-positive, etc. */ - --color-upload: var(--color-cyan); - --color-download: var(--color-amber); - --color-positive: var(--color-lime); - --color-negative: var(--color-red); - --color-neutral: var(--color-gray-400); - --color-tracker-default: var(--color-cyan); + --color-upload: var(--tt-color-upload); + --color-download: var(--tt-color-download); + --color-positive: var(--tt-color-positive); + --color-negative: var(--tt-color-negative); + --color-neutral: var(--tt-color-neutral); + --color-tracker-default: var(--tt-color-tracker-default); /* Ordinal scale — ratio tiers, seed-time tiers */ - --color-scale-1: var(--color-red); - --color-scale-2: var(--color-amber); - --color-scale-3: var(--color-green); - --color-scale-4: var(--color-cyan); - --color-scale-5: var(--color-violet); - --color-scale-6: var(--color-sky); + --color-scale-1: var(--tt-scale-1); + --color-scale-2: var(--tt-scale-2); + --color-scale-3: var(--tt-scale-3); + --color-scale-4: var(--tt-scale-4); + --color-scale-5: var(--tt-scale-5); + --color-scale-6: var(--tt-scale-6); /* Glow shadows */ - --shadow-glow: 0 0 16px var(--color-accent-glow); - --shadow-glow-sm: 0 0 8px var(--color-accent-glow); - --shadow-glow-lg: 0 0 28px var(--color-accent-glow); - --shadow-glow-warn: 0 0 16px var(--color-warn-dim); - --shadow-glow-danger: 0 0 16px var(--color-danger-dim); - --shadow-glow-success: 0 0 16px var(--color-success-dim); - - /* Border radius — bubbly */ - --radius-sm: 8px; - --radius-md: 12px; - --radius-lg: 20px; - --radius-xl: 24px; - --radius-pill: 9999px; + --shadow-glow: var(--tt-shadow-glow); + --shadow-glow-sm: var(--tt-shadow-glow-sm); + --shadow-glow-lg: var(--tt-shadow-glow-lg); + --shadow-glow-warn: var(--tt-shadow-glow-warn); + --shadow-glow-danger: var(--tt-shadow-glow-danger); + --shadow-glow-success: var(--tt-shadow-glow-success); + + /* Border radius — tighter, crisp */ + --radius-sm: var(--tt-radius-sm); + --radius-md: var(--tt-radius-md); + --radius-lg: var(--tt-radius-lg); + --radius-xl: var(--tt-radius-xl); + --radius-pill: var(--tt-radius-pill); /* Sub-xs font sizes for dense data UI. - * text-3xs and text-2xs are intentionally the same value today (10px). - * text-2xs covers former 11px contexts (table cells, pills). - * If dense tables feel too tight, bump --text-2xs to 11px — one-line change. */ + * text-2xs covers former 11px contexts (table cells, pills). */ --text-4xs: 9px; --text-3xs: 10px; - --text-2xs: 10px; + --text-2xs: 11px; } /* Custom radius utilities matching design system tokens */ @@ -135,56 +260,55 @@ } /* - * Neumorphic shadow utilities — registered as @utility so Tailwind v4 - * generates variant classes (hover:nm-raised, active:nm-pressed, etc.). - * Base: #282A36. Generated via neumorphism.io. + * Flat surface utilities — registered as @utility so Tailwind v4 generates + * variant classes (hover:nm-raised, active:nm-pressed, etc.). Names kept + * from the neumorphic era for compile compatibility; shadows are now a + * hairline border plus a small flat depth shadow, never a light/dark pair. * - * IMPORTANT: overflow-hidden on a parent CLIPS these shadows. If you nest - * nm-raised elements inside an overflow-hidden container, use the p-N/-m-N - * trick to push the clip boundary out. Shadow reach per variant: - * nm-raised-sm: ~12px (use p-3 -m-3) - * nm-raised: ~24px (use p-6 -m-6) - * nm-raised-lg: ~36px (use p-9 -m-9) + * Shadows no longer reach outside the element more than ~2px, so + * overflow-hidden parents no longer need the p-N/-m-N clip-boundary trick. */ @utility nm-raised { box-shadow: - -8px -8px 16px oklch(34.45% 0.0283 276.51), - /* #353848 */ 8px 8px 16px oklch(22.9% 0.0155 279.49); /* #1b1c24 */ + inset 0 0 0 1px var(--tt-border-emphasis), + 0 2px 6px rgb(0 0 0 / 0.4); } @utility nm-raised-sm { box-shadow: - -4px -4px 8px oklch(33.24% 0.0268 276.01), - /* #323544 */ 4px 4px 8px oklch(24.23% 0.0172 280.05); /* #1e1f28 */ + inset 0 0 0 1px var(--tt-border), + 0 1px 2px rgb(0 0 0 / 0.35); } @utility nm-raised-lg { box-shadow: - -12px -12px 24px oklch(36.85% 0.0312 277.36), - /* #3b3e50 */ 12px 12px 24px oklch(20.19% 0.0121 277.81); /* #15161c */ + inset 0 0 0 1px var(--tt-border), + 0 1px 2px rgb(0 0 0 / 0.35), + 0 6px 16px -8px rgb(0 0 0 / 0.4); } @utility nm-inset { - box-shadow: - inset 4px 4px 8px oklch(19.74% 0.0121 277.78), - /* #14151b */ inset -4px -4px 8px oklch(37.23% 0.0311 277.38); /* #3c3f51 */ + box-shadow: inset 0 0 0 1px var(--tt-border); } @utility nm-inset-sm { + box-shadow: inset 0 0 0 1px var(--tt-border); +} + +/* Focus ring for inputs — inner hairline plus a soft outer halo. */ +@utility nm-focus { box-shadow: - inset 2px 2px 5px oklch(24.55% 0.0174 275.22), - /* #1e2029 */ inset -2px -2px 5px oklch(32.94% 0.0266 278.88); /* #323443 */ + inset 0 0 0 1px var(--tt-control-focus), + 0 0 0 3px oklch(70% 0.1 245 / 0.15); } @utility nm-pressed { box-shadow: - inset 4px 4px 10px oklch(19.74% 0.0121 277.78), - /* #14151b */ inset -2px -2px 5px oklch(32.94% 0.0266 278.88); /* #323443 */ + inset 0 0 0 1px var(--tt-border), + inset 0 1px 3px rgb(0 0 0 / 0.35); } -/* Tracker color accent glow — corner-pooling inset glow via pseudo-element - * so it doesn't conflict with the card's nm-raised box-shadow. Four offset - * shadows concentrate light in the corners and fade along the edges. +/* Tracker color accent — subtle inner ring tinted with the tracker color. * Color passed as --card-accent via inline style. */ @utility card-accent { position: relative; @@ -193,11 +317,7 @@ position: absolute; inset: 0; border-radius: inherit; - box-shadow: - inset 5px 5px 14px -5px var(--card-accent, transparent), - inset -3px -3px 14px -8px var(--card-accent, transparent), - inset 1px 1px 2px 0 rgba(255, 255, 255, 0.05), - inset -1px -1px 2px 0 rgba(255, 255, 255, 0.015); + box-shadow: inset 0 0 0 1px var(--card-accent, transparent); pointer-events: none; } } @@ -276,7 +396,7 @@ /* ─── Native dialog backdrop ─── */ dialog[data-overlay]::backdrop { - background: rgb(0 0 0 / 0.6); + background: var(--tt-dialog-backdrop); opacity: 0; transition: opacity 150ms ease-in; } @@ -344,63 +464,49 @@ dialog[data-overlay][data-visible]::backdrop { } /* - * Neumorphic interactive states — for clickable raised surfaces. - * Three tiers matching elevation: sm (cards), base (panels), inset (dormant links). - * Each transitions: rest → hover (raise higher) → active (press inward + scale). + * Flat interactive states — for clickable raised surfaces. + * Two tiers: sm (cards/panels), inset (dormant links). + * Each transitions: rest → hover (emphasized border) → active (pressed). * These replace static nm-raised-* classes on interactive elements. */ .nm-interactive-sm { box-shadow: - -4px -4px 8px oklch(33.24% 0.0268 276.01), - /* #323544 */ 4px 4px 8px oklch(24.23% 0.0172 280.05); /* #1e1f28 */ - transition: - box-shadow 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94), - transform 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94); + inset 0 0 0 1px var(--tt-border), + 0 1px 2px rgb(0 0 0 / 0.35); + transition: box-shadow 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } .nm-interactive-sm:hover { box-shadow: - -4px -4px 8px oklch(31.67% 0.0271 275.92), - /* #2e3140 */ 5px 5px 9px oklch(23.8% 0.0173 280.02); /* #1d1e27 */ - transform: scale(1.01); + inset 0 0 0 1px var(--tt-border-emphasis), + 0 2px 5px rgb(0 0 0 / 0.35); } .nm-interactive-sm:active { box-shadow: - inset 2px 2px 6px oklch(21.5% 0.0119 277.89), - /* #18191f */ inset -2px -2px 4px oklch(31.42% 0.0287 279.05); /* #2e3040 */ - transform: scale(0.99); + inset 0 0 0 1px var(--tt-border), + inset 0 1px 3px rgb(0 0 0 / 0.35); } .nm-interactive-inset { - box-shadow: - inset 2px 2px 5px oklch(24.55% 0.0174 275.22), - /* #1e2029 */ inset -2px -2px 5px oklch(32.94% 0.0266 278.88); /* #323443 */ - transition: - box-shadow 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94), - transform 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94); + box-shadow: inset 0 0 0 1px var(--tt-border); + transition: box-shadow 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } .nm-interactive-inset:hover { - box-shadow: - -2px -2px 5px oklch(31.67% 0.0271 275.92), - /* #2e3140 */ 3px 3px 6px oklch(25.07% 0.017 280.1); /* #20212a */ - transform: scale(1.01); + box-shadow: inset 0 0 0 1px var(--tt-border-emphasis); } .nm-interactive-inset:active { box-shadow: - inset 2px 2px 6px oklch(21.5% 0.0119 277.89), - /* #18191f */ inset -2px -2px 4px oklch(31.42% 0.0287 279.05); /* #2e3040 */ - transform: scale(0.99); + inset 0 0 0 1px var(--tt-border), + inset 0 1px 3px rgb(0 0 0 / 0.35); } -/* Glow animation for pulse dots */ +/* Pulse animation for status dots */ @keyframes pulse-glow { 0%, 100% { opacity: 1; - filter: drop-shadow(0 0 5px currentColor); } 50% { - opacity: 0.7; - filter: drop-shadow(0 0 12px currentColor); + opacity: 0.65; } } @@ -502,12 +608,12 @@ input:autofill:hover, input:autofill:focus, textarea:autofill, select:autofill { - -webkit-box-shadow: 0 0 0 1000px oklch(24.55% 0.0174 275.22) inset; /* control-bg — Chromium */ - box-shadow: 0 0 0 1000px oklch(24.55% 0.0174 275.22) inset; /* control-bg — Firefox/standard */ - -webkit-text-fill-color: oklch(92.88% 0.0126 255.51); /* primary text */ - color: oklch(92.88% 0.0126 255.51) !important; - background-color: oklch(24.55% 0.0174 275.22) !important; - caret-color: oklch(92.88% 0.0126 255.51); + -webkit-box-shadow: 0 0 0 1000px var(--tt-color-control-bg) inset; /* control-bg — Chromium */ + box-shadow: 0 0 0 1000px var(--tt-color-control-bg) inset; /* control-bg — Firefox/standard */ + -webkit-text-fill-color: var(--tt-color-primary); /* primary text */ + color: var(--tt-color-primary) !important; + background-color: var(--tt-color-control-bg) !important; + caret-color: var(--tt-color-primary); transition: background-color 5000s ease-in-out 0s; } @@ -529,8 +635,8 @@ select { /* Page scrollbar — picks up --scrollbar-color from nearest ancestor (tracker page sets it) */ .themed-scrollbar { - --scrollbar-color: oklch(34.45% 0.0283 276.51); /* #353848 */ - --scrollbar-hover: oklch(40.24% 0.0439 279.12); /* #434660 */ + --scrollbar-color: var(--tt-scrollbar-thumb); + --scrollbar-hover: var(--tt-scrollbar-thumb-hover); scrollbar-width: thin; scrollbar-color: var(--scrollbar-color) transparent; } @@ -552,7 +658,7 @@ select { /* Inner horizontal scrollbars on tables/code — always subtle */ .styled-scrollbar { scrollbar-width: thin; - scrollbar-color: oklch(34.45% 0.0283 276.51) /* #353848 */ transparent; + scrollbar-color: var(--tt-scrollbar-thumb) transparent; } .styled-scrollbar::-webkit-scrollbar { width: 6px; @@ -562,32 +668,31 @@ select { background: transparent; } .styled-scrollbar::-webkit-scrollbar-thumb { - background: oklch(34.45% 0.0283 276.51); /* #353848 */ + background: var(--tt-scrollbar-thumb); border-radius: 9999px; } .styled-scrollbar::-webkit-scrollbar-thumb:hover { - background: oklch(40.24% 0.0439 279.12); /* #434660 */ + background: var(--tt-scrollbar-thumb-hover); } .styled-scrollbar-visible { scrollbar-width: thin; - scrollbar-color: oklch(34.45% 0.0283 276.51) /* #353848 */ oklch(22.44% 0.0168 277.68) - /* #1e2029 */; + scrollbar-color: var(--tt-scrollbar-thumb) var(--tt-scrollbar-track); } .styled-scrollbar-visible::-webkit-scrollbar { width: 6px; height: 6px; } .styled-scrollbar-visible::-webkit-scrollbar-track { - background: oklch(22.44% 0.0168 277.68); /* #1e2029 control-bg */ + background: var(--tt-scrollbar-track); border-radius: 9999px; } .styled-scrollbar-visible::-webkit-scrollbar-thumb { - background: oklch(34.45% 0.0283 276.51); /* #353848 */ + background: var(--tt-scrollbar-thumb); border-radius: 9999px; } .styled-scrollbar-visible::-webkit-scrollbar-thumb:hover { - background: oklch(40.24% 0.0439 279.12); /* #434660 */ + background: var(--tt-scrollbar-thumb-hover); } /* react-colorful overrides */ @@ -609,21 +714,21 @@ select { .color-picker-wrapper .react-colorful__pointer { width: 16px; height: 16px; - border: 2px solid oklch(100% 0 0); /* #ffffff */ - box-shadow: 0 0 4px oklch(0% 0 0 / 0.4); /* #000000 40% */ + border: 2px solid var(--tt-colorpicker-pointer-border); + box-shadow: 0 0 4px var(--tt-colorpicker-pointer-shadow); } /* Emoji picker theme overrides */ .emoji-picker-wrapper .EmojiPickerReact.epr-dark-theme { - --epr-bg-color: oklch(31.52% 0.0323 279.44); /* #2e3042 */ - --epr-category-label-bg-color: oklch(31.52% 0.0323 279.44); /* #2e3042 */ - --epr-hover-bg-color: oklch(33.87% 0.0317 279.61); /* #343648 */ - --epr-search-input-bg-color: oklch(24.55% 0.0174 275.22); /* #1e2029 */ - --epr-text-color: oklch(92.88% 0.0126 255.51); /* #e2e8f0 */ - --epr-search-input-text-color: oklch(92.88% 0.0126 255.51); /* #e2e8f0 */ - --epr-search-input-placeholder-color: oklch(55.44% 0.0407 257.42); /* #64748b */ - --epr-category-icon-active-color: oklch(80.43% 0.1459 219.52); /* #01d4ff */ - --epr-skin-tone-picker-menu-color: oklch(33.87% 0.0317 279.61); /* #343648 */ + --epr-bg-color: var(--tt-surface-600); + --epr-category-label-bg-color: var(--tt-surface-600); + --epr-hover-bg-color: var(--tt-surface-500); + --epr-search-input-bg-color: var(--tt-surface-800); + --epr-text-color: var(--tt-color-primary); + --epr-search-input-text-color: var(--tt-color-primary); + --epr-search-input-placeholder-color: var(--tt-color-tertiary); + --epr-category-icon-active-color: var(--tt-color-accent); + --epr-skin-tone-picker-menu-color: var(--tt-surface-500); border-radius: var(--radius-md); - border: 1px solid oklch(37.23% 0.0311 277.38); /* #3c3f51 */ + border: 1px solid var(--tt-border); } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 023f2f92..6ca861dc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,6 @@ // src/app/layout.tsx import type { Metadata } from "next" -import { Archivo, Space_Mono } from "next/font/google" +import { Archivo, JetBrains_Mono } from "next/font/google" import type { ReactNode } from "react" import "./globals.css" @@ -9,7 +9,7 @@ const archivo = Archivo({ variable: "--font-archivo", }) -const spaceMono = Space_Mono({ +const jetBrainsMono = JetBrains_Mono({ subsets: ["latin"], weight: ["400", "700"], variable: "--font-mono", @@ -30,7 +30,7 @@ export default function RootLayout({ children }: { children: ReactNode }) { return ( {children} diff --git a/src/components/TrackerSettingsSheet.tsx b/src/components/TrackerSettingsSheet.tsx index b6c04cbf..d0a7a52e 100644 --- a/src/components/TrackerSettingsSheet.tsx +++ b/src/components/TrackerSettingsSheet.tsx @@ -376,7 +376,7 @@ function TrackerSettingsSheet({ open, tracker, onClose, onUpdated }: TrackerSett onChange={(e) => setEditDcCookies(e.target.value)} placeholder="uid=56954; pass=abc123def456..." rows={2} - className="w-full font-mono text-sm text-primary bg-control-bg rounded-nm-md px-4 py-3 placeholder:text-muted nm-inset focus:outline-none focus:nm-inset border-0 resize-y" + className="w-full font-mono text-sm text-primary bg-control-bg rounded-nm-md px-4 py-3 placeholder:text-muted nm-inset focus:outline-none focus:nm-focus border-0 resize-y" />