From d94c1a93940341388889b5ce683a795e2a25bd53 Mon Sep 17 00:00:00 2001
From: Nebojsa Stojanovic
Date: Fri, 13 Nov 2026 16:15:14 +0100
Subject: [PATCH 1/2] test: add dashboard E2E CI and privacy-safe error
monitoring
---
.coderabbit.yaml | 10 +
.env.example | 11 +
.githooks/pre-commit | 3 +
.github/workflows/ci.yml | 24 +
.gitignore | 6 +
.npmrc | 1 +
app/app/error.tsx | 21 +
app/app/layout.tsx | 4 +-
app/global-error.tsx | 15 +
app/layout.tsx | 2 +
components/monitoring.tsx | 18 +
components/product/dashboard-page.tsx | 128 +-
eslint.config.mjs | 20 +
instrumentation.ts | 8 +
lib/current-user.ts | 24 +
lib/e2e-mode.ts | 9 +
lib/loadiq-api.ts | 16 +-
lib/monitoring/privacy.ts | 158 +
lib/monitoring/sentry.ts | 50 +
lib/monitoring/source-files.json | 45 +
middleware.ts | 12 +-
next.config.js | 13 +-
package.json | 13 +-
playwright.config.ts | 23 +
pnpm-lock.yaml | 4563 ++++++++++++++++++++++---
quality/eslint-baseline.json | 15 +
quality/format-baseline.json | 15 +
scripts/check-format.mjs | 66 +
scripts/check-quality.mjs | 61 +
scripts/e2e-server.mjs | 49 +
tests/dashboard.spec.ts | 74 +
tests/fixture-server.mjs | 115 +
tests/privacy.spec.ts | 206 ++
33 files changed, 5283 insertions(+), 515 deletions(-)
create mode 100644 .coderabbit.yaml
create mode 100644 .env.example
create mode 100755 .githooks/pre-commit
create mode 100644 .github/workflows/ci.yml
create mode 100644 .npmrc
create mode 100644 app/app/error.tsx
create mode 100644 app/global-error.tsx
create mode 100644 components/monitoring.tsx
create mode 100644 eslint.config.mjs
create mode 100644 instrumentation.ts
create mode 100644 lib/current-user.ts
create mode 100644 lib/e2e-mode.ts
create mode 100644 lib/monitoring/privacy.ts
create mode 100644 lib/monitoring/sentry.ts
create mode 100644 lib/monitoring/source-files.json
create mode 100644 playwright.config.ts
create mode 100644 quality/eslint-baseline.json
create mode 100644 quality/format-baseline.json
create mode 100644 scripts/check-format.mjs
create mode 100644 scripts/check-quality.mjs
create mode 100644 scripts/e2e-server.mjs
create mode 100644 tests/dashboard.spec.ts
create mode 100644 tests/fixture-server.mjs
create mode 100644 tests/privacy.spec.ts
diff --git a/.coderabbit.yaml b/.coderabbit.yaml
new file mode 100644
index 0000000..ab99165
--- /dev/null
+++ b/.coderabbit.yaml
@@ -0,0 +1,10 @@
+language: en-US
+reviews:
+ path_filters:
+ - "!samples/**"
+ - "!uploads/**"
+ - "!.env*"
+ - "!playwright-report/**"
+ - "!test-results/**"
+ - "!**/*.zip"
+ - "!**/*.fit"
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..8ba7b32
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,11 @@
+# Backend only; never prefix these with NEXT_PUBLIC_.
+LOADIQ_API_BASE_URL=http://127.0.0.1:3001
+LOADIQ_INTERNAL_API_KEY=
+WORKOS_API_KEY=
+WORKOS_CLIENT_ID=
+WORKOS_COOKIE_PASSWORD=
+NEXT_PUBLIC_WORKOS_REDIRECT_URI=http://localhost:3000/callback
+# Two separate EU Sentry projects: backend and web. Empty disables monitoring.
+SENTRY_DSN=
+NEXT_PUBLIC_SENTRY_DSN=
+# E2E flags are set only by scripts/e2e-server.mjs. Never configure in deployment.
diff --git a/.githooks/pre-commit b/.githooks/pre-commit
new file mode 100755
index 0000000..e2be067
--- /dev/null
+++ b/.githooks/pre-commit
@@ -0,0 +1,3 @@
+#!/bin/sh
+set -eu
+corepack pnpm --ignore-workspace quality
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..d0ad61b
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,24 @@
+name: Frontend quality
+on:
+ push:
+ pull_request:
+permissions:
+ contents: read
+jobs:
+ quality:
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+ env:
+ NEXT_TELEMETRY_DISABLED: "1"
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ - run: corepack enable
+ - run: corepack pnpm@10.15.1 --ignore-workspace install --frozen-lockfile
+ - run: corepack pnpm --ignore-workspace quality
+ - run: corepack pnpm --ignore-workspace build
+ - run: corepack pnpm --ignore-workspace typecheck
+ - run: corepack pnpm --ignore-workspace exec playwright install --with-deps chromium
+ - run: corepack pnpm --ignore-workspace test:e2e
diff --git a/.gitignore b/.gitignore
index b87c7b7..41b739f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,9 @@ next-env.d.ts
# contentlayer
.contentlayer
+
+/playwright-report/
+/test-results/
+.env
+.env.*
+!.env.example
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..de14fd9
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+ignore-workspace=true
diff --git a/app/app/error.tsx b/app/app/error.tsx
new file mode 100644
index 0000000..800d7ab
--- /dev/null
+++ b/app/app/error.tsx
@@ -0,0 +1,21 @@
+"use client";
+import { useEffect } from "react";
+import { reportFailure } from "@/lib/monitoring/sentry";
+export default function DashboardError({
+ reset,
+ error,
+}: {
+ reset: () => void;
+ error: Error;
+}) {
+ useEffect(() => {
+ reportFailure(error);
+ }, [error]);
+ return (
+
+ Dashboard unavailable
+ Please try again later.
+ Try again
+
+ );
+}
diff --git a/app/app/layout.tsx b/app/app/layout.tsx
index 91ad7a6..0fc084d 100644
--- a/app/app/layout.tsx
+++ b/app/app/layout.tsx
@@ -1,5 +1,5 @@
import type { ReactNode } from "react";
-import { withAuth } from "@workos-inc/authkit-nextjs";
+import { currentUser } from "@/lib/current-user";
export const dynamic = "force-dynamic";
@@ -8,7 +8,7 @@ export default async function ProductLayout({
}: {
children: ReactNode;
}) {
- await withAuth({ ensureSignedIn: true });
+ await currentUser();
return children;
}
diff --git a/app/global-error.tsx b/app/global-error.tsx
new file mode 100644
index 0000000..30ac6dd
--- /dev/null
+++ b/app/global-error.tsx
@@ -0,0 +1,15 @@
+"use client";
+import { useEffect } from "react";
+import { reportFailure } from "@/lib/monitoring/sentry";
+export default function GlobalError({ error }: { error: Error }) {
+ useEffect(() => {
+ reportFailure(error);
+ }, [error]);
+ return (
+
+
+ LoadIQ is temporarily unavailable
+
+
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
index e443d25..6182a16 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,4 +1,5 @@
import "./css/style.css";
+import { Monitoring } from "@/components/monitoring";
import { Inter } from "next/font/google";
import localFont from "next/font/local";
@@ -57,6 +58,7 @@ export default function RootLayout({
+
{children}
diff --git a/components/monitoring.tsx b/components/monitoring.tsx
new file mode 100644
index 0000000..01293b9
--- /dev/null
+++ b/components/monitoring.tsx
@@ -0,0 +1,18 @@
+"use client";
+import { useEffect } from "react";
+import { initializeMonitoring, reportFailure } from "@/lib/monitoring/sentry";
+export function Monitoring() {
+ useEffect(() => {
+ initializeMonitoring(process.env.NEXT_PUBLIC_SENTRY_DSN);
+ const onError = (event: ErrorEvent) => reportFailure(event.error);
+ const onRejection = (event: PromiseRejectionEvent) =>
+ reportFailure(event.reason);
+ window.addEventListener("error", onError);
+ window.addEventListener("unhandledrejection", onRejection);
+ return () => {
+ window.removeEventListener("error", onError);
+ window.removeEventListener("unhandledrejection", onRejection);
+ };
+ }, []);
+ return null;
+}
diff --git a/components/product/dashboard-page.tsx b/components/product/dashboard-page.tsx
index f3fd92e..97ae7e8 100644
--- a/components/product/dashboard-page.tsx
+++ b/components/product/dashboard-page.tsx
@@ -1,9 +1,26 @@
import type { ReactNode } from "react";
-import { ArrowRight, CalendarRange, Download, Footprints, HeartPulse, Scale, ShieldAlert, TimerReset, Zap } from "lucide-react";
-import { signOut, withAuth } from "@workos-inc/authkit-nextjs";
+import {
+ ArrowRight,
+ CalendarRange,
+ Download,
+ Footprints,
+ HeartPulse,
+ Scale,
+ ShieldAlert,
+ TimerReset,
+ Zap,
+} from "lucide-react";
+import { signOut } from "@workos-inc/authkit-nextjs";
+import { currentUser } from "@/lib/current-user";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
import {
getDashboardSummary,
@@ -18,18 +35,21 @@ import {
import { TrendPanel } from "./trend-panel";
export async function DashboardPage() {
- const [{ user }, summary, timeline, recentActivity, recentImports] = await Promise.all([
- withAuth({ ensureSignedIn: true }),
- getDashboardSummary(),
- getDashboardTimeline("28d"),
- getRecentActivity("14d"),
- getRecentImports(5),
- ]);
+ const [{ user }, summary, timeline, recentActivity, recentImports] =
+ await Promise.all([
+ currentUser(),
+ getDashboardSummary(),
+ getDashboardTimeline("28d"),
+ getRecentActivity("14d"),
+ getRecentImports(5),
+ ]);
const greetingName = user.firstName ?? user.email.split("@")[0];
- const activeStates = summary.daily.states.filter((state) => state.status !== "RESOLVED");
- const recommendationActions = summary.daily.recommendations.flatMap((recommendation) =>
- recommendation.payloadJson?.actions ?? [],
+ const activeStates = summary.daily.states.filter(
+ (state) => state.status !== "RESOLVED",
+ );
+ const recommendationActions = summary.daily.recommendations.flatMap(
+ (recommendation) => recommendation.payloadJson?.actions ?? [],
);
return (
@@ -77,17 +97,23 @@ export async function DashboardPage() {
}
label="Wearable days"
- value={String(summary.weekly.summary.metrics.coverage.wearableDays)}
+ value={String(
+ summary.weekly.summary.metrics.coverage.wearableDays,
+ )}
/>
}
label="Average steps"
- value={formatNullable(summary.weekly.summary.metrics.activity.averageSteps)}
+ value={formatNullable(
+ summary.weekly.summary.metrics.activity.averageSteps,
+ )}
/>
}
label="Sessions"
- value={String(summary.weekly.summary.metrics.activitySessions.sessionCount)}
+ value={String(
+ summary.weekly.summary.metrics.activitySessions.sessionCount,
+ )}
/>
@@ -127,12 +153,14 @@ export async function DashboardPage() {
Next actions
- {summary.daily.summary.nextActions.slice(0, 3).map((action) => (
-
-
- {action}
-
- ))}
+ {summary.daily.summary.nextActions
+ .slice(0, 3)
+ .map((action) => (
+
+
+ {action}
+
+ ))}
@@ -143,7 +171,9 @@ export async function DashboardPage() {
}
- items={summary.weekly.highlights.slice(0, 4).map((highlight) => highlight.message)}
+ items={summary.weekly.highlights
+ .slice(0, 4)
+ .map((highlight) => highlight.message)}
emptyMessage="Highlights will appear after enough recovery and activity data comes in."
/>
Trend Overview
- Last {timeline.range.days} days of chart-ready normalized signals.
+ Last {timeline.range.days} days of chart-ready normalized
+ signals.
@@ -196,7 +227,11 @@ export async function DashboardPage() {
/>
point.sleepDurationMin)}
/>
@@ -240,7 +275,9 @@ function InsightCard({
- {icon}
+
+ {icon}
+
{title}
@@ -274,7 +311,8 @@ function RecentImports({
Recent Imports
- Latest upload status plus {summary.imports.recentCount} import(s) in the last 7 days.
+ Latest upload status plus {summary.imports.recentCount} import(s) in
+ the last 7 days.
@@ -292,12 +330,16 @@ function RecentImports({
{formatDateTime(entry.createdAt)}
- {entry.status}
+
+ {entry.status}
+
{entry.error ? (
{entry.error}
) : null}
- {index < imports.length - 1 ? : null}
+ {index < imports.length - 1 ? (
+
+ ) : null}
))
)}
@@ -319,7 +361,9 @@ function RecentActivity({ sessions }: { sessions: ActivitySessionRecord[] }) {
{items.length === 0 ? (
- No activity sessions available yet.
+
+ No activity sessions available yet.
+
) : (
items.map((session, index) => (
@@ -336,9 +380,13 @@ function RecentActivity({ sessions }: { sessions: ActivitySessionRecord[] }) {
-
{session.durationMin ? `${session.durationMin} min` : "n/a"}
+
+ {session.durationMin ? `${session.durationMin} min` : "n/a"}
+
- {session.caloriesBurned ? `${session.caloriesBurned} kcal` : "No calories"}
+ {session.caloriesBurned
+ ? `${session.caloriesBurned} kcal`
+ : "No calories"}
@@ -366,7 +414,9 @@ function StatPill({
{icon}
{label}
- {value}
+
+ {value}
+
);
}
@@ -386,7 +436,9 @@ function KeyDatum({
{icon}
{label}
- {value}
+
+ {value}
+
);
}
@@ -396,7 +448,9 @@ function formatMetricFromTimeline(
key: "weightKg" | "steps" | "sleepDurationMin" | "restingHr" | "stressScore",
suffix?: string,
) {
- const latest = [...timeline.points].reverse().find((point) => point[key] !== null)?.[key];
+ const latest = [...timeline.points]
+ .reverse()
+ .find((point) => point[key] !== null)?.[key];
if (latest === undefined || latest === null) {
return "No data";
@@ -405,7 +459,9 @@ function formatMetricFromTimeline(
return suffix ? `${latest} ${suffix}` : String(latest);
}
-function mapSummaryStatus(status: DashboardSummaryResponse["daily"]["summary"]["status"]) {
+function mapSummaryStatus(
+ status: DashboardSummaryResponse["daily"]["summary"]["status"],
+) {
if (status === "attention") {
return "warning" as const;
}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..8a0a695
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,20 @@
+import { createRequire } from "node:module";
+import { dirname } from "node:path";
+import { FlatCompat } from "@eslint/eslintrc";
+const compat = new FlatCompat({
+ baseDirectory: import.meta.dirname,
+ resolvePluginsRelativeTo: dirname(
+ createRequire(import.meta.url).resolve("eslint-config-next/package.json"),
+ ),
+});
+export default [
+ {
+ ignores: [
+ ".next/**",
+ "node_modules/**",
+ "playwright-report/**",
+ "test-results/**",
+ ],
+ },
+ ...compat.extends("next/core-web-vitals", "next/typescript"),
+];
diff --git a/instrumentation.ts b/instrumentation.ts
new file mode 100644
index 0000000..c741843
--- /dev/null
+++ b/instrumentation.ts
@@ -0,0 +1,8 @@
+export async function register() {
+ const { initializeMonitoring } = await import("./lib/monitoring/sentry");
+ initializeMonitoring(process.env.SENTRY_DSN);
+}
+export async function onRequestError(error: unknown) {
+ const { reportFailure } = await import("./lib/monitoring/sentry");
+ reportFailure(error);
+}
diff --git a/lib/current-user.ts b/lib/current-user.ts
new file mode 100644
index 0000000..4c999fc
--- /dev/null
+++ b/lib/current-user.ts
@@ -0,0 +1,24 @@
+import "server-only";
+import { withAuth } from "@workos-inc/authkit-nextjs";
+import { headers } from "next/headers";
+import { redirect } from "next/navigation";
+import { e2eEnabled } from "./e2e-mode";
+export async function currentUser() {
+ if (!e2eEnabled()) return withAuth({ ensureSignedIn: true });
+ const input = await headers();
+ if (!["127.0.0.1:4318", "localhost:4318"].includes(input.get("host") ?? ""))
+ redirect("/signin");
+ const session = input.get("x-loadiq-e2e-session");
+ const name = ["alice", "bob"].find(
+ (name) => session === `${process.env.LOADIQ_E2E_SECRET}:${name}`,
+ );
+ if (!name) redirect("/signin");
+ return {
+ user: {
+ id: `synthetic-${name}`,
+ email: `${name}@example.invalid`,
+ firstName: name,
+ lastName: "Fixture",
+ },
+ };
+}
diff --git a/lib/e2e-mode.ts b/lib/e2e-mode.ts
new file mode 100644
index 0000000..596c8d5
--- /dev/null
+++ b/lib/e2e-mode.ts
@@ -0,0 +1,9 @@
+// Both checks are required. A production build rejects this flag in next.config.js.
+export function e2eEnabled() {
+ return (
+ process.env.NODE_ENV === "development" &&
+ process.env.LOADIQ_E2E_MODE === "true" &&
+ Boolean(process.env.LOADIQ_E2E_SECRET) &&
+ process.env.LOADIQ_API_BASE_URL === "http://127.0.0.1:4319"
+ );
+}
diff --git a/lib/loadiq-api.ts b/lib/loadiq-api.ts
index 57ab246..ae748a3 100644
--- a/lib/loadiq-api.ts
+++ b/lib/loadiq-api.ts
@@ -1,6 +1,8 @@
import "server-only";
+import { headers as requestHeaders } from "next/headers";
+import { e2eEnabled } from "./e2e-mode";
-import { withAuth } from "@workos-inc/authkit-nextjs";
+import { currentUser } from "@/lib/current-user";
const INTERNAL_API_KEY_HEADER = "x-loadiq-internal-api-key";
const EXTERNAL_AUTH_ID_HEADER = "x-loadiq-external-auth-id";
@@ -150,9 +152,15 @@ function requireEnv(name: string) {
}
async function getApiHeaders() {
- const { user } = await withAuth({ ensureSignedIn: true });
+ const { user } = await currentUser();
return {
+ ...(e2eEnabled()
+ ? {
+ "x-loadiq-e2e-scenario":
+ (await requestHeaders()).get("x-loadiq-e2e-scenario") ?? "normal",
+ }
+ : {}),
[INTERNAL_API_KEY_HEADER]: requireEnv("LOADIQ_INTERNAL_API_KEY"),
[EXTERNAL_AUTH_ID_HEADER]: user.id,
[USER_EMAIL_HEADER]: user.email,
@@ -171,7 +179,9 @@ async function apiFetch(path: string) {
});
if (!response.ok) {
- throw new Error(`LoadIQ API request failed: ${response.status} ${response.statusText}`);
+ throw new Error(
+ `LoadIQ API request failed: ${response.status} ${response.statusText}`,
+ );
}
return (await response.json()) as T;
diff --git a/lib/monitoring/privacy.ts b/lib/monitoring/privacy.ts
new file mode 100644
index 0000000..86093d1
--- /dev/null
+++ b/lib/monitoring/privacy.ts
@@ -0,0 +1,158 @@
+import sourceFiles from "./source-files.json";
+
+type UnknownRecord = Record;
+const record = (value: unknown): UnknownRecord =>
+ value !== null && typeof value === "object" ? (value as UnknownRecord) : {};
+const categories = new Set([
+ "Error",
+ "TypeError",
+ "RangeError",
+ "ReferenceError",
+ "SyntaxError",
+ "URIError",
+ "AbortError",
+ "PrismaClientKnownRequestError",
+ "PrismaClientValidationError",
+ "ServiceUnavailableException",
+ "BadGatewayException",
+]);
+const paths = new Set(
+ sourceFiles.flatMap((path) => [
+ path,
+ ...(path.startsWith("src/")
+ ? [
+ path.replace(/^src\//, "dist/").replace(/\.ts$/, ".js"),
+ "dist/" + path.replace(/\.ts$/, ".js"),
+ ]
+ : []),
+ ...(path.startsWith("app/")
+ ? [".next/server/" + path.replace(/\.tsx?$/, ".js")]
+ : []),
+ ]),
+);
+
+function technicalFile(value: unknown): string | undefined {
+ if (typeof value !== "string") return undefined;
+ const clean = value.replace(/\\/g, "/").split(/[?#]/, 1)[0];
+ // Output only a reviewed repository path, never an absolute prefix or runtime URL.
+ for (const path of Array.from(paths)) {
+ if (clean === path || clean.endsWith("/" + path)) return path;
+ if (path.startsWith("app/") && /\.tsx?$/.test(path)) {
+ const marker = "_next/static/chunks/" + path.replace(/\.tsx?$/, "") + "-";
+ const index = clean.lastIndexOf("/" + marker);
+ const suffix = clean.startsWith(marker)
+ ? clean.slice(marker.length)
+ : index >= 0
+ ? clean.slice(index + marker.length + 1)
+ : "";
+ if (/^[a-f0-9]{8,64}\.js$/.test(suffix)) return marker + suffix;
+ }
+ }
+ const chunk = clean.match(
+ /(?:^|\/)((?:_next\/static|\.next\/server)\/chunks\/[0-9a-f-]{1,80}\.js)$/,
+ );
+ return chunk?.[1];
+}
+function position(value: unknown) {
+ return typeof value === "number" &&
+ Number.isInteger(value) &&
+ value > 0 &&
+ value <= 10000000
+ ? value
+ : undefined;
+}
+function frames(value: unknown) {
+ return (Array.isArray(value) ? value : []).slice(-40).flatMap((raw) => {
+ const frame = record(raw);
+ const filename = technicalFile(frame.filename);
+ return filename
+ ? [
+ {
+ filename,
+ lineno: position(frame.lineno),
+ colno: position(frame.colno),
+ in_app: true,
+ },
+ ]
+ : [];
+ });
+}
+
+// Reconstruct events. Retain only static categories and reviewed code locations.
+export function scrubEvent<
+ T extends {
+ event_id?: string;
+ timestamp?: number;
+ platform?: string;
+ environment?: string;
+ },
+>(event: T): T {
+ const input = record(event);
+ const candidate = record(input.tags).operation;
+ const operation =
+ typeof candidate === "string" &&
+ ["garmin_sync", "import_processing", "unhandled", "frontend"].includes(
+ candidate,
+ )
+ ? candidate
+ : "unhandled";
+ const values = record(input.exception).values;
+ const exceptions = (
+ Array.isArray(values) && values.length ? values.slice(0, 3) : [{}]
+ ).map((raw) => {
+ const error = record(raw);
+ const type =
+ typeof error.type === "string" && categories.has(error.type)
+ ? error.type
+ : "Error";
+ const safeFrames = frames(record(error.stacktrace).frames);
+ return {
+ type,
+ value: "Application operation failed",
+ ...(safeFrames.length ? { stacktrace: { frames: safeFrames } } : {}),
+ };
+ });
+ const directFrames = frames(record(input.stacktrace).frames);
+ return {
+ event_id:
+ typeof event.event_id === "string" &&
+ /^[a-f0-9]{32}$/.test(event.event_id)
+ ? event.event_id
+ : undefined,
+ timestamp:
+ typeof event.timestamp === "number" && Number.isFinite(event.timestamp)
+ ? event.timestamp
+ : undefined,
+ platform: "javascript",
+ environment: ["production", "development", "test"].includes(
+ event.environment ?? "",
+ )
+ ? event.environment
+ : undefined,
+ level: "error",
+ message: "LoadIQ application failure (details intentionally withheld)",
+ exception: { values: exceptions },
+ ...(directFrames.length ? { stacktrace: { frames: directFrames } } : {}),
+ fingerprint: ["{{ default }}", operation, exceptions[0].type],
+ tags: { operation },
+ } as unknown as T;
+}
+
+export function euDsn(dsn: string | undefined): string | undefined {
+ if (!dsn) return undefined;
+ try {
+ const url = new URL(dsn);
+ if (
+ url.protocol === "https:" &&
+ /^o[0-9]+\.ingest\.de\.sentry\.io$/.test(url.hostname) &&
+ !url.password &&
+ !url.search &&
+ !url.hash &&
+ /^\/[0-9]+$/.test(url.pathname)
+ )
+ return dsn;
+ } catch {
+ /* Invalid configuration remains disabled. */
+ }
+ return undefined;
+}
diff --git a/lib/monitoring/sentry.ts b/lib/monitoring/sentry.ts
new file mode 100644
index 0000000..30bfbb5
--- /dev/null
+++ b/lib/monitoring/sentry.ts
@@ -0,0 +1,50 @@
+import * as Sentry from "@sentry/nextjs";
+import { euDsn, scrubEvent } from "./privacy";
+export function initializeMonitoring(dsn: string | undefined) {
+ const verified = euDsn(dsn);
+ if (!verified || process.env.LOADIQ_E2E_MODE === "true") return;
+ Sentry.init(monitoringOptions(verified));
+}
+export function reportFailure(error?: unknown) {
+ Sentry.captureException(
+ error instanceof Error ? error : new Error("LoadIQ application failure"),
+ {
+ tags: { operation: "frontend" },
+ },
+ );
+}
+
+export function monitoringOptions(
+ dsn: string,
+): NonNullable[0]> {
+ return {
+ dsn,
+ environment:
+ process.env.NODE_ENV === "production" ? "production" : "development",
+ defaultIntegrations: false,
+ tracePropagationTargets: [],
+ maxBreadcrumbs: 0,
+ dataCollection: {
+ graphQL: { document: false, variables: false },
+ genAI: { inputs: false, outputs: false },
+ mcp: { inputs: false, outputs: false },
+ userInfo: false,
+ cookies: false,
+ httpHeaders: false,
+ httpBodies: [],
+ urlQueryParams: false,
+ databaseQueryData: false,
+ queues: false,
+ stackFrameVariables: false,
+ frameContextLines: 0,
+ },
+ beforeSendLog: () => null,
+ beforeSendMetric: () => null,
+ tracesSampleRate: 0,
+
+ beforeSend: (event, hint) => {
+ hint.attachments = [];
+ return scrubEvent(event);
+ },
+ };
+}
diff --git a/lib/monitoring/source-files.json b/lib/monitoring/source-files.json
new file mode 100644
index 0000000..1840799
--- /dev/null
+++ b/lib/monitoring/source-files.json
@@ -0,0 +1,45 @@
+[
+ "app/(auth)/layout.tsx",
+ "app/(auth)/reset-password/page.tsx",
+ "app/(auth)/signin/route.ts",
+ "app/(auth)/signup/route.ts",
+ "app/(default)/contact/page.tsx",
+ "app/(default)/disclaimer/page.tsx",
+ "app/(default)/layout.tsx",
+ "app/(default)/page.tsx",
+ "app/(default)/privacy/page.tsx",
+ "app/(default)/terms/page.tsx",
+ "app/api/hello/route.ts",
+ "app/app/error.tsx",
+ "app/app/layout.tsx",
+ "app/app/page.tsx",
+ "app/callback/route.ts",
+ "app/global-error.tsx",
+ "app/layout.tsx",
+ "components/cta.tsx",
+ "components/features.tsx",
+ "components/hero-home.tsx",
+ "components/legal/legal-page.tsx",
+ "components/modal-video.tsx",
+ "components/monitoring.tsx",
+ "components/page-illustration.tsx",
+ "components/product/dashboard-page.tsx",
+ "components/product/trend-panel.tsx",
+ "components/providers/aos-provider.tsx",
+ "components/spotlight.tsx",
+ "components/testimonials.tsx",
+ "components/ui/badge.tsx",
+ "components/ui/button.tsx",
+ "components/ui/card.tsx",
+ "components/ui/footer.tsx",
+ "components/ui/header.tsx",
+ "components/ui/logo.tsx",
+ "components/ui/separator.tsx",
+ "components/workflows.tsx",
+ "lib/current-user.ts",
+ "lib/e2e-mode.ts",
+ "lib/loadiq-api.ts",
+ "lib/monitoring/privacy.ts",
+ "lib/monitoring/sentry.ts",
+ "lib/utils.ts"
+]
diff --git a/middleware.ts b/middleware.ts
index c80be83..65ba3b8 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,7 +1,17 @@
import { authkitMiddleware } from "@workos-inc/authkit-nextjs";
+import { NextResponse } from "next/server";
+import { e2eEnabled } from "./lib/e2e-mode";
import type { NextFetchEvent, NextRequest } from "next/server";
-export default function middleware(request: NextRequest, event: NextFetchEvent) {
+export default function middleware(
+ request: NextRequest,
+ event: NextFetchEvent,
+) {
+ if (
+ e2eEnabled() &&
+ ["127.0.0.1", "localhost"].includes(request.nextUrl.hostname)
+ )
+ return NextResponse.next();
return authkitMiddleware({
redirectUri:
process.env.NEXT_PUBLIC_WORKOS_REDIRECT_URI ??
diff --git a/next.config.js b/next.config.js
index 658404a..1d0f2d4 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,4 +1,15 @@
/** @type {import('next').NextConfig} */
-const nextConfig = {};
+if (
+ process.env.NODE_ENV === "production" &&
+ process.env.LOADIQ_E2E_MODE === "true"
+) {
+ throw new Error(
+ "E2E authentication is forbidden in production builds and servers",
+ );
+}
+const nextConfig = {
+ // The separate quality gate rejects new findings while tracking the existing backlog.
+ eslint: { ignoreDuringBuilds: true },
+};
module.exports = nextConfig;
diff --git a/package.json b/package.json
index 5f8cdec..5e98803 100644
--- a/package.json
+++ b/package.json
@@ -6,11 +6,17 @@
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "node scripts/check-quality.mjs",
+ "quality": "node scripts/check-quality.mjs && node scripts/check-format.mjs",
+ "lint:all": "eslint app components lib middleware.ts",
+ "typecheck": "tsc --noEmit --incremental false",
+ "test:e2e": "playwright test",
+ "format:check": "node scripts/check-format.mjs"
},
"dependencies": {
"@headlessui/react": "^2.2.0",
"@radix-ui/react-slot": "^1.2.4",
+ "@sentry/nextjs": "^11.12.0",
"@types/node": "^22.13.0",
"@types/react": "19.0.8",
"@types/react-dom": "19.0.3",
@@ -26,10 +32,15 @@
"typescript": "^5.7.3"
},
"devDependencies": {
+ "@eslint/eslintrc": "^3.3.7",
+ "@playwright/test": "^1.65.0",
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/postcss": "^4.0.3",
"@types/aos": "^3.0.7",
+ "eslint": "^9.39.5",
+ "eslint-config-next": "15.2.8",
"postcss": "^8.5.1",
+ "prettier": "^3.10.1",
"tailwindcss": "^4.0.3"
},
"packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67"
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 0000000..5556740
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,23 @@
+import { defineConfig } from "@playwright/test";
+export default defineConfig({
+ testDir: "./tests",
+ testMatch: "**/*.spec.ts",
+ fullyParallel: false,
+ workers: 1,
+ retries: 0,
+ timeout: 60000,
+ reporter: "list",
+ use: {
+ baseURL: "http://127.0.0.1:4318",
+ browserName: "chromium",
+ trace: "off",
+ screenshot: "off",
+ video: "off",
+ },
+ webServer: {
+ command: "node scripts/e2e-server.mjs",
+ url: "http://127.0.0.1:4318",
+ reuseExistingServer: false,
+ timeout: 180000,
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9b8ca7c..93be9bf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,6 +14,9 @@ importers:
'@radix-ui/react-slot':
specifier: ^1.2.4
version: 1.2.4(@types/react@19.0.8)(react@19.2.3)
+ '@sentry/nextjs':
+ specifier: ^11.12.0
+ version: 11.12.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
'@types/node':
specifier: ^22.13.0
version: 22.13.0
@@ -25,7 +28,7 @@ importers:
version: 19.0.3(@types/react@19.0.8)
'@workos-inc/authkit-nextjs':
specifier: ^3.0.0
- version: 3.0.0(next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)
+ version: 3.0.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)
aos:
specifier: 3.0.0-beta.6
version: 3.0.0-beta.6
@@ -40,7 +43,7 @@ importers:
version: 1.7.0(react@19.2.3)
next:
specifier: 15.2.8
- version: 15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react:
specifier: 19.2.3
version: 19.2.3
@@ -54,6 +57,12 @@ importers:
specifier: ^5.7.3
version: 5.7.3
devDependencies:
+ '@eslint/eslintrc':
+ specifier: ^3.3.7
+ version: 3.3.7
+ '@playwright/test':
+ specifier: ^1.65.0
+ version: 1.65.0
'@tailwindcss/forms':
specifier: ^0.5.10
version: 0.5.10(tailwindcss@4.0.3)
@@ -63,9 +72,18 @@ importers:
'@types/aos':
specifier: ^3.0.7
version: 3.0.7
+ eslint:
+ specifier: ^9.39.5
+ version: 9.39.5(jiti@2.4.2)
+ eslint-config-next:
+ specifier: 15.2.8
+ version: 15.2.8(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
postcss:
specifier: ^8.5.1
version: 8.5.1
+ prettier:
+ specifier: ^3.10.1
+ version: 3.10.1
tailwindcss:
specifier: ^4.0.3
version: 4.0.3
@@ -79,6 +97,44 @@ packages:
'@emnapi/runtime@1.7.1':
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
+ '@eslint-community/eslint-utils@4.10.1':
+ resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.3':
+ resolution: {integrity: sha512-R76UKbvsqI68DJJVTVyqFKqU98CN4+B+acxNfEA2IFarSzP0SjtKf/3+fFiXzTyv5Fj3PxLkGHe2wnVWWMxobQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.2':
+ resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.7':
+ resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.39.5':
+ resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@floating-ui/core@1.6.9':
resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
@@ -107,6 +163,26 @@ packages:
react: ^18 || ^19 || ^19.0.0-rc
react-dom: ^18 || ^19 || ^19.0.0-rc
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
'@img/sharp-darwin-arm64@0.33.5':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -212,9 +288,18 @@ packages:
cpu: [x64]
os: [win32]
+ '@isaacs/nonrecursive-glob-match@1.1.0':
+ resolution: {integrity: sha512-GPm/Dbvk5RLmhRnxXIa7nTpK0xtl4E0wj0MslsuNiJ1FIROU+2+9lgUC/dgF7Ey4QCWhfEsgxilMRMCdHPfDfw==}
+
+ '@jridgewell/sourcemap-codec@1.6.0':
+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
+
'@next/env@15.2.8':
resolution: {integrity: sha512-TaEsAki14R7BlgywA05t2PFYfwZiNlGUHyIQHVyloXX3y+Dm0HUITe5YwTkjtuOQuDhuuLotNEad4VtnmE11Uw==}
+ '@next/eslint-plugin-next@15.2.8':
+ resolution: {integrity: sha512-RZzpLUhsoVH322lj3Nf/s3oyHh9+cqvKGifMUE9bcTyIUtsQ+WUrwH7y9rCxr5s22V5YLsLzBD02yT37vwPemg==}
+
'@next/swc-darwin-arm64@15.2.5':
resolution: {integrity: sha512-4OimvVlFTbgzPdA0kh8A1ih6FN9pQkL4nPXGqemEYgk+e7eQhsst/p35siNNqA49eQA6bvKZ1ASsDtu9gtXuog==}
engines: {node: '>= 10'}
@@ -263,6 +348,148 @@ packages:
cpu: [x64]
os: [win32]
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+
+ '@opentelemetry/api@1.10.0':
+ resolution: {integrity: sha512-lMkyes8iHrG+mk6WH7X70MdCLI2RS0FwNBY1PyQ8UemaijE2m5mv5A0Niy3HtbYTFrgkUEQjFMXmSAk2hQDuPQ==}
+ engines: {node: '>=8.0.0'}
+
+ '@oxc-parser/binding-android-arm-eabi@0.152.0':
+ resolution: {integrity: sha512-393VtirINkae4XHBTkq/yQxhOwEr4V+r0et37P2fp+sYZSdYgZTRDPo5Um8vBh0QjMZ+RmaMy4PP0qwr4cTMwA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
+
+ '@oxc-parser/binding-android-arm64@0.152.0':
+ resolution: {integrity: sha512-iYFcExATJNZ0rZj0o02THbD1Nc9jAW0nVgIQPee6ejbSASpbZXlIMw8jxtpzaG14JQTWwGSZ6U5dEtRJXE6V3Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@oxc-parser/binding-darwin-arm64@0.152.0':
+ resolution: {integrity: sha512-fnU+DfUzi5/rFy0LzmipYRz06PAUUkOS8kCJQ3Eg6oqlunC1XZXoffFqxmdL51RmcbYtUG3P8DVG1U5fckoa2A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@oxc-parser/binding-darwin-x64@0.152.0':
+ resolution: {integrity: sha512-Y3U2okryWTs7hDld6UhjJwLNf8/do+x4g4C+1U5SiGwrTLwbO83WJYJA8+l9iFSilWBgnfpd/+U76tfeNxUHzA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@oxc-parser/binding-freebsd-x64@0.152.0':
+ resolution: {integrity: sha512-XkhkRrrPffEw+ZLv/d/5pEni0buxinm/E/N6fLbJCunD1DBbeCTtVP23ESV+4CWCWdSz397asks1ViGslpmWiQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.152.0':
+ resolution: {integrity: sha512-MLzsRRbdfmdzo6JEhbC1yKU9ItfvM8tEf18HM32jCiNYZEz6J3bRBRl3cTkKR0vBdrk9ZVlcARXtwHccs+epDA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-arm-musleabihf@0.152.0':
+ resolution: {integrity: sha512-HHerTEJz7Iy10Ji6BGsk4gqG6PU0UzFuBu91jIEOX89FnrI5ECWSEr7BLpkYQhp7U0QFtMnBhNfQKI0hYZK78w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-arm64-gnu@0.152.0':
+ resolution: {integrity: sha512-9Bb8GyzZ2uSLzRDZ27usaKokr07mxiBe2dDF5b6bd2janmaJTT1gL51UfP7AU30yFiXrJvcRyFKREAgKwZYs0w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-arm64-musl@0.152.0':
+ resolution: {integrity: sha512-om7iDMUroI74A/lfRRWY9/Ev3VWrVsrUZ4tyvyh8raBey/sdcfyAD7tYWc+iykAiotnmftyKTpUKFr1QnaBrAQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-ppc64-gnu@0.152.0':
+ resolution: {integrity: sha512-Lf1OL2lMTqwDMFC6jnRb30B+WYHKV0XT+bPHcFM6xHtNVwxpobiTzUIvKH6a0LWpvfwyru8Yu6zCGHqqFHH+gg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-riscv64-gnu@0.152.0':
+ resolution: {integrity: sha512-BYWSMQK+YJ9ZILStPcmmiSVq8KEG9Qdq/c4BHPC3rUEq/fEDCVjUIwdj5ZzjgZ9P9is9PKu0tcAXzq1ZXg4urQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-riscv64-musl@0.152.0':
+ resolution: {integrity: sha512-d2LqHNNNqdH185sRK5dPKWZu201JrNu9/CRFuVEuT+ht7n/QaVblEMWT9MALQPrDWYvhG10P+NSKJFquDWZ09w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-s390x-gnu@0.152.0':
+ resolution: {integrity: sha512-8gBeHt5rA/8+pKhHl+zLggfa3L/V/L2at96p7ty6pBE7id6lFO19nFUc15u2PcjC4OYeYK465MKy1fhhbpFIGw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-x64-gnu@0.152.0':
+ resolution: {integrity: sha512-ltgrSF6L+yPTVsIdaAyqKq3zTqzj/1VlNbxWZuxAe8flR3sWdyNsKvdXukoO8/ucJbLickhmieRBge+o/e8Ugw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxc-parser/binding-linux-x64-musl@0.152.0':
+ resolution: {integrity: sha512-LcMp6BvrBnewSfdkLHoSqidhoAq4syKOTBV5TYHWd+2VnGkfD/nPRRVIzTBt/Lkbt7pfOFDGtkiTntFS0p6sQQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxc-parser/binding-openharmony-arm64@0.152.0':
+ resolution: {integrity: sha512-jbhoMCslVxzRCRNQ8TSHxjYdSKRvk8O6ciLVDkahJvmyHDzBqba/bMQHM6ULKj/rgHNNbSzlIiakdx8SEfkJzA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@oxc-parser/binding-win32-arm64-msvc@0.152.0':
+ resolution: {integrity: sha512-JZYVlhv36mr/nertnRB7vchJECOBb1Lz6lltalILsB+o9M/is+H6BEDRLQKdqA4JKs6NjJszo46+iM5sfwj6jQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@oxc-parser/binding-win32-ia32-msvc@0.152.0':
+ resolution: {integrity: sha512-1X9oganvVsunRH0lH10UU05N+H9atpX6WsOybByUjwnfcd3h/0tYwvuv16XuHglrIUOnxV2TodbLVEwwafd64g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@oxc-parser/binding-win32-x64-msvc@0.152.0':
+ resolution: {integrity: sha512-sw0M80/dn9rcpu+Rqqph/C+MjvDDce6MlXmFjsNQtPEymha0eJy3ml6+foSUTqFfpDIDyHZZ4eoJ43IoMe8bJw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@oxc-project/types@0.152.0':
+ resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==}
+
+ '@playwright/test@1.65.0':
+ resolution: {integrity: sha512-iGURLGuKDLakSEl7Pgfv8h7f+XLT+V861Wfhz0zlEl5nyFuKUopdkFBPKqTllTUp06aOwPuH8iuUEb3yp3MpbQ==}
+ engines: {node: '>=20'}
+ hasBin: true
+
'@radix-ui/react-compose-refs@1.1.2':
resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
peerDependencies:
@@ -315,6 +542,238 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ '@rollup/plugin-commonjs@28.0.1':
+ resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==}
+ engines: {node: '>=16.0.0 || 14 >= 14.17'}
+ peerDependencies:
+ rollup: ^2.68.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/pluginutils@5.5.1':
+ resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.68.3':
+ resolution: {integrity: sha512-mqfypgH/liYjaSCoPI4erckUcROgZtmFUUmyOJ05oyayi/tVqOEYAzWP7ufqCoCT3xB31Fw4XIVO/jX42hYvKA==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.68.3':
+ resolution: {integrity: sha512-5tY+GC/1gpt79cKS2DQzu6iD824j6BmI4q5Zb6qftZ4kWqIQmvR3DD4eJ2Gclu6/nVMYDk2IVpqxypWOiAuWJg==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-android-x64@4.68.3':
+ resolution: {integrity: sha512-nDBcQ/o3PMmGxmAzGBJFn+n1rb83Va9WSdFIq1AHmlEF3tuibVsyJ3kG5x13r7VIy6WI8SvzCdHVNSlSDIdj8w==}
+ cpu: [x64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.68.3':
+ resolution: {integrity: sha512-dra5zl0QWKkIkaMgNDNPC19gkMlPAfAf41yWlkGztXMIvUQrX9XWZFQRw7abhH3nks+XZGQpybINAxT2pKdFew==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.68.3':
+ resolution: {integrity: sha512-xo5xeo/AjEB/ArzQjGn0JRDZuybZicQ5O3VPfko6ocH1li/qNrN4p5+R/WgjavzRz6UwAOaqsau7VvRQA6i6AA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.68.3':
+ resolution: {integrity: sha512-zdckkcxHDEEKyDbC1t21DeaaiKGymxbkBU9c3zyfaaz+8N96ItJw4nmzHhZF+Mukgt906fnf2tsc90pVyStuHA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.68.3':
+ resolution: {integrity: sha512-9oXqI7g/ycEz7TyicdGBC4sL6PfWMXAx8u15f/nd7lYkCLJd8U8VdBfbpc4SSnRBU/e7aPALve3mhzasGDeCYg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.68.3':
+ resolution: {integrity: sha512-hbgT4NlaOELE3D5UUzSqF+OFgwz4Scvo2SQD9nZJUFjdIsg9Kg3FabQauUxkHKY9N5yjNXfXRRmiKNN4JpLmFA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.68.3':
+ resolution: {integrity: sha512-yECcXZ/Bl+JVRhLFgld42rYrXgPdE0LtySGAmmmH6OtkaJM17A4cWG/eCzDymMVb52/jZjW0R54YrTHj4xXlSA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.68.3':
+ resolution: {integrity: sha512-q4Q4/B7wyqM+TFqY5tJYQlaz5+ksGopcRmMeMdu4q6eaPK7N1PymTjIaH5LL32mMJBqIzpRof7BhlYLim5JgNQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.68.3':
+ resolution: {integrity: sha512-Ich3TGl/7GqhQ6G6jVPzgGQGJjd3E5hECxSVanPYchy6Vwcq+WI8wG/gmEMilHNy+ZYCR6U8EN50EejG3TaIgw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.68.3':
+ resolution: {integrity: sha512-URBmOhwv4Y0Hi5Hhxc3cmqZLtQlx55DOs5PUhhITDC3zu0qwAfhcNAFAIwAhOUdA6NFVEck07CNZX6cBEs1vTg==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-musl@4.68.3':
+ resolution: {integrity: sha512-PTdJXuZplRyaE3ECArlbZubI2LlUHWm0oCipCexnE/8LM+L7qIqUiNbU0piBxt46EB5zxXX+cpmDvHX4Z3WwcQ==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.68.3':
+ resolution: {integrity: sha512-IlSQPDExSm9YdtrWeZIHj87GPXI9lYygRvHVwQ1o9t91JHIiB2CihrvNIASpc/zI28atqm04jS3proaQuaJMww==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-musl@4.68.3':
+ resolution: {integrity: sha512-O2ssyDcBTZkH5v2P/9ZaXJreL0hCKvUA5UwuHn0jCKeMLKi4GhspZJ1I5FT5QsHtJ/dPx4pup7pg/Lw0emeY0Q==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.68.3':
+ resolution: {integrity: sha512-fesqagxcnc87lH2+aBWne/tFCmQVIGH+YezjY1wQwbUODuTBBlhHoyxju6umwn8LnjHVanjpoeaQdLsXP8JQSQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.68.3':
+ resolution: {integrity: sha512-+fZiTeHV/1fy/14dRqE4thjYwUOABL6qQjxElOEQg2oHLkCamO8dxhHphVgD4+pFxtVEUIWxsGVduPtwnAlvbg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.68.3':
+ resolution: {integrity: sha512-pfn4Zd9Ic3lEaSwW3GsQhTIDd7929C+eiEkOutsSCT2IHD6rDLblwmMQkgeGOso0oDo9Jk/ERtFdtFr9ElLs+g==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.68.3':
+ resolution: {integrity: sha512-eUXzaeNQbKXKNqseL3g/usUqOPmRu+DbQsvwr9MXMdV+VQFUNb9bcWSNAAs/TRV95PCbFK46kLzHEOhFSzujsg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openharmony-arm64@4.68.3':
+ resolution: {integrity: sha512-s6EclDWmk6zvIfk1yixgYthk7xHNx0xu5cEF5RDpS4IHNTpfswRX6xOXVG5cHF5xWn0B6EpDGARhPQ520KTlsA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.68.3':
+ resolution: {integrity: sha512-G2xnmxGnU8XHLwtjnnXNRcLrub+Af3nm9VQ1QzL2aEiAL7woBdRgTCZBslJl8umA+YMqdEFpUh9kJB/Vyzk2wQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.68.3':
+ resolution: {integrity: sha512-Y/4tApNVrMUYWbAHsyRWJgwuuJOfhTNhA2B04Xpa6+G9btkPZ9kU3XagUKzPTwF3hg36NpQk748JsnoTVho67Q==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.68.3':
+ resolution: {integrity: sha512-ADb1Uz2MNM0sxVpAlMNdQG16Hw4sgW1aqVL7NeqBMpcZeiHb192d7W6shZdMQs33D+w9ihDYBBPsYqqc4MlD8w==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/eslint-patch@1.16.1':
+ resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==}
+
+ '@sentry/browser-utils@11.12.0':
+ resolution: {integrity: sha512-OttAHqf557R1gfLQRqb/dpGUK1UQd21qkeeN0KA/ThuymYXTNY+qTpJIOqmzgpk6fOmE922mTT6xmnMEiGYZBQ==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/browser@11.12.0':
+ resolution: {integrity: sha512-oiSs0ZZQGVLVLASxTk/Z+MW4cGOHhC65IKc3B//M54eaZEa4p6JqP2DM++ta4IqDQx8+lSD6+TglAIsHBdSyVQ==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/bundler-plugins@11.12.0':
+ resolution: {integrity: sha512-7vBXoHMoYKjYu08anYv5I0nplSWOfQyl7BqV0VOrLxEtGoOpk1+DxL2dyBiaWoAtISkaqJEV/ft813OsCGuuMg==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+ peerDependencies:
+ rollup: '>=3.2.0'
+ webpack: '>=5.1.0'
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ webpack:
+ optional: true
+
+ '@sentry/cloudflare@11.12.0':
+ resolution: {integrity: sha512-m/nls+rx8NTCfxqgIMsw57lit5Rbo8VKbbrGDEZF65qsG12uV7wORDrUV6PnGi/MCjXx1Cc+tfdc90ljAlamwQ==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+ peerDependencies:
+ '@cloudflare/workers-types': ^4.x || ^5.x
+ vite: ^6.1.0 || ^7.0.0 || ^8.0.0
+ wrangler: ^4.x
+ peerDependenciesMeta:
+ '@cloudflare/workers-types':
+ optional: true
+ vite:
+ optional: true
+ wrangler:
+ optional: true
+
+ '@sentry/conventions@0.32.0':
+ resolution: {integrity: sha512-WkSQcDhUUsz1SwxR23LpmyPKba+dgxxiH0DWV4VSM9yaAvhhl87ppW2Ts3g4piIKCVflc31aJeWy+biUbYfsMQ==}
+ engines: {node: '>=14'}
+
+ '@sentry/core@11.12.0':
+ resolution: {integrity: sha512-HKER7EcRpPPgC8mLRe5BzP6njfRYFZ53BFLZxVp1whWbY6lp/b2mvTBk4q6+rKsUFhLhRDsd6jL8y/8ddEWv6A==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/feedback@11.12.0':
+ resolution: {integrity: sha512-vYOIeby3tVoKZ/q70D1NJ48D4APMVcojyvCjlaZkFOQR6DIEsOjF/uC9MkhnCP3cpa4oADdMatsIpkhlPM+qng==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/nextjs@11.12.0':
+ resolution: {integrity: sha512-IFmUbw8J+hrJTN3SoFG+CilZ8kMiRpA7G2Or8frCER3kfB+ZxkYJdYf0PJf/OMd0xKmSyfAozcqXJAfkEXIHIw==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+ peerDependencies:
+ next: ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0
+
+ '@sentry/node@11.12.0':
+ resolution: {integrity: sha512-MNSZDOd92Twrq5Z4ZAkxZdIfhr3YGytFb1T+vh5bNXVHkqByWpI/P2VtTSrzBR4Pi1IDRMz0i8t/OWNOsuAuBg==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/opentelemetry@11.12.0':
+ resolution: {integrity: sha512-oWJwUdc2OSSvyOPXn/E1nWkC3GV5KNTWfR5prbw/0XxlKJepdlBsW19y+FAE9n3QznZ52aMZmetWEAFMsPJ0KQ==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.9.0
+
+ '@sentry/react@11.12.0':
+ resolution: {integrity: sha512-tNr2yyfj//7Wrn0scoauR8D9FG93PWSRPQakWuvlVXGIXEAx/pwVkOjWYKUD1Xhyo8Hbvu5f6ddQ0+StsL3zyw==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+ peerDependencies:
+ react: 17.x || 18.x || 19.x
+ react-router: 6.x || 7.x || 8.x
+ peerDependenciesMeta:
+ react-router:
+ optional: true
+
+ '@sentry/replay-canvas@11.12.0':
+ resolution: {integrity: sha512-kx9Q3TY8pMp0b12fpcR0tziGoEW7Z8PpFKncmzD9XYWE3YzMt//B+cjkR+vmmZSUVxOuQATYDFp9c1jRTnbrug==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/replay@11.12.0':
+ resolution: {integrity: sha512-SF1064TKmOvIQTKo8WelVB34IZWtYtrflInsydPeB9jMTpy2iE3LqKRizDJr3YivjMUPDgIGn67b+0kaxiwQ4g==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/server-runtime-injection@11.12.0':
+ resolution: {integrity: sha512-fAZjCFyEfhvyfEdbav0/X13Yqbom5Ka1+hG0Nyl6bd7GxkQIWd68unSIw/Rvzfj/DSO8A1JidezST3D6omALkw==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/server-utils@11.12.0':
+ resolution: {integrity: sha512-gAP5FLhXSiMs9vsU7guc54QNY1OzUJmhqyXMjhiP4SYlhQltoKtipcyo8pFWVsmylIzIkA8e2eGR6e0YA6YF3A==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
+ '@sentry/vercel-edge@11.12.0':
+ resolution: {integrity: sha512-+s+XyGtncoeQQd0f1hjdXbjIORcAt5IdhmcV1mz0vwBlyilfq3bB40bCg1j91g2L4xTlVmTm01X2ofGeKkZuew==}
+ engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'}
+
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@@ -414,6 +873,15 @@ packages:
'@types/aos@3.0.7':
resolution: {integrity: sha512-sEhyFqvKauUJZDbvAB3Pggynrq6g+2PS4XB3tmUr+mDL1gfDJnwslUC4QQ7/l8UD+LWpr3RxZVR/rHoZrLqZVg==}
+ '@types/estree@1.0.10':
+ resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
'@types/node@22.13.0':
resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==}
@@ -425,674 +893,3269 @@ packages:
'@types/react@19.0.8':
resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==}
- '@workos-inc/authkit-nextjs@3.0.0':
- resolution: {integrity: sha512-9qER/fIlxGw0gfkBOcHh9Vi9LMBSq9zVsrJReQ6xbd08Ulz9QcrRDxOvs6CX6xitZjxrQKUwkWi0yH1vwUlhVA==}
+ '@typescript-eslint/eslint-plugin@8.72.2':
+ resolution: {integrity: sha512-222PKFXKihmFpi/pS5njoBgdAqsPhj2/GBmFbrNw8Tq8gEG9Sv+kSlKFy4u2q+mJv9ZzJgM2Gkv/bUzRZwZw5g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- next: ^13.5.9 || ^14.2.26 || ^15.2.3 || ^16
- react: ^18.0 || ^19.0.0
- react-dom: ^18.0 || ^19.0.0
+ '@typescript-eslint/parser': ^8.72.2
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- '@workos-inc/node@8.10.0':
- resolution: {integrity: sha512-3UqtU+QqITkQy77UZJumrZxb+4FcUjxgHfC4c186Q0rzSNDZ7YF7iNLWN7QB/q/26KbtgHlEpFS9GX75wUxSEQ==}
- engines: {node: '>=20.15.0'}
+ '@typescript-eslint/parser@8.72.2':
+ resolution: {integrity: sha512-llP+T1YuJOLlxEciP6OyQGtz5SMxyn+9LA2BvZw5RmToGVa1y4beEDVQL6Gje7T5WFYh19WREjDCN9Ev4gm5AA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- aos@3.0.0-beta.6:
- resolution: {integrity: sha512-VLWrpq8bfAWcetynVHMMrqdC+89Qq/Ym6UBJbHB4crIwp3RR8uq1dNGgsFzoDl03S43rlVMK+na3r5+oUCZsYw==}
+ '@typescript-eslint/project-service@8.72.2':
+ resolution: {integrity: sha512-6y5dLTZdHhI8Eh3yIQ/bfQhRKwn5e+TpJj64o18Cngc0iW/BCrVvrr6zGYqXPnYH31u6YXAYiFh0+qxX5mybJw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
- busboy@1.6.0:
- resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
- engines: {node: '>=10.16.0'}
+ '@typescript-eslint/scope-manager@8.72.2':
+ resolution: {integrity: sha512-iIoMJ6/8c1/QpFNyFjU0d1YzPco4MsZjQw0k3V+vfzNWAFmUmvhlyMoYEoYYDQZXc+J6Gi1X5XcxlzW2taIIGQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- caniuse-lite@1.0.30001696:
- resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==}
+ '@typescript-eslint/tsconfig-utils@8.72.2':
+ resolution: {integrity: sha512-+h3iCgZXuTNtoLXcnnjP12ZUHLMqoUcIHPfQrFEXTUqvb9dF8QK9b5nv5VtSo5fLkdHuks8ehbTzZj3rImAm9w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
- class-variance-authority@0.7.1:
- resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+ '@typescript-eslint/type-utils@8.72.2':
+ resolution: {integrity: sha512-STfkR38qIdhfkLpgtXnUjAzsNy4xouqiBO0lrVc/Wpk9Kem5/aHXUx1J8dGC16zpdYN1+yc2ILQ28er1kXX7ag==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- classlist-polyfill@1.2.0:
- resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==}
+ '@typescript-eslint/types@8.72.2':
+ resolution: {integrity: sha512-Xfn37OLZx03+PCU7qWx9DTv2FCRh1E6fk2+wONeNY15HXIwtcwuveaSwVpGAUptkNmPQegRxW5JyRel9T7wrog==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ '@typescript-eslint/typescript-estree@8.72.2':
+ resolution: {integrity: sha512-pQEGqIK/cqEvKivVWaFLYpe7XYejFxfuAOi4mu1oAWFvIo36aRHI9esRFTUxcIy/z8N482RJyH+LpZB0ZIU7Ow==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
- clsx@2.1.1:
- resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
- engines: {node: '>=6'}
+ '@typescript-eslint/utils@8.72.2':
+ resolution: {integrity: sha512-hv3eRYbpPbbpezuax1EfGrzpa3C4ySgNZkPUkLOWOAjU8HsOKowEDAr8C7nsNl1C+SBSKDpvno6VKHnlhvp9iA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ '@typescript-eslint/visitor-keys@8.72.2':
+ resolution: {integrity: sha512-NAGrjn0Pitjqzq/GkgMC4kBYm233PQ8GffyQ9+kTA3AlNQYEzOf25EIM02BAHZv5FRJSpHpJk+OGUxVkOB93GQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ '@unrs/resolver-binding-android-arm-eabi@1.13.0':
+ resolution: {integrity: sha512-60E5mvmIiW+i1E/HYeSX4iE4A8s9NJSGYPu7UM0DJght1c2tTkWwuyDyAwzsEXhKM/XbbndfnTiXdfrf27d2hw==}
+ cpu: [arm]
+ os: [android]
- color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ '@unrs/resolver-binding-android-arm64@1.13.0':
+ resolution: {integrity: sha512-qlh/JR3Tuy1cJ7xtf5pR4ykvLiK6os7X7EL2+zXZbrVc/s+yB8DoFdQrCAW9/a2TOxPVbR7QVNpkPWh7UWIsEQ==}
+ cpu: [arm64]
+ os: [android]
- color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
+ '@unrs/resolver-binding-darwin-arm64@1.13.0':
+ resolution: {integrity: sha512-yynnnnJXUC99WeD1GfvuXPKsKNfvgzGYC2eRayFnUfsHVROjqrbFOkFQLZiSx1H8+PLy5BzU8vqyPyLqbRfeBQ==}
+ cpu: [arm64]
+ os: [darwin]
- cookie@0.7.2:
- resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
- engines: {node: '>= 0.6'}
+ '@unrs/resolver-binding-darwin-x64@1.13.0':
+ resolution: {integrity: sha512-t8PXE0Ip9tmGyhRlfVsnEbzGM5iSvJIeNIXciUACjzpg0mmPs13fGv2x7W8sBa0S8zbIiohxKXS9fL/LXW/ERQ==}
+ cpu: [x64]
+ os: [darwin]
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ '@unrs/resolver-binding-freebsd-x64@1.13.0':
+ resolution: {integrity: sha512-qdtl9GDWDoDx6rhzF4RU5SJutV3lcLOiTiyqD6nBxYfEO6lAgLNukfrA+HJ2u2OiyWvV8JW5iEWD3LoONw7lYA==}
+ cpu: [x64]
+ os: [freebsd]
- detect-libc@1.0.3:
- resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
- engines: {node: '>=0.10'}
- hasBin: true
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.13.0':
+ resolution: {integrity: sha512-VrMUVwdrScTarsh4B6aUhTtziUavSlglo4Hi8XZ6CpAe4+j3nquY+XoP+tYkiSBDsXZ8386ne4pv4YYYBNi02w==}
+ cpu: [arm]
+ os: [linux]
- detect-libc@2.1.2:
- resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
- engines: {node: '>=8'}
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.13.0':
+ resolution: {integrity: sha512-zSbTVwaxiTC+zYJ9xVNTC6c+BYO/kOV/odcTI3bHuFFXa+XmjLoUkb/8UxsZeU5YF4K000m17wrXoTblNWuzOg==}
+ cpu: [arm]
+ os: [linux]
- enhanced-resolve@5.18.0:
- resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
- engines: {node: '>=10.13.0'}
-
- graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
- iron-session@8.0.4:
- resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==}
-
- iron-webcrypto@1.2.1:
- resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
-
- is-arrayish@0.3.4:
- resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
-
- jiti@2.4.2:
- resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
- hasBin: true
-
- jose@5.10.0:
- resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
+ '@unrs/resolver-binding-linux-arm64-gnu@1.13.0':
+ resolution: {integrity: sha512-Z/Rax87moZHsuvJ8awdfP+zrMlsCt3d7mggUPIiPe32KpeagimyzJWnZSMQoV67an9uVQghyh92Pc0VprITnYA==}
+ cpu: [arm64]
+ os: [linux]
- lightningcss-darwin-arm64@1.29.1:
- resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==}
- engines: {node: '>= 12.0.0'}
+ '@unrs/resolver-binding-linux-arm64-musl@1.13.0':
+ resolution: {integrity: sha512-oUzXz8hNvFLNEAag8lBKJe1euiV2dmGHAR+eQ5fNpsZO0F1K7IMRb4J6pqYsd7uLMRQNPiu5A1WKUJHbFLWbbw==}
cpu: [arm64]
- os: [darwin]
+ os: [linux]
- lightningcss-darwin-x64@1.29.1:
- resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [darwin]
+ '@unrs/resolver-binding-linux-loong64-gnu@1.13.0':
+ resolution: {integrity: sha512-BxhGYvZBg0YrvNOeSEGR3eNklwXYy0mUJk7oeGJvZoQMKM68zYvbbf52+fQI3Le4X0fW276FTKIoTwjpMob80A==}
+ cpu: [loong64]
+ os: [linux]
- lightningcss-freebsd-x64@1.29.1:
- resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [freebsd]
+ '@unrs/resolver-binding-linux-loong64-musl@1.13.0':
+ resolution: {integrity: sha512-nZcIuup9Ar3gAlqoZfX/KW6x83TMI11tLpCjldZG5M1KeY8qNUPNJJ71+sPvG8HMBpoh+ix1pAm5gkMFvcSAcQ==}
+ cpu: [loong64]
+ os: [linux]
- lightningcss-linux-arm-gnueabihf@1.29.1:
- resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm]
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.13.0':
+ resolution: {integrity: sha512-AG6AgdDrkRNjAPwD/cftFJGgZUWCiJX+E8vpYCDEnwFHLTHZ7ppBiU6/vyPPwrfjcPUPQCDbbxE/eZUXsx49jQ==}
+ cpu: [ppc64]
os: [linux]
- lightningcss-linux-arm64-gnu@1.29.1:
- resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.13.0':
+ resolution: {integrity: sha512-6vOqYGcAmzpRWpUURWutzvpf1qJ6eOu5cfYObdtPJnzZ0+Kw4cw+ZkZJqIYEh8fPuTBwSYDL/FwlUhma1G/JVQ==}
+ cpu: [riscv64]
os: [linux]
- lightningcss-linux-arm64-musl@1.29.1:
- resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
+ '@unrs/resolver-binding-linux-riscv64-musl@1.13.0':
+ resolution: {integrity: sha512-4HeIn0S2KVUowK0A+EweXrDvZ8CKHEfTtif0kx9vt3ORNsqcXNFFIFnHE0tizma3/Gt5OGrU2ovYNuj+D/bN4g==}
+ cpu: [riscv64]
os: [linux]
- lightningcss-linux-x64-gnu@1.29.1:
- resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==}
- engines: {node: '>= 12.0.0'}
+ '@unrs/resolver-binding-linux-s390x-gnu@1.13.0':
+ resolution: {integrity: sha512-JfkvqY7NZbxyhexLE+g6Z8Hsx4utHOGaVazAVghPiBn8Upw2iERZPpKYnW1FBVU4WStv/BiIsoK/Muke0E7asA==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.13.0':
+ resolution: {integrity: sha512-iwjLeVdZo/8v5OKAeRIC+4VQV045t1EPZr5B/AVLgUQ04IdtNthWzg6not2cNjZgH2gHpSf4fOXMmN83aLO1FA==}
cpu: [x64]
os: [linux]
- lightningcss-linux-x64-musl@1.29.1:
- resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==}
- engines: {node: '>= 12.0.0'}
+ '@unrs/resolver-binding-linux-x64-musl@1.13.0':
+ resolution: {integrity: sha512-TOh1fqOjyq1OPoht3BDLd7Y+HeMJRwd5g2VNmCQclknEbjp4py5GFRmT4L/rOybF5Af8q0LT9zHs2WGkwlqtrw==}
cpu: [x64]
os: [linux]
- lightningcss-win32-arm64-msvc@1.29.1:
- resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==}
- engines: {node: '>= 12.0.0'}
+ '@unrs/resolver-binding-openharmony-arm64@1.13.0':
+ resolution: {integrity: sha512-3T2MNtF2dd1yjaXCVqrsi+/3VZeksEzU1hygPzqqkBLVVjn+2iJzXEkxxCKIVFrWnpmEbazeHJp/ruYD0RUVWA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.13.0':
+ resolution: {integrity: sha512-hKWfSLiN3L4cIxg0jrpyP/66AXLTcyD37jmSn//rGdOUYGlizYxTEFdJ+GZbp2NnaML3YS/A73nCysze8FaJdg==}
cpu: [arm64]
os: [win32]
- lightningcss-win32-x64-msvc@1.29.1:
- resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
+ '@unrs/resolver-binding-win32-ia32-msvc@1.13.0':
+ resolution: {integrity: sha512-N4gDKkDoiyIQEcn3vTqe2ksRxUAtBvQ8c5TiT+WonSa6FHgCAY5+RggnZ134hXJoRj57JEjv4/m+i/pAKHWrTQ==}
+ cpu: [ia32]
os: [win32]
- lightningcss@1.29.1:
- resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==}
- engines: {node: '>= 12.0.0'}
+ '@unrs/resolver-binding-win32-x64-msvc@1.13.0':
+ resolution: {integrity: sha512-DpLMlAqlrk4zBVK3DiDjwKD0oq7pZNy+8BiIBRuByqb6dm5jsdoLMhIiyh/xR7+WejaW/1Ui+XgbgMNa4+zWJg==}
+ cpu: [x64]
+ os: [win32]
- lodash.debounce@4.0.8:
- resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+ '@workos-inc/authkit-nextjs@3.0.0':
+ resolution: {integrity: sha512-9qER/fIlxGw0gfkBOcHh9Vi9LMBSq9zVsrJReQ6xbd08Ulz9QcrRDxOvs6CX6xitZjxrQKUwkWi0yH1vwUlhVA==}
+ peerDependencies:
+ next: ^13.5.9 || ^14.2.26 || ^15.2.3 || ^16
+ react: ^18.0 || ^19.0.0
+ react-dom: ^18.0 || ^19.0.0
- lodash.throttle@4.1.1:
- resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+ '@workos-inc/node@8.10.0':
+ resolution: {integrity: sha512-3UqtU+QqITkQy77UZJumrZxb+4FcUjxgHfC4c186Q0rzSNDZ7YF7iNLWN7QB/q/26KbtgHlEpFS9GX75wUxSEQ==}
+ engines: {node: '>=20.15.0'}
- lucide-react@1.7.0:
- resolution: {integrity: sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==}
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- mini-svg-data-uri@1.4.4:
- resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
+ acorn@8.19.0:
+ resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==}
+ engines: {node: '>=0.4.0'}
hasBin: true
- nanoid@3.3.8:
- resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
- next@15.2.8:
- resolution: {integrity: sha512-pe2trLKZTdaCuvNER0S9Wp+SP2APf7SfFmyUP9/w1SFA2UqmW0u+IsxCKkiky3n6um7mryaQIlgiDnKrf1ZwIw==}
- engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.1.0
- '@playwright/test': ^1.41.2
- babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- '@playwright/test':
- optional: true
- babel-plugin-react-compiler:
- optional: true
- sass:
- optional: true
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
- path-to-regexp@6.3.0:
- resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+ aos@3.0.0-beta.6:
+ resolution: {integrity: sha512-VLWrpq8bfAWcetynVHMMrqdC+89Qq/Ym6UBJbHB4crIwp3RR8uq1dNGgsFzoDl03S43rlVMK+na3r5+oUCZsYw==}
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- postcss@8.4.31:
- resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
- engines: {node: ^10 || ^12 || >=14}
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
- postcss@8.5.1:
- resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
- engines: {node: ^10 || ^12 || >=14}
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
- react-dom@19.2.3:
- resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
- peerDependencies:
- react: ^19.2.3
+ array-includes@3.2.0:
+ resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==}
+ engines: {node: '>= 0.4'}
- react@19.2.3:
- resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
- engines: {node: '>=0.10.0'}
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
- scheduler@0.27.0:
- resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
- semver@7.7.3:
- resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axe-core@4.14.0:
+ resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==}
+ engines: {node: '>=4'}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ brace-expansion@1.1.22:
+ resolution: {integrity: sha512-CKLDTuSsN0+r1ThM0WkzzBI7dnPI6xEGfa/JnVYIK9JNBA1N1NyPwXVHor//NKD/y3sDxp764sZdLhFK7pH8XQ==}
+
+ brace-expansion@5.0.13:
+ resolution: {integrity: sha512-Vh3dmFbc4wZeox7M9I/0L9GfFd83Su4+yCck/OF9Gi/P/dAHn0RT7X4K9R7gMNMhDck3DvhR6QXsnQdjjgwNvQ==}
+ engines: {node: 20 || >=22}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001696:
+ resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- hasBin: true
- sharp@0.33.5:
- resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
- simple-swizzle@0.2.4:
- resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+ classlist-polyfill@1.2.0:
+ resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- streamsearch@1.1.0:
- resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
- engines: {node: '>=10.0.0'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
- styled-jsx@5.1.6:
- resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
- engines: {node: '>= 12.0.0'}
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ commondir@1.0.1:
+ resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
- '@babel/core': '*'
- babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ supports-color: '*'
peerDependenciesMeta:
- '@babel/core':
+ supports-color:
optional: true
- babel-plugin-macros:
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
optional: true
- tabbable@6.2.0:
- resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
- tailwind-merge@3.5.0:
- resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==}
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
- tailwindcss@4.0.3:
- resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==}
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
- tapable@2.2.1:
- resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
- engines: {node: '>=6'}
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
- typescript@5.7.3:
- resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
- engines: {node: '>=14.17'}
- hasBin: true
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ enhanced-resolve@5.18.0:
+ resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
+ engines: {node: '>=10.13.0'}
+
+ es-abstract-get@1.0.0:
+ resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==}
+ engines: {node: '>= 0.4'}
+
+ es-abstract@1.24.2:
+ resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.4.0:
+ resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.4:
+ resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==}
+ engines: {node: '>= 0.4'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-config-next@15.2.8:
+ resolution: {integrity: sha512-sTk5l0ASdfv9upHwTS0Z98NPfNXAHwVsTNyZaS47rCLkrFQiAzrLowYDLxpZ80SkPZAnzW0Yzw64+AgsRthsMg==}
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-import-resolver-node@0.3.10:
+ resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==}
+
+ eslint-import-resolver-typescript@3.10.1:
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+
+ eslint-module-utils@2.14.0:
+ resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-jsx-a11y@6.10.2:
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react@7.37.5:
+ resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@9.39.5:
+ resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.20.3:
+ resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.4:
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.2.0:
+ resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.14.3:
+ resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@14.0.6:
+ resolution: {integrity: sha512-OwXjVP2svY5EyLY75Vek96C8qK43gqrt4xsZ+qSILdnaEiJPXkd62mcfUSNx/TQErQRdu5uM5kF67sfONragKw==}
+ engines: {node: 18 || 20 || >=22}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.14:
+ resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ iron-session@8.0.4:
+ resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==}
+
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.3.4:
+ resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.18.0:
+ resolution: {integrity: sha512-qyax9fgaKOEC4qK8WZn7Q4IcoZC9RC1O1fFxRcRTq/oMMkWT/uXpqpXa12kzWR409zAt1drYN9N9BO26UmBCmw==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-document.all@1.0.0:
+ resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-reference@1.2.1:
+ resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jiti@2.4.2:
+ resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ hasBin: true
+
+ jose@5.10.0:
+ resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.3.2:
+ resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-darwin-arm64@1.29.1:
+ resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.29.1:
+ resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.29.1:
+ resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.29.1:
+ resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.29.1:
+ resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.29.1:
+ resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.29.1:
+ resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.29.1:
+ resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.29.1:
+ resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.29.1:
+ resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.29.1:
+ resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==}
+ engines: {node: '>= 12.0.0'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.throttle@4.1.1:
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lru-cache@11.5.3:
+ resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==}
+ engines: {node: 20 || >=22}
+
+ lucide-react@1.7.0:
+ resolution: {integrity: sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ magic-string@1.4.5:
+ resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mini-svg-data-uri@1.4.4:
+ resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
+ hasBin: true
+
+ minimatch@10.2.6:
+ resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@11.0.8:
+ resolution: {integrity: sha512-nFQuYSTVrGvysVBps5Ih+0BdnYFN/Cj3C816r6+p7yK+FHrVLGE4O4N9AFwykrlNlvM2HYt+Rad1Uiro6h88Ig==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ napi-postinstall@0.3.8:
+ resolution: {integrity: sha512-dHbDC5V1g/EI8OLEtL4Iuwbu0fgzmyykxenn2KnlsX9XdhTXL3gWnfbbP+ab+oUcgV6CFpb8QGyQt/ZXA0UXig==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ next@15.2.8:
+ resolution: {integrity: sha512-pe2trLKZTdaCuvNER0S9Wp+SP2APf7SfFmyUP9/w1SFA2UqmW0u+IsxCKkiky3n6um7mryaQIlgiDnKrf1ZwIw==}
+ engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ node-exports-info@1.6.2:
+ resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==}
+ engines: {node: '>= 0.4'}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ own-keys@1.0.2:
+ resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==}
+ engines: {node: '>= 0.4'}
+
+ oxc-parser@0.152.0:
+ resolution: {integrity: sha512-ZztsZgaCWmPeKYMdoTT5e0oV/oxD1NeLWNR3kAtr/G707cUPYaaozRlVDHLCGnszHJRszN9mJwmPNpqgwloC0A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@3.0.0:
+ resolution: {integrity: sha512-1pTbQqH1wIwMi/eleQ5leFTTCkzFsPcgXNjwOA8YGGW/W4/kHT3dssE7Z6NH+zuqNLOzOB0uaD61yl7cAcVhgg==}
+ engines: {node: 18 || 20 || >=22}
+
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
+ engines: {node: '>=12'}
+
+ playwright-core@1.65.0:
+ resolution: {integrity: sha512-vNSKgH6YqtN7cdT/L334zo0a+YwkrpicyrHJlWWPIm/Q+Nn2SWInil01oT0mbu96U4GgoRtCYQD9CzJQgju+lA==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ playwright@1.65.0:
+ resolution: {integrity: sha512-F3AMWcR44qMBt4kq+6Kb6mX7bjGXshktKFOPULd7reED6ZJWevjbNRqysP7q+AATE9kdPEZBibex1BYsvpVoeA==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier@3.10.1:
+ resolution: {integrity: sha512-70vp3ZUYoPlFbF9uiTdXHUUCGEIp7d4+6p+8DYbkm2jP7x/3i/paXVF6dopSI3zd/CEitrZN1rc4i85xWmmXlg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-dom@19.2.3:
+ resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
+ peerDependencies:
+ react: ^19.2.3
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react@19.2.3:
+ resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
+ engines: {node: '>=0.10.0'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@2.0.0-next.7:
+ resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rollup@4.68.3:
+ resolution: {integrity: sha512-wd2gavj7CEQv52rdcVqfUupO/KPIKcoJKxyFWl4cOqYZGMQEOSijJRkliz0dRa7gpkj/h4TRqyWa+dJJi6T0OA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.4:
+ resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
+ engines: {node: '>=0.4'}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ semver@6.3.2:
+ resolution: {integrity: sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==}
+ hasBin: true
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sentry@0.49.0:
+ resolution: {integrity: sha512-9tjS0jTx5FQzhwAGhpcnwvqE0MlQiwJtunsIUNqGkw6E9CBOMbijlamIDUqvZTDtJAveVwa9L5ziP44bOJUzcQ==}
+ engines: {node: '>=20.0'}
+ hasBin: true
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ sharp@0.33.5:
+ resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
+ engines: {node: '>= 0.4'}
+
+ simple-swizzle@0.2.4:
+ resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+ stacktrace-parser@0.1.11:
+ resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==}
+ engines: {node: '>=6'}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.matchall@4.1.0:
+ resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+ string.prototype.trim@1.2.11:
+ resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.10:
+ resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
+ tailwind-merge@3.5.0:
+ resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==}
+
+ tailwindcss@4.0.3:
+ resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==}
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.7.1:
+ resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
+ engines: {node: '>=8'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.5:
+ resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.8:
+ resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
+ engines: {node: '>= 0.4'}
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ unrs-resolver@1.13.0:
+ resolution: {integrity: sha512-mcPQo9Vm6kXd84d/WqMiYBi2CcA57QHBX/ev5PoUEb8b2oQzUvJ6xYsfseQblnCncgnVmCZGWiFwK7KkS5JZJA==}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ valibot@1.3.1:
+ resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==}
+ peerDependencies:
+ typescript: '>=5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ web-vitals@6.2.3:
+ resolution: {integrity: sha512-Dmy+vdO1UPMqXiAtZSNayhl4f794Bxfd94W4HIj2HlYtczEQfEOon969memlcpcHrTuOKLa5baFjX7WbgmOq+A==}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.24:
+ resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@emnapi/runtime@1.7.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.39.5(jiti@2.4.2)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.3': {}
+
+ '@eslint/config-array@0.21.2':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.7':
+ dependencies:
+ ajv: 6.15.0
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.3.2
+ minimatch: 3.1.5
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.39.5': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.9':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/dom@1.6.13':
+ dependencies:
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@floating-ui/dom': 1.6.13
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@floating-ui/react@0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@floating-ui/utils': 0.2.9
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ tabbable: 6.2.0
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@headlessui/react@2.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@react-aria/focus': 3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@tanstack/react-virtual': 3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@humanfs/core@0.19.2':
+ dependencies:
+ '@humanfs/types': 0.15.0
+
+ '@humanfs/node@0.16.8':
+ dependencies:
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanfs/types@0.15.0': {}
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ optional: true
+
+ '@img/sharp-linux-s390x@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-wasm32@0.33.5':
+ dependencies:
+ '@emnapi/runtime': 1.7.1
+ optional: true
+
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
+
+ '@isaacs/nonrecursive-glob-match@1.1.0': {}
+
+ '@jridgewell/sourcemap-codec@1.6.0': {}
+
+ '@next/env@15.2.8': {}
+
+ '@next/eslint-plugin-next@15.2.8':
+ dependencies:
+ fast-glob: 3.3.1
+
+ '@next/swc-darwin-arm64@15.2.5':
+ optional: true
+
+ '@next/swc-darwin-x64@15.2.5':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@15.2.5':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@15.2.5':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@15.2.5':
+ optional: true
+
+ '@next/swc-linux-x64-musl@15.2.5':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@15.2.5':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@15.2.5':
+ optional: true
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.3
+
+ '@nolyfill/is-core-module@1.0.39': {}
+
+ '@opentelemetry/api@1.10.0': {}
+
+ '@oxc-parser/binding-android-arm-eabi@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-android-arm64@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-darwin-arm64@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-darwin-x64@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-freebsd-x64@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-arm-musleabihf@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-arm64-gnu@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-arm64-musl@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-ppc64-gnu@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-riscv64-gnu@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-riscv64-musl@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-s390x-gnu@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-x64-gnu@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-linux-x64-musl@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-openharmony-arm64@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-win32-arm64-msvc@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-win32-ia32-msvc@0.152.0':
+ optional: true
+
+ '@oxc-parser/binding-win32-x64-msvc@0.152.0':
+ optional: true
+
+ '@oxc-project/types@0.152.0': {}
+
+ '@playwright/test@1.65.0':
+ dependencies:
+ playwright: 1.65.0
+
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.8)(react@19.2.3)':
+ dependencies:
+ react: 19.2.3
+ optionalDependencies:
+ '@types/react': 19.0.8
+
+ '@radix-ui/react-slot@1.2.4(@types/react@19.0.8)(react@19.2.3)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.8)(react@19.2.3)
+ react: 19.2.3
+ optionalDependencies:
+ '@types/react': 19.0.8
+
+ '@react-aria/focus@3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@react-types/shared': 3.27.0(react@19.2.3)
+ '@swc/helpers': 0.5.15
+ clsx: 2.1.1
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@react-aria/interactions@3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@react-aria/ssr': 3.9.7(react@19.2.3)
+ '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@react-types/shared': 3.27.0(react@19.2.3)
+ '@swc/helpers': 0.5.15
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@react-aria/ssr@3.9.7(react@19.2.3)':
+ dependencies:
+ '@swc/helpers': 0.5.15
+ react: 19.2.3
+
+ '@react-aria/utils@3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@react-aria/ssr': 3.9.7(react@19.2.3)
+ '@react-stately/utils': 3.10.5(react@19.2.3)
+ '@react-types/shared': 3.27.0(react@19.2.3)
+ '@swc/helpers': 0.5.15
+ clsx: 2.1.1
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@react-stately/utils@3.10.5(react@19.2.3)':
+ dependencies:
+ '@swc/helpers': 0.5.15
+ react: 19.2.3
+
+ '@react-types/shared@3.27.0(react@19.2.3)':
+ dependencies:
+ react: 19.2.3
+
+ '@rollup/plugin-commonjs@28.0.1(rollup@4.68.3)':
+ dependencies:
+ '@rollup/pluginutils': 5.5.1(rollup@4.68.3)
+ commondir: 1.0.1
+ estree-walker: 2.0.2
+ fdir: 6.5.0(picomatch@4.0.7)
+ is-reference: 1.2.1
+ magic-string: 0.30.21
+ picomatch: 4.0.7
+ optionalDependencies:
+ rollup: 4.68.3
+
+ '@rollup/pluginutils@5.5.1(rollup@4.68.3)':
+ dependencies:
+ '@types/estree': 1.0.10
+ estree-walker: 2.0.2
+ picomatch: 4.0.7
+ optionalDependencies:
+ rollup: 4.68.3
+
+ '@rollup/rollup-android-arm-eabi@4.68.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-android-x64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.68.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.68.3':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.68.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.68.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.68.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.68.3':
+ optional: true
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/eslint-patch@1.16.1': {}
+
+ '@sentry/browser-utils@11.12.0':
+ dependencies:
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ web-vitals: 6.2.3
+
+ '@sentry/browser@11.12.0':
+ dependencies:
+ '@sentry/browser-utils': 11.12.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ '@sentry/feedback': 11.12.0
+ '@sentry/replay': 11.12.0
+ '@sentry/replay-canvas': 11.12.0
+
+ '@sentry/bundler-plugins@11.12.0(rollup@4.68.3)':
+ dependencies:
+ '@sentry/core': 11.12.0
+ dotenv: 17.4.2
+ glob: 14.0.6
+ magic-string: 1.4.5
+ oxc-parser: 0.152.0
+ sentry: 0.49.0
+ optionalDependencies:
+ rollup: 4.68.3
+
+ '@sentry/cloudflare@11.12.0':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0)
+ '@sentry/server-utils': 11.12.0
+ magic-string: 0.30.21
+
+ '@sentry/conventions@0.32.0': {}
+
+ '@sentry/core@11.12.0':
+ dependencies:
+ '@sentry/conventions': 0.32.0
+
+ '@sentry/feedback@11.12.0':
+ dependencies:
+ '@sentry/core': 11.12.0
+
+ '@sentry/nextjs@11.12.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@rollup/plugin-commonjs': 28.0.1(rollup@4.68.3)
+ '@sentry/browser-utils': 11.12.0
+ '@sentry/bundler-plugins': 11.12.0(rollup@4.68.3)
+ '@sentry/cloudflare': 11.12.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ '@sentry/node': 11.12.0(rollup@4.68.3)
+ '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0)
+ '@sentry/react': 11.12.0(react@19.2.3)
+ '@sentry/server-runtime-injection': 11.12.0
+ '@sentry/server-utils': 11.12.0
+ '@sentry/vercel-edge': 11.12.0
+ next: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ rollup: 4.68.3
+ stacktrace-parser: 0.1.11
+ transitivePeerDependencies:
+ - '@cloudflare/workers-types'
+ - react
+ - react-router
+ - vite
+ - webpack
+ - wrangler
+
+ '@sentry/node@11.12.0(rollup@4.68.3)':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@sentry/bundler-plugins': 11.12.0(rollup@4.68.3)
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0)
+ '@sentry/server-runtime-injection': 11.12.0
+ '@sentry/server-utils': 11.12.0
+ transitivePeerDependencies:
+ - rollup
+ - webpack
+
+ '@sentry/opentelemetry@11.12.0(@opentelemetry/api@1.10.0)':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+
+ '@sentry/react@11.12.0(react@19.2.3)':
+ dependencies:
+ '@sentry/browser': 11.12.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+ react: 19.2.3
+
+ '@sentry/replay-canvas@11.12.0':
+ dependencies:
+ '@sentry/core': 11.12.0
+ '@sentry/replay': 11.12.0
+
+ '@sentry/replay@11.12.0':
+ dependencies:
+ '@sentry/browser-utils': 11.12.0
+ '@sentry/core': 11.12.0
+
+ '@sentry/server-runtime-injection@11.12.0':
+ dependencies:
+ '@sentry/core': 11.12.0
+ '@sentry/server-utils': 11.12.0
+
+ '@sentry/server-utils@11.12.0':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@sentry/conventions': 0.32.0
+ '@sentry/core': 11.12.0
+
+ '@sentry/vercel-edge@11.12.0':
+ dependencies:
+ '@opentelemetry/api': 1.10.0
+ '@sentry/core': 11.12.0
+ '@sentry/server-utils': 11.12.0
+
+ '@swc/counter@0.1.3': {}
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tailwindcss/forms@0.5.10(tailwindcss@4.0.3)':
+ dependencies:
+ mini-svg-data-uri: 1.4.4
+ tailwindcss: 4.0.3
+
+ '@tailwindcss/node@4.0.3':
+ dependencies:
+ enhanced-resolve: 5.18.0
+ jiti: 2.4.2
+ tailwindcss: 4.0.3
+
+ '@tailwindcss/oxide-android-arm64@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.0.3':
+ optional: true
+
+ '@tailwindcss/oxide@4.0.3':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.0.3
+ '@tailwindcss/oxide-darwin-arm64': 4.0.3
+ '@tailwindcss/oxide-darwin-x64': 4.0.3
+ '@tailwindcss/oxide-freebsd-x64': 4.0.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.0.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.0.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.0.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.0.3
+
+ '@tailwindcss/postcss@4.0.3':
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ '@tailwindcss/node': 4.0.3
+ '@tailwindcss/oxide': 4.0.3
+ lightningcss: 1.29.1
+ postcss: 8.5.1
+ tailwindcss: 4.0.3
+
+ '@tanstack/react-virtual@3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@tanstack/virtual-core': 3.12.0
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@tanstack/virtual-core@3.12.0': {}
+
+ '@types/aos@3.0.7': {}
+
+ '@types/estree@1.0.10': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/node@22.13.0':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/react-dom@19.0.3(@types/react@19.0.8)':
+ dependencies:
+ '@types/react': 19.0.8
+
+ '@types/react@19.0.8':
+ dependencies:
+ csstype: 3.1.3
+
+ '@typescript-eslint/eslint-plugin@8.72.2(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.3
+ '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.72.2
+ '@typescript-eslint/type-utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.72.2
+ eslint: 9.39.5(jiti@2.4.2)
+ ignore: 7.0.14
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.72.2
+ '@typescript-eslint/types': 8.72.2
+ '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.72.2
+ debug: 4.4.3
+ eslint: 9.39.5(jiti@2.4.2)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.72.2(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.7.3)
+ '@typescript-eslint/types': 8.72.2
+ debug: 4.4.3
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.72.2':
+ dependencies:
+ '@typescript-eslint/types': 8.72.2
+ '@typescript-eslint/visitor-keys': 8.72.2
+
+ '@typescript-eslint/tsconfig-utils@8.72.2(typescript@5.7.3)':
+ dependencies:
+ typescript: 5.7.3
+
+ '@typescript-eslint/type-utils@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.72.2
+ '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ debug: 4.4.3
+ eslint: 9.39.5(jiti@2.4.2)
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.72.2': {}
+
+ '@typescript-eslint/typescript-estree@8.72.2(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.72.2(typescript@5.7.3)
+ '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.7.3)
+ '@typescript-eslint/types': 8.72.2
+ '@typescript-eslint/visitor-keys': 8.72.2
+ debug: 4.4.3
+ minimatch: 10.2.6
+ semver: 7.7.3
+ tinyglobby: 0.2.17
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.4.2))
+ '@typescript-eslint/scope-manager': 8.72.2
+ '@typescript-eslint/types': 8.72.2
+ '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3)
+ eslint: 9.39.5(jiti@2.4.2)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.72.2':
+ dependencies:
+ '@typescript-eslint/types': 8.72.2
+ eslint-visitor-keys: 5.0.1
+
+ '@unrs/resolver-binding-android-arm-eabi@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-android-arm64@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-arm64@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-loong64-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-loong64-musl@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-openharmony-arm64@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.13.0':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.13.0':
+ optional: true
+
+ '@workos-inc/authkit-nextjs@3.0.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)':
+ dependencies:
+ '@workos-inc/node': 8.10.0
+ iron-session: 8.0.4
+ jose: 5.10.0
+ next: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ path-to-regexp: 6.3.0
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ valibot: 1.3.1(typescript@5.7.3)
+ transitivePeerDependencies:
+ - typescript
+
+ '@workos-inc/node@8.10.0': {}
+
+ acorn-jsx@5.3.2(acorn@8.19.0):
+ dependencies:
+ acorn: 8.19.0
+
+ acorn@8.19.0: {}
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ aos@3.0.0-beta.6:
+ dependencies:
+ classlist-polyfill: 1.2.0
+ lodash.debounce: 4.0.8
+ lodash.throttle: 4.1.1
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-includes@3.2.0:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.findlastindex@1.2.6:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ ast-types-flow@0.0.8: {}
+
+ async-function@1.0.0: {}
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axe-core@4.14.0: {}
+
+ axobject-query@4.1.0: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ brace-expansion@1.1.22:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@5.0.13:
+ dependencies:
+ balanced-match: 4.0.4
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.9:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001696: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
+ classlist-polyfill@1.2.0: {}
+
+ client-only@0.0.1: {}
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.4
+ optional: true
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+ optional: true
+
+ commondir@1.0.1: {}
+
+ concat-map@0.0.1: {}
+
+ cookie@0.7.2: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ csstype@3.1.3: {}
+
+ damerau-levenshtein@1.0.8: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ detect-libc@1.0.3: {}
+
+ detect-libc@2.1.2:
+ optional: true
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
- uncrypto@0.1.3:
- resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+ dotenv@17.4.2: {}
- undici-types@6.20.0:
- resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
- valibot@1.3.1:
- resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==}
- peerDependencies:
- typescript: '>=5'
- peerDependenciesMeta:
- typescript:
- optional: true
+ emoji-regex@9.2.2: {}
-snapshots:
+ enhanced-resolve@5.18.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
- '@alloc/quick-lru@5.2.0': {}
+ es-abstract-get@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ is-callable: 1.2.7
+ object-inspect: 1.13.4
- '@emnapi/runtime@1.7.1':
+ es-abstract@1.24.2:
dependencies:
- tslib: 2.8.1
- optional: true
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.4
+ function.prototype.name: 1.2.0
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.2
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.4
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.11
+ string.prototype.trimend: 1.0.10
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.5
+ typed-array-length: 1.0.8
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.24
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-iterator-helpers@1.4.0:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ math-intrinsics: 1.1.0
+
+ es-object-atoms@1.1.2:
+ dependencies:
+ es-errors: 1.3.0
- '@floating-ui/core@1.6.9':
+ es-set-tostringtag@2.1.0:
dependencies:
- '@floating-ui/utils': 0.2.9
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.4
- '@floating-ui/dom@1.6.13':
+ es-shim-unscopables@1.1.0:
dependencies:
- '@floating-ui/core': 1.6.9
- '@floating-ui/utils': 0.2.9
+ hasown: 2.0.4
- '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ es-to-primitive@1.3.4:
dependencies:
- '@floating-ui/dom': 1.6.13
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ es-abstract-get: 1.0.0
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
- '@floating-ui/react@0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ escape-string-regexp@4.0.0: {}
+
+ eslint-config-next@15.2.8(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3):
dependencies:
- '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@floating-ui/utils': 0.2.9
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- tabbable: 6.2.0
+ '@next/eslint-plugin-next': 15.2.8
+ '@rushstack/eslint-patch': 1.16.1
+ '@typescript-eslint/eslint-plugin': 8.72.2(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ eslint: 9.39.5(jiti@2.4.2)
+ eslint-import-resolver-node: 0.3.10
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.4.2))
+ eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.4.2))
+ eslint-plugin-react-hooks: 5.2.0(eslint@9.39.5(jiti@2.4.2))
+ optionalDependencies:
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
- '@floating-ui/utils@0.2.9': {}
+ eslint-import-resolver-node@0.3.10:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.18.0
+ resolve: 2.0.0-next.7
+ transitivePeerDependencies:
+ - supports-color
- '@headlessui/react@2.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2)):
dependencies:
- '@floating-ui/react': 0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-aria/focus': 3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@tanstack/react-virtual': 3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3
+ eslint: 9.39.5(jiti@2.4.2)
+ get-tsconfig: 4.14.3
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.17
+ unrs-resolver: 1.13.0
+ optionalDependencies:
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2))
+ transitivePeerDependencies:
+ - supports-color
- '@img/sharp-darwin-arm64@0.33.5':
+ eslint-module-utils@2.14.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)):
+ dependencies:
+ debug: 3.2.7
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.0.4
- optional: true
+ '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ eslint: 9.39.5(jiti@2.4.2)
+ eslint-import-resolver-node: 0.3.10
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2))
+ transitivePeerDependencies:
+ - supports-color
- '@img/sharp-darwin-x64@0.33.5':
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.2.0
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.39.5(jiti@2.4.2)
+ eslint-import-resolver-node: 0.3.10
+ eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2))
+ hasown: 2.0.4
+ is-core-module: 2.18.0
+ is-glob: 4.0.3
+ minimatch: 3.1.5
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.2
+ string.prototype.trimend: 1.0.10
+ tsconfig-paths: 3.15.0
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.0.4
- optional: true
+ '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
- '@img/sharp-libvips-darwin-arm64@1.0.4':
- optional: true
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.4.2)):
+ dependencies:
+ aria-query: 5.3.2
+ array-includes: 3.2.0
+ array.prototype.flatmap: 1.3.3
+ ast-types-flow: 0.0.8
+ axe-core: 4.14.0
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 9.39.5(jiti@2.4.2)
+ hasown: 2.0.4
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.5
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.1.0
+ string.prototype.includes: 2.0.1
+
+ eslint-plugin-react-hooks@5.2.0(eslint@9.39.5(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.39.5(jiti@2.4.2)
- '@img/sharp-libvips-darwin-x64@1.0.4':
- optional: true
+ eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.4.2)):
+ dependencies:
+ array-includes: 3.2.0
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.4.0
+ eslint: 9.39.5(jiti@2.4.2)
+ estraverse: 5.3.0
+ hasown: 2.0.4
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.5
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.7
+ semver: 6.3.2
+ string.prototype.matchall: 4.1.0
+ string.prototype.repeat: 1.0.0
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
- '@img/sharp-libvips-linux-arm64@1.0.4':
- optional: true
+ eslint-visitor-keys@3.4.3: {}
- '@img/sharp-libvips-linux-arm@1.0.5':
- optional: true
+ eslint-visitor-keys@4.2.1: {}
- '@img/sharp-libvips-linux-s390x@1.0.4':
- optional: true
+ eslint-visitor-keys@5.0.1: {}
- '@img/sharp-libvips-linux-x64@1.0.4':
- optional: true
+ eslint@9.39.5(jiti@2.4.2):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.3
+ '@eslint/config-array': 0.21.2
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.7
+ '@eslint/js': 9.39.5
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.10
+ ajv: 6.15.0
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.4.2
+ transitivePeerDependencies:
+ - supports-color
- '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
- optional: true
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.19.0
+ acorn-jsx: 5.3.2(acorn@8.19.0)
+ eslint-visitor-keys: 4.2.1
- '@img/sharp-libvips-linuxmusl-x64@1.0.4':
- optional: true
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
- '@img/sharp-linux-arm64@0.33.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.0.4
- optional: true
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
- '@img/sharp-linux-arm@0.33.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.0.5
- optional: true
+ estraverse@5.3.0: {}
- '@img/sharp-linux-s390x@0.33.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.0.4
- optional: true
+ estree-walker@2.0.2: {}
- '@img/sharp-linux-x64@0.33.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.0.4
- optional: true
+ esutils@2.0.3: {}
- '@img/sharp-linuxmusl-arm64@0.33.5':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
- optional: true
+ fast-deep-equal@3.1.3: {}
- '@img/sharp-linuxmusl-x64@0.33.5':
+ fast-glob@3.3.1:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.20.3:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.7):
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.0.4
- optional: true
+ picomatch: 4.0.7
- '@img/sharp-wasm32@0.33.5':
+ file-entry-cache@8.0.0:
dependencies:
- '@emnapi/runtime': 1.7.1
- optional: true
+ flat-cache: 4.0.1
- '@img/sharp-win32-ia32@0.33.5':
- optional: true
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
- '@img/sharp-win32-x64@0.33.5':
- optional: true
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
- '@next/env@15.2.8': {}
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.4.4
+ keyv: 4.5.4
- '@next/swc-darwin-arm64@15.2.5':
- optional: true
+ flatted@3.4.4: {}
- '@next/swc-darwin-x64@15.2.5':
- optional: true
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
- '@next/swc-linux-arm64-gnu@15.2.5':
+ fsevents@2.3.3:
optional: true
- '@next/swc-linux-arm64-musl@15.2.5':
- optional: true
+ function-bind@1.1.2: {}
- '@next/swc-linux-x64-gnu@15.2.5':
- optional: true
+ function.prototype.name@1.2.0:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ hasown: 2.0.4
+ is-callable: 1.2.7
+ is-document.all: 1.0.0
- '@next/swc-linux-x64-musl@15.2.5':
- optional: true
+ functions-have-names@1.2.3: {}
- '@next/swc-win32-arm64-msvc@15.2.5':
- optional: true
+ generator-function@2.0.1: {}
- '@next/swc-win32-x64-msvc@15.2.5':
- optional: true
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.2
- '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.8)(react@19.2.3)':
+ get-symbol-description@1.1.0:
dependencies:
- react: 19.2.3
- optionalDependencies:
- '@types/react': 19.0.8
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
- '@radix-ui/react-slot@1.2.4(@types/react@19.0.8)(react@19.2.3)':
+ get-tsconfig@4.14.3:
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.8)(react@19.2.3)
- react: 19.2.3
- optionalDependencies:
- '@types/react': 19.0.8
+ resolve-pkg-maps: 1.0.0
- '@react-aria/focus@3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ glob-parent@5.1.2:
dependencies:
- '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-types/shared': 3.27.0(react@19.2.3)
- '@swc/helpers': 0.5.15
- clsx: 2.1.1
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ is-glob: 4.0.3
- '@react-aria/interactions@3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ glob-parent@6.0.2:
dependencies:
- '@react-aria/ssr': 3.9.7(react@19.2.3)
- '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@react-types/shared': 3.27.0(react@19.2.3)
- '@swc/helpers': 0.5.15
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ is-glob: 4.0.3
- '@react-aria/ssr@3.9.7(react@19.2.3)':
+ glob@14.0.6:
dependencies:
- '@swc/helpers': 0.5.15
- react: 19.2.3
+ minimatch: 11.0.8
+ minipass: 7.1.3
+ path-scurry: 3.0.0
- '@react-aria/utils@3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ globals@14.0.0: {}
+
+ globalthis@1.0.4:
dependencies:
- '@react-aria/ssr': 3.9.7(react@19.2.3)
- '@react-stately/utils': 3.10.5(react@19.2.3)
- '@react-types/shared': 3.27.0(react@19.2.3)
- '@swc/helpers': 0.5.15
- clsx: 2.1.1
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ define-properties: 1.2.1
+ gopd: 1.2.0
- '@react-stately/utils@3.10.5(react@19.2.3)':
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-bigints@1.1.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
dependencies:
- '@swc/helpers': 0.5.15
- react: 19.2.3
+ es-define-property: 1.0.1
- '@react-types/shared@3.27.0(react@19.2.3)':
+ has-proto@1.2.0:
dependencies:
- react: 19.2.3
+ dunder-proto: 1.0.1
- '@swc/counter@0.1.3': {}
+ has-symbols@1.1.0: {}
- '@swc/helpers@0.5.15':
+ has-tostringtag@1.0.2:
dependencies:
- tslib: 2.8.1
+ has-symbols: 1.1.0
- '@tailwindcss/forms@0.5.10(tailwindcss@4.0.3)':
+ hasown@2.0.4:
dependencies:
- mini-svg-data-uri: 1.4.4
- tailwindcss: 4.0.3
+ function-bind: 1.1.2
- '@tailwindcss/node@4.0.3':
- dependencies:
- enhanced-resolve: 5.18.0
- jiti: 2.4.2
- tailwindcss: 4.0.3
+ ignore@5.3.2: {}
- '@tailwindcss/oxide-android-arm64@4.0.3':
- optional: true
+ ignore@7.0.14: {}
- '@tailwindcss/oxide-darwin-arm64@4.0.3':
- optional: true
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
- '@tailwindcss/oxide-darwin-x64@4.0.3':
- optional: true
+ imurmurhash@0.1.4: {}
- '@tailwindcss/oxide-freebsd-x64@4.0.3':
- optional: true
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.4
+ side-channel: 1.1.1
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3':
- optional: true
+ iron-session@8.0.4:
+ dependencies:
+ cookie: 0.7.2
+ iron-webcrypto: 1.2.1
+ uncrypto: 0.1.3
- '@tailwindcss/oxide-linux-arm64-gnu@4.0.3':
- optional: true
+ iron-webcrypto@1.2.1: {}
- '@tailwindcss/oxide-linux-arm64-musl@4.0.3':
- optional: true
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
- '@tailwindcss/oxide-linux-x64-gnu@4.0.3':
+ is-arrayish@0.3.4:
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.0.3':
- optional: true
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- '@tailwindcss/oxide-win32-arm64-msvc@4.0.3':
- optional: true
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
- '@tailwindcss/oxide-win32-x64-msvc@4.0.3':
- optional: true
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- '@tailwindcss/oxide@4.0.3':
- optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.0.3
- '@tailwindcss/oxide-darwin-arm64': 4.0.3
- '@tailwindcss/oxide-darwin-x64': 4.0.3
- '@tailwindcss/oxide-freebsd-x64': 4.0.3
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3
- '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3
- '@tailwindcss/oxide-linux-arm64-musl': 4.0.3
- '@tailwindcss/oxide-linux-x64-gnu': 4.0.3
- '@tailwindcss/oxide-linux-x64-musl': 4.0.3
- '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3
- '@tailwindcss/oxide-win32-x64-msvc': 4.0.3
+ is-bun-module@2.0.0:
+ dependencies:
+ semver: 7.7.3
- '@tailwindcss/postcss@4.0.3':
+ is-callable@1.2.7: {}
+
+ is-core-module@2.18.0:
dependencies:
- '@alloc/quick-lru': 5.2.0
- '@tailwindcss/node': 4.0.3
- '@tailwindcss/oxide': 4.0.3
- lightningcss: 1.29.1
- postcss: 8.5.1
- tailwindcss: 4.0.3
+ hasown: 2.0.4
- '@tanstack/react-virtual@3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ is-data-view@1.0.2:
dependencies:
- '@tanstack/virtual-core': 3.12.0
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
- '@tanstack/virtual-core@3.12.0': {}
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- '@types/aos@3.0.7': {}
+ is-document.all@1.0.0:
+ dependencies:
+ call-bound: 1.0.4
- '@types/node@22.13.0':
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
dependencies:
- undici-types: 6.20.0
+ call-bound: 1.0.4
- '@types/react-dom@19.0.3(@types/react@19.0.8)':
+ is-generator-function@1.1.2:
dependencies:
- '@types/react': 19.0.8
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- '@types/react@19.0.8':
+ is-glob@4.0.3:
dependencies:
- csstype: 3.1.3
+ is-extglob: 2.1.1
- '@workos-inc/authkit-nextjs@3.0.0(next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)':
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
dependencies:
- '@workos-inc/node': 8.10.0
- iron-session: 8.0.4
- jose: 5.10.0
- next: 15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- path-to-regexp: 6.3.0
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- valibot: 1.3.1(typescript@5.7.3)
- transitivePeerDependencies:
- - typescript
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- '@workos-inc/node@8.10.0': {}
+ is-number@7.0.0: {}
- aos@3.0.0-beta.6:
+ is-reference@1.2.1:
dependencies:
- classlist-polyfill: 1.2.0
- lodash.debounce: 4.0.8
- lodash.throttle: 4.1.1
+ '@types/estree': 1.0.10
- busboy@1.6.0:
+ is-regex@1.2.1:
dependencies:
- streamsearch: 1.1.0
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.4
- caniuse-lite@1.0.30001696: {}
+ is-set@2.0.3: {}
- class-variance-authority@0.7.1:
+ is-shared-array-buffer@1.0.4:
dependencies:
- clsx: 2.1.1
-
- classlist-polyfill@1.2.0: {}
+ call-bound: 1.0.4
- client-only@0.0.1: {}
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- clsx@2.1.1: {}
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
- color-convert@2.0.1:
+ is-typed-array@1.1.15:
dependencies:
- color-name: 1.1.4
- optional: true
+ which-typed-array: 1.1.24
- color-name@1.1.4:
- optional: true
+ is-weakmap@2.0.2: {}
- color-string@1.9.1:
+ is-weakref@1.1.1:
dependencies:
- color-name: 1.1.4
- simple-swizzle: 0.2.4
- optional: true
+ call-bound: 1.0.4
- color@4.2.3:
+ is-weakset@2.0.4:
dependencies:
- color-convert: 2.0.1
- color-string: 1.9.1
- optional: true
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
- cookie@0.7.2: {}
+ isarray@2.0.5: {}
- csstype@3.1.3: {}
+ isexe@2.0.0: {}
- detect-libc@1.0.3: {}
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
- detect-libc@2.1.2:
- optional: true
+ jiti@2.4.2: {}
- enhanced-resolve@5.18.0:
+ jose@5.10.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.3.2:
dependencies:
- graceful-fs: 4.2.11
- tapable: 2.2.1
+ argparse: 2.0.1
- graceful-fs@4.2.11: {}
+ json-buffer@3.0.1: {}
- iron-session@8.0.4:
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
dependencies:
- cookie: 0.7.2
- iron-webcrypto: 1.2.1
- uncrypto: 0.1.3
+ minimist: 1.2.8
- iron-webcrypto@1.2.1: {}
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.2.0
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
- is-arrayish@0.3.4:
- optional: true
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
- jiti@2.4.2: {}
+ language-subtag-registry@0.3.23: {}
- jose@5.10.0: {}
+ language-tags@1.0.9:
+ dependencies:
+ language-subtag-registry: 0.3.23
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
lightningcss-darwin-arm64@1.29.1:
optional: true
@@ -1139,19 +4202,71 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.29.1
lightningcss-win32-x64-msvc: 1.29.1
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
lodash.debounce@4.0.8: {}
+ lodash.merge@4.6.2: {}
+
lodash.throttle@4.1.1: {}
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@11.5.3: {}
+
lucide-react@1.7.0(react@19.2.3):
dependencies:
react: 19.2.3
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ magic-string@1.4.5:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ math-intrinsics@1.1.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
mini-svg-data-uri@1.4.4: {}
+ minimatch@10.2.6:
+ dependencies:
+ brace-expansion: 5.0.13
+
+ minimatch@11.0.8:
+ dependencies:
+ '@isaacs/nonrecursive-glob-match': 1.1.0
+ brace-expansion: 5.0.13
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.22
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.3: {}
+
+ ms@2.1.3: {}
+
nanoid@3.3.8: {}
- next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ napi-postinstall@0.3.8: {}
+
+ natural-compare@1.4.0: {}
+
+ next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies:
'@next/env': 15.2.8
'@swc/counter': 0.1.3
@@ -1171,15 +4286,141 @@ snapshots:
'@next/swc-linux-x64-musl': 15.2.5
'@next/swc-win32-arm64-msvc': 15.2.5
'@next/swc-win32-x64-msvc': 15.2.5
+ '@opentelemetry/api': 1.10.0
+ '@playwright/test': 1.65.0
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
+ node-exports-info@1.6.2:
+ dependencies:
+ array.prototype.flatmap: 1.3.3
+ es-errors: 1.3.0
+ object.entries: 1.1.9
+ semver: 6.3.2
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.9:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ own-keys@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ oxc-parser@0.152.0:
+ dependencies:
+ '@oxc-project/types': 0.152.0
+ optionalDependencies:
+ '@oxc-parser/binding-android-arm-eabi': 0.152.0
+ '@oxc-parser/binding-android-arm64': 0.152.0
+ '@oxc-parser/binding-darwin-arm64': 0.152.0
+ '@oxc-parser/binding-darwin-x64': 0.152.0
+ '@oxc-parser/binding-freebsd-x64': 0.152.0
+ '@oxc-parser/binding-linux-arm-gnueabihf': 0.152.0
+ '@oxc-parser/binding-linux-arm-musleabihf': 0.152.0
+ '@oxc-parser/binding-linux-arm64-gnu': 0.152.0
+ '@oxc-parser/binding-linux-arm64-musl': 0.152.0
+ '@oxc-parser/binding-linux-ppc64-gnu': 0.152.0
+ '@oxc-parser/binding-linux-riscv64-gnu': 0.152.0
+ '@oxc-parser/binding-linux-riscv64-musl': 0.152.0
+ '@oxc-parser/binding-linux-s390x-gnu': 0.152.0
+ '@oxc-parser/binding-linux-x64-gnu': 0.152.0
+ '@oxc-parser/binding-linux-x64-musl': 0.152.0
+ '@oxc-parser/binding-openharmony-arm64': 0.152.0
+ '@oxc-parser/binding-win32-arm64-msvc': 0.152.0
+ '@oxc-parser/binding-win32-ia32-msvc': 0.152.0
+ '@oxc-parser/binding-win32-x64-msvc': 0.152.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@3.0.0:
+ dependencies:
+ lru-cache: 11.5.3
+ minipass: 7.1.3
+
path-to-regexp@6.3.0: {}
picocolors@1.1.1: {}
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.7: {}
+
+ playwright-core@1.65.0: {}
+
+ playwright@1.65.0:
+ dependencies:
+ playwright-core: 1.65.0
+
+ possible-typed-array-names@1.1.0: {}
+
postcss@8.4.31:
dependencies:
nanoid: 3.3.8
@@ -1192,17 +4433,145 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ prelude-ls@1.2.1: {}
+
+ prettier@3.10.1: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
react-dom@19.2.3(react@19.2.3):
dependencies:
react: 19.2.3
scheduler: 0.27.0
+ react-is@16.13.1: {}
+
react@19.2.3: {}
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@2.0.0-next.7:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.18.0
+ node-exports-info: 1.6.2
+ object-keys: 1.1.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ reusify@1.1.0: {}
+
+ rollup@4.68.3:
+ dependencies:
+ '@types/estree': 1.0.10
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.68.3
+ '@rollup/rollup-android-arm64': 4.68.3
+ '@rollup/rollup-android-x64': 4.68.3
+ '@rollup/rollup-darwin-arm64': 4.68.3
+ '@rollup/rollup-darwin-x64': 4.68.3
+ '@rollup/rollup-freebsd-arm64': 4.68.3
+ '@rollup/rollup-freebsd-x64': 4.68.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.68.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.68.3
+ '@rollup/rollup-linux-arm64-gnu': 4.68.3
+ '@rollup/rollup-linux-arm64-musl': 4.68.3
+ '@rollup/rollup-linux-loong64-gnu': 4.68.3
+ '@rollup/rollup-linux-loong64-musl': 4.68.3
+ '@rollup/rollup-linux-ppc64-gnu': 4.68.3
+ '@rollup/rollup-linux-ppc64-musl': 4.68.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.68.3
+ '@rollup/rollup-linux-s390x-gnu': 4.68.3
+ '@rollup/rollup-linux-x64-gnu': 4.68.3
+ '@rollup/rollup-linux-x64-musl': 4.68.3
+ '@rollup/rollup-openharmony-arm64': 4.68.3
+ '@rollup/rollup-win32-arm64-msvc': 4.68.3
+ '@rollup/rollup-win32-ia32-msvc': 4.68.3
+ '@rollup/rollup-win32-x64-msvc': 4.68.3
+ fsevents: 2.3.3
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.4:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
scheduler@0.27.0: {}
- semver@7.7.3:
- optional: true
+ semver@6.3.2: {}
+
+ semver@7.7.3: {}
+
+ sentry@0.49.0: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
sharp@0.33.5:
dependencies:
@@ -1231,6 +4600,40 @@ snapshots:
'@img/sharp-win32-x64': 0.33.5
optional: true
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
simple-swizzle@0.2.4:
dependencies:
is-arrayish: 0.3.4
@@ -1238,13 +4641,85 @@ snapshots:
source-map-js@1.2.1: {}
+ stable-hash@0.0.5: {}
+
+ stacktrace-parser@0.1.11:
+ dependencies:
+ type-fest: 0.7.1
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
streamsearch@1.1.0: {}
+ string.prototype.includes@2.0.1:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+
+ string.prototype.matchall@4.1.0:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.1
+
+ string.prototype.repeat@1.0.0:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+
+ string.prototype.trim@1.2.11:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+ has-property-descriptors: 1.0.2
+ safe-regex-test: 1.1.0
+
+ string.prototype.trimend@1.0.10:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ strip-bom@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
styled-jsx@5.1.6(react@19.2.3):
dependencies:
client-only: 0.0.1
react: 19.2.3
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
tabbable@6.2.0: {}
tailwind-merge@3.5.0: {}
@@ -1253,14 +4728,160 @@ snapshots:
tapable@2.2.1: {}
+ tinyglobby@0.2.17:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ ts-api-utils@2.5.0(typescript@5.7.3):
+ dependencies:
+ typescript: 5.7.3
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
tslib@2.8.1: {}
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@0.7.1: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.5:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
typescript@5.7.3: {}
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
uncrypto@0.1.3: {}
undici-types@6.20.0: {}
+ unrs-resolver@1.13.0:
+ dependencies:
+ napi-postinstall: 0.3.8
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.13.0
+ '@unrs/resolver-binding-android-arm64': 1.13.0
+ '@unrs/resolver-binding-darwin-arm64': 1.13.0
+ '@unrs/resolver-binding-darwin-x64': 1.13.0
+ '@unrs/resolver-binding-freebsd-x64': 1.13.0
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.13.0
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.13.0
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-arm64-musl': 1.13.0
+ '@unrs/resolver-binding-linux-loong64-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-loong64-musl': 1.13.0
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.13.0
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-x64-gnu': 1.13.0
+ '@unrs/resolver-binding-linux-x64-musl': 1.13.0
+ '@unrs/resolver-binding-openharmony-arm64': 1.13.0
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.13.0
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.13.0
+ '@unrs/resolver-binding-win32-x64-msvc': 1.13.0
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
valibot@1.3.1(typescript@5.7.3):
optionalDependencies:
typescript: 5.7.3
+
+ web-vitals@6.2.3: {}
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.2.0
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.24
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.24:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/quality/eslint-baseline.json b/quality/eslint-baseline.json
new file mode 100644
index 0000000..79ac8ca
--- /dev/null
+++ b/quality/eslint-baseline.json
@@ -0,0 +1,15 @@
+{
+ "app/(auth)/reset-password/page.tsx:@typescript-eslint/no-unused-vars:b728893e4acb0f9c:69133de71f6611d2:2": 1,
+ "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:c5a5e2a1458b58b1:2": 2,
+ "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:ffd76ff58589503a:2": 2,
+ "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:b00b6f721170ad06:2": 2,
+ "app/api/hello/route.ts:@typescript-eslint/no-unused-vars:4de5a2da09f9a3a6:d94ae0b200cbd3e2:2": 1,
+ "components/features.tsx:@typescript-eslint/no-unused-vars:46caadc339cb7170:1ea0b1617e95c54d:2": 1,
+ "components/spotlight.tsx:@typescript-eslint/no-unused-expressions:0c76df5cc23b85bd:8f8b048b5ead5eac:2": 1,
+ "components/spotlight.tsx:react-hooks/exhaustive-deps:24b591d6474d100c:5e61b3167f235ea7:1": 1,
+ "components/testimonials.tsx:react/no-unescaped-entities:4a5fcfbb4b1a13ca:3f24d4ed5fa4dd97:2": 1,
+ "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:8ded8914e8d7bde0:2": 1,
+ "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:a183b133e812c4cb:2": 1,
+ "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:eecb865f44dfc990:2": 2,
+ "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:48610c20e48ab358:2": 1
+}
diff --git a/quality/format-baseline.json b/quality/format-baseline.json
new file mode 100644
index 0000000..b24ba89
--- /dev/null
+++ b/quality/format-baseline.json
@@ -0,0 +1,15 @@
+{
+ "app/(default)/contact/page.tsx": "e723e9a1e4d88cbf41b21369b7753a8ffcf1495a994d2a5fc5d722d11592448c",
+ "app/(default)/disclaimer/page.tsx": "6b5def71b5cebd2a2d2f2b17483cba9b496ec9e46313b5d5ddd42ff499aad2ef",
+ "app/(default)/privacy/page.tsx": "2533bf409f5faf43215ec1910dbef61eef162eb8812f034700c0be2379fb450b",
+ "app/(default)/terms/page.tsx": "80b14b6e136839234c0b204d1df974fdc83975efe56f93ab33180328a0dbe96a",
+ "components/features.tsx": "885658ebb2b323a135a0d87deaded0dd4b03914311f49b8eb814372bffc33ff3",
+ "components/hero-home.tsx": "6f10ff5e9953fd4b430dd1ffa7b350f3c803be1552c017b5c4e39addc0df0ab6",
+ "components/legal/legal-page.tsx": "b7696c0b85dc215f8e91394994cbc516cb058ac289fe19906612ea2022ffc356",
+ "components/ui/badge.tsx": "7e1318d20f902eba92bccdbef3c20143fcfc85a444816deccd2a4e8ee86ad268",
+ "components/ui/button.tsx": "d6a638903cce1dde29ad180eef2ab36665f201c411d5b75022942d96cce51a4e",
+ "components/ui/card.tsx": "c375ec8547fc642b51a03b5effa4f7264e399ffdb94c84977aad478092142035",
+ "components/ui/header.tsx": "ee35b9035a2521a150f26b2e5b598b84be55e8445b8bd9e844248a5f1bf3847c",
+ "components/workflows.tsx": "7e204c9bcd1eaacea01e0567cbcc05e6d0e2b11086d4976949bfb81c5decbb5a",
+ "postcss.config.js": "323d21314f4ee8f2a44c196b2a0cfc87b98144ac5eae429c1749dd5a4da9da1f"
+}
diff --git a/scripts/check-format.mjs b/scripts/check-format.mjs
new file mode 100644
index 0000000..e3f8969
--- /dev/null
+++ b/scripts/check-format.mjs
@@ -0,0 +1,66 @@
+if (process.env.CI && process.argv.includes("--baseline"))
+ throw new Error("CI may not regenerate formatting debt");
+import { execFileSync } from "node:child_process";
+import { createHash } from "node:crypto";
+import { existsSync, readFileSync, writeFileSync } from "node:fs";
+import * as prettier from "prettier";
+const path = "quality/format-baseline.json";
+const files = [
+ ...new Set(
+ execFileSync(
+ "git",
+ ["ls-files", "--cached", "--others", "--exclude-standard", "-z"],
+ { encoding: "utf8" },
+ ).split("\0"),
+ ),
+].filter(
+ (file) =>
+ /\.(?:ts|tsx|js|mjs|json|yml|yaml)$/.test(file) &&
+ !/(?:^|\/)(?:node_modules|dist|coverage|samples|uploads|quality|playwright-report|test-results)\//.test(
+ file,
+ ) &&
+ !["pnpm-lock.yaml", "package-lock.json"].includes(file) &&
+ existsSync(file),
+);
+const baseline = existsSync(path) ? JSON.parse(readFileSync(path, "utf8")) : {};
+const changed = new Set(
+ execFileSync("git", ["diff", "HEAD", "--name-only"], {
+ encoding: "utf8",
+ }).split("\n"),
+);
+const tracked = new Set(
+ execFileSync("git", ["ls-files"], { encoding: "utf8" }).split("\n"),
+);
+const next = {};
+let failed = false;
+for (const file of files) {
+ const text = readFileSync(file, "utf8");
+ const hash = createHash("sha256").update(text).digest("hex");
+ if (
+ await prettier.check(text, {
+ ...(await prettier.resolveConfig(file)),
+ filepath: file,
+ })
+ )
+ continue;
+ if (
+ process.argv.includes("--baseline") &&
+ tracked.has(file) &&
+ !changed.has(file)
+ ) {
+ next[file] = hash;
+ continue;
+ }
+ if (baseline[file] === hash) {
+ next[file] = hash;
+ continue;
+ }
+ console.error(`Formatting required: ${file}`);
+ failed = true;
+}
+if (process.argv.includes("--baseline"))
+ writeFileSync(path, JSON.stringify(next, null, 2) + "\n");
+console.log(
+ `Formatting: ${files.length} files checked, ${Object.keys(next).length} unchanged historical exceptions`,
+);
+if (failed) process.exitCode = 1;
diff --git a/scripts/check-quality.mjs b/scripts/check-quality.mjs
new file mode 100644
index 0000000..a15eb8f
--- /dev/null
+++ b/scripts/check-quality.mjs
@@ -0,0 +1,61 @@
+import { ESLint } from "eslint";
+import { createHash } from "node:crypto";
+import { readFileSync, writeFileSync } from "node:fs";
+const backend =
+ JSON.parse(readFileSync("package.json", "utf8")).name === "loadiq-api";
+const files = backend
+ ? ["src/**/*.ts", "test/**/*.ts"]
+ : [
+ "app/**/*.{ts,tsx}",
+ "components/**/*.{ts,tsx}",
+ "lib/**/*.{ts,tsx}",
+ "tests/**/*.ts",
+ "middleware.ts",
+ "instrumentation*.ts",
+ ];
+const results = await new ESLint({ errorOnUnmatchedPattern: false }).lintFiles(
+ files,
+);
+const counts = {};
+if (process.env.CI && process.argv.includes("--baseline"))
+ throw new Error("CI may not regenerate lint debt");
+for (const result of results)
+ for (const message of result.messages) {
+ if (message.fatal)
+ throw new Error("Fatal ESLint parsing/configuration error");
+ const file = result.filePath.slice(process.cwd().length + 1);
+ const source = readFileSync(result.filePath, "utf8")
+ .split("\n")
+ .slice(message.line - 1, message.endLine ?? message.line)
+ .map((line) => line.trim())
+ .join("\n");
+ const sourceHash = createHash("sha256")
+ .update(source)
+ .digest("hex")
+ .slice(0, 16);
+ const key = `${file}:${message.ruleId ?? "parse"}:${createHash("sha256").update(message.message).digest("hex").slice(0, 16)}:${sourceHash}:${message.severity}`;
+ counts[key] = (counts[key] ?? 0) + 1;
+ }
+const path = "quality/eslint-baseline.json";
+if (process.argv.includes("--baseline")) {
+ // Manual debt acknowledgement only; CI never invokes this option.
+ writeFileSync(path, JSON.stringify(counts, null, 2) + "\n");
+ console.log(
+ `Recorded ${Object.values(counts).reduce((a, b) => a + b, 0)} existing lint findings`,
+ );
+} else {
+ const baseline = JSON.parse(readFileSync(path, "utf8"));
+ let failures = 0;
+ for (const [key, count] of Object.entries(counts))
+ if (count > (baseline[key] ?? 0)) {
+ console.error(
+ `New lint finding: ${key} (${count - (baseline[key] ?? 0)})`,
+ );
+ failures++;
+ }
+ if (failures) process.exitCode = 1;
+ else
+ console.log(
+ `Lint gate passed; ${Object.values(counts).reduce((a, b) => a + b, 0)} acknowledged historical findings remain`,
+ );
+}
diff --git a/scripts/e2e-server.mjs b/scripts/e2e-server.mjs
new file mode 100644
index 0000000..da71a2f
--- /dev/null
+++ b/scripts/e2e-server.mjs
@@ -0,0 +1,49 @@
+import { spawn } from "node:child_process";
+const env = {
+ ...process.env,
+ NODE_ENV: "development",
+ LOADIQ_E2E_MODE: "true",
+ LOADIQ_E2E_SECRET: "synthetic-e2e-local-only",
+ LOADIQ_API_BASE_URL: "http://127.0.0.1:4319",
+ LOADIQ_INTERNAL_API_KEY: "synthetic-internal",
+ NEXT_TELEMETRY_DISABLED: "1",
+ WORKOS_API_KEY: "",
+ WORKOS_CLIENT_ID: "",
+ WORKOS_COOKIE_PASSWORD: "",
+ SENTRY_DSN: "",
+ NEXT_PUBLIC_SENTRY_DSN: "",
+};
+const children = [
+ spawn(process.execPath, ["tests/fixture-server.mjs"], {
+ stdio: "inherit",
+ env,
+ }),
+ spawn(
+ process.execPath,
+ [
+ "node_modules/next/dist/bin/next",
+ "dev",
+ "--hostname",
+ "127.0.0.1",
+ "--port",
+ "4318",
+ ],
+ { stdio: "inherit", env },
+ ),
+];
+let stopping = false;
+function stop() {
+ if (stopping) return;
+ stopping = true;
+ children.forEach((child) => child.kill("SIGTERM"));
+}
+process.on("SIGTERM", stop);
+process.on("SIGINT", stop);
+children.forEach((child) =>
+ child.on("exit", (code) => {
+ if (!stopping) {
+ stop();
+ process.exitCode = code || 1;
+ }
+ }),
+);
diff --git a/tests/dashboard.spec.ts b/tests/dashboard.spec.ts
new file mode 100644
index 0000000..baccdb1
--- /dev/null
+++ b/tests/dashboard.spec.ts
@@ -0,0 +1,74 @@
+import { test, expect } from "@playwright/test";
+const session = { "x-loadiq-e2e-session": "synthetic-e2e-local-only:alice" };
+test.beforeEach(async ({ page }) => {
+ await page.route("**/*", (route) => {
+ const target = new URL(route.request().url());
+ return target.origin === "http://127.0.0.1:4318"
+ ? route.continue()
+ : route.abort();
+ });
+ await page.setExtraHTTPHeaders(session);
+});
+test("dashboard loads fixture data", async ({ page }) => {
+ await page.goto("/app");
+ await expect(
+ page.getByRole("heading", { name: "Welcome back, alice" }),
+ ).toBeVisible();
+ await expect(page.getByText("Alice fixture week")).toBeVisible();
+});
+test("daily signals are displayed with units", async ({ page }) => {
+ await page.goto("/app");
+ await expect(page.getByText("8000", { exact: true })).toBeVisible();
+ await expect(page.getByText("420 min", { exact: true })).toBeVisible();
+ await expect(page.getByText("56 bpm", { exact: true })).toBeVisible();
+});
+test("insights display deterministic recommendations", async ({ page }) => {
+ await page.goto("/app");
+ await expect(page.getByText("Keep training intensity easy")).toBeVisible();
+});
+test("missing and historical data remains limited", async ({ page }) => {
+ await page.setExtraHTTPHeaders({
+ ...session,
+ "x-loadiq-e2e-scenario": "limited",
+ });
+ await page.goto("/app");
+ await expect(page.getByText("Limited data", { exact: true })).toBeVisible();
+ await expect(
+ page.getByText("Historical data only; current recovery is unknown."),
+ ).toBeVisible();
+ await expect(page.getByText("No recent wearable data")).toBeVisible();
+});
+test("API failure is controlled", async ({ page }) => {
+ await page.setExtraHTTPHeaders({
+ ...session,
+ "x-loadiq-e2e-scenario": "error",
+ });
+ await page.goto("/app");
+ await expect(
+ page.getByRole("heading", { name: "Dashboard unavailable" }),
+ ).toBeVisible();
+});
+test("protected route redirects without a session", async ({ request }) => {
+ const result = await request.get("/app", { maxRedirects: 0 });
+ expect([302, 303, 307, 308]).toContain(result.status());
+ expect(result.headers().location).toContain("/signin");
+});
+test("identity cannot be overridden by query or client user headers", async ({
+ page,
+}) => {
+ await page.setExtraHTTPHeaders({
+ ...session,
+ "x-loadiq-external-auth-id": "synthetic-bob",
+ });
+ await page.goto("/app?userId=synthetic-bob");
+ await expect(page.getByText("Alice fixture week")).toBeVisible();
+ await expect(page.getByText("Bob fixture week")).toHaveCount(0);
+});
+test("second isolated session sees only its own fixtures", async ({ page }) => {
+ await page.setExtraHTTPHeaders({
+ "x-loadiq-e2e-session": "synthetic-e2e-local-only:bob",
+ });
+ await page.goto("/app");
+ await expect(page.getByText("Bob fixture week")).toBeVisible();
+ await expect(page.getByText("Alice fixture week")).toHaveCount(0);
+});
diff --git a/tests/fixture-server.mjs b/tests/fixture-server.mjs
new file mode 100644
index 0000000..6f5d6fe
--- /dev/null
+++ b/tests/fixture-server.mjs
@@ -0,0 +1,115 @@
+import { createServer } from "node:http";
+const date = "2020-01-06";
+function summary(limited, bob) {
+ return {
+ asOfDate: date,
+ daily: {
+ date,
+ summary: {
+ headline: limited ? "Limited data" : "Recovery signals stable",
+ status: limited ? "limited_data" : "stable",
+ narrative: [
+ limited
+ ? "Historical data only; current recovery is unknown."
+ : "Synthetic recovery summary.",
+ ],
+ nextActions: limited ? [] : ["Choose an easy workout"],
+ },
+ coverage: {
+ insufficientData: limited,
+ insufficientReasons: limited ? ["No recent wearable data"] : [],
+ },
+ states: [],
+ recommendations: limited
+ ? []
+ : [
+ {
+ recommendationType: "RECOVERY",
+ confidence: 0.8,
+ priority: 1,
+ payloadJson: { actions: ["Keep training intensity easy"] },
+ },
+ ],
+ },
+ weekly: {
+ period: { from: "2019-12-31", to: date, anchorDate: date },
+ summary: {
+ headline: bob ? "Bob fixture week" : "Alice fixture week",
+ narrative: ["Synthetic weekly summary"],
+ nextActions: [],
+ metrics: {
+ coverage: { weightDays: 0, wearableDays: limited ? 0 : 7 },
+ body: {
+ latestWeightKg: null,
+ averageWeightKg: null,
+ weightChangeKg: null,
+ },
+ recovery: {
+ averageRestingHr: limited ? null : 56,
+ averageSleepDurationMin: limited ? null : 420,
+ averageStressScore: limited ? null : 25,
+ },
+ activity: {
+ totalSteps: limited ? 0 : 56000,
+ averageSteps: limited ? null : 8000,
+ totalCaloriesBurned: 0,
+ },
+ activitySessions: {
+ sessionCount: 0,
+ totalSessionDurationMin: 0,
+ totalSessionCalories: 0,
+ },
+ },
+ },
+ coverage: {},
+ highlights: [],
+ },
+ latestWeight: null,
+ latestWearable: limited
+ ? null
+ : { date, sourceType: "synthetic", sourceRef: "fixture" },
+ imports: { recentCount: 0, latest: null },
+ };
+}
+const server = createServer((req, res) => {
+ if (req.url === "/health") return res.end("ok");
+ if (
+ req.headers["x-loadiq-internal-api-key"] !== "synthetic-internal" ||
+ !["synthetic-alice", "synthetic-bob"].includes(
+ req.headers["x-loadiq-external-auth-id"],
+ )
+ ) {
+ res.writeHead(403);
+ return res.end();
+ }
+ if (req.headers["x-loadiq-e2e-scenario"] === "error") {
+ res.writeHead(503);
+ return res.end();
+ }
+ const limited = req.headers["x-loadiq-e2e-scenario"] === "limited";
+ const bob = req.headers["x-loadiq-external-auth-id"] === "synthetic-bob";
+ const url = new URL(req.url, "http://127.0.0.1");
+ const body = url.pathname.endsWith("/summary")
+ ? summary(limited, bob)
+ : url.pathname.endsWith("/timeline")
+ ? {
+ range: { days: 28, from: "2019-12-10", to: date },
+ points: limited
+ ? []
+ : [
+ {
+ date,
+ weightKg: null,
+ steps: bob ? 3000 : 8000,
+ sleepDurationMin: 420,
+ restingHr: 56,
+ stressScore: 25,
+ },
+ ],
+ }
+ : [];
+ res.setHeader("Content-Type", "application/json");
+ res.end(JSON.stringify(body));
+});
+server.listen(4319, "127.0.0.1");
+process.on("SIGTERM", () => server.close());
diff --git a/tests/privacy.spec.ts b/tests/privacy.spec.ts
new file mode 100644
index 0000000..e626518
--- /dev/null
+++ b/tests/privacy.spec.ts
@@ -0,0 +1,206 @@
+import { spawnSync } from "node:child_process";
+import { test, expect } from "@playwright/test";
+import { scrubEvent, euDsn } from "../lib/monitoring/privacy";
+import { e2eEnabled } from "../lib/e2e-mode";
+test("monitoring strips all sensitive event context", () => {
+ const event = {
+ event_id: "a".repeat(32),
+ request: {
+ headers: { Authorization: "synthetic-secret" },
+ cookies: "synthetic-cookie",
+ data: { hrv: 999 },
+ },
+ user: {
+ email: "private@example.invalid",
+ id: "synthetic-private-id",
+ username: "synthetic-private-name",
+ ip_address: "203.0.113.42",
+ },
+ extra: { gps: [45, 16] },
+ exception: { values: [{ value: "synthetic-private-error" }] },
+ };
+ const serialized = JSON.stringify(scrubEvent(event));
+ for (const value of [
+ "synthetic-secret",
+ "synthetic-cookie",
+ "999",
+ "private@example.invalid",
+ "gps",
+ "synthetic-private-error",
+ ])
+ expect(serialized).not.toContain(value);
+ expect(euDsn("https://synthetic@o1.ingest.us.sentry.io/1")).toBeUndefined();
+});
+test("test authentication cannot activate in production", () => {
+ const original = { ...process.env };
+ try {
+ Object.assign(process.env, {
+ NODE_ENV: "production",
+ LOADIQ_E2E_MODE: "true",
+ LOADIQ_E2E_SECRET: "synthetic-e2e-local-only",
+ LOADIQ_API_BASE_URL: "http://127.0.0.1:4319",
+ });
+ expect(e2eEnabled()).toBe(false);
+ const build = spawnSync(
+ process.execPath,
+ ["-e", 'require("./next.config.js")'],
+ { env: process.env, encoding: "utf8" },
+ );
+ expect(build.status).not.toBe(0);
+ expect(build.stderr).toContain(
+ "E2E authentication is forbidden in production",
+ );
+ } finally {
+ process.env = original;
+ }
+});
+
+test("frontend SDK initialization scrubs its transport envelope", async () => {
+ const Sentry = await import("@sentry/nextjs");
+ const { monitoringOptions } = await import("../lib/monitoring/sentry");
+ const envelopes: unknown[] = [];
+ Sentry.init({
+ ...monitoringOptions("https://synthetic@o1.ingest.de.sentry.io/1"),
+ integrations: [],
+ transport: () => ({
+ send: (envelope: unknown) => {
+ envelopes.push(envelope);
+ return Promise.resolve({ statusCode: 200 });
+ },
+ flush: () => Promise.resolve(true),
+ }),
+ });
+ const original = new TypeError("synthetic-private-error");
+ original.stack =
+ "TypeError: synthetic-private-error\n at render (https://private.invalid/_next/static/chunks/app/app/page-1234abcd.js:123:7)";
+ Sentry.captureException(original, {
+ user: {
+ email: "private@example.invalid",
+ id: "synthetic-private-id",
+ username: "synthetic-private-name",
+ ip_address: "203.0.113.42",
+ },
+ extra: { Authorization: "synthetic-secret", gps: [45, 16] },
+ });
+ await Sentry.flush(2000);
+ expect(envelopes).toHaveLength(1);
+ const serialized = JSON.stringify(envelopes);
+ for (const value of [
+ "synthetic-private-error",
+ "private@example.invalid",
+ "synthetic-secret",
+ "gps",
+ "synthetic-private-name",
+ "203.0.113.42",
+ ])
+ expect(serialized).not.toContain(value);
+ expect(serialized).toContain("Application operation failed");
+ expect(serialized).toContain("_next/static/chunks/app/app/page-1234abcd.js");
+ expect(serialized).not.toContain("private.invalid");
+ expect(serialized).toContain("TypeError");
+ expect(serialized).not.toContain("synthetic-private-id");
+ await Sentry.close();
+});
+
+test("retains useful technical diagnostics without runtime or personal context", () => {
+ const input = {
+ event_id: "a".repeat(32),
+ tags: { operation: "frontend", userId: "synthetic-private-id" },
+ exception: {
+ values: [
+ {
+ type: "TypeError",
+ value: "synthetic-secret hrv=999 gps=45,16",
+ stacktrace: {
+ frames: [
+ {
+ filename:
+ "/Users/synthetic-private-id/project/components/product/dashboard-page.tsx?token=synthetic-secret",
+ lineno: 123,
+ colno: 7,
+ function: "synthetic-private-function",
+ vars: { hrv: 999 },
+ pre_context: ["synthetic-secret"],
+ },
+ {
+ filename:
+ "https://private.invalid/uploads/synthetic-private-id/activity.fit",
+ lineno: 10,
+ },
+ {
+ filename:
+ "https://private.invalid/_next/static/chunks/123-abcd.js?token=synthetic-secret",
+ lineno: 456,
+ colno: 8,
+ },
+ ],
+ },
+ },
+ ],
+ },
+ };
+ const safe = scrubEvent(input);
+ expect(safe.exception.values[0].type).toBe("TypeError");
+ expect(safe.exception.values[0].stacktrace.frames).toEqual([
+ {
+ filename: "components/product/dashboard-page.tsx",
+ lineno: 123,
+ colno: 7,
+ in_app: true,
+ },
+ {
+ filename: "_next/static/chunks/123-abcd.js",
+ lineno: 456,
+ colno: 8,
+ in_app: true,
+ },
+ ]);
+ expect((safe as unknown as { fingerprint: string[] }).fingerprint).toEqual([
+ "{{ default }}",
+ "frontend",
+ "TypeError",
+ ]);
+ const serialized = JSON.stringify(safe);
+ for (const secret of [
+ "synthetic-secret",
+ "999",
+ "45,16",
+ "synthetic-private-id",
+ "private.invalid",
+ "synthetic-private-function",
+ "pre_context",
+ ])
+ expect(serialized).not.toContain(secret);
+});
+test("rejects arbitrary categories, filenames and invalid frame positions", () => {
+ const safe = scrubEvent({
+ event_id: "a".repeat(32),
+ exception: {
+ values: [
+ {
+ type: "private-health-category",
+ value: "private-health",
+ stacktrace: {
+ frames: [
+ {
+ filename: "components/product/dashboard-page.tsx",
+ lineno: NaN,
+ colno: Infinity,
+ },
+ { filename: "src/not-reviewed-user-file.ts", lineno: 123 },
+ ],
+ },
+ },
+ ],
+ },
+ });
+ expect(safe.exception.values[0].type).toBe("Error");
+ expect(safe.exception.values[0].stacktrace.frames).toEqual([
+ {
+ filename: "components/product/dashboard-page.tsx",
+ lineno: undefined,
+ colno: undefined,
+ in_app: true,
+ },
+ ]);
+});
From 78b5bdd8195247e4cff6b1fb65bcf4e44d520256 Mon Sep 17 00:00:00 2001
From: Nebojsa Stojanovic
Date: Fri, 13 Nov 2026 16:15:29 +0100
Subject: [PATCH 2/2] docs: document deterministic quality checks and
monitoring privacy
---
QUALITY.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
README.md | 4 ++++
2 files changed, 62 insertions(+)
create mode 100644 QUALITY.md
diff --git a/QUALITY.md b/QUALITY.md
new file mode 100644
index 0000000..8889fc6
--- /dev/null
+++ b/QUALITY.md
@@ -0,0 +1,58 @@
+# Engineering quality — final review (2026-11-13)
+
+Keep these repositories separate. Use Node22 and the existing pnpm10.15.1 lockfile:
+`corepack pnpm@10.15.1 --ignore-workspace install --frozen-lockfile`.
+The pnpm lockfile is authoritative; the pre-existing frontend package-lock.json is not used by CI.
+No dependencies or infrastructure were added in Task3.1.
+
+## Quality gates
+`pnpm quality` runs ESLint and Prettier without fixing files.
+Lint debt fingerprints include file, rule, message hash, source hash, severity and occurrence count.
+New/changed findings, severity upgrades and increased counts fail. Fatal parser errors always fail.
+Obsolete debt was pruned without accepting new findings. Baseline generation is forbidden on CI.
+A review must approve any manual debt change; never regenerate a baseline to hide a failed PR.
+Formatting exceptions apply only to exact unchanged hashes of old files.
+The optional `.githooks/pre-commit` runs checks without modifying files; no hooksPath was set automatically.
+
+## Sentry diagnostics and privacy
+Separate API/web projects must belong to an EU Sentry organization. Empty DSNs disable monitoring.
+Server: SENTRY_DSN. Web browser: NEXT_PUBLIC_SENTRY_DSN (public DSN, never an API/auth secret).
+Only HTTPS EU ingestion DSNs without password/query/fragment are accepted.
+Events are reconstructed from an allowlist: generic message, approved error category, environment,
+static operation, event ID/time and reviewed code locations with bounded line/column numbers.
+`monitoring/source-files.json` lists approved repository paths. Review/update it when adding modules;
+unlisted paths are dropped. Backend dist aliases and strictly named Next hashed chunks are supported.
+Absolute prefixes, URL hosts/query strings, function names, original error messages, source context,
+locals, user identities, cookies, headers, bodies, health/GPS data, extras and attachments are discarded.
+Grouping uses Sentry's default sanitized-stack grouping plus operation/category, rather than one global bucket.
+Handled ingestion failures and framework/browser error handlers now retain the original technical stack
+through the sanitizer. No raw message or stack context is sent. Replay, tracing, logs and metrics are disabled.
+Both actual SDK envelopes are tested through an in-memory transport; no network delivery is claimed.
+Before enabling DSNs, configure server-side scrubbing, prevention of IP-address storage and IP-derived
+geography scrubbing in Sentry. SDK scrubbing cannot control ingestion-side metadata.
+Live Sentry delivery remains unverified until EU DSNs are configured. Hosted CI status is recorded in the feature pull request checks.
+
+## External services
+GitHub Actions YAML was parsed and structurally validated locally. Feature branches run the same checks on GitHub; inspect the latest PR checks for the hosted result.
+Actions are enabled (allowed_actions=all) on both repositories; no enablement change is needed.
+No Garmin API credentials, personal data or WorkOS production credentials are required in CI.
+There is no artifact upload. Playwright screenshots/video/traces are disabled.
+CodeRabbit configuration excludes sensitive paths; installation status is unverified (API403).
+Do not grant a new review app access to personal-data history without an owner decision.
+
+## Frontend checks
+```
+pnpm quality
+pnpm build
+pnpm typecheck
+pnpm exec playwright install chromium
+pnpm test:e2e
+```
+Playwright: 13 passing tests. Coverage includes dashboard/metric units/recommendations, limited historical data,
+API errors, unauthenticated redirects, two-user isolation, production auth refusal, and useful private SDK diagnostics.
+Build/typecheck and quality gates pass. Production build was verified with empty auth/Sentry credentials.
+The development-only test adapter requires NODE_ENV=development, explicit mode+secret, exact fixture backend URL
+and loopback host. Production builds/servers reject the flag and production auth still uses WorkOS.
+Local Next4318 and fixture backend4319 use only fabricated users/data. Actual WorkOS login/callback is not verified.
+Build and E2E run sequentially because both use .next. Historical lint is enforced by a separate mandatory gate,
+not by Next build; no new lint fingerprints are accepted. No production login was weakened.
diff --git a/README.md b/README.md
index 128ec04..6f737dc 100644
--- a/README.md
+++ b/README.md
@@ -18,3 +18,7 @@ Data is used exclusively to generate personalized fitness insights for the user.
Users may revoke access at any time by disconnecting their Garmin account.
This application does not resell or redistribute Garmin user data.
+
+## Engineering quality
+
+See [QUALITY.md](QUALITY.md) for isolated database tests, CI, Playwright, lint debt and privacy-safe monitoring.