From be3ed5244a2490273269d3393c1e089c6427baac Mon Sep 17 00:00:00 2001 From: Bailey Dixon Date: Tue, 16 Jun 2026 20:47:47 -0400 Subject: [PATCH] feat: add standalone landing site A standalone Next.js 15 static-export marketing site under landing/, decoupled from the app (its own package.json + deps). Recreates the Forge Landing Site design with the Forge token system, real brand assets (favicon, OG/Twitter cards, web manifest), and light/dark theming. - Version + changelog are sourced from ../package.json and ../CHANGELOG.md at build time, so there is no hand-maintained copy to drift. - Live GitHub star badge: a client component fetches stargazers_count at runtime and shows it only at >= 1 star, with a 1h localStorage cache. Repo identity lives in a Node-free lib/repo.ts so the client bundle never pulls the build-time fs reads. - MIT throughout, matching the repo LICENSE. Also records the work in DEVLOG. Co-Authored-By: Claude Opus 4.8 (1M context) --- DEVLOG.md | 44 + landing/.gitignore | 12 + landing/README.md | 97 + landing/app/apple-icon.png | Bin 0 -> 11150 bytes landing/app/docs/page.tsx | 41 + landing/app/globals.css | 421 ++ landing/app/icon.svg | 8 + landing/app/layout.tsx | 82 + landing/app/manifest.ts | 25 + landing/app/not-found.tsx | 64 + landing/app/opengraph-image.tsx | 91 + landing/app/page.tsx | 41 + landing/app/releases/page.tsx | 78 + landing/app/robots.ts | 12 + landing/app/sitemap.ts | 14 + landing/app/twitter-image.tsx | 8 + landing/components/docs-content.tsx | 98 + landing/components/footer.tsx | 106 + landing/components/github-stars.tsx | 96 + landing/components/hero.tsx | 402 ++ landing/components/icon.tsx | 128 + landing/components/logo.tsx | 23 + landing/components/nav.tsx | 110 + landing/components/pillars.tsx | 209 + landing/components/planning.tsx | 122 + landing/components/primitives.tsx | 178 + landing/components/product-strip.tsx | 263 ++ landing/components/releases-section.tsx | 56 + landing/components/runtimes.tsx | 273 ++ landing/components/self-host.tsx | 82 + landing/components/theme-provider.tsx | 23 + landing/components/theme-toggle.tsx | 42 + landing/eslint.config.mjs | 30 + landing/lib/releases.ts | 128 + landing/lib/repo.ts | 11 + landing/next.config.ts | 26 + landing/package.json | 32 + landing/pnpm-lock.yaml | 3913 +++++++++++++++++++ landing/postcss.config.mjs | 6 + landing/public/icons/forge-icon-192.png | Bin 0 -> 9638 bytes landing/public/icons/forge-icon-512.png | Bin 0 -> 44627 bytes landing/public/icons/forge-maskable-512.png | Bin 0 -> 29027 bytes landing/tailwind.config.ts | 45 + landing/tsconfig.json | 23 + 44 files changed, 7463 insertions(+) create mode 100644 landing/.gitignore create mode 100644 landing/README.md create mode 100644 landing/app/apple-icon.png create mode 100644 landing/app/docs/page.tsx create mode 100644 landing/app/globals.css create mode 100644 landing/app/icon.svg create mode 100644 landing/app/layout.tsx create mode 100644 landing/app/manifest.ts create mode 100644 landing/app/not-found.tsx create mode 100644 landing/app/opengraph-image.tsx create mode 100644 landing/app/page.tsx create mode 100644 landing/app/releases/page.tsx create mode 100644 landing/app/robots.ts create mode 100644 landing/app/sitemap.ts create mode 100644 landing/app/twitter-image.tsx create mode 100644 landing/components/docs-content.tsx create mode 100644 landing/components/footer.tsx create mode 100644 landing/components/github-stars.tsx create mode 100644 landing/components/hero.tsx create mode 100644 landing/components/icon.tsx create mode 100644 landing/components/logo.tsx create mode 100644 landing/components/nav.tsx create mode 100644 landing/components/pillars.tsx create mode 100644 landing/components/planning.tsx create mode 100644 landing/components/primitives.tsx create mode 100644 landing/components/product-strip.tsx create mode 100644 landing/components/releases-section.tsx create mode 100644 landing/components/runtimes.tsx create mode 100644 landing/components/self-host.tsx create mode 100644 landing/components/theme-provider.tsx create mode 100644 landing/components/theme-toggle.tsx create mode 100644 landing/eslint.config.mjs create mode 100644 landing/lib/releases.ts create mode 100644 landing/lib/repo.ts create mode 100644 landing/next.config.ts create mode 100644 landing/package.json create mode 100644 landing/pnpm-lock.yaml create mode 100644 landing/postcss.config.mjs create mode 100644 landing/public/icons/forge-icon-192.png create mode 100644 landing/public/icons/forge-icon-512.png create mode 100644 landing/public/icons/forge-maskable-512.png create mode 100644 landing/tailwind.config.ts create mode 100644 landing/tsconfig.json diff --git a/DEVLOG.md b/DEVLOG.md index 4e5d2fbf..c5e80d24 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,6 +2,50 @@ > Append-only session log. Read at session start. Update at session end. +## 2026-06-16 — Public landing site (`landing/`, standalone Next app) + +Built the marketing site from the Claude Design handoff bundle (`Forge +Landing Site` project). Implemented as a **standalone** Next 15 app in +`landing/` — its own `package.json`/lockfile, decoupled from the main app, +`output: "export"` → static `out/` deployable to any host. Stack: React 19, +Tailwind 3 wired to the Forge token vars, `next/font` (Inter + JetBrains +Mono), `next-themes` (light/dark). `landing/README.md` documents it. + +`app/globals.css` mirrors the Forge token system from `src/app/globals.css` +(tokens + the motion/glow-grid keyframes) plus a thin **responsive layer**: +the section components are inline-styled verbatim from the prototype, and +responsiveness is layered via marker classes (`.lnd-cols-2/3/4`, `.lnd-pad`, +`.lnd-pad-left`, `.lnd-hero-grid`, `.lnd-hero-visual`, `.lnd-nav*`, +`.lnd-footer*`, `.lnd-release-row`, `.lnd-navlink`, `.lnd-doclink`) with +`!important` media-query overrides. The prototype's canvas/tweaks shell is +dropped; one responsive page replaces the separate desktop/mobile artboards. + +Routes: `/` (hero → 4 pillars → 3-tier runtimes → product strip → planning → +self-host → changelog preview → footer), `/releases` (full changelog from +`lib/releases.ts`), `/docs` (docs index), branded `not-found`, plus +`robots.ts` + `sitemap.ts` + per-page OG/canonical for SEO. + +Process: ported the ~10 section components by fanning out parallel subagents +(verbatim port + per-file responsive markers), each adversarially +fidelity-reviewed against the prototype; then a 3-dimension review +(responsive / a11y / correctness) caught real bugs I fixed: phone nav +overflow (hide GitHub pill + version badge < 860/520px), the self-host +install `
` inverting onto `--foreground` and going invisible in dark
+mode (pinned to a fixed dark terminal surface), the hero product-mock
+cramping on phones (hidden < 760px, matching the mobile artboard), missing
+`

` + heading-level skips on sub-pages, dead in-page anchors rewired to +real routes, and trailing-slash consistency. + +Intentional non-fix: the primary ember CTA is ~3.06:1 in light mode (WCAG AA +miss for 13px bold) — it's the brand `--ember` token mirrored verbatim from +the app's design system (lockstep per CLAUDE.md) and the exact button shipped +in-product, so the contrast fix belongs in the design system, not a +landing-site fork. + +Verification: `pnpm typecheck`, `pnpm lint`, `pnpm build` (static export, all +routes) all green; exported HTML spot-checked (one h1/page, per-page og:url + +canonical, trailing-slash links, fixed terminal colors, sitemap). + ## 2026-06-15 — Goal creation starts live planning Closed AXI-80's silent-goal gap. Goal creation from the Goals page now chains diff --git a/landing/.gitignore b/landing/.gitignore new file mode 100644 index 00000000..8e0fd70b --- /dev/null +++ b/landing/.gitignore @@ -0,0 +1,12 @@ +# deps +/node_modules + +# next +/.next/ +/out/ +next-env.d.ts + +# misc +.DS_Store +*.tsbuildinfo +.vercel diff --git a/landing/README.md b/landing/README.md new file mode 100644 index 00000000..2839ec4b --- /dev/null +++ b/landing/README.md @@ -0,0 +1,97 @@ +# Forge — Landing Site + +The public marketing site for [Forge](https://github.com/Codename-11/forge). A +**standalone** Next.js app, fully decoupled from the main application: it has +its own `package.json`, its own dependencies, and emits a **static site** you +can host anywhere. + +It was implemented from the `Forge Landing Site` design (Claude Design handoff +bundle) and recreates that design pixel-for-pixel using the same Forge token +system (`globals.css` mirrors `src/app/globals.css` from the main repo). + +## Stack + +Next.js 15 (App Router, `output: "export"`) · React 19 · TypeScript · +Tailwind 3 (wired to the Forge token CSS vars) · `next/font` (Inter + +JetBrains Mono) · `next-themes` (light/dark). + +## Develop + +```bash +cd landing +pnpm install # standalone; resolves from the repo's pnpm store +pnpm dev # binds 0.0.0.0:3200 — http://localhost:3200 (and over the LAN) +``` + +> Port `3100` is taken by the `mission-control` container, so dev/start/serve +> default to **`3200`** on `0.0.0.0` (reachable from other machines on the LAN). +> Change the port in `package.json` if `3200` is occupied. + +## Build & deploy + +```bash +pnpm build # static export → ./out +pnpm serve # preview the exported site locally (npx serve) +``` + +`out/` is a plain static bundle. Drop it on GitHub Pages, S3/CloudFront, +Netlify, Vercel, or behind the same reverse proxy as the app. No Node server +is required. (If you later need server features, remove `output: "export"` +in `next.config.ts` and run `pnpm start`.) + +Set the canonical URL via `NEXT_PUBLIC_SITE_URL` at build time (used for +metadata / Open Graph). Defaults to `https://forge.axiom-labs.dev`. + +## Live data + +**Version + changelog** are read from the repo **at build time** (`lib/releases.ts`): +the version comes from `../package.json` and the release list is parsed from the +real `../CHANGELOG.md` — so the site stays accurate on every rebuild, with a +baked-in real fallback if those files aren't found. No hard-coded version or +changelog copy to drift. + +**Star count is live at runtime.** `components/github-stars.tsx` is a client +component that fetches `stargazers_count` from the public GitHub REST API (no +token; CORS-open) and renders a `★ N` badge in the nav + footer. It renders +nothing while loading or on error, dedupes concurrent mounts via a module-level +in-flight promise, and caches the count in `localStorage` for 1h to stay well +under the unauthenticated rate limit. Repo identity lives in the Node-free +`lib/repo.ts` so the client bundle never pulls `lib/releases.ts`'s build-time +`fs` reads. + +## Layout + +``` +landing/ + app/ + layout.tsx # fonts, theme provider, metadata + page.tsx # the landing page (composes the sections below) + releases/page.tsx # /releases — full changelog + docs/page.tsx # /docs — docs index + globals.css # Forge tokens + motion + responsive layer + components/ + icon.tsx # Forge icon set (stroke-1.6 lucide-style) + logo.tsx # the Forge brand mark (inline SVG) + primitives.tsx # Eyebrow, GhostButton, SectionShell + theme-toggle.tsx # nav light/dark toggle (client) + github-stars.tsx # live GitHub star badge (client; runtime fetch) + nav.tsx hero.tsx pillars.tsx runtimes.tsx product-strip.tsx + planning.tsx self-host.tsx releases-section.tsx footer.tsx docs-content.tsx + lib/ + repo.ts # repo identity + GitHub endpoints (Node-free) + releases.ts # build-time version + changelog (../package.json, ../CHANGELOG.md) +``` + +## Design fidelity + +The section components are inline-styled with `hsl(var(--token))` exactly as the +prototype. Production-only additions over the prototype: + +- The canvas/tweaks shell is dropped; the page renders directly and **reflows + responsively** (the prototype shipped fixed desktop/mobile artboards). +- Responsive behaviour is layered via marker classes (`.lnd-cols-*`, + `.lnd-pad`, `.lnd-hero-grid`, `.lnd-nav*`, `.lnd-footer*`) in `globals.css`. +- Prototype hover handlers (`onMouseEnter`/`onMouseLeave`) became CSS `:hover` + classes so the components can stay server-rendered. +- A real light/dark **theme toggle** in the nav (the prototype's lived in the + design-canvas panel). diff --git a/landing/app/apple-icon.png b/landing/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..538ff01e75955c3c05cde8f66332e106c2f5c97e GIT binary patch literal 11150 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 literal 0 HcmV?d00001 diff --git a/landing/app/docs/page.tsx b/landing/app/docs/page.tsx new file mode 100644 index 00000000..95347acb --- /dev/null +++ b/landing/app/docs/page.tsx @@ -0,0 +1,41 @@ +import type { Metadata } from "next"; +import { LandingNav } from "@/components/nav"; +import { LandingFooter } from "@/components/footer"; +import { DocsContent } from "@/components/docs-content"; + +const DESCRIPTION = + "Everything you need to install Forge, connect an agent, and ship the first plan. Get started, runtimes & agents, and full reference."; + +export const metadata: Metadata = { + title: "Docs", + description: DESCRIPTION, + alternates: { canonical: "/docs/" }, + openGraph: { + type: "website", + siteName: "Forge", + url: "/docs/", + title: "Docs · Forge", + description: DESCRIPTION, + images: [{ url: "/opengraph-image", width: 1200, height: 630, alt: "Forge — issue tracking for humans & agents." }], + }, +}; + +// Docs landing — ported from the prototype's DocsPage. +export default function DocsPage() { + return ( +
+ +
+ +
+ +
+ ); +} diff --git a/landing/app/globals.css b/landing/app/globals.css new file mode 100644 index 00000000..d1d409df --- /dev/null +++ b/landing/app/globals.css @@ -0,0 +1,421 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* ------------------------------------------------------------------ */ +/* Forge design tokens — mirrored from + * src/app/globals.css @ Codename-11/Forge@master + * (the prototype shipped these as forge-tokens.css). Keep in lockstep. + * The two --font-* vars below are bound to the self-hosted next/font + * families (Inter + JetBrains Mono) instead of the named webfonts. + * ------------------------------------------------------------------ */ + +:root { + --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif; + --font-mono: var(--font-jetbrains-mono), ui-monospace, SFMono-Regular, monospace; + --radius: 0.5rem; + + /* Warm paper neutrals (HSL components) */ + --background: 38 20% 97%; + --foreground: 30 10% 12%; + --card: 36 24% 98%; + --card-foreground: 30 10% 12%; + --popover: 36 24% 98%; + --popover-foreground: 30 10% 12%; + --muted: 34 16% 92%; + --muted-foreground: 30 8% 36%; + --subtle: 34 20% 90%; + --border: 30 10% 86%; + --input: 30 10% 86%; + --ring: 25 70% 48%; + + /* Ember — single accent, warm amber */ + --ember: 25 80% 50%; + --ember-foreground: 40 40% 98%; + + --success: 120 45% 34%; + --warning: 38 90% 45%; + --danger: 0 60% 44%; + + --sticky-sand: 38 35% 78%; + --sticky-blush: 10 45% 80%; + --sticky-sage: 95 22% 72%; + --sticky-sky: 205 35% 78%; + --sticky-lavender: 265 28% 80%; + --sticky-peach: 25 55% 78%; +} + +.dark { + --background: 30 6% 8%; + --foreground: 36 16% 92%; + --card: 30 6% 10%; + --card-foreground: 36 16% 92%; + --popover: 30 6% 10%; + --popover-foreground: 36 16% 92%; + --muted: 30 6% 14%; + --muted-foreground: 30 10% 62%; + --subtle: 30 6% 16%; + --border: 30 6% 18%; + --input: 30 6% 18%; + --ring: 25 80% 58%; + + --ember: 25 90% 58%; + --ember-foreground: 30 6% 8%; + + --success: 120 45% 48%; + --warning: 38 90% 56%; + --danger: 0 60% 60%; + + --sticky-sand: 38 30% 64%; + --sticky-blush: 10 40% 66%; + --sticky-sage: 95 18% 58%; + --sticky-sky: 205 30% 64%; + --sticky-lavender: 265 23% 66%; + --sticky-peach: 25 50% 64%; +} + +/* Density / textsize cascade — same logic as globals.css */ +html { font-size: 16px; } +html[data-density="comfortable"] { font-size: 17px; } +html[data-textsize="larger"] { font-size: 18px; } +html[data-density="comfortable"][data-textsize="larger"] { font-size: 19px; } + +html, body { margin: 0; padding: 0; } +*, *::before, *::after { box-sizing: border-box; } + +body { + min-height: 100vh; + font-family: var(--font-sans); + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + font-feature-settings: "cv02", "cv03", "cv04", "cv11"; + -webkit-font-smoothing: antialiased; +} +code, kbd, pre, samp { font-family: var(--font-mono); } +::selection { background: hsl(var(--ember) / 0.25); } + +/* Smooth in-page anchor jumps for the nav links. */ +html { scroll-behavior: smooth; } +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } +} + +/* ============================================================ */ +/* Existing UI patterns (mirrored from globals.css) */ +/* ============================================================ */ + +.ui-shimmer { + position: relative; + overflow: hidden; + background-color: hsl(var(--subtle)); +} +.ui-shimmer::after { + content: ""; + position: absolute; + inset: 0; + background-image: linear-gradient( + 90deg, + transparent 0%, + hsl(var(--muted) / 0.6) 50%, + transparent 100% + ); + background-size: 200% 100%; + background-repeat: no-repeat; + background-position: -200% 0; +} +@media (prefers-reduced-motion: no-preference) { + .ui-shimmer::after { animation: forge-shimmer 1.8s linear infinite; } +} +[data-motion="off"] .ui-shimmer::after { animation: none !important; } + +@keyframes forge-shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +/* ============================================================ */ +/* Motion additions — gated on no-preference AND on a doc-level */ +/* data-motion="on" so motion can be paused. */ +/* ============================================================ */ + +/* M1: Animated grid background ------------------------------- */ +.forge-grid-bg { + --grid-line: hsl(var(--border) / 0.6); + --grid-size: 40px; + background-image: + linear-gradient(to right, var(--grid-line) 1px, transparent 1px), + linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px); + background-size: var(--grid-size) var(--grid-size); + background-position: 0 0, 0 0; +} +@media (prefers-reduced-motion: no-preference) { + [data-motion="on"] .forge-grid-bg { + animation: forge-grid-drift 48s linear infinite; + } +} +@keyframes forge-grid-drift { + to { background-position: var(--grid-size) var(--grid-size), var(--grid-size) var(--grid-size); } +} + +/* M2: Ember aurora glow -------------------------------------- */ +.forge-aurora { + position: relative; + isolation: isolate; + overflow: hidden; +} +.forge-aurora::before { + content: ""; + position: absolute; + inset: -25%; + z-index: -1; + background: + radial-gradient(40% 50% at 30% 40%, hsl(var(--ember) / 0.18), transparent 70%), + radial-gradient(35% 45% at 70% 60%, hsl(var(--ember) / 0.10), transparent 75%); + filter: blur(20px); + opacity: 0.9; +} +@media (prefers-reduced-motion: no-preference) { + [data-motion="on"] .forge-aurora::before { + animation: forge-aurora-drift 28s ease-in-out infinite alternate; + } +} +@keyframes forge-aurora-drift { + 0% { transform: translate3d(-2%, -1%, 0) scale(1); opacity: 0.85; } + 50% { transform: translate3d( 2%, 1%, 0) scale(1.05); opacity: 1; } + 100% { transform: translate3d( 1%, -2%, 0) scale(1.02); opacity: 0.9; } +} + +/* M7: Active-path glow on running node ----------------------- */ +.forge-active-node { + box-shadow: + 0 0 0 1px hsl(var(--ember) / 0.55) inset, + 0 0 0 0 hsl(var(--ember) / 0); +} +@media (prefers-reduced-motion: no-preference) { + [data-motion="on"] .forge-active-node { + animation: forge-pulse 2.4s ease-in-out infinite; + } +} +@keyframes forge-pulse { + 0%, 100% { + box-shadow: + 0 0 0 1px hsl(var(--ember) / 0.55) inset, + 0 0 0 0 hsl(var(--ember) / 0.0); + } + 50% { + box-shadow: + 0 0 0 1px hsl(var(--ember) / 0.8) inset, + 0 0 0 6px hsl(var(--ember) / 0.10); + } +} + +/* M10: Idle status-dot breath ------------------------------- */ +.forge-breath { + display: inline-block; + width: 6px; height: 6px; + border-radius: 9999px; + background: hsl(var(--success)); + box-shadow: 0 0 0 0 hsl(var(--success) / 0.5); +} +@media (prefers-reduced-motion: no-preference) { + [data-motion="on"] .forge-breath { + animation: forge-breath 3.2s ease-in-out infinite; + } +} +@keyframes forge-breath { + 0%, 100% { box-shadow: 0 0 0 0 hsl(var(--success) / 0.40); } + 50% { box-shadow: 0 0 0 5px hsl(var(--success) / 0); } +} + +/* Activity halo pulse (lived in the prototype's ) ------ */ +@keyframes forge-act-pulse { + 0%, 100% { transform: scale(1); opacity: 0.55; } + 50% { transform: scale(1.55); opacity: 0; } +} +[data-motion="off"] .forge-act-pulse, +[data-motion="off"] [style*="forge-act-pulse"] { animation: none !important; } + +/* ============================================================ */ +/* Drifting glow grid (hero background) */ +/* ============================================================ */ + +.forge-glow-grid { + position: absolute; + inset: 0; + overflow: hidden; + mask-image: radial-gradient( + ellipse at center, + rgb(0 0 0 / 1) 30%, + rgb(0 0 0 / 0.6) 60%, + transparent 95% + ); + -webkit-mask-image: radial-gradient( + ellipse at center, + rgb(0 0 0 / 1) 30%, + rgb(0 0 0 / 0.6) 60%, + transparent 95% + ); +} + +.forge-glow-grid-dots { + position: absolute; + inset: 0; + background-image: + radial-gradient(circle, hsl(var(--foreground) / 0.07) 1px, transparent 1.5px), + radial-gradient(circle, hsl(var(--foreground) / 0.03) 1.5px, transparent 2px); + background-size: 24px 24px, 24px 24px; +} + +.forge-glow-grid-blob { + position: absolute; + inset: -50%; + mix-blend-mode: plus-lighter; + will-change: transform; + pointer-events: none; +} + +.forge-glow-grid-blob-a { + background: radial-gradient( + circle at 50% 50%, + hsl(var(--foreground) / 0.07) 0%, + hsl(var(--foreground) / 0.03) 18%, + transparent 38% + ); +} + +.forge-glow-grid-blob-b { + background: radial-gradient( + circle at 50% 50%, + hsl(var(--ember) / 0.12) 0%, + hsl(var(--ember) / 0.05) 20%, + transparent 40% + ); +} + +@media (prefers-reduced-motion: no-preference) { + [data-motion="on"] .forge-glow-grid-blob-a { + animation: forge-glow-drift-a 28s linear infinite; + } + [data-motion="on"] .forge-glow-grid-blob-b { + animation: forge-glow-drift-b 36s linear infinite; + } +} + +@keyframes forge-glow-drift-a { + 0% { transform: translate3d(-15%, -10%, 0); } + 25% { transform: translate3d( 10%, -18%, 0); } + 50% { transform: translate3d( 18%, 12%, 0); } + 75% { transform: translate3d(-12%, 16%, 0); } + 100% { transform: translate3d(-15%, -10%, 0); } +} + +@keyframes forge-glow-drift-b { + 0% { transform: translate3d( 20%, 15%, 0); } + 33% { transform: translate3d(-18%, 10%, 0); } + 66% { transform: translate3d(-10%, -20%, 0); } + 100% { transform: translate3d( 20%, 15%, 0); } +} + +/* ============================================================ */ +/* Landing-site responsive layer. */ +/* The ported components keep their (desktop-1440) inline styles */ +/* verbatim; these classes layer responsive behaviour on top. */ +/* Longhand !important beats the shorthand inline `padding` / */ +/* explicit inline `grid-template-columns` below the breakpoint. */ +/* ============================================================ */ + +/* Multi-column grids collapse to a single column on narrow screens. */ +@media (max-width: 980px) { + .lnd-cols-2, + .lnd-cols-3, + .lnd-cols-4 { grid-template-columns: minmax(0, 1fr) !important; } + .lnd-hero-grid { grid-template-columns: minmax(0, 1fr) !important; gap: 40px !important; } +} +@media (min-width: 981px) and (max-width: 1180px) { + .lnd-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } +} + +/* Section horizontal padding shrinks on tablet / phone. */ +@media (max-width: 860px) { + .lnd-pad { + padding-left: clamp(20px, 6vw, 96px) !important; + padding-right: clamp(20px, 6vw, 96px) !important; + padding-top: clamp(56px, 12vw, 120px) !important; + padding-bottom: clamp(56px, 12vw, 120px) !important; + } + /* Product strip: left/top/bottom only — right stays 0 so the horizontal + scroll strip can bleed to the screen edge. */ + .lnd-pad-left { + padding-left: clamp(20px, 6vw, 96px) !important; + padding-top: clamp(56px, 12vw, 120px) !important; + padding-bottom: clamp(56px, 12vw, 120px) !important; + } + .lnd-nav { padding-left: 18px !important; padding-right: 18px !important; } + .lnd-footer { padding-left: 22px !important; padding-right: 22px !important; } +} + +/* Narrow-screen nav: drop the desktop link row and the wide GitHub pill so + the essential controls (logo, theme toggle, Get-started CTA) fit ~360px. */ +@media (max-width: 860px) { + .lnd-nav-links { display: none !important; } + .lnd-nav-gh { display: none !important; } +} +/* On the smallest phones, also drop the version badge. */ +@media (max-width: 520px) { + .lnd-nav-badge { display: none !important; } +} + +/* The hero's product mock is intricate (absolute-positioned, fixed height); + below ~760px it can't reflow legibly, so we drop it on phones — matching + the prototype's mobile artboard, which omits it. */ +@media (max-width: 760px) { + .lnd-hero-visual { display: none !important; } +} + +/* Footer column grid stacks. */ +@media (max-width: 860px) { + .lnd-footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; gap: 32px !important; } +} +@media (max-width: 520px) { + .lnd-footer-grid { grid-template-columns: minmax(0, 1fr) !important; } + .lnd-footer-bottom { flex-wrap: wrap; } +} + +/* Release rows: the date rail folds above the body on phones. */ +@media (max-width: 640px) { + .lnd-release-row { grid-template-columns: minmax(0, 1fr) !important; gap: 12px !important; } +} + +/* Nav hover (was an inline onMouseEnter handler in the prototype). */ +.lnd-navlink { color: hsl(var(--muted-foreground)); transition: color 120ms ease-out; } +.lnd-navlink:hover { color: hsl(var(--foreground)); } + +/* Docs index rows hover (was an inline handler in the prototype). */ +.lnd-doclink { transition: background-color 120ms ease-out; } +.lnd-doclink:hover { background: hsl(var(--muted) / 0.5); } + +/* GhostButton lift on hover. */ +.lnd-btn { transition: transform 100ms ease-out, background-color 120ms ease-out, box-shadow 120ms ease-out; } +.lnd-btn:hover { transform: translateY(-1px); } + +/* Forge primitive shims (kbd / focus / density text utilities). */ +.kbd { + display: inline-flex; + height: 1.25rem; + min-width: 1.25rem; + align-items: center; + justify-content: center; + border-radius: 0.25rem; + border: 1px solid hsl(var(--border)); + background: hsl(var(--muted)); + padding: 0 0.375rem; + font-family: var(--font-mono); + font-size: 0.6875rem; + font-weight: 500; + color: hsl(var(--muted-foreground)); +} + +:focus-visible { + outline: 2px solid hsl(var(--ring)); + outline-offset: 2px; +} diff --git a/landing/app/icon.svg b/landing/app/icon.svg new file mode 100644 index 00000000..76e3b697 --- /dev/null +++ b/landing/app/icon.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/landing/app/layout.tsx b/landing/app/layout.tsx new file mode 100644 index 00000000..2ce4c439 --- /dev/null +++ b/landing/app/layout.tsx @@ -0,0 +1,82 @@ +import type { Metadata, Viewport } from "next"; +import { Inter, JetBrains_Mono } from "next/font/google"; +import { ThemeProvider } from "@/components/theme-provider"; +import "./globals.css"; + +// Self-hosted via next/font; bound to --font-sans / --font-mono in globals.css. +const inter = Inter({ + subsets: ["latin"], + weight: ["400", "500", "600", "700"], + variable: "--font-inter", + display: "swap", +}); +const jetbrainsMono = JetBrains_Mono({ + subsets: ["latin"], + weight: ["400", "500", "600"], + variable: "--font-jetbrains-mono", + display: "swap", +}); + +const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://forge.axiom-labs.dev"; +const TITLE = "Forge — issue tracking for humans & agents"; +const DESCRIPTION = + "An open-source work tracker built for the handoff between humans and agents. Humans file, agents pick up, humans review — same issues, same plans, same keyboard. Self-host in 60 seconds."; + +export const metadata: Metadata = { + metadataBase: new URL(SITE_URL), + title: { + default: TITLE, + template: "%s · Forge", + }, + description: DESCRIPTION, + applicationName: "Forge", + keywords: [ + "issue tracking", + "project management", + "AI agents", + "MCP", + "Model Context Protocol", + "Hermes", + "Codex", + "Claude Code", + "self-hosted", + "open source", + "Linear alternative", + ], + authors: [{ name: "Forge" }], + openGraph: { + type: "website", + url: SITE_URL, + siteName: "Forge", + title: TITLE, + description: DESCRIPTION, + }, + twitter: { + card: "summary_large_image", + title: TITLE, + description: DESCRIPTION, + }, + robots: { index: true, follow: true }, +}; + +export const viewport: Viewport = { + themeColor: [ + { media: "(prefers-color-scheme: light)", color: "#f7f4ef" }, + { media: "(prefers-color-scheme: dark)", color: "#16140f" }, + ], +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + + ); +} diff --git a/landing/app/manifest.ts b/landing/app/manifest.ts new file mode 100644 index 00000000..71f32652 --- /dev/null +++ b/landing/app/manifest.ts @@ -0,0 +1,25 @@ +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +export default function manifest(): MetadataRoute.Manifest { + return { + id: "/", + name: "Forge — issue tracking for humans & agents", + short_name: "Forge", + description: + "An open-source work tracker built for the handoff between humans and agents. Self-host in 60 seconds.", + lang: "en", + start_url: "/", + scope: "/", + display: "browser", + background_color: "#fef3e6", + theme_color: "#d97706", + prefer_related_applications: false, + icons: [ + { src: "/icons/forge-icon-192.png", sizes: "192x192", type: "image/png", purpose: "any" }, + { src: "/icons/forge-icon-512.png", sizes: "512x512", type: "image/png", purpose: "any" }, + { src: "/icons/forge-maskable-512.png", sizes: "512x512", type: "image/png", purpose: "maskable" }, + ], + }; +} diff --git a/landing/app/not-found.tsx b/landing/app/not-found.tsx new file mode 100644 index 00000000..a2b383dd --- /dev/null +++ b/landing/app/not-found.tsx @@ -0,0 +1,64 @@ +import { LandingNav } from "@/components/nav"; +import { LandingFooter } from "@/components/footer"; +import { Eyebrow, GhostButton } from "@/components/primitives"; + +export default function NotFound() { + return ( +
+ +
+ error · 404 +

+ This page took a different dispatch. +

+

+ The URL you followed doesn’t resolve to a page. Head back to the + workspace, or jump straight to the docs. +

+
+ + Back to home + + + Read the docs + +
+
+ +
+ ); +} diff --git a/landing/app/opengraph-image.tsx b/landing/app/opengraph-image.tsx new file mode 100644 index 00000000..8e6e651b --- /dev/null +++ b/landing/app/opengraph-image.tsx @@ -0,0 +1,91 @@ +import { ImageResponse } from "next/og"; + +// Social card for the landing site — real Forge mark + brand, landing copy. +// Generated at build time (static export) into out/opengraph-image.png. +export const runtime = "nodejs"; +export const dynamic = "force-static"; +export const alt = "Forge — issue tracking for humans & agents."; +export const size = { width: 1200, height: 630 }; +export const contentType = "image/png"; + +export default async function OgImage() { + // The real Forge app-icon mark (ember tile + paper forge glyph + brown stroke). + const mark = ` + + + + + + `; + const dataUri = `data:image/svg+xml;base64,${Buffer.from(mark).toString("base64")}`; + + return new ImageResponse( + ( +
+
+ +
+
Forge
+
+ Issue tracking for humans & agents. +
+
+
+ +
+
+ Built for the handoff. +
+
+ Humans file, agents pick up, humans review — same issues, same plans, same keyboard. +
+
+ Self-host + · + MCP-native + · + Open-source + · + MIT +
+
+ +
+ forge.axiom-labs.dev + github.com/Codename-11/forge +
+
+ ), + { ...size }, + ); +} diff --git a/landing/app/page.tsx b/landing/app/page.tsx new file mode 100644 index 00000000..702e2867 --- /dev/null +++ b/landing/app/page.tsx @@ -0,0 +1,41 @@ +import type { Metadata } from "next"; +import { LandingNav } from "@/components/nav"; +import { LandingHero } from "@/components/hero"; +import { LandingPillars } from "@/components/pillars"; +import { LandingRuntimes } from "@/components/runtimes"; +import { LandingProductStrip } from "@/components/product-strip"; +import { LandingPlanning } from "@/components/planning"; +import { LandingSelfHost } from "@/components/self-host"; +import { LandingReleasesPreview } from "@/components/releases-section"; +import { LandingFooter } from "@/components/footer"; + +export const metadata: Metadata = { + alternates: { canonical: "/" }, +}; + +// Full landing page — composed from the section components (ported from the +// prototype's LandingPageFull). The page reflows responsively; there is no +// separate mobile route (the prototype's mobile artboard was a preview). +export default function Home() { + return ( +
+ +
+ + + + + + + +
+ +
+ ); +} diff --git a/landing/app/releases/page.tsx b/landing/app/releases/page.tsx new file mode 100644 index 00000000..12aef8cc --- /dev/null +++ b/landing/app/releases/page.tsx @@ -0,0 +1,78 @@ +import type { Metadata } from "next"; +import { LandingNav } from "@/components/nav"; +import { LandingFooter } from "@/components/footer"; +import { ReleaseRow } from "@/components/releases-section"; +import { SectionShell, GhostButton } from "@/components/primitives"; +import { Icon } from "@/components/icon"; +import { RELEASES_ALL } from "@/lib/releases"; + +const DESCRIPTION = + "Every Forge release, every tag, in the open. Patches are bug-fixes only; minors bring new surfaces. Signed and tagged on GitHub."; + +export const metadata: Metadata = { + title: "Releases", + description: DESCRIPTION, + alternates: { canonical: "/releases/" }, + openGraph: { + type: "website", + siteName: "Forge", + url: "/releases/", + title: "Releases · Forge", + description: DESCRIPTION, + images: [{ url: "/opengraph-image", width: 1200, height: 630, alt: "Forge — issue tracking for humans & agents." }], + }, +}; + +// Full changelog page — ported from the prototype's ReleasesPage. +export default function ReleasesPage() { + return ( +
+ +
+ +
+ {RELEASES_ALL.map((r, i) => ( + + ))} +
+
+ +
+
Subscribe to release notes
+
+ RSS · Atom · or watch the repo on GitHub. +
+
+ + releases.atom + +
+
+
+ +
+ ); +} diff --git a/landing/app/robots.ts b/landing/app/robots.ts new file mode 100644 index 00000000..658872f5 --- /dev/null +++ b/landing/app/robots.ts @@ -0,0 +1,12 @@ +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://forge.axiom-labs.dev"; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { userAgent: "*", allow: "/" }, + sitemap: `${SITE_URL}/sitemap.xml`, + }; +} diff --git a/landing/app/sitemap.ts b/landing/app/sitemap.ts new file mode 100644 index 00000000..db52194e --- /dev/null +++ b/landing/app/sitemap.ts @@ -0,0 +1,14 @@ +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://forge.axiom-labs.dev"; + +export default function sitemap(): MetadataRoute.Sitemap { + // Trailing slashes match the exported canonical routes (trailingSlash: true). + return ["/", "/releases/", "/docs/"].map((path) => ({ + url: `${SITE_URL}${path}`, + changeFrequency: "weekly", + priority: path === "/" ? 1 : 0.7, + })); +} diff --git a/landing/app/twitter-image.tsx b/landing/app/twitter-image.tsx new file mode 100644 index 00000000..e28aeb81 --- /dev/null +++ b/landing/app/twitter-image.tsx @@ -0,0 +1,8 @@ +// Twitter card reuses the OG image (same 1200×630 brand card). +export { default } from "./opengraph-image"; + +export const runtime = "nodejs"; +export const dynamic = "force-static"; +export const alt = "Forge — issue tracking for humans & agents."; +export const size = { width: 1200, height: 630 }; +export const contentType = "image/png"; diff --git a/landing/components/docs-content.tsx b/landing/components/docs-content.tsx new file mode 100644 index 00000000..42c5c46a --- /dev/null +++ b/landing/components/docs-content.tsx @@ -0,0 +1,98 @@ +import { Icon } from "@/components/icon"; +import { SectionShell } from "@/components/primitives"; + +type DocItem = { name: string; path: string; blurb: string }; +type DocGroup = { title: string; icon: string; items: DocItem[] }; + +export function DocsContent() { + const groups: DocGroup[] = [ + { + title: "Get started", + icon: "Rocket", + items: [ + { name: "Install Forge", path: "docs.forge.dev/install", blurb: "Postgres, Node, 60 seconds." }, + { name: "Your first issue", path: "docs.forge.dev/first-issue", blurb: "C anywhere. Title. Save." }, + { name: "Connect an agent", path: "docs.forge.dev/connect-agent", blurb: "Hermes, Orca, Claude, Codex." }, + { name: "Self-host with Docker", path: "docs.forge.dev/docker", blurb: "Compose file + env vars." }, + ], + }, + { + title: "Runtimes & agents", + icon: "Bot", + items: [ + { name: "Hermes setup", path: "docs.forge.dev/hermes", blurb: "Persistent gateway." }, + { name: "Orca ADE integration", path: "docs.forge.dev/orca", blurb: "Auto-open + dispatch." }, + { name: "Claude Code (MCP)", path: "docs.forge.dev/claude-code", blurb: "Drop-in config." }, + { name: "Codex CLI (MCP)", path: "docs.forge.dev/codex", blurb: "Streamable HTTP." }, + { name: "Custom HTTP webhook", path: "docs.forge.dev/custom-http", blurb: "BYO bridge." }, + { name: "Dispatch rules", path: "docs.forge.dev/dispatch", blurb: "Capability matching." }, + ], + }, + { + title: "Reference", + icon: "BookOpen", + items: [ + { name: "tRPC API", path: "docs.forge.dev/api", blurb: "Every router + procedure." }, + { name: "MCP tool catalogue", path: "docs.forge.dev/mcp", blurb: "14 tools, all keyboard-driven." }, + { name: "Webhook payloads", path: "docs.forge.dev/webhooks", blurb: "Signing, retries, headers." }, + { name: "Prisma schema", path: "docs.forge.dev/schema", blurb: "The source of truth." }, + { name: "CLI · forge daemon", path: "docs.forge.dev/cli", blurb: "Local runtime." }, + { name: "Keyboard shortcuts", path: "docs.forge.dev/shortcuts", blurb: "Cheat sheet." }, + ], + }, + ]; + return ( + + {/* Search bar */} +
+ + Search the docs… + ⌘ K +
+ +
+ {groups.map((g, i) => ( +
+
+ + + +

{g.title}

+
+
+ {g.items.map((it, j) => ( + + + {it.name} + + + {it.path} + {it.blurb} + + ))} +
+
+ ))} +
+
+ ); +} diff --git a/landing/components/footer.tsx b/landing/components/footer.tsx new file mode 100644 index 00000000..df23d0fc --- /dev/null +++ b/landing/components/footer.tsx @@ -0,0 +1,106 @@ +import { Icon } from "@/components/icon"; +import { GitHubStars } from "@/components/github-stars"; +import { Logo } from "@/components/logo"; +import { VERSION_LABEL } from "@/lib/releases"; + +export function LandingFooter() { + const REPO = "https://github.com/Codename-11/forge"; + // [label, href]. Internal sections + real pages are wired; community + // links that have no target yet stay as "#" placeholders. + const cols: { title: string; items: [string, string][] }[] = [ + { + title: "Product", + items: [ + ["Features", "/#features"], + ["Runtimes", "/#runtimes"], + ["Activity dock", "/#planning"], + ["Roadmap", "/releases/"], + ], + }, + { + title: "Docs", + items: [ + ["Install", "/docs/"], + ["MCP reference", "/docs/"], + ["Dispatch rules", "/docs/"], + ["Self-host guide", "/#self-host"], + ], + }, + { + title: "Open source", + items: [ + ["GitHub", REPO], + ["Releases", "/releases/"], + ["Issues", `${REPO}/issues`], + ["License (MIT)", `${REPO}/blob/main/LICENSE`], + ], + }, + { + title: "Community", + items: [ + ["Discord", "#"], + ["Mastodon", "#"], + ["Email", "#"], + ["Security", "#"], + ], + }, + ]; + return ( +
+
+
+
+ + Forge +
+

+ An open-source work tracker built for teams of humans and agents. +

+
+ + {VERSION_LABEL} · latest +
+
+ {cols.map((c, i) => ( +
+
{c.title}
+
    + {c.items.map(([label, href], j) => { + const external = href.startsWith("http"); + return ( +
  • + + {label} + +
  • + ); + })} +
+
+ ))} +
+
+ © 2026 Forge — MIT + · + built by humans + agents + + + + github.com/Codename-11/forge + + +
+
+ ); +} diff --git a/landing/components/github-stars.tsx b/landing/components/github-stars.tsx new file mode 100644 index 00000000..65b3bf5d --- /dev/null +++ b/landing/components/github-stars.tsx @@ -0,0 +1,96 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { GITHUB_API_REPO } from "@/lib/repo"; + +/** + * Live GitHub star count. Fetched client-side at runtime (the site is a static + * export, so there is no request-time server fetch) from the public REST API — + * no token, CORS-open, ~60 req/hr per IP unauthenticated. + * + * Designed to sit *inside* an existing repo link: it renders a leading dot + * divider + a filled star + the formatted count, and renders nothing at all + * while loading or if the fetch fails (so the surrounding link never shows a + * broken or half-rendered badge). A 1-hour localStorage cache + a module-level + * in-flight promise keep it to a single request across the nav/footer mounts + * and across page navigations. + */ + +const CACHE_KEY = "forge:gh-stars"; +const TTL_MS = 60 * 60 * 1000; // 1 hour + +let inflight: Promise | null = null; + +function readCache(): number | null { + try { + const raw = localStorage.getItem(CACHE_KEY); + if (!raw) return null; + const { v, t } = JSON.parse(raw) as { v: number; t: number }; + if (typeof v === "number" && typeof t === "number" && Date.now() - t < TTL_MS) return v; + } catch { + /* ignore malformed / unavailable storage */ + } + return null; +} + +function fetchStars(): Promise { + const cached = readCache(); + if (cached !== null) return Promise.resolve(cached); + if (inflight) return inflight; + inflight = fetch(GITHUB_API_REPO, { headers: { Accept: "application/vnd.github+json" } }) + .then((r) => (r.ok ? r.json() : null)) + .then((d: { stargazers_count?: number } | null) => { + const n = d && typeof d.stargazers_count === "number" ? d.stargazers_count : null; + if (n !== null) { + try { + localStorage.setItem(CACHE_KEY, JSON.stringify({ v: n, t: Date.now() })); + } catch { + /* ignore unavailable storage */ + } + } + return n; + }) + .catch(() => null) + .finally(() => { + inflight = null; + }); + return inflight; +} + +/** 0..999 → "0".."999"; 1000+ → "1.2k" / "12k". */ +function fmt(n: number): string { + if (n < 1000) return String(n); + const k = n / 1000; + return `${k >= 10 ? Math.round(k) : Number(k.toFixed(1))}k`; +} + +export function GitHubStars({ size = 12 }: { size?: number }) { + const [stars, setStars] = useState(null); + + useEffect(() => { + let active = true; + fetchStars().then((n) => { + if (active && n !== null) setStars(n); + }); + return () => { + active = false; + }; + }, []); + + // Only surface the badge once the repo has traction: hidden while loading, on + // error, and at 0 stars (a freshly public repo shouldn't advertise "★ 0"). + if (stars === null || stars < 1) return null; + + return ( + + · + + + + {fmt(stars)} + + ); +} diff --git a/landing/components/hero.tsx b/landing/components/hero.tsx new file mode 100644 index 00000000..81caad24 --- /dev/null +++ b/landing/components/hero.tsx @@ -0,0 +1,402 @@ +import { Icon } from "@/components/icon"; +import { GhostButton } from "@/components/primitives"; +import { LATEST_RELEASE, VERSION_LABEL } from "@/lib/releases"; + +function HeroVisual() { + // A composed stylized "dispatch" frame — the story Forge tells: an + // issue is filed by a human, picked up by an agent runtime, and runs + // through a plan. Static React, all token-driven. + return ( +
+ {/* faint grid background */} +
+ {/* ember aurora */} +
+ + {/* fake app chrome */} +
+ + + + + + + forge / w/forge / activity + + + + + 3 running · 2 queued + +
+ +
+ {/* Left: an issue card flowing into a plan */} +
+ + +
+ + {/* Right: agent runtimes column */} + +
+
+ ); +} + +function DispatchCard() { + return ( +
+
+ + Dispatching + + FRG-128 +
+
+ Cut chat-stream tail latency below 250ms +
+
+ + + urgent + + + + backend + + + match · capability + + + 🔷 @victor + +
+
+ ); +} + +function PlanProgressCard() { + const steps = [ + { label: "Replay scope on existing keys", state: "done" }, + { label: "Adapter registry · phase 2", state: "running" }, + { label: "Webhook backoff tuning", state: "pending" }, + { label: "Verify p99 < 250ms", state: "pending" }, + ]; + return ( +
+
+ + Plan · auto-dispatch capability matching + + + step 2 / 4 + +
+
+ {steps.map((s, i) => ( +
+ + {s.state === "done" && } + {s.state === "running" && } + + + {s.label} + + {s.state === "running" && ( + + · running + + )} +
+ ))} +
+
+ ); +} + +function RuntimePeek() { + const runtimes = [ + { name: "hermes-prod", provider: "Hermes", tier: "first-class", load: "2 / 3", color: "hsl(210 60% 55%)" }, + { name: "codex-app-server", provider: "Codex App", tier: "first-class", load: "1 / 2", color: "hsl(var(--ember))" }, + { name: "claude-mcp", provider: "Claude Code", tier: "MCP", load: "—", color: "hsl(30 50% 45%)" }, + { name: "codex-cli", provider: "Codex CLI", tier: "MCP", load: "—", color: "hsl(265 30% 50%)" }, + { name: "orca-bridge", provider: "Orca", tier: "connector", load: "—", color: "hsl(150 35% 45%)" }, + ]; + return ( +
+
+ + Runtimes + + 5 connected +
+
+ {runtimes.map((r, i) => { + const tierFg = r.tier === "first-class" ? "hsl(var(--ember))" : r.tier === "MCP" ? "hsl(var(--muted-foreground))" : "hsl(var(--muted-foreground))"; + const tierBg = r.tier === "first-class" ? "hsl(var(--ember) / 0.13)" : "hsl(var(--muted))"; + return ( +
+
+ ); + })} +
+
+ + Add runtime · forge daemon start +
+
+ ); +} + +export function LandingHero() { + return ( +
+
+
+
+
+
+ +
+
+

+ Issue tracking for Humans & Agents. +

+

+ Humans file, agents pick up, humans review — same issues, same plans, same keyboard. One workspace for the work humans and agents do together. +

+ +
+ Self-host in 60 seconds + + github.com/Codename-11/forge + +
+ +
+ + + {VERSION_LABEL} · {LATEST_RELEASE.title} · {LATEST_RELEASE.date} + + · + MIT · Postgres + Node · self-host or fly.io +
+
+ + +
+
+ ); +} diff --git a/landing/components/icon.tsx b/landing/components/icon.tsx new file mode 100644 index 00000000..4fb6e708 --- /dev/null +++ b/landing/components/icon.tsx @@ -0,0 +1,128 @@ +import type { CSSProperties } from "react"; + +/* Forge icon set — minimal stroke-1.6 lucide-style SVGs, ported verbatim + from the prototype's forge-icons.jsx. Centralized so the screens share a + uniform glyph vocabulary that matches the real lucide-react icons in the + app. Each icon renders into viewBox=0 0 24 24 and inherits currentColor. */ + +export const FORGE_ICON_PATHS: Record = { + // ─── sidebar nav (mirrors sidebar-nav.ts) ─── + LayoutDashboard: "M3 3h7v9H3zM14 3h7v5h-7zM14 12h7v9h-7zM3 16h7v5H3z", + Command: + "M15 6V4.5a2.5 2.5 0 1 1 2.5 2.5H16M9 6V4.5A2.5 2.5 0 1 0 6.5 7H8M9 18v1.5a2.5 2.5 0 1 1-2.5-2.5H8M15 18v1.5a2.5 2.5 0 1 0 2.5-2.5H16M8 8h8v8H8z", + Inbox: + "M22 12h-6l-2 3h-4l-2-3H2M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z", + MessageSquare: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z", + CircleDot: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2z", + FolderKanban: "M4 4h5l2 3h9v11a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM8 10v6M12 10v3M16 10v8", + Shield: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z", + Clock: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 7v5l3 2", + CalendarRange: + "M3 6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v13a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM3 10h18M8 2v4M16 2v4M8 14l2 2 4-4", + Compass: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM16.24 7.76l-2.12 6.36-6.36 2.12 2.12-6.36z", + Map: "M9 4l-6 2v14l6-2 6 2 6-2V4l-6 2zM9 4v14M15 6v14", + FileText: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h5", + Target: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM12 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2z", + ListChecks: "M3 5l2 2 4-4M3 12l2 2 4-4M3 19l2 2 4-4M13 6h8M13 13h8M13 20h8", + UsersRound: "M18 21a8 8 0 0 0-16 0M14 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0M22 21v-1a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75", + Sparkles: + "M12 3l1.7 4.6L18 9l-4.3 1.4L12 15l-1.7-4.6L6 9l4.3-1.4zM19 14l.8 2 2.2.6-2.2.6-.8 2-.8-2-2.2-.6 2.2-.6zM5 17l.5 1.3 1.5.4-1.5.4-.5 1.3-.5-1.3-1.5-.4 1.5-.4z", + LineChart: "M3 3v18h18M7 14l3-3 4 4 6-6", + Workflow: "M3 3h6v6H3zM15 3h6v6h-6zM9 9v3h6v3M9 15h6v6H9z", + BookOpen: "M2 4h7a3 3 0 0 1 3 3v14a2 2 0 0 0-2-2H2zM22 4h-7a3 3 0 0 0-3 3v14a2 2 0 0 1 2-2h8z", + Settings: + "M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 0 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 0 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3h.1a1.7 1.7 0 0 0 1-1.5V3a2 2 0 0 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8v.1a1.7 1.7 0 0 0 1.5 1H21a2 2 0 0 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z", + + // ─── shell + ui ─── + Search: "M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.3-4.3", + Plus: "M12 5v14M5 12h14", + Bell: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.94 1.94 0 0 0 3.4 0", + HelpCircle: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h0", + ChevronDown: "M6 9l6 6 6-6", + ChevronRight: "M9 18l6-6-6-6", + ChevronLeft: "M15 18l-6-6 6-6", + MoreHorizontal: "M5 12h.01M12 12h.01M19 12h.01", + PanelLeftClose: "M3 5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 3v18M16 15l-3-3 3-3", + Bot: "M12 8V4M9 4h6M5 8h14a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2zM2 14h2M20 14h2M9 13v2M15 13v2", + AlertTriangle: "M10.3 3.86a2 2 0 0 1 3.4 0l8.5 14a2 2 0 0 1-1.7 3H3.5a2 2 0 0 1-1.7-3zM12 9v4M12 17h0", + ArrowRight: "M5 12h14M12 5l7 7-7 7", + CalendarClock: + "M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h6M16 2v4M8 2v4M3 10h13M17 21a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM17 17v-2.5l1.5 1", + X: "M18 6L6 18M6 6l12 12", + Folder: "M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z", + CheckCheck: "M3 13l4 4L18 6M8 13l4 4L23 6", + Eye: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z", + AtSign: "M16 8v5a3 3 0 1 0 6 0v-1a10 10 0 1 0-3.9 7.9M16 12a4 4 0 1 1-8 0 4 4 0 0 1 8 0", + Zap: "M13 2L3 14h8l-1 8 10-12h-8z", + Sun: "M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4", + Moon: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z", + UserCircle: "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM7 18a5 5 0 0 1 10 0M12 14a3 3 0 1 0 0-6 3 3 0 0 0 0 6z", + GitBranch: "M6 3v12M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM15 6a9 9 0 0 0-9 9", + PaperClip: "M21.4 11l-9.2 9.2a6 6 0 0 1-8.5-8.5l9.2-9.2a4 4 0 0 1 5.7 5.7l-9.2 9.2a2 2 0 0 1-2.8-2.8L15 6", + Activity: "M22 12h-4l-3 9L9 3l-3 9H2", + Link: "M10 13a5 5 0 0 0 7 0l3-3a5 5 0 1 0-7-7L11.5 4.5M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 1 0 7 7l1.5-1.5", + Pin: "M12 17v5M9 9V3h6v6M5 9h14l-2 8H7z", + Filter: "M22 3H2l8 9.5V19l4 2v-8.5z", + ListIcon: "M3 6h18M3 12h18M3 18h18", + Grid: "M3 3h8v8H3zM13 3h8v8h-8zM13 13h8v8h-8zM3 13h8v8H3z", + Loader: "M21 12a9 9 0 1 1-6.2-8.55", + Rocket: + "M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.9.7-2.2-.1-3-.8-.8-2.1-.8-3 .1zM12 15l-3-3a22 22 0 0 1 8-10l3 3a22 22 0 0 1-8 10zM9 12H4l3-3h4M12 15v5l3-3v-4", + Check: "M5 12l5 5L20 7", + + // ─── settings + extras ─── + Users: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8M23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75", + User: "M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2M12 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8", + Tag: "M20.6 13.4l-7.2 7.2a2 2 0 0 1-2.8 0L3 13.1V3h10.1l7.5 7.5a2 2 0 0 1 0 2.9zM7 7h.01", + ClipboardList: "M9 4h6a1 1 0 0 1 1 1v2H8V5a1 1 0 0 1 1-1zM7 5H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 12h8M9 16h6M9 20h4", + Layers: "M12 2L2 7l10 5 10-5zM2 17l10 5 10-5M2 12l10 5 10-5", + Repeat: "M17 1l4 4-4 4M3 11V9a4 4 0 0 1 4-4h14M7 23l-4-4 4-4M21 13v2a4 4 0 0 1-4 4H3", + Plug: "M9 2v6M15 2v6M7 8h10v4a5 5 0 0 1-10 0zM12 17v5", + PlugZap: "M9 2v3M13 2v3M6 5h11l-1.5 6a3 3 0 0 1-3 2H10.5a3 3 0 0 1-3-2zM12 13l-2 5h4l-2 5", + Server: "M3 5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM3 15a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM7 7h.01M7 17h.01", + Send: "M22 2L11 13M22 2l-7 20-4-9-9-4z", + DatabaseBackup: "M4 6a8 3 0 1 0 16 0 8 3 0 1 0-16 0M4 6v6a8 3 0 0 0 11 2.8M4 12v6a8 3 0 0 0 6.6 3M18 14l-3 3 3 3M21 17h-6", + Palette: + "M12 21a9 9 0 1 0 0-18c5 0 9 4 9 8 0 3-2 4-4 4h-3a2 2 0 0 0-1 4 3 3 0 0 1-1 2zM7 13a1 1 0 1 0 0-2 1 1 0 0 0 0 2M10 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2M15 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2", + Key: "M15 11a4 4 0 1 0-4-4M11 7L3 15v4h4l1-1v-2h2v-2h2l1-1z", + KeyRound: "M15 11a4 4 0 1 0-4-4M11 7L2 16v4h4v-2h2v-2h2v-2z", + GripVertical: "M9 5h.01M9 12h.01M9 19h.01M15 5h.01M15 12h.01M15 19h.01", + Bookmark: "M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z", + Download: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3", + Upload: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12", + Terminal: "M4 17l6-6-6-6M12 19h8", +}; + +export type IconName = keyof typeof FORGE_ICON_PATHS; + +export function Icon({ + name, + size = 14, + className = "", + style, +}: { + name: string; + size?: number; + className?: string; + style?: CSSProperties; +}) { + const d = FORGE_ICON_PATHS[name]; + if (!d) return null; + return ( + + ); +} diff --git a/landing/components/logo.tsx b/landing/components/logo.tsx new file mode 100644 index 00000000..74bb93e3 --- /dev/null +++ b/landing/components/logo.tsx @@ -0,0 +1,23 @@ +/* The real Forge app-icon mark — ember tile, paper forge glyph, brown stroke. + Mirrors app/icon.svg and public/brand/forge-app-icon-v2-ember.svg from the + main repo. Inlined (no HTTP request) and theme-independent, like a real logo. */ +export function Logo({ size = 22, className }: { size?: number; className?: string }) { + return ( + + + + + + ); +} diff --git a/landing/components/nav.tsx b/landing/components/nav.tsx new file mode 100644 index 00000000..6d863317 --- /dev/null +++ b/landing/components/nav.tsx @@ -0,0 +1,110 @@ +import { Icon } from "@/components/icon"; +import { GitHubStars } from "@/components/github-stars"; +import { Logo } from "@/components/logo"; +import { GhostButton } from "@/components/primitives"; +import { ThemeToggle } from "@/components/theme-toggle"; +import { REPO_URL, VERSION_SHORT } from "@/lib/releases"; + +export function LandingNav({ compact = false }: { compact?: boolean }) { + // Absolute hrefs so the nav works from every page (the prototype used + // bare in-page anchors, which are dead on /docs and /releases). Docs and + // Changelog route to their real pages. + const links: [string, string][] = [ + ["Features", "/#features"], + ["Runtimes", "/#runtimes"], + ["Docs", "/docs/"], + ["Changelog", "/releases/"], + ["Self-host", "/#self-host"], + ]; + return ( + + ); +} diff --git a/landing/components/pillars.tsx b/landing/components/pillars.tsx new file mode 100644 index 00000000..2eee522d --- /dev/null +++ b/landing/components/pillars.tsx @@ -0,0 +1,209 @@ +import type { ReactNode } from "react"; +import { Icon } from "@/components/icon"; +import { SectionShell } from "@/components/primitives"; + +function PillarCard({ + n, + icon, + title, + blurb, + demo, +}: { + n: string; + icon: string; + title: string; + blurb: string; + demo: ReactNode; +}) { + return ( +
+
+ + + + {n} +
+

{title}

+

{blurb}

+
{demo}
+
+ ); +} + +function PillarIssuesDemo() { + const rows = [ + { id: "FRG-127", title: "MCP scope tightening to GA", st: "In Progress", color: "hsl(var(--ember))" }, + { id: "FRG-128", title: "Cut chat-stream tail latency", st: "In Review", color: "hsl(45 80% 45%)" }, + { id: "FRG-129", title: "Onboarding tour polish", st: "Todo", color: "hsl(var(--muted-foreground))" }, + ]; + return ( +
+ {rows.map((r, i) => ( +
0 ? "1px solid hsl(var(--border) / 0.6)" : "none", + fontSize: 11.5, + }} + > + + {r.id} + {r.title} +
+ ))} +
+ ); +} + +function PillarAgentsDemo() { + return ( +
+ {[ + { name: "@victor", role: "Lead engineer", status: "ONLINE", assigned: 4 }, + { name: "@mizu", role: "Frontend", status: "BUSY", assigned: 2 }, + { name: "@atlas", role: "QA", status: "IDLE", assigned: 0 }, + ].map((a, i) => ( +
+ {a.name} + + {a.status} + + {a.role} + {a.assigned} open +
+ ))} +
+ ); +} + +function PillarPlanningDemo() { + return ( +
+ + + + + + + + {/* sprint progress shape */} + + + {/* markers */} + {[30, 90, 150, 210].map((x, i) => ( + + ))} + +
+ Sprint 1 + 42% · on track +
+
+ ); +} + +function PillarMcpDemo() { + return ( +
+      ${" "}
+      forge{" "}
+      mcp connect{" "}
+      --profile=victor
+      {"\n"}
+      ✓ signed handshake · 14 tools registered
+    
+ ); +} + +export function LandingPillars() { + return ( + +
+ } + /> + } + /> + } + /> + } + /> +
+
+ ); +} diff --git a/landing/components/planning.tsx b/landing/components/planning.tsx new file mode 100644 index 00000000..189d7d15 --- /dev/null +++ b/landing/components/planning.tsx @@ -0,0 +1,122 @@ +import { Icon } from "@/components/icon"; +import { SectionShell } from "@/components/primitives"; + +export function LandingPlanning() { + return ( + +
+
+ {[ + { icon: "Target", title: "Goals roll up to initiatives", body: "Quarter-scale outcomes hold the bigger picture. Plans and issues attach to the goals they advance — progress is computed, not promised." }, + { icon: "Workflow", title: "Plans break work into ordered steps", body: "Each step has owners, budgets, and a status. Agents run their steps; humans review them. Both speak the same vocabulary." }, + { icon: "Activity", title: "Activity dock — chord G then 5", body: "One pill, six tabs: Live, Queue, Agents, History, Chat, Admin. Always one keystroke from the work that's running right now." }, + ].map((row, i) => ( +
+ + + +
+

{row.title}

+

{row.body}

+
+
+ ))} +
+ +
+
+ ); +} + +function PlanningVisual() { + // A composed visualization: sprint progress + goals breakdown + activity pill + return ( +
+ {/* Sprint header */} +
+ + Sprint 1 · May 21 → May 28 + + + + + 42% complete + +
+ + {/* Progress bar */} +
+
+
+ + {/* Goals */} +
+ {[ + { title: "Ship MCP scope tightening to GA", done: 8, total: 12, budget: "$16.42 / $40.00" }, + { title: "Cut chat-stream tail latency < 250ms", done: 5, total: 8, budget: "$6.10 / $20.00" }, + { title: "Onboarding · time-to-first-issue < 90s", done: 4, total: 9, budget: "$3.85 / $12.00" }, + ].map((g, i) => ( +
+
+ + {g.title} + {g.done}/{g.total} steps +
+
+
+
+
+ + budget {g.budget} +
+
+ ))} +
+ + {/* Activity pill floating */} +
+ + + + + 3 running + · 2 queued · 0 stalled + + G 5 +
+
+ ); +} diff --git a/landing/components/primitives.tsx b/landing/components/primitives.tsx new file mode 100644 index 00000000..e9526d68 --- /dev/null +++ b/landing/components/primitives.tsx @@ -0,0 +1,178 @@ +import type { CSSProperties, ReactNode } from "react"; +import { Icon } from "@/components/icon"; + +/* Small primitives local to the landing site — ported from the prototype's + landing-sections.jsx. Visuals are token-driven inline styles; the only + additions over the prototype are responsive class hooks (.lnd-btn / + .lnd-pad) defined in globals.css and a clamp() on the section title. */ + +export function Eyebrow({ + children, + tone = "muted", +}: { + children: ReactNode; + tone?: "muted" | "ember"; +}) { + return ( +
+ {children} +
+ ); +} + +export function GhostButton({ + children, + icon, + kbd, + href = "#", + primary = false, + mono = false, + style, +}: { + children: ReactNode; + icon?: string; + kbd?: string; + href?: string; + primary?: boolean; + mono?: boolean; + style?: CSSProperties; +}) { + return ( + + {icon && } + {children} + {kbd && ( + + {kbd} + + )} + + ); +} + +export function SectionShell({ + id, + eyebrow, + title, + titleAs = "h2", + kicker, + children, + pad = "120px 96px", + padClass = "lnd-pad", + bg, + style, +}: { + id?: string; + eyebrow?: ReactNode; + title?: ReactNode; + /** Heading level for the title. Sub-pages pass "h1" so each page has one. */ + titleAs?: "h1" | "h2"; + kicker?: ReactNode; + children?: ReactNode; + pad?: string; + /** Responsive padding hook. Product strip uses "lnd-pad-left" to keep its + * right-edge bleed; everything else uses the default "lnd-pad". */ + padClass?: string; + bg?: string; + style?: CSSProperties; +}) { + const TitleTag = titleAs; + return ( +
+ {(eyebrow || title || kicker) && ( +
+ {eyebrow && ( +
+ {eyebrow} +
+ )} + {title && ( + + {title} + + )} + {kicker && ( +

+ {kicker} +

+ )} +
+ )} + {children} +
+ ); +} diff --git a/landing/components/product-strip.tsx b/landing/components/product-strip.tsx new file mode 100644 index 00000000..a4052313 --- /dev/null +++ b/landing/components/product-strip.tsx @@ -0,0 +1,263 @@ +import type { ReactNode } from "react"; +import { Icon } from "@/components/icon"; +import { SectionShell } from "@/components/primitives"; + +/* Landing-site sections part 2: product strip, planning/activity callouts, + self-host, releases, docs, footer + page-level compositions. */ + +// ========================================================================= +// MINI SCREENS — stylized previews of Screens Board surfaces +// ========================================================================= + +type MiniFrameLabel = { n: string; name: string; path: string }; + +function MiniFrame({ + label, + width = 380, + height = 240, + children, +}: { + label: MiniFrameLabel; + width?: number; + height?: number; + children?: ReactNode; +}) { + return ( +
+
+ {/* chrome */} +
+ + + + + + {label.path} +
+
+ {children} +
+
+
+ {label.n} + {label.name} +
+
+ ); +} + +function MiniMissionControl() { + const rows = [ + { st: "running", title: "Auto-dispatch capability matching", agent: "@victor", color: "hsl(var(--ember))" }, + { st: "running", title: "Slow board query investigation", agent: "@victor", color: "hsl(var(--ember))" }, + { st: "queued", title: "Inbox triage walkthrough", agent: "@mizu", color: "hsl(var(--muted-foreground))" }, + { st: "done", title: "Webhook delivery backoff", agent: "@victor", color: "hsl(var(--success))" }, + ]; + return ( +
+
+ + ACTIVITY · LIVE · 3 running +
+ {rows.map((r, i) => ( +
+ + {r.title} + {r.agent} +
+ ))} +
+ ); +} + +function MiniIssueDetail() { + return ( +
+
+ FRG-128 + In progress +
+
+ Cut chat-stream tail latency below 250ms +
+
+ {["urgent","backend","perf"].map((l) => ( + {l} + ))} +
+
+ Backpressure on the ingest queue is dominating tail. Likely fix lives in the new adapter registry — gating GA. +
+
+ V + @victor began plan · 23m +
+
+ ); +} + +function MiniBoard() { + const cols = [ + { name: "Todo", items: 4, color: "hsl(var(--muted-foreground))" }, + { name: "In progress", items: 3, color: "hsl(var(--ember))" }, + { name: "Review", items: 2, color: "hsl(45 80% 45%)" }, + { name: "Done", items: 6, color: "hsl(var(--success))" }, + ]; + return ( +
+ {cols.map((c, i) => ( +
+
+ + {c.name} + {c.items} +
+ {Array.from({ length: c.items }).map((_, j) => ( +
+ {["MCP scope", "Auth flow", "Backoff", "Sample data", "Empty-state", "Quota guard", "Cycle edge"][j % 7]} +
+ ))} +
+ ))} +
+ ); +} + +function MiniAgents() { + const agents = [ + { name: "victor", provider: "Hermes", status: "ONLINE", load: "2/3", glyph: "🔷", accent: "hsl(210 60% 55%)" }, + { name: "mizu", provider: "Hermes", status: "BUSY", load: "1/2", glyph: "💧", accent: "hsl(210 60% 55%)" }, + { name: "atlas", provider: "Codex App", status: "ONLINE", load: "0/2", glyph: "▲", accent: "hsl(var(--ember))" }, + { name: "rune", provider: "Codex CLI", status: "IDLE", load: "—", glyph: "▣", accent: "hsl(265 30% 45%)" }, + ]; + return ( +
+ {agents.map((a, i) => ( +
+ {a.glyph} + @{a.name} + {a.provider} + + {a.status} + {a.load} +
+ ))} +
+ ); +} + +function MiniDispatch() { + const rules = [ + { match: "label:urgent + label:backend", target: "@victor", priority: 1 }, + { match: "label:frontend", target: "@mizu", priority: 2 }, + { match: "label:qa", target: "@atlas", priority: 3 }, + ]; + return ( +
+
dispatch rules · priority order
+ {rules.map((r, i) => ( +
+ {r.priority} + {r.match} + + {r.target} +
+ ))} +
+ ); +} + +export function LandingProductStrip() { + return ( + +
+ + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/landing/components/releases-section.tsx b/landing/components/releases-section.tsx new file mode 100644 index 00000000..a7d30f93 --- /dev/null +++ b/landing/components/releases-section.tsx @@ -0,0 +1,56 @@ +import { GhostButton, SectionShell } from "@/components/primitives"; +import { RELEASES, type Release } from "@/lib/releases"; + +export function ReleaseRow({ r, expanded }: { r: Release; expanded?: boolean }) { + return ( +
+
+ {r.v} + {r.date} + {r.tag} +
+
+

{r.title}

+
    + {r.bullets.map((b, i) => ( +
  • + + {b} +
  • + ))} +
+
+
+ ); +} + +export function LandingReleasesPreview() { + return ( + +
+ {RELEASES.map((r, i) => )} +
+
+ See all releases + github.com/.../releases +
+
+ ); +} diff --git a/landing/components/runtimes.tsx b/landing/components/runtimes.tsx new file mode 100644 index 00000000..d3818e1b --- /dev/null +++ b/landing/components/runtimes.tsx @@ -0,0 +1,273 @@ +import type { ReactNode } from "react"; +import { Icon } from "@/components/icon"; +import { SectionShell } from "@/components/primitives"; + +function RuntimeCard({ + tier, + name, + blurb, + blurbColor, + mode, + status, + snippet, + snippetLabel, + accent, + glyph, +}: { + tier: string; + name: string; + blurb: string; + blurbColor?: string; + mode: string; + status: string; + snippet: ReactNode; + snippetLabel?: string; + accent: string; + glyph: string; +}) { + return ( +
+
+ + {glyph} + +
+ {name} + + {mode} + +
+ + + {tier} + +
+

+ {blurb} +

+ +
+        {snippetLabel}
+        {"\n"}
+        {snippet}
+      
+ +
+ + {status} + + + Setup guide + +
+
+ ); +} + +function TierHeader({ n, label, blurb }: { n: string; label: string; blurb: string }) { + return ( +
+ {n} + {label} + + {blurb} +
+ ); +} + +export function LandingRuntimes() { + return ( + + +
+ + [runtime.hermes]{"\n"} + endpoint = "https://hermes.forge.local"{"\n"} + providers = ["openai", "anthropic"]{"\n"} + # forge daemon start + + } + /> + + [runtime.codex-app]{"\n"} + endpoint = "ws://127.0.0.1:4500"{"\n"} + providers = ["openai"]{"\n"} + # tier-2 capacity by default + + } + /> +
+ + +
+ + {"{"} "forge": {"{ "} + "url": "https://forge/mcp" {"} }"} + + } + /> + + codex mcp add forge \{"\n"} + {" "}--url https://forge/mcp{"\n"} + codex run "triage FRG-128" + + } + /> +
+ + +
+ + workspace: forge.local/w/forge{"\n"} + auto_open: true{"\n"} + # onorca.dev + + } + /> + + {"{ "}"kind": "REMOTE_HTTP",{"\n"} + {" "}"endpoint": "https://yours.dev" {"}"} + + } + /> + + ✓ registered as{" "} + local-daemon{"\n"} + ✓ heartbeat · 12s{"\n"} + ✓ mcp · 14 tools + + } + /> +
+
+ ); +} diff --git a/landing/components/self-host.tsx b/landing/components/self-host.tsx new file mode 100644 index 00000000..0f8add08 --- /dev/null +++ b/landing/components/self-host.tsx @@ -0,0 +1,82 @@ +import { Icon } from "@/components/icon"; +import { GhostButton, SectionShell } from "@/components/primitives"; +import { VERSION_LABEL } from "@/lib/releases"; + +export function LandingSelfHost() { + return ( + +
+ {/* Code block */} +
+          
+            install.sh
+          
+          # 1. Clone{"\n"}
+          $ git clone github.com/Codename-11/forge{"\n"}
+          $ cd forge{"\n"}
+          {"\n"}
+          # 2. Bring up Postgres + the app{"\n"}
+          $ docker compose up -d{"\n"}
+          {"\n"}
+          # 3. Seed a workspace with sample data{"\n"}
+          $ pnpm run seed --workspace forge{"\n"}
+          {"\n"}
+          # 4. Start the local daemon{"\n"}
+          $ forge daemon start{"\n"}
+          ✓ http://localhost:3000{"\n"}
+          ✓ mcp at /api/mcp{"\n"}
+          ✓ heartbeat · 14s ago
+        
+ + {/* Side panel */} +
+ {[ + { icon: "Server", title: "Postgres + Node", body: "Nothing exotic. Runs alongside your other Next.js apps. Migrations via Prisma." }, + { icon: "Shield", title: "Your data, your box", body: "OIDC, Authelia, Keycloak, Okta — bring your own. API keys never leave Postgres." }, + { icon: "Plug", title: "MCP everywhere", body: "Every action is a tool. Wire Hermes, Orca, Claude Code, or your own bridge." }, + { icon: "GitBranch", title: "MIT, no rug-pull", body: "Build on it. Fork it. Run it forever. Releases tag every 1–2 weeks." }, + ].map((it, i) => ( +
+ + + +
+

{it.title}

+

{it.body}

+
+
+ ))} +
+
+ +
+ Download {VERSION_LABEL} + Read the install guide + github.com/Codename-11/forge +
+
+ ); +} diff --git a/landing/components/theme-provider.tsx b/landing/components/theme-provider.tsx new file mode 100644 index 00000000..4aa2a71d --- /dev/null +++ b/landing/components/theme-provider.tsx @@ -0,0 +1,23 @@ +"use client"; + +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import type { ComponentProps } from "react"; + +/** + * Class-based theme provider. Toggles `.dark` on (matches the + * Forge token system + the prototype's tweaks panel), defaults to the + * OS preference, and persists the user's choice. + */ +export function ThemeProvider({ children, ...props }: ComponentProps) { + return ( + + {children} + + ); +} diff --git a/landing/components/theme-toggle.tsx b/landing/components/theme-toggle.tsx new file mode 100644 index 00000000..f5dbe086 --- /dev/null +++ b/landing/components/theme-toggle.tsx @@ -0,0 +1,42 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useTheme } from "next-themes"; +import { Icon } from "@/components/icon"; + +/** + * Light/dark toggle for the nav. Renders a stable placeholder until + * mounted so SSR markup matches the first client paint (next-themes + * can't know the resolved theme on the server). + */ +export function ThemeToggle() { + const [mounted, setMounted] = useState(false); + const { resolvedTheme, setTheme } = useTheme(); + useEffect(() => setMounted(true), []); + + const isDark = resolvedTheme === "dark"; + const next = isDark ? "light" : "dark"; + + return ( + + ); +} diff --git a/landing/eslint.config.mjs b/landing/eslint.config.mjs new file mode 100644 index 00000000..88fd9dd0 --- /dev/null +++ b/landing/eslint.config.mjs @@ -0,0 +1,30 @@ +import { FlatCompat } from "@eslint/eslintrc"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ baseDirectory: __dirname }); + +export default [ + ...compat.extends("next/core-web-vitals", "next/typescript"), + { ignores: ["out/**", ".next/**", "node_modules/**"] }, + { + rules: { + // The runtime/self-host sections render real code snippets as JSX text + // (forge.toml, mcp.json, install.sh) — the literal quotes are content, + // not prose, so escaping them would corrupt what's displayed. + "react/no-unescaped-entities": "off", + // This is a static-export marketing site built on inline-styled + // elements; plain anchors are intentional (full-page nav between the + // three static pages is instant). We don't use next/link here. + "@next/next/no-html-link-for-pages": "off", + "@typescript-eslint/consistent-type-imports": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, + ], + }, + }, +]; diff --git a/landing/lib/releases.ts b/landing/lib/releases.ts new file mode 100644 index 00000000..ebdc42e7 --- /dev/null +++ b/landing/lib/releases.ts @@ -0,0 +1,128 @@ +/** + * Real release data for the landing site, sourced from the repo at BUILD TIME. + * + * The landing lives inside the Forge repo, so at build we read the canonical + * version from `../package.json` and the curated changelog from + * `../CHANGELOG.md` (the same file the app's "What's New" rail reads). This + * keeps the site accurate on every rebuild without hand-maintained copy. + * + * The repo is public, so the live star count is fetched client-side at runtime + * (see `components/github-stars.tsx`, which hits `GITHUB_API_REPO`). Version and + * changelog stay build-time-from-repo — they only change on a release. + * + * Everything degrades to a baked-in real fallback if the repo files aren't + * found (e.g. the landing built in isolation), so the build never breaks. + */ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +export type Release = { + v: string; + date: string; + tag: "patch" | "minor" | "major"; + title: string; + bullets: string[]; +}; + +// Repo identity / GitHub endpoints live in a Node-free module so the client +// star badge can import them without pulling this file's build-time fs reads. +export { REPO_URL, REPO_OWNER, REPO_NAME, GITHUB_API_REPO } from "./repo"; + +// ── repo file access (build-time only) ────────────────────────────────────── +function repoFile(name: string): string | null { + for (const base of [join(process.cwd(), ".."), process.cwd(), join(process.cwd(), "..", "..")]) { + try { + return readFileSync(join(base, name), "utf8"); + } catch { + /* try next candidate */ + } + } + return null; +} + +const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +function fmtDate(iso: string): string { + const [y, m, d] = iso.split("-").map(Number); + if (!y || !m || !d) return iso; + return `${MONTHS[m - 1]} ${d}, ${y}`; +} + +function tagFor(v: string): Release["tag"] { + const [maj, min, pat] = v.replace(/^v/, "").split(".").map((n) => Number(n) || 0); + if ((pat ?? 0) > 0) return "patch"; + if ((min ?? 0) > 0) return "minor"; + return maj >= 1 ? "major" : "minor"; +} + +// ── changelog parser ──────────────────────────────────────────────────────── +// Headings look like: ## [2026-06-09] — v0.7.0 · Chat runtime controls +function parseChangelog(md: string): Release[] { + const out: Release[] = []; + let cur: Release | null = null; + for (const line of md.split("\n")) { + const h = line.match(/^##\s+\[(\d{4}-\d{2}-\d{2})\]\s*[—-]\s*(v\d+\.\d+\.\d+)\s*·?\s*(.*)$/); + if (h) { + if (cur) out.push(cur); + const [, date, v, title] = h; + cur = { v, date: fmtDate(date), tag: tagFor(v), title: title.trim() || v, bullets: [] }; + continue; + } + if (line.startsWith("## ")) { + // Unreleased / other section — close the current release. + if (cur) out.push(cur); + cur = null; + continue; + } + if (cur && cur.bullets.length < 6) { + const b = line.match(/^\s*-\s+(.+)$/); + if (b) { + const bold = b[1].match(/^\*\*(.+?)\*\*/); + const text = (bold ? bold[1] : b[1].replace(/\*\*/g, "")).trim().replace(/[.:]\s*$/, ""); + if (text) cur.bullets.push(text); + } + } + } + if (cur) out.push(cur); + return out; +} + +// ── baked fallback (real values, used only if repo files are unavailable) ──── +const FALLBACK: Release[] = [ + { v: "v0.7.0", date: "Jun 9, 2026", tag: "minor", title: "Chat runtime controls", bullets: ["Runtime model and mode controls", "Conversation-level YOLO overrides", "Workspace default issue assignee"] }, + { v: "v0.6.0", date: "Jun 9, 2026", tag: "minor", title: "GitHub support and sprint planning", bullets: ["Shared GitHub Apps for runtime git auth", "Per-project repositories", "Sprint planning"] }, + { v: "v0.5.1", date: "Jun 6, 2026", tag: "patch", title: "Android PWA install and push", bullets: ["Installable Android PWA", "Web push notifications"] }, + { v: "v0.5.0", date: "Jun 6, 2026", tag: "minor", title: "Agent runroom views", bullets: ["Agent runroom", "Live run streaming"] }, + { v: "v0.4.2", date: "Jun 3, 2026", tag: "patch", title: "Build version reporting", bullets: ["Build identity in Settings → About"] }, +]; + +// ── resolved data (computed once at module load = build time) ──────────────── +const changelog = repoFile("CHANGELOG.md"); +const parsed = changelog ? parseChangelog(changelog) : []; +const all = parsed.length ? parsed : FALLBACK; + +function pkgVersion(): string { + const raw = repoFile("package.json"); + if (raw) { + try { + const v = JSON.parse(raw).version; + if (typeof v === "string" && v) return v; + } catch { + /* fall through */ + } + } + return (all[0]?.v ?? "v0.7.0").replace(/^v/, ""); +} + +/** Canonical version, e.g. "0.7.0". */ +export const SITE_VERSION = pkgVersion(); +/** "v0.7.0" */ +export const VERSION_LABEL = `v${SITE_VERSION}`; +/** "v0.7" — major.minor, for the compact nav badge. */ +export const VERSION_SHORT = `v${SITE_VERSION.split(".").slice(0, 2).join(".")}`; +/** Most recent release (for the hero / footer "latest" lines). */ +export const LATEST_RELEASE: Release = all[0] ?? FALLBACK[0]; + +/** Latest 3 — landing changelog preview. */ +export const RELEASES: Release[] = all.slice(0, 3); +/** Up to 10 — the full /releases page. */ +export const RELEASES_ALL: Release[] = all.slice(0, 10); diff --git a/landing/lib/repo.ts b/landing/lib/repo.ts new file mode 100644 index 00000000..f7b5bed6 --- /dev/null +++ b/landing/lib/repo.ts @@ -0,0 +1,11 @@ +/** + * Repo identity + GitHub endpoints. Kept in a **Node-free** module (no + * `node:fs`/`node:path`) so client components — e.g. the live star badge in + * `components/github-stars.tsx` — can import these without dragging the + * build-time file reads in `lib/releases.ts` into the browser bundle. + */ +export const REPO_OWNER = "Codename-11"; +export const REPO_NAME = "Forge"; +export const REPO_URL = "https://github.com/Codename-11/forge"; +/** GitHub REST endpoint for the repo — used by the live star-count badge. */ +export const GITHUB_API_REPO = `https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}`; diff --git a/landing/next.config.ts b/landing/next.config.ts new file mode 100644 index 00000000..83d8f01d --- /dev/null +++ b/landing/next.config.ts @@ -0,0 +1,26 @@ +import type { NextConfig } from "next"; +import path from "node:path"; + +/** + * Forge landing site — standalone Next.js app. + * + * `output: "export"` emits a fully static site to `out/`, so it can be + * hosted on any static host (GitHub Pages, S3/CloudFront, Netlify, Vercel, + * or behind the same reverse proxy as the app). No Node server required. + * + * If you later need server features (ISR, route handlers), drop the + * `output` line and deploy as a normal Next server. + */ +const nextConfig: NextConfig = { + output: "export", + // Static export can't use the Image Optimization API. + images: { unoptimized: true }, + // Emit `dir/index.html` so static hosts resolve clean URLs (`/releases`). + trailingSlash: true, + reactStrictMode: true, + // This app has its own lockfile; pin tracing to it so Next doesn't infer + // the parent monorepo root (the main Forge app's lockfile sits above). + outputFileTracingRoot: path.join(import.meta.dirname, "."), +}; + +export default nextConfig; diff --git a/landing/package.json b/landing/package.json new file mode 100644 index 00000000..afa5ed85 --- /dev/null +++ b/landing/package.json @@ -0,0 +1,32 @@ +{ + "name": "forge-landing", + "version": "0.1.0", + "private": true, + "description": "Forge — public landing site. Standalone Next.js app (static export), decoupled from the main Forge application.", + "scripts": { + "dev": "next dev --turbo --hostname 0.0.0.0 --port 3200", + "build": "next build", + "start": "next start --hostname 0.0.0.0 --port 3200", + "serve": "npx serve out -l tcp://0.0.0.0:3200", + "lint": "next lint", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "next": "^15.5.15", + "next-themes": "^0.4.4", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.3.5", + "@types/node": "^22.10.2", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "autoprefixer": "^10.4.20", + "eslint": "^9", + "eslint-config-next": "^15.5.15", + "postcss": "^8.5.0", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.2" + } +} diff --git a/landing/pnpm-lock.yaml b/landing/pnpm-lock.yaml new file mode 100644 index 00000000..13d72882 --- /dev/null +++ b/landing/pnpm-lock.yaml @@ -0,0 +1,3913 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + next: + specifier: ^15.5.15 + version: 15.5.19(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next-themes: + specifier: ^0.4.4 + version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: + specifier: ^19.0.0 + version: 19.2.7 + react-dom: + specifier: ^19.0.0 + version: 19.2.7(react@19.2.7) + devDependencies: + '@eslint/eslintrc': + specifier: ^3.3.5 + version: 3.3.5 + '@types/node': + specifier: ^22.10.2 + version: 22.19.21 + '@types/react': + specifier: ^19.0.2 + version: 19.2.17 + '@types/react-dom': + specifier: ^19.0.2 + version: 19.2.3(@types/react@19.2.17) + autoprefixer: + specifier: ^10.4.20 + version: 10.5.0(postcss@8.5.15) + eslint: + specifier: ^9 + version: 9.39.4(jiti@1.21.7) + eslint-config-next: + specifier: ^15.5.15 + version: 15.5.19(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + postcss: + specifier: ^8.5.0 + version: 8.5.15 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.19 + typescript: + specifier: ^5.7.2 + version: 5.9.3 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + 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.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + 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.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + 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} + + '@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/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@next/env@15.5.19': + resolution: {integrity: sha512-sWWluFvcv5v3Fxznmf2ZfjyoVQt/64oCnYqS90inQWGzMPK1VjvekPiz3OPHKmFT30EnHrjlbyaHLt3M0vWabw==} + + '@next/eslint-plugin-next@15.5.19': + resolution: {integrity: sha512-Ctwb4qYuMbHN/1oXLlTdMchwG8h8Xzwq+wGZZMgF3o6+uwyBKAI2c96bdOsl+C62PaUD0Jkh+QpNkhUeDlam0Q==} + + '@next/swc-darwin-arm64@15.5.19': + resolution: {integrity: sha512-jx9wWlTKueHKPvVOndyr7WuaevWCkuYqsQ8gC0TMPKAVWG3MhcdMrjfo9tvIZNXd0QOUYXXvAcZ325y8Uq7uzg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.19': + resolution: {integrity: sha512-291KFcsIQ3OenRdiUDFOR6W3wezzH4auENXm1gbm1Bjd4ANMMRgxPrWTUztQN43BnVoVuMnHCrLeECIMwgFKbA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.5.19': + resolution: {integrity: sha512-WeH+nelQyyMeE2f8FxBRZNrGipya5zHZV2vjzfCOAYyiI6am+NbnWAAldOBFQBB2w0DjJcsvrKqoFT2b7+5YoA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@15.5.19': + resolution: {integrity: sha512-5xTOE0lDlDCSSfp+BAif7j17VRRCjWp//ZPZy6NI0QpdrhxtQnsZguSx0xAAZ0c9XZLrLLwCe/XVe5YPrRilKw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@15.5.19': + resolution: {integrity: sha512-LTxRmMgqqMv05Had879W00Fm53quiJd3Zuz8h1JSNJ3nGSlbZ/7Tjs1tKyScgN3Au3t3MyPsjPlq60fMmSHLsg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@15.5.19': + resolution: {integrity: sha512-eoNQSpA5PQfB9wBO4RA47MTDXWz1fizy9Y3Z6e4DetYIF3dvjuu8sj7aIGn/bFCU6lnFzTK34NtCaffP4NsQ7Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@15.5.19': + resolution: {integrity: sha512-6UNt2dFuCHOe446sm/Kp69nUe8/wIhnh9bm6Xcqw4qEWCOppLMOvhTBVgvM7invVUNr4SPpP6NOQsACtn2IN9Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.19': + resolution: {integrity: sha512-PhmojAHyqMne56HBLGu9dhDnHPuFmEjrXSQMM/nW0J6j849lk3ESrVtqNJcCk8CKOV7brpTTbaYAjwKPzKM69w==} + engines: {node: '>= 10'} + 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'} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.16.1': + resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@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.19.21': + resolution: {integrity: sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + + '@typescript-eslint/eslint-plugin@8.61.1': + resolution: {integrity: sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.61.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.61.1': + resolution: {integrity: sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==} + 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' + + '@typescript-eslint/project-service@8.61.1': + resolution: {integrity: sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.61.1': + resolution: {integrity: sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.61.1': + resolution: {integrity: sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.61.1': + resolution: {integrity: sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==} + 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' + + '@typescript-eslint/types@8.61.1': + resolution: {integrity: sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.61.1': + resolution: {integrity: sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.61.1': + resolution: {integrity: sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==} + 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' + + '@typescript-eslint/visitor-keys@8.61.1': + resolution: {integrity: sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + 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'} + + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.12.1: + resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} + 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} + + baseline-browser-mapping@2.10.37: + resolution: {integrity: sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + 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'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001799: + resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + 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==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + 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: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.374: + resolution: {integrity: sha512-HCF5i7izveksHSGqa7mhDh6tr3Uz9Dar2RAjwuh69bw3QGPVObjQIgLwQWeO/Rxp9/r0KdboKy9RbpQDl97fjg==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + 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.3.3: + resolution: {integrity: sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==} + 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.1: + resolution: {integrity: sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.5.19: + resolution: {integrity: sha512-UZwkuhBCNxVZfo93MSHRDOVNWXooJJGcAUyTAVIp0+9QFhH4SqJxWY0s6Mk9C2kMi777HPMn3dseOrZshWpG9Q==} + 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.13.0: + resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + 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.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + 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'} + + 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-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + 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.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + 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.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + 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.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + 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'} + + 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'} + + 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.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + 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'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + 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-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + 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.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + 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-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@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + 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'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + 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'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@15.5.19: + resolution: {integrity: sha512-xNOW6tYshGX1/Oi3F8uuk4gpDeWsSUE/1Z0G5uUMekIxaQ0xc03UXd9II0VQHYMWviMeA0OHpJFAKsHf8bTYVg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + 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.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + 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.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + 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==} + + 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.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + 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.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.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@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + 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'} + + 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.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + engines: {node: '>=10'} + 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.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + 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'} + + 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==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + 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 + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: 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'} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + 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' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + 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'} + + 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.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + 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.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + 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.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + 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/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': + dependencies: + eslint: 9.39.4(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@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.5': + 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.2.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.4': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@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/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.11.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@next/env@15.5.19': {} + + '@next/eslint-plugin-next@15.5.19': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.5.19': + optional: true + + '@next/swc-darwin-x64@15.5.19': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.19': + optional: true + + '@next/swc-linux-arm64-musl@15.5.19': + optional: true + + '@next/swc-linux-x64-gnu@15.5.19': + optional: true + + '@next/swc-linux-x64-musl@15.5.19': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.19': + optional: true + + '@next/swc-win32-x64-msvc@15.5.19': + 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.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.16.1': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/node@22.19.21': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.2.3(@types/react@19.2.17)': + dependencies: + '@types/react': 19.2.17 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.61.1(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/type-utils': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.61.1 + eslint: 9.39.4(jiti@1.21.7) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.61.1 + debug: 4.4.3 + eslint: 9.39.4(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.61.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@5.9.3) + '@typescript-eslint/types': 8.61.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.61.1': + dependencies: + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/visitor-keys': 8.61.1 + + '@typescript-eslint/tsconfig-utils@8.61.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.4(jiti@1.21.7) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.61.1': {} + + '@typescript-eslint/typescript-estree@8.61.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.61.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@5.9.3) + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/visitor-keys': 8.61.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.4 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@5.9.3) + eslint: 9.39.4(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.61.1': + dependencies: + '@typescript-eslint/types': 8.61.1 + eslint-visitor-keys: 5.0.1 + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.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 + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + + 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.1.9: + 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 + get-intrinsic: 1.3.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: {} + + autoprefixer@10.5.0(postcss@8.5.15): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001799 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.15 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.12.1: {} + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.37: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.37 + caniuse-lite: 1.0.30001799 + electron-to-chromium: 1.5.374 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + 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: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001799: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + client-only@0.0.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.2.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@2.1.2: + optional: true + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.374: {} + + emoji-regex@9.2.2: {} + + 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 + + es-abstract@1.24.2: + dependencies: + 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.1 + 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.1 + 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.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.3.3: + 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 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.1: + dependencies: + es-abstract-get: 1.0.0 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.5.19(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3): + dependencies: + '@next/eslint-plugin-next': 15.5.19 + '@rushstack/eslint-patch': 1.16.1 + '@typescript-eslint/eslint-plugin': 8.61.1(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.4(jiti@1.21.7) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.4(jiti@1.21.7)) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.4(jiti@1.21.7) + get-tsconfig: 4.14.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.17 + unrs-resolver: 1.12.2 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.4(jiti@1.21.7) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + 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.4(jiti@1.21.7) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) + hasown: 2.0.4 + is-core-module: 2.16.2 + 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.1 + string.prototype.trimend: 1.0.10 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.61.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.12.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.4(jiti@1.21.7) + 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.4(jiti@1.21.7)): + dependencies: + eslint: 9.39.4(jiti@1.21.7) + + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): + dependencies: + array-includes: 3.1.9 + 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.3.3 + eslint: 9.39.4(jiti@1.21.7) + 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.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.4(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@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.9 + 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: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + 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-glob@3.3.3: + 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.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fraction.js@5.3.4: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + 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 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + 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 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + 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 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.8.4 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + 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 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + 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 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + 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 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.12: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + next@15.5.19(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@next/env': 15.5.19 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001799 + postcss: 8.4.31 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + styled-jsx: 5.1.6(react@19.2.7) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.19 + '@next/swc-darwin-x64': 15.5.19 + '@next/swc-linux-arm64-gnu': 15.5.19 + '@next/swc-linux-arm64-musl': 15.5.19 + '@next/swc-linux-x64-gnu': 15.5.19 + '@next/swc-linux-x64-musl': 15.5.19 + '@next/swc-win32-arm64-msvc': 15.5.19 + '@next/swc-win32-x64-msvc': 15.5.19 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + node-releases@2.0.47: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + 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.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.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: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + + postcss-js@4.1.0(postcss@8.5.15): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.15 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.15 + + postcss-nested@6.2.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-selector-parser: 6.1.4 + + postcss-selector-parser@6.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.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.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-is@16.13.1: {} + + react@19.2.7: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + 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@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + 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@6.3.1: {} + + semver@7.8.4: {} + + 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.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + 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 + + source-map-js@1.2.1: {} + + stable-hash@0.0.5: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 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.0.12: + 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.7): + dependencies: + client-only: 0.0.1 + react: 19.2.7 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@3.4.19: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.1.0(postcss@8.5.15) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15) + postcss-nested: 6.2.0(postcss@8.5.15) + postcss-selector-parser: 6.1.4 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-interface-checker@0.1.13: {} + + 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 + + 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.4: + dependencies: + available-typed-arrays: 1.0.7 + 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 + 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.9.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 + + undici-types@6.21.0: {} + + unrs-resolver@1.12.2: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + 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.22 + + 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.22: + 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/landing/postcss.config.mjs b/landing/postcss.config.mjs new file mode 100644 index 00000000..2aa7205d --- /dev/null +++ b/landing/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/landing/public/icons/forge-icon-192.png b/landing/public/icons/forge-icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b74a441f8056a620f375e84b76e5f6116d23618b GIT binary patch literal 9638 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

hWrKRRjrW8 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 literal 0 HcmV?d00001 diff --git a/landing/public/icons/forge-icon-512.png b/landing/public/icons/forge-icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..89f6b97abfc319af84d6300e52518ae39de77730 GIT binary patch literal 44627 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 z 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 j^nWApzY+L9rqg- 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", + foreground: "hsl(var(--foreground) / )", + card: { DEFAULT: "hsl(var(--card) / )", foreground: "hsl(var(--card-foreground) / )" }, + popover: { DEFAULT: "hsl(var(--popover) / )", foreground: "hsl(var(--popover-foreground) / )" }, + muted: { DEFAULT: "hsl(var(--muted) / )", foreground: "hsl(var(--muted-foreground) / )" }, + subtle: "hsl(var(--subtle) / )", + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + ember: { DEFAULT: "hsl(var(--ember) / )", foreground: "hsl(var(--ember-foreground) / )" }, + success: "hsl(var(--success) / )", + warning: "hsl(var(--warning) / )", + danger: "hsl(var(--danger) / )", + }, + fontFamily: { + sans: ["var(--font-inter)", "ui-sans-serif", "system-ui", "sans-serif"], + mono: ["var(--font-jetbrains-mono)", "ui-monospace", "SFMono-Regular", "monospace"], + }, + borderRadius: { + DEFAULT: "var(--radius)", + md: "calc(var(--radius) - 2px)", + lg: "var(--radius)", + xl: "calc(var(--radius) + 4px)", + }, + }, + }, + plugins: [], +}; + +export default config; diff --git a/landing/tsconfig.json b/landing/tsconfig.json new file mode 100644 index 00000000..12a60786 --- /dev/null +++ b/landing/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [{ "name": "next" }], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", "out", ".next"] +}