From 37e485538e07e5755e8b0a7be3b4bc8b1bc5f8b2 Mon Sep 17 00:00:00 2001 From: Gaurav Ghosh Date: Wed, 21 Oct 2026 14:39:36 +0530 Subject: [PATCH 1/2] refactor: migrate website to a pnpm and Turborepo monorepo - move the Next.js app into apps/nextjs and retain Turbopack - extract shared env, database, auth, UI, and email packages - centralize ESLint, Prettier, TypeScript, and Tailwind tooling - load environment files from the repository root - add root Vercel configuration and update CI and documentation - add tests for environment loading and service factories --- .env.example | 7 +- .github/workflows/ci.yml | 3 +- .gitignore | 21 +- .prettierignore | 12 +- .prettierrc | 10 - README.md | 94 ++-- WEBSITE_CONFIG.md | 8 +- .../nextjs/components.json | 6 +- .../nextjs/content}/authors/karthik-prabhu.md | 0 .../nextjs/content}/posts/.gitkeep | 0 .../content}/posts/advice-from-an-alumnus.md | 0 apps/nextjs/eslint.config.mjs | 1 + next.config.ts => apps/nextjs/next.config.ts | 11 +- apps/nextjs/package.json | 63 +++ apps/nextjs/postcss.config.mjs | 1 + .../nextjs/public}/authors/karthik-prabhu.jpg | Bin {public => apps/nextjs/public}/discord.png | Bin {public => apps/nextjs/public}/github.webp | Bin {public => apps/nextjs/public}/logo.png | Bin {public => apps/nextjs/public}/osf.svg | 0 .../nextjs/public}/placeholder.png | Bin {public => apps/nextjs/public}/team.jpg | Bin {public => apps/nextjs/public}/team.png | Bin {app => apps/nextjs/src/app}/apple-icon.png | Bin .../nextjs/src/app}/authors/[id]/page.tsx | 0 {app => apps/nextjs/src/app}/authors/page.tsx | 0 .../src/app}/blog/[uid]/opengraph-image.tsx | 0 .../nextjs/src/app}/blog/[uid]/page.tsx | 0 .../nextjs/src/app}/blog/feed.xml/route.ts | 0 {app => apps/nextjs/src/app}/blog/page.tsx | 0 {app => apps/nextjs/src/app}/error.tsx | 0 {app => apps/nextjs/src/app}/global-error.tsx | 0 {app => apps/nextjs/src/app}/icon.png | Bin {app => apps/nextjs/src/app}/layout.tsx | 0 {app => apps/nextjs/src/app}/manifest.ts | 0 {app => apps/nextjs/src/app}/not-found.tsx | 0 .../nextjs/src/app}/opengraph-image.tsx | 0 {app => apps/nextjs/src/app}/page.tsx | 0 {app => apps/nextjs/src/app}/robots.ts | 0 {app => apps/nextjs/src/app}/sitemap.ts | 0 {app => apps/nextjs/src/app}/team/page.tsx | 0 .../src/components}/authors/AuthorAvatar.tsx | 2 +- .../src/components}/authors/AuthorCard.tsx | 0 .../components}/authors/AuthorProfiles.tsx | 0 .../nextjs/src/components}/blog/BlogCard.tsx | 0 .../src/components}/blog/CoverImage.tsx | 4 +- .../src/components}/blog/HeadingList.tsx | 2 +- .../src/components}/blog/MarkdownRenderer.tsx | 0 .../blog/MobileTableOfContents.tsx | 2 +- .../src/components}/blog/PostHeader.tsx | 0 .../nextjs/src/components}/blog/PostList.tsx | 0 .../nextjs/src/components}/blog/PostMeta.tsx | 2 +- .../src/components}/blog/PostNavigation.tsx | 2 +- .../src/components}/blog/TableOfContents.tsx | 2 +- .../nextjs/src/components}/blog/Tags.tsx | 2 +- .../src/components}/common/BrandIcon.tsx | 0 .../src/components}/common/Breadcrumbs.tsx | 0 .../src/components}/common/Container.tsx | 2 +- .../nextjs/src/components}/common/JsonLd.tsx | 0 .../src/components}/common/ServerError.tsx | 0 .../src/components}/common/StatusMessage.tsx | 0 .../src/components}/common/ThemeScript.tsx | 0 .../src/components}/common/UnderDev.tsx | 0 .../src/components}/home/ActivityCard.tsx | 2 +- .../nextjs/src/components}/home/BentoCell.tsx | 2 +- .../src/components}/home/KarnatakaMap.tsx | 0 .../src/components}/home/LanguagesCard.tsx | 0 .../nextjs/src/components}/home/LinkCell.tsx | 0 .../nextjs/src/components}/home/maplibre.ts | 0 .../nextjs/src/components}/layout/Footer.tsx | 0 .../nextjs/src/components}/layout/Header.tsx | 0 .../nextjs/src/components}/layout/Layout.tsx | 0 .../nextjs/src/components}/layout/Logo.tsx | 0 .../src/components}/layout/NavLinks.tsx | 0 .../src/components}/layout/ThemeToggle.tsx | 0 .../nextjs/src/components}/layout/styles.ts | 0 .../src/components}/team/MemberLoop.tsx | 4 +- .../src/components}/team/SpotlightCard.tsx | 2 +- .../nextjs/src/components}/team/Timeline.tsx | 4 +- .../src/components}/team/TimelineScroll.tsx | 0 .../nextjs/src/hooks}/use-scroll-progress.ts | 0 {hooks => apps/nextjs/src/hooks}/use-theme.ts | 0 .../nextjs/src/hooks}/use-visible-sections.ts | 0 .../nextjs/src/lib}/content/authors.ts | 0 .../nextjs/src/lib}/content/collection.ts | 0 .../nextjs/src/lib}/content/markdown.ts | 0 {lib => apps/nextjs/src/lib}/content/posts.ts | 0 .../nextjs/src/lib}/content/schema.ts | 0 {lib => apps/nextjs/src/lib}/fonts.ts | 4 +- {lib => apps/nextjs/src/lib}/format.ts | 0 {lib => apps/nextjs/src/lib}/github.ts | 2 +- {lib => apps/nextjs/src/lib}/og.tsx | 0 {lib => apps/nextjs/src/lib}/rehype-ec.mjs | 0 {lib => apps/nextjs/src/lib}/resend.ts | 2 +- {lib => apps/nextjs/src/lib}/seo.ts | 0 {lib => apps/nextjs/src/lib}/site.ts | 0 {lib => apps/nextjs/src/lib}/team.ts | 0 {lib => apps/nextjs/src/lib}/theme.ts | 0 {lib => apps/nextjs/src/lib}/timeline.ts | 0 .../nextjs/src/mdx-components.tsx | 0 .../nextjs/src/styles}/globals.css | 126 +---- .../nextjs/src/styles}/typography.css | 0 {types => apps/nextjs/src/types}/blog.ts | 0 apps/nextjs/tsconfig.json | 17 + eslint.config.mjs | 7 - package.json | 85 +--- packages/auth/eslint.config.mjs | 1 + packages/auth/package.json | 26 + packages/auth/src/index.ts | 48 ++ packages/auth/tests/factory.test.ts | 68 +++ packages/auth/tsconfig.json | 5 + packages/db/eslint.config.mjs | 1 + packages/db/package.json | 26 + packages/db/src/index.ts | 41 ++ packages/db/tests/client.test.ts | 57 +++ packages/db/tsconfig.json | 5 + packages/email/eslint.config.mjs | 1 + packages/email/package.json | 29 ++ .../email/templates}/example.tsx | 0 packages/email/tsconfig.json | 5 + packages/env/bin/with-env.mjs | 31 ++ packages/env/eslint.config.mjs | 1 + packages/env/load.mjs | 16 + packages/env/package.json | 29 ++ lib/env.ts => packages/env/src/index.ts | 0 packages/env/tests/load.test.mjs | 127 +++++ packages/env/tsconfig.json | 5 + packages/ui/components.json | 21 + packages/ui/eslint.config.mjs | 1 + packages/ui/package.json | 37 ++ .../ui/src/components}/avatar.tsx | 2 +- .../ui/src/components}/badge.tsx | 2 +- .../ui/src/components}/button.tsx | 2 +- {lib => packages/ui/src/lib}/utils.ts | 0 packages/ui/tsconfig.json | 5 + pnpm-lock.yaml | 479 +++++++++++++++--- pnpm-workspace.yaml | 27 + tooling/eslint/base.mjs | 14 + tooling/eslint/eslint.config.mjs | 1 + tooling/eslint/nextjs.mjs | 5 + tooling/eslint/package.json | 18 + tooling/eslint/react.mjs | 22 + tooling/prettier/eslint.config.mjs | 1 + tooling/prettier/index.cjs | 10 + tooling/prettier/package.json | 17 + tooling/tailwind/eslint.config.mjs | 1 + tooling/tailwind/package.json | 23 + .../tailwind/postcss.mjs | 2 +- tooling/tailwind/styles.css | 127 +++++ tooling/typescript/base.json | 17 + tooling/typescript/nextjs.json | 12 + tooling/typescript/package.json | 12 + tooling/typescript/react.json | 7 + tsconfig.json | 28 - turbo.json | 38 ++ vercel.json | 8 + 156 files changed, 1587 insertions(+), 388 deletions(-) delete mode 100644 .prettierrc rename components.json => apps/nextjs/components.json (75%) rename {content => apps/nextjs/content}/authors/karthik-prabhu.md (100%) rename {content => apps/nextjs/content}/posts/.gitkeep (100%) rename {content => apps/nextjs/content}/posts/advice-from-an-alumnus.md (100%) create mode 100644 apps/nextjs/eslint.config.mjs rename next.config.ts => apps/nextjs/next.config.ts (77%) create mode 100644 apps/nextjs/package.json create mode 100644 apps/nextjs/postcss.config.mjs rename {public => apps/nextjs/public}/authors/karthik-prabhu.jpg (100%) rename {public => apps/nextjs/public}/discord.png (100%) rename {public => apps/nextjs/public}/github.webp (100%) rename {public => apps/nextjs/public}/logo.png (100%) rename {public => apps/nextjs/public}/osf.svg (100%) rename {public => apps/nextjs/public}/placeholder.png (100%) rename {public => apps/nextjs/public}/team.jpg (100%) rename {public => apps/nextjs/public}/team.png (100%) rename {app => apps/nextjs/src/app}/apple-icon.png (100%) rename {app => apps/nextjs/src/app}/authors/[id]/page.tsx (100%) rename {app => apps/nextjs/src/app}/authors/page.tsx (100%) rename {app => apps/nextjs/src/app}/blog/[uid]/opengraph-image.tsx (100%) rename {app => apps/nextjs/src/app}/blog/[uid]/page.tsx (100%) rename {app => apps/nextjs/src/app}/blog/feed.xml/route.ts (100%) rename {app => apps/nextjs/src/app}/blog/page.tsx (100%) rename {app => apps/nextjs/src/app}/error.tsx (100%) rename {app => apps/nextjs/src/app}/global-error.tsx (100%) rename {app => apps/nextjs/src/app}/icon.png (100%) rename {app => apps/nextjs/src/app}/layout.tsx (100%) rename {app => apps/nextjs/src/app}/manifest.ts (100%) rename {app => apps/nextjs/src/app}/not-found.tsx (100%) rename {app => apps/nextjs/src/app}/opengraph-image.tsx (100%) rename {app => apps/nextjs/src/app}/page.tsx (100%) rename {app => apps/nextjs/src/app}/robots.ts (100%) rename {app => apps/nextjs/src/app}/sitemap.ts (100%) rename {app => apps/nextjs/src/app}/team/page.tsx (100%) rename {components => apps/nextjs/src/components}/authors/AuthorAvatar.tsx (94%) rename {components => apps/nextjs/src/components}/authors/AuthorCard.tsx (100%) rename {components => apps/nextjs/src/components}/authors/AuthorProfiles.tsx (100%) rename {components => apps/nextjs/src/components}/blog/BlogCard.tsx (100%) rename {components => apps/nextjs/src/components}/blog/CoverImage.tsx (84%) rename {components => apps/nextjs/src/components}/blog/HeadingList.tsx (95%) rename {components => apps/nextjs/src/components}/blog/MarkdownRenderer.tsx (100%) rename {components => apps/nextjs/src/components}/blog/MobileTableOfContents.tsx (98%) rename {components => apps/nextjs/src/components}/blog/PostHeader.tsx (100%) rename {components => apps/nextjs/src/components}/blog/PostList.tsx (100%) rename {components => apps/nextjs/src/components}/blog/PostMeta.tsx (97%) rename {components => apps/nextjs/src/components}/blog/PostNavigation.tsx (97%) rename {components => apps/nextjs/src/components}/blog/TableOfContents.tsx (94%) rename {components => apps/nextjs/src/components}/blog/Tags.tsx (91%) rename {components => apps/nextjs/src/components}/common/BrandIcon.tsx (100%) rename {components => apps/nextjs/src/components}/common/Breadcrumbs.tsx (100%) rename {components => apps/nextjs/src/components}/common/Container.tsx (86%) rename {components => apps/nextjs/src/components}/common/JsonLd.tsx (100%) rename {components => apps/nextjs/src/components}/common/ServerError.tsx (100%) rename {components => apps/nextjs/src/components}/common/StatusMessage.tsx (100%) rename {components => apps/nextjs/src/components}/common/ThemeScript.tsx (100%) rename {components => apps/nextjs/src/components}/common/UnderDev.tsx (100%) rename {components => apps/nextjs/src/components}/home/ActivityCard.tsx (98%) rename {components => apps/nextjs/src/components}/home/BentoCell.tsx (96%) rename {components => apps/nextjs/src/components}/home/KarnatakaMap.tsx (100%) rename {components => apps/nextjs/src/components}/home/LanguagesCard.tsx (100%) rename {components => apps/nextjs/src/components}/home/LinkCell.tsx (100%) rename {components => apps/nextjs/src/components}/home/maplibre.ts (100%) rename {components => apps/nextjs/src/components}/layout/Footer.tsx (100%) rename {components => apps/nextjs/src/components}/layout/Header.tsx (100%) rename {components => apps/nextjs/src/components}/layout/Layout.tsx (100%) rename {components => apps/nextjs/src/components}/layout/Logo.tsx (100%) rename {components => apps/nextjs/src/components}/layout/NavLinks.tsx (100%) rename {components => apps/nextjs/src/components}/layout/ThemeToggle.tsx (100%) rename {components => apps/nextjs/src/components}/layout/styles.ts (100%) rename {components => apps/nextjs/src/components}/team/MemberLoop.tsx (92%) rename {components => apps/nextjs/src/components}/team/SpotlightCard.tsx (96%) rename {components => apps/nextjs/src/components}/team/Timeline.tsx (97%) rename {components => apps/nextjs/src/components}/team/TimelineScroll.tsx (100%) rename {hooks => apps/nextjs/src/hooks}/use-scroll-progress.ts (100%) rename {hooks => apps/nextjs/src/hooks}/use-theme.ts (100%) rename {hooks => apps/nextjs/src/hooks}/use-visible-sections.ts (100%) rename {lib => apps/nextjs/src/lib}/content/authors.ts (100%) rename {lib => apps/nextjs/src/lib}/content/collection.ts (100%) rename {lib => apps/nextjs/src/lib}/content/markdown.ts (100%) rename {lib => apps/nextjs/src/lib}/content/posts.ts (100%) rename {lib => apps/nextjs/src/lib}/content/schema.ts (100%) rename {lib => apps/nextjs/src/lib}/fonts.ts (82%) rename {lib => apps/nextjs/src/lib}/format.ts (100%) rename {lib => apps/nextjs/src/lib}/github.ts (99%) rename {lib => apps/nextjs/src/lib}/og.tsx (100%) rename {lib => apps/nextjs/src/lib}/rehype-ec.mjs (100%) rename {lib => apps/nextjs/src/lib}/resend.ts (88%) rename {lib => apps/nextjs/src/lib}/seo.ts (100%) rename {lib => apps/nextjs/src/lib}/site.ts (100%) rename {lib => apps/nextjs/src/lib}/team.ts (100%) rename {lib => apps/nextjs/src/lib}/theme.ts (100%) rename {lib => apps/nextjs/src/lib}/timeline.ts (100%) rename mdx-components.tsx => apps/nextjs/src/mdx-components.tsx (100%) rename {styles => apps/nextjs/src/styles}/globals.css (55%) rename {styles => apps/nextjs/src/styles}/typography.css (100%) rename {types => apps/nextjs/src/types}/blog.ts (100%) create mode 100644 apps/nextjs/tsconfig.json delete mode 100644 eslint.config.mjs create mode 100644 packages/auth/eslint.config.mjs create mode 100644 packages/auth/package.json create mode 100644 packages/auth/src/index.ts create mode 100644 packages/auth/tests/factory.test.ts create mode 100644 packages/auth/tsconfig.json create mode 100644 packages/db/eslint.config.mjs create mode 100644 packages/db/package.json create mode 100644 packages/db/src/index.ts create mode 100644 packages/db/tests/client.test.ts create mode 100644 packages/db/tsconfig.json create mode 100644 packages/email/eslint.config.mjs create mode 100644 packages/email/package.json rename {emails => packages/email/templates}/example.tsx (100%) create mode 100644 packages/email/tsconfig.json create mode 100755 packages/env/bin/with-env.mjs create mode 100644 packages/env/eslint.config.mjs create mode 100644 packages/env/load.mjs create mode 100644 packages/env/package.json rename lib/env.ts => packages/env/src/index.ts (100%) create mode 100644 packages/env/tests/load.test.mjs create mode 100644 packages/env/tsconfig.json create mode 100644 packages/ui/components.json create mode 100644 packages/ui/eslint.config.mjs create mode 100644 packages/ui/package.json rename {components/ui => packages/ui/src/components}/avatar.tsx (98%) rename {components/ui => packages/ui/src/components}/badge.tsx (97%) rename {components/ui => packages/ui/src/components}/button.tsx (98%) rename {lib => packages/ui/src/lib}/utils.ts (100%) create mode 100644 packages/ui/tsconfig.json create mode 100644 tooling/eslint/base.mjs create mode 100644 tooling/eslint/eslint.config.mjs create mode 100644 tooling/eslint/nextjs.mjs create mode 100644 tooling/eslint/package.json create mode 100644 tooling/eslint/react.mjs create mode 100644 tooling/prettier/eslint.config.mjs create mode 100644 tooling/prettier/index.cjs create mode 100644 tooling/prettier/package.json create mode 100644 tooling/tailwind/eslint.config.mjs create mode 100644 tooling/tailwind/package.json rename postcss.config.js => tooling/tailwind/postcss.mjs (73%) create mode 100644 tooling/tailwind/styles.css create mode 100644 tooling/typescript/base.json create mode 100644 tooling/typescript/nextjs.json create mode 100644 tooling/typescript/package.json create mode 100644 tooling/typescript/react.json delete mode 100644 tsconfig.json create mode 100644 turbo.json create mode 100644 vercel.json diff --git a/.env.example b/.env.example index 2e5758e..648bb17 100644 --- a/.env.example +++ b/.env.example @@ -1,10 +1,11 @@ -# Optional for the public site. Copy this file to .env.local when needed. +# Optional for the public site. Copy this file to .env at the repository root. +# All workspace commands load root .env files; process variables take precedence. # Neon PostgreSQL connection string; leave blank until database features are added. # Example: postgresql://USER:PASSWORD@HOST/DATABASE?sslmode=require DATABASE_URL= -# Better Auth is installed for future use; no auth routes are configured yet. +# Shared auth factories are ready for future use; no auth routes are mounted. # Generate a secret with: openssl rand -base64 32 BETTER_AUTH_SECRET= BETTER_AUTH_URL=http://localhost:3000 @@ -14,5 +15,5 @@ BETTER_AUTH_URL=http://localhost:3000 RESEND_API_KEY= RESEND_FROM_EMAIL= -# reccomended as 5000 reqs can be sent per hour +# Optional GitHub token for a higher API rate limit. GITHUB_TOKEN= diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 614a775..927999a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Next.js checks +name: Workspace checks on: push: @@ -21,4 +21,5 @@ jobs: - run: pnpm install --frozen-lockfile - run: pnpm typecheck - run: pnpm lint + - run: pnpm test - run: pnpm build diff --git a/.gitignore b/.gitignore index 2435e48..692ddac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,19 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules/ +node_modules/ /.pnp .pnp.js # testing -/coverage +coverage/ # next.js -/.next/ -/out/ +.next/ +out/ # production -/build +build/ # misc .DS_Store @@ -30,15 +30,20 @@ yarn-error.log* !.env.example # React Email preview and exported templates -/.react-email/ -/email-out/ +.react-email/ +email-out/ # vercel .vercel # typescript *.tsbuildinfo -/next-env.d.ts +next-env.d.ts /.yarn /.yarnrc.yml + +# monorepo task and package outputs +.turbo/ +dist/ +.cache/ diff --git a/.prettierignore b/.prettierignore index c7a34bd..6e1d1a5 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,9 @@ -build -node_modules -.next +**/node_modules +**/.next +**/.turbo +**/.react-email +**/build +**/dist +**/next-env.d.ts +**/*.tsbuildinfo +pnpm-lock.yaml diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 1d9fbef..0000000 --- a/.prettierrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": true, - "jsxSingleQuote": true, - "bracketSpacing": true, - "bracketSameLine": false, - "arrowParens": "always" -} diff --git a/README.md b/README.md index 6ebf10f..12ffafd 100644 --- a/README.md +++ b/README.md @@ -1,90 +1,104 @@ # Manipal OSF website -The official Manipal OSF website is a single Next.js application at the repository root. It uses TypeScript, React, Tailwind CSS, and the App Router. Blog posts live in the repository as Markdown files. +The Manipal OSF website lives in a pnpm and Turborepo monorepo modeled on [create-t3-turbo](https://github.com/t3-oss/create-t3-turbo). Next.js uses Turbopack for development and production builds. ## Development -Use Node.js 24 LTS (minimum 22) and PNPM 11.2.2. Run commands from the repository root: +Use Node.js 24 LTS (minimum 22.18 for native TypeScript test execution) and pnpm 11.2.2. Run commands from the repository root: ```sh pnpm install pnpm dev ``` -Open http://localhost:3000. No environment variables or separate service are required for the existing site; an optional `GITHUB_TOKEN` raises the GitHub API limit for the home page statistics. - -Development and production builds use Turbopack. +Open http://localhost:3000. The public website needs no service credentials. An optional `GITHUB_TOKEN` increases the GitHub API rate limit for statistics. ```sh pnpm typecheck pnpm lint +pnpm test +pnpm build +pnpm start pnpm format ``` -CI runs the production build with `pnpm build`. A deployed Node.js application starts with `pnpm start`. Configure hosting to use the repository root, with `pnpm install --frozen-lockfile` as the install command and `pnpm build` as the build command. - -See [website configuration](./WEBSITE_CONFIG.md) for the Markdown format, images, and publishing instructions. The blog initially displays “No posts yet.” Add your own content to `content/posts/`; existing hosted content is not copied automatically. +`dev` starts workspaces under `apps/`. `build`, `lint`, `typecheck`, and `test` use Turbo's dependency graph and cache. Development servers and email previews are uncached. Build artifacts exclude `.next/cache` from Turbo storage. Environment changes invalidate task caches. -The `@next/mdx` component registry lives in `mdx-components.tsx` at the repository root, beside `app/`, as required by Next.js. Keep it there when adding MDX components. The filesystem blog continues to render Markdown using `MarkdownRenderer`. +To target the website directly: -## UI components +```sh +pnpm --filter @apps/nextjs dev +pnpm build --filter=@apps/nextjs... +pnpm --filter @apps/nextjs ui:add input +``` -shadcn/ui is configured with the Base UI Nova style, TypeScript, React Server Components, Lucide icons, and the `@/*` import alias pointing to the repository root. Its CSS variables extend the existing Nord light and Catppuccin dark themes, using the existing `data-theme` switch. +## Workspace structure -Import the initial Button from `@/components/ui/button` and shared class helpers from `@/lib/utils`. Add more components from the repository root: +| Location | Package | Responsibility | +| ---------------- | ----------------- | ------------------------------------------------------------------ | +| `apps/nextjs` | `@apps/nextjs` | App Router website, content, public assets, and site-specific code | +| `packages/env` | `@packages/env` | T3 Env validation and root environment loading | +| `packages/db` | `@packages/db` | Lazy Neon HTTP / Drizzle database clients | +| `packages/auth` | `@packages/auth` | Configurable Better Auth factory | +| `packages/ui` | `@packages/ui` | Shared Base UI components and class helpers | +| `packages/email` | `@packages/email` | React Email templates and local preview server | +| `tooling/*` | `@tooling/*` | ESLint, Prettier, TypeScript, and Tailwind configuration | -```sh -pnpm exec shadcn add input -``` +Workspace imports use real package exports and `workspace:*` dependencies. The website's `@/*` alias refers to its `src/` directory. Shared dependencies are versioned centrally in the pnpm catalog. -`components.json` points to `styles/globals.css`; Tailwind v4 does not need a separate Tailwind configuration file. Keep the existing palettes and `data-theme` convention when adding theme tokens. +See [website configuration](./WEBSITE_CONFIG.md) for posts, authors, images, and publishing. Content lives under `apps/nextjs/content/`. The MDX registry lives in `apps/nextjs/src/mdx-components.tsx`, beside `src/app/`. ## Environment variables -The public site runs without service credentials. When preparing backend features, copy the example file: +Keep environment files at the repository root: ```sh -cp .env.example .env.local +cp .env.example .env ``` -`lib/env.ts` uses T3 Env and Zod to validate settings during development and builds. Service settings are optional, and blank values are treated as unset. Values supplied must be valid. Import `env` from `@/lib/env` in server code instead of reading `process.env` directly. All settings below are server variables; do not expose credentials using `NEXT_PUBLIC_`. +`with-env` loads root environment files before running Turbo or an application command. It uses Next.js environment loading, resolving the root from the loader's location rather than the current directory. Existing process variables win, followed by `.env..local`, `.env.local`, `.env.`, and `.env`. Test mode skips `.env.local`. Vercel supplies process variables through project settings and needs no committed environment file. -| Variable | Purpose | -| -------------------- | -------------------------------------------------------------------------------------- | -| `DATABASE_URL` | Neon PostgreSQL connection string (`postgres://` or `postgresql://`). | -| `BETTER_AUTH_SECRET` | Future auth secret of at least 32 characters; generate with `openssl rand -base64 32`. | -| `BETTER_AUTH_URL` | Future auth server origin, such as `http://localhost:3000`. | -| `RESEND_API_KEY` | API key required when calling `getResend()`. | -| `RESEND_FROM_EMAIL` | Plain sender email address on a Resend-verified domain, for future sending features. | +Import `env` from `@packages/env` in server code. T3 Env and Zod validate supplied values, treat empty strings as unset, and prevent access to server variables in browser code. The filesystem loader is separate at `@packages/env/load`; do not import it into application runtime code. -Real `.env*` files are ignored by Git; `.env.example` contains no credentials and is tracked. +| Variable | Purpose | +| -------------------- | --------------------------------------------------------------- | +| `DATABASE_URL` | Optional Neon PostgreSQL URL (`postgres://` or `postgresql://`) | +| `BETTER_AUTH_SECRET` | Optional auth secret, at least 32 characters | +| `BETTER_AUTH_URL` | Optional auth origin for a future app instance | +| `RESEND_API_KEY` | Required when calling the website's `getResend()` | +| `RESEND_FROM_EMAIL` | Optional sender address on a verified Resend domain | +| `GITHUB_TOKEN` | Optional higher GitHub API rate limit | + +All current variables are server-side. Keep `.env*` ignored except the credential-free example. When adding variables, update the shared validation schema, example file, and Turbo environment inputs together. Future apps can compose their own validation from this package as their requirements diverge. ## Database and authentication -Drizzle ORM, Drizzle Kit, the Neon serverless driver, Better Auth, and its Drizzle adapter are installed for later use. Database clients, application/auth schemas, migrations, auth routes, and login pages are deferred. The blog still uses repository Markdown files. +`@packages/db` exports `createDb(url, schema?)` and `getDb()`. Constructing a client does not execute a query. `getDb()` lazily creates a shared schema-less client from `env.DATABASE_URL`, with a clear error when it is unset. Use `createDb` when supplying a typed schema or a different database URL. These APIs are server-only. Neon HTTP supports individual queries and non-interactive batches; interactive transactions require a different driver. -When implementing these features, configure a Neon PostgreSQL database with the validated `DATABASE_URL`, use `drizzle-orm/neon-http` for HTTP queries (or `drizzle-orm/neon-serverless` when interactive transactions are needed), and connect Better Auth through `@better-auth/drizzle-adapter` with PostgreSQL provider `pg`. Generate the auth schema from the final auth configuration before creating Drizzle migrations. Add the auth Route Handler under `app/api/auth/[...all]/route.ts` and keep client auth code separate from server credentials. +`@packages/auth` exports `createAuth({ db, schema, options })`. Supply an explicit Drizzle auth schema and app-specific `secret`, `baseURL`, and `trustedOrigins`; `options` also accepts Better Auth providers, plugins, and session configuration. The factory preserves plugin and additional-field inference, uses the PostgreSQL Drizzle adapter, and disables interactive transactions. It does not establish a global auth singleton or shared cookie domain. -Drizzle Kit runs outside the Next.js runtime. Before adding its configuration, use `@next/env` to load the root `.env*` files so CLI commands follow the same environment loading rules as Next.js. +The website does not instantiate auth or mount auth endpoints. Auth tables, login methods, schema generation, migrations, and login pages remain deferred. When implementing them, generate the schema from the final auth configuration, keep tables and migrations in `packages/db`, and mount the framework-specific handler inside the consuming app. Set each app's URL and trusted origins explicitly. Drizzle Kit is owned by the database package; migration commands will be added with the actual schema. -## Email templates +## Shared UI and Tailwind + +Import components from `@packages/ui/components/button` (or `badge` / `avatar`) and `cn` from `@packages/ui/lib/utils`. Add shadcn components from the website workspace using `pnpm --filter @apps/nextjs ui:add `; its aliases route shared primitives to the UI package. -Resend and React Email are ready for future email features. Components and rendering utilities use the current `react-email` package; `@react-email/ui` provides local previews. +`@tooling/tailwind/styles.css` provides Tailwind v4, shared animation imports, theme tokens, the `data-theme` dark variant, common base styles, and shared UI source registration. Applications import this CSS and register their own source directory with `@source`. App-specific layout and typography remain local. `@tooling/tailwind/postcss` exports the PostCSS configuration. Keep the existing Nord light and Catppuccin dark palettes. + +## Email templates ```sh pnpm email:dev ``` -Open http://localhost:3001 to preview `emails/example.tsx`. Previews need no API key and send no email. - -Server code can import `getResend` from `@/lib/resend` to obtain a lazily initialized Resend client. It throws a clear error if `RESEND_API_KEY` is unset when called. When adding a sending feature, pass a verified sender, recipient, subject, and React Email template to `getResend().emails.send(...)`, and handle the returned `error`. There are no sending endpoints or automatic email triggers yet. +Open http://localhost:3001 to preview `packages/email/templates/example.tsx`. Previews need no API key and send no email. Apps can import the template from `@packages/email/example`. -## Server features +The website retains its lazy `getResend()` helper at `@/lib/resend`. There are no sending endpoints or automatic email triggers. -Add server endpoints as Route Handlers in `app/**/route.ts`, using the Web `Request` and `Response` APIs or Next.js `NextRequest` and `NextResponse`. Keep private environment variables server-side and put reusable server logic in `lib/`. Async Server Components, post metadata, and `generateStaticParams` call the server-only filesystem blog loader directly; it does not make HTTP calls. +## Vercel and additional apps -Use a deployment that supports the Next.js Node.js runtime when adding Route Handlers or request-time server rendering. +The root `vercel.json` deploys `@apps/nextjs` using pnpm, a filtered Turbo build, and `apps/nextjs/.next` as the output directory. Keep the existing Vercel project's Root Directory at the repository root (empty/default), select Node.js 24, and enable [Corepack](https://vercel.com/docs/builds/configure-a-build#corepack) (`ENABLE_EXPERIMENTAL_COREPACK=1`) so Vercel uses the package-manager version pinned in `package.json`. Remove conflicting dashboard command overrides. A matching root Next.js dependency supports framework detection with pnpm's isolated installation. -## Contributing +Add future applications under `apps/`, name them `@apps/`, declare shared packages using `workspace:*`, and extend shared tooling. Each future app should have its own Vercel project, environment values, and app-specific deployment configuration. The root config remains specific to the current website; it does not deploy every app. For a project rooted in a new app directory, enable access to files outside that root so shared packages are available. Do not reuse the website's root build and output settings for another app. -React, Next.js, TypeScript, Tailwind CSS, and basic HTML knowledge are useful. Contributions to content and bug reports are welcome too. +GitHub Actions installs with the frozen lockfile and runs typecheck, lint, service-package tests, and the production build. No live database, migration, email, or deployment is required for these checks. diff --git a/WEBSITE_CONFIG.md b/WEBSITE_CONFIG.md index 3228809..ac39f10 100644 --- a/WEBSITE_CONFIG.md +++ b/WEBSITE_CONFIG.md @@ -1,12 +1,12 @@ # Website configuration -All source, public assets, and configuration are at the repository root. Run `pnpm dev` from this directory. No environment variables are needed for the existing site. Future server features can read private values from `.env.local`; never prefix secrets with `NEXT_PUBLIC_`. +The website is in `apps/nextjs/`. Source files are under `src/`, while `content/`, `public/`, and Next.js configuration are at the app root. Run `pnpm dev` from the repository root. No environment variables are needed for the public site. Shared environment files belong at the repository root; never prefix secrets with `NEXT_PUBLIC_`. Paths below are relative to `apps/nextjs/`. ## Home page -The home page is a bento grid (`app/page.tsx`, laid out by the `.bento` rules in `styles/globals.css`). Its statistics, language breakdown, and commit calendar come from the public GitHub API for the [Manipal-OSF](https://github.com/Manipal-OSF) organization (`lib/github.ts`). Responses are cached for a day and the page re-renders hourly; if GitHub is unreachable, those cells say so instead of failing the page. Unauthenticated requests are limited to 60 an hour, so set `GITHUB_TOKEN` in `.env.local` or the hosting environment if builds or previews run often. A fine-grained token without any permissions is enough. +The home page is a bento grid (`src/app/page.tsx`, laid out by the `.bento` rules in `src/styles/globals.css`). Its statistics, language breakdown, and commit calendar come from the public GitHub API for the [Manipal-OSF](https://github.com/Manipal-OSF) organization (`src/lib/github.ts`). Responses are cached for a day and the page re-renders hourly; if GitHub is unreachable, those cells say so instead of failing the page. Unauthenticated requests are limited to 60 an hour, so set `GITHUB_TOKEN` in the repository-root `.env` or the hosting environment if builds or previews run often. A fine-grained token without any permissions is enough. -The map uses [MapLibre](https://maplibre.org/) with [OpenFreeMap](https://openfreemap.org/) tiles; edit `regions` in `components/home/KarnatakaMap.tsx` to change the places in its menu. +The map uses [MapLibre](https://maplibre.org/) with [OpenFreeMap](https://openfreemap.org/) tiles; edit `regions` in `src/components/home/KarnatakaMap.tsx` to change the places in its menu. ## SEO @@ -44,7 +44,7 @@ Write standard Markdown here, including **bold text**, links, fenced code blocks - `coverImage` is optional. Place the example image in `public/images/your-post.jpg`; omit this field to display the existing placeholder. Images must use local public paths beginning with a single `/`. - The body supports Markdown rather than JSX or raw HTML. Start headings at `##`, since the page already renders the title as an `h1`. -The directory initially contains only `.gitkeep`, so the blog shows “No posts yet.” Invalid metadata and duplicate IDs produce errors identifying the offending post or ID. +Invalid metadata and duplicate IDs produce errors identifying the offending post or ID. ## Add an author profile diff --git a/components.json b/apps/nextjs/components.json similarity index 75% rename from components.json rename to apps/nextjs/components.json index 2db33e4..aa3a774 100644 --- a/components.json +++ b/apps/nextjs/components.json @@ -5,15 +5,15 @@ "tsx": true, "tailwind": { "config": "", - "css": "styles/globals.css", + "css": "src/styles/globals.css", "baseColor": "neutral", "cssVariables": true, "prefix": "" }, "aliases": { "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", + "utils": "@packages/ui/lib/utils", + "ui": "@packages/ui/components", "lib": "@/lib", "hooks": "@/hooks" }, diff --git a/content/authors/karthik-prabhu.md b/apps/nextjs/content/authors/karthik-prabhu.md similarity index 100% rename from content/authors/karthik-prabhu.md rename to apps/nextjs/content/authors/karthik-prabhu.md diff --git a/content/posts/.gitkeep b/apps/nextjs/content/posts/.gitkeep similarity index 100% rename from content/posts/.gitkeep rename to apps/nextjs/content/posts/.gitkeep diff --git a/content/posts/advice-from-an-alumnus.md b/apps/nextjs/content/posts/advice-from-an-alumnus.md similarity index 100% rename from content/posts/advice-from-an-alumnus.md rename to apps/nextjs/content/posts/advice-from-an-alumnus.md diff --git a/apps/nextjs/eslint.config.mjs b/apps/nextjs/eslint.config.mjs new file mode 100644 index 0000000..ceaee76 --- /dev/null +++ b/apps/nextjs/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/nextjs'; diff --git a/next.config.ts b/apps/nextjs/next.config.ts similarity index 77% rename from next.config.ts rename to apps/nextjs/next.config.ts index 70e15f7..b824211 100644 --- a/next.config.ts +++ b/apps/nextjs/next.config.ts @@ -1,10 +1,17 @@ import type { NextConfig } from 'next'; import createMDX from '@next/mdx'; import path from 'node:path'; -import './lib/env'; +import { fileURLToPath } from 'node:url'; +import '@packages/env'; + +const appRoot = fileURLToPath(new URL('.', import.meta.url)); +const workspaceRoot = path.resolve(appRoot, '../..'); const nextConfig: NextConfig = { reactStrictMode: true, + turbopack: { root: workspaceRoot }, + outputFileTracingRoot: workspaceRoot, + outputFileTracingIncludes: { '/*': ['./content/**/*.md'] }, pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], images: { // AVIF is usually 20-30% smaller than WebP; browsers without it get WebP. @@ -50,7 +57,7 @@ const withMDX = createMDX({ ], 'rehype-slug', 'rehype-katex', - path.join(process.cwd(), 'lib/rehype-ec.mjs'), + path.join(appRoot, 'src/lib/rehype-ec.mjs'), ], }, }); diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json new file mode 100644 index 0000000..ae3936b --- /dev/null +++ b/apps/nextjs/package.json @@ -0,0 +1,63 @@ +{ + "name": "@apps/nextjs", + "private": true, + "type": "module", + "scripts": { + "lint": "eslint .", + "typecheck": "with-env production next typegen && tsc --noEmit", + "dev": "with-env development next dev --turbopack", + "build": "with-env production next build --turbopack", + "start": "with-env production next start", + "ui:add": "shadcn add" + }, + "dependencies": { + "@fontsource-variable/cascadia-code": "^5.3.0", + "@mdx-js/loader": "^3.1.1", + "@mdx-js/react": "^3.1.1", + "@next/mdx": "^16.4.0", + "@types/mdx": "^2.0.14", + "@vercel/analytics": "^2.0.1", + "@vercel/speed-insights": "^2.0.0", + "github-slugger": "2.0.0", + "gray-matter": "^4.0.3", + "lucide-react": "^1.52.0", + "maplibre-gl": "^6.13.0", + "mdast-util-to-string": "^4.0.0", + "next": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "react-markdown": "^10.1.0", + "rehype-expressive-code": "^0.44.2", + "rehype-external-links": "^3.0.0", + "rehype-katex": "^7.0.1", + "rehype-slug": "^6.0.0", + "remark-emoji": "^5.0.2", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", + "resend": "^6.32.1", + "server-only": "catalog:", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "zod": "catalog:", + "@packages/env": "workspace:*", + "@packages/ui": "workspace:*", + "@packages/email": "workspace:*", + "@packages/db": "workspace:*", + "@packages/auth": "workspace:*", + "@base-ui/react": "catalog:" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:", + "@types/mdast": "^4.0.4", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "postcss": "catalog:", + "@tooling/tailwind": "workspace:*", + "shadcn": "catalog:" + } +} diff --git a/apps/nextjs/postcss.config.mjs b/apps/nextjs/postcss.config.mjs new file mode 100644 index 0000000..47b83e4 --- /dev/null +++ b/apps/nextjs/postcss.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/tailwind/postcss'; diff --git a/public/authors/karthik-prabhu.jpg b/apps/nextjs/public/authors/karthik-prabhu.jpg similarity index 100% rename from public/authors/karthik-prabhu.jpg rename to apps/nextjs/public/authors/karthik-prabhu.jpg diff --git a/public/discord.png b/apps/nextjs/public/discord.png similarity index 100% rename from public/discord.png rename to apps/nextjs/public/discord.png diff --git a/public/github.webp b/apps/nextjs/public/github.webp similarity index 100% rename from public/github.webp rename to apps/nextjs/public/github.webp diff --git a/public/logo.png b/apps/nextjs/public/logo.png similarity index 100% rename from public/logo.png rename to apps/nextjs/public/logo.png diff --git a/public/osf.svg b/apps/nextjs/public/osf.svg similarity index 100% rename from public/osf.svg rename to apps/nextjs/public/osf.svg diff --git a/public/placeholder.png b/apps/nextjs/public/placeholder.png similarity index 100% rename from public/placeholder.png rename to apps/nextjs/public/placeholder.png diff --git a/public/team.jpg b/apps/nextjs/public/team.jpg similarity index 100% rename from public/team.jpg rename to apps/nextjs/public/team.jpg diff --git a/public/team.png b/apps/nextjs/public/team.png similarity index 100% rename from public/team.png rename to apps/nextjs/public/team.png diff --git a/app/apple-icon.png b/apps/nextjs/src/app/apple-icon.png similarity index 100% rename from app/apple-icon.png rename to apps/nextjs/src/app/apple-icon.png diff --git a/app/authors/[id]/page.tsx b/apps/nextjs/src/app/authors/[id]/page.tsx similarity index 100% rename from app/authors/[id]/page.tsx rename to apps/nextjs/src/app/authors/[id]/page.tsx diff --git a/app/authors/page.tsx b/apps/nextjs/src/app/authors/page.tsx similarity index 100% rename from app/authors/page.tsx rename to apps/nextjs/src/app/authors/page.tsx diff --git a/app/blog/[uid]/opengraph-image.tsx b/apps/nextjs/src/app/blog/[uid]/opengraph-image.tsx similarity index 100% rename from app/blog/[uid]/opengraph-image.tsx rename to apps/nextjs/src/app/blog/[uid]/opengraph-image.tsx diff --git a/app/blog/[uid]/page.tsx b/apps/nextjs/src/app/blog/[uid]/page.tsx similarity index 100% rename from app/blog/[uid]/page.tsx rename to apps/nextjs/src/app/blog/[uid]/page.tsx diff --git a/app/blog/feed.xml/route.ts b/apps/nextjs/src/app/blog/feed.xml/route.ts similarity index 100% rename from app/blog/feed.xml/route.ts rename to apps/nextjs/src/app/blog/feed.xml/route.ts diff --git a/app/blog/page.tsx b/apps/nextjs/src/app/blog/page.tsx similarity index 100% rename from app/blog/page.tsx rename to apps/nextjs/src/app/blog/page.tsx diff --git a/app/error.tsx b/apps/nextjs/src/app/error.tsx similarity index 100% rename from app/error.tsx rename to apps/nextjs/src/app/error.tsx diff --git a/app/global-error.tsx b/apps/nextjs/src/app/global-error.tsx similarity index 100% rename from app/global-error.tsx rename to apps/nextjs/src/app/global-error.tsx diff --git a/app/icon.png b/apps/nextjs/src/app/icon.png similarity index 100% rename from app/icon.png rename to apps/nextjs/src/app/icon.png diff --git a/app/layout.tsx b/apps/nextjs/src/app/layout.tsx similarity index 100% rename from app/layout.tsx rename to apps/nextjs/src/app/layout.tsx diff --git a/app/manifest.ts b/apps/nextjs/src/app/manifest.ts similarity index 100% rename from app/manifest.ts rename to apps/nextjs/src/app/manifest.ts diff --git a/app/not-found.tsx b/apps/nextjs/src/app/not-found.tsx similarity index 100% rename from app/not-found.tsx rename to apps/nextjs/src/app/not-found.tsx diff --git a/app/opengraph-image.tsx b/apps/nextjs/src/app/opengraph-image.tsx similarity index 100% rename from app/opengraph-image.tsx rename to apps/nextjs/src/app/opengraph-image.tsx diff --git a/app/page.tsx b/apps/nextjs/src/app/page.tsx similarity index 100% rename from app/page.tsx rename to apps/nextjs/src/app/page.tsx diff --git a/app/robots.ts b/apps/nextjs/src/app/robots.ts similarity index 100% rename from app/robots.ts rename to apps/nextjs/src/app/robots.ts diff --git a/app/sitemap.ts b/apps/nextjs/src/app/sitemap.ts similarity index 100% rename from app/sitemap.ts rename to apps/nextjs/src/app/sitemap.ts diff --git a/app/team/page.tsx b/apps/nextjs/src/app/team/page.tsx similarity index 100% rename from app/team/page.tsx rename to apps/nextjs/src/app/team/page.tsx diff --git a/components/authors/AuthorAvatar.tsx b/apps/nextjs/src/components/authors/AuthorAvatar.tsx similarity index 94% rename from components/authors/AuthorAvatar.tsx rename to apps/nextjs/src/components/authors/AuthorAvatar.tsx index ae25514..8840374 100644 --- a/components/authors/AuthorAvatar.tsx +++ b/apps/nextjs/src/components/authors/AuthorAvatar.tsx @@ -1,5 +1,5 @@ import Image from 'next/image'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; interface AuthorAvatarProps { name: string; diff --git a/components/authors/AuthorCard.tsx b/apps/nextjs/src/components/authors/AuthorCard.tsx similarity index 100% rename from components/authors/AuthorCard.tsx rename to apps/nextjs/src/components/authors/AuthorCard.tsx diff --git a/components/authors/AuthorProfiles.tsx b/apps/nextjs/src/components/authors/AuthorProfiles.tsx similarity index 100% rename from components/authors/AuthorProfiles.tsx rename to apps/nextjs/src/components/authors/AuthorProfiles.tsx diff --git a/components/blog/BlogCard.tsx b/apps/nextjs/src/components/blog/BlogCard.tsx similarity index 100% rename from components/blog/BlogCard.tsx rename to apps/nextjs/src/components/blog/BlogCard.tsx diff --git a/components/blog/CoverImage.tsx b/apps/nextjs/src/components/blog/CoverImage.tsx similarity index 84% rename from components/blog/CoverImage.tsx rename to apps/nextjs/src/components/blog/CoverImage.tsx index 54c2037..2f5ff6e 100644 --- a/components/blog/CoverImage.tsx +++ b/apps/nextjs/src/components/blog/CoverImage.tsx @@ -1,6 +1,6 @@ import Image from 'next/image'; -import placeholder from '@/public/placeholder.png'; -import { cn } from '@/lib/utils'; +import placeholder from '../../../public/placeholder.png'; +import { cn } from '@packages/ui/lib/utils'; interface CoverImageProps { src: string | null; diff --git a/components/blog/HeadingList.tsx b/apps/nextjs/src/components/blog/HeadingList.tsx similarity index 95% rename from components/blog/HeadingList.tsx rename to apps/nextjs/src/components/blog/HeadingList.tsx index 12f54eb..f226706 100644 --- a/components/blog/HeadingList.tsx +++ b/apps/nextjs/src/components/blog/HeadingList.tsx @@ -1,7 +1,7 @@ 'use client'; import { useVisibleSections } from '@/hooks/use-visible-sections'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; import type { PostHeading } from '@/types/blog'; const indent: Record = { diff --git a/components/blog/MarkdownRenderer.tsx b/apps/nextjs/src/components/blog/MarkdownRenderer.tsx similarity index 100% rename from components/blog/MarkdownRenderer.tsx rename to apps/nextjs/src/components/blog/MarkdownRenderer.tsx diff --git a/components/blog/MobileTableOfContents.tsx b/apps/nextjs/src/components/blog/MobileTableOfContents.tsx similarity index 98% rename from components/blog/MobileTableOfContents.tsx rename to apps/nextjs/src/components/blog/MobileTableOfContents.tsx index fadcd29..0101355 100644 --- a/components/blog/MobileTableOfContents.tsx +++ b/apps/nextjs/src/components/blog/MobileTableOfContents.tsx @@ -4,7 +4,7 @@ import { ChevronDown } from 'lucide-react'; import { useRef } from 'react'; import { useScrollProgress } from '@/hooks/use-scroll-progress'; import { useVisibleSections } from '@/hooks/use-visible-sections'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; import type { PostHeading } from '@/types/blog'; import HeadingList from './HeadingList'; diff --git a/components/blog/PostHeader.tsx b/apps/nextjs/src/components/blog/PostHeader.tsx similarity index 100% rename from components/blog/PostHeader.tsx rename to apps/nextjs/src/components/blog/PostHeader.tsx diff --git a/components/blog/PostList.tsx b/apps/nextjs/src/components/blog/PostList.tsx similarity index 100% rename from components/blog/PostList.tsx rename to apps/nextjs/src/components/blog/PostList.tsx diff --git a/components/blog/PostMeta.tsx b/apps/nextjs/src/components/blog/PostMeta.tsx similarity index 97% rename from components/blog/PostMeta.tsx rename to apps/nextjs/src/components/blog/PostMeta.tsx index e0c32b6..7f3cc07 100644 --- a/components/blog/PostMeta.tsx +++ b/apps/nextjs/src/components/blog/PostMeta.tsx @@ -1,7 +1,7 @@ import AuthorAvatar from '@/components/authors/AuthorAvatar'; import Link from 'next/link'; import { formatDate } from '@/lib/format'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; import type { PostAuthor } from '@/types/blog'; interface PostMetaProps { diff --git a/components/blog/PostNavigation.tsx b/apps/nextjs/src/components/blog/PostNavigation.tsx similarity index 97% rename from components/blog/PostNavigation.tsx rename to apps/nextjs/src/components/blog/PostNavigation.tsx index 3eff4f3..c1cedcf 100644 --- a/components/blog/PostNavigation.tsx +++ b/apps/nextjs/src/components/blog/PostNavigation.tsx @@ -1,6 +1,6 @@ import { ArrowLeft, ArrowRight } from 'lucide-react'; import Link from 'next/link'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; import type { BlogPost } from '@/types/blog'; type PostLink = Pick; diff --git a/components/blog/TableOfContents.tsx b/apps/nextjs/src/components/blog/TableOfContents.tsx similarity index 94% rename from components/blog/TableOfContents.tsx rename to apps/nextjs/src/components/blog/TableOfContents.tsx index ebeba3c..bf43669 100644 --- a/components/blog/TableOfContents.tsx +++ b/apps/nextjs/src/components/blog/TableOfContents.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; import type { PostHeading } from '@/types/blog'; import HeadingList from './HeadingList'; diff --git a/components/blog/Tags.tsx b/apps/nextjs/src/components/blog/Tags.tsx similarity index 91% rename from components/blog/Tags.tsx rename to apps/nextjs/src/components/blog/Tags.tsx index 5059a5f..ef10d52 100644 --- a/components/blog/Tags.tsx +++ b/apps/nextjs/src/components/blog/Tags.tsx @@ -1,5 +1,5 @@ import { Hash } from 'lucide-react'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; const Tags = ({ tags, className }: { tags: string[]; className?: string }) => tags.length > 0 ? ( diff --git a/components/common/BrandIcon.tsx b/apps/nextjs/src/components/common/BrandIcon.tsx similarity index 100% rename from components/common/BrandIcon.tsx rename to apps/nextjs/src/components/common/BrandIcon.tsx diff --git a/components/common/Breadcrumbs.tsx b/apps/nextjs/src/components/common/Breadcrumbs.tsx similarity index 100% rename from components/common/Breadcrumbs.tsx rename to apps/nextjs/src/components/common/Breadcrumbs.tsx diff --git a/components/common/Container.tsx b/apps/nextjs/src/components/common/Container.tsx similarity index 86% rename from components/common/Container.tsx rename to apps/nextjs/src/components/common/Container.tsx index eec4bd4..1ebf9d1 100644 --- a/components/common/Container.tsx +++ b/apps/nextjs/src/components/common/Container.tsx @@ -1,5 +1,5 @@ import type { ComponentProps } from 'react'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; // The reading-width column shared by blog and author pages. const Container = ({ className, ...props }: ComponentProps<'div'>) => ( diff --git a/components/common/JsonLd.tsx b/apps/nextjs/src/components/common/JsonLd.tsx similarity index 100% rename from components/common/JsonLd.tsx rename to apps/nextjs/src/components/common/JsonLd.tsx diff --git a/components/common/ServerError.tsx b/apps/nextjs/src/components/common/ServerError.tsx similarity index 100% rename from components/common/ServerError.tsx rename to apps/nextjs/src/components/common/ServerError.tsx diff --git a/components/common/StatusMessage.tsx b/apps/nextjs/src/components/common/StatusMessage.tsx similarity index 100% rename from components/common/StatusMessage.tsx rename to apps/nextjs/src/components/common/StatusMessage.tsx diff --git a/components/common/ThemeScript.tsx b/apps/nextjs/src/components/common/ThemeScript.tsx similarity index 100% rename from components/common/ThemeScript.tsx rename to apps/nextjs/src/components/common/ThemeScript.tsx diff --git a/components/common/UnderDev.tsx b/apps/nextjs/src/components/common/UnderDev.tsx similarity index 100% rename from components/common/UnderDev.tsx rename to apps/nextjs/src/components/common/UnderDev.tsx diff --git a/components/home/ActivityCard.tsx b/apps/nextjs/src/components/home/ActivityCard.tsx similarity index 98% rename from components/home/ActivityCard.tsx rename to apps/nextjs/src/components/home/ActivityCard.tsx index 978343a..4ee83ad 100644 --- a/components/home/ActivityCard.tsx +++ b/apps/nextjs/src/components/home/ActivityCard.tsx @@ -1,6 +1,6 @@ import type { CSSProperties } from 'react'; import { ACTIVITY_WEEKS, type OrgStats } from '@/lib/github'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; interface ActivityCardProps { activity: OrgStats['activity']; diff --git a/components/home/BentoCell.tsx b/apps/nextjs/src/components/home/BentoCell.tsx similarity index 96% rename from components/home/BentoCell.tsx rename to apps/nextjs/src/components/home/BentoCell.tsx index ac11ffe..e49eb96 100644 --- a/components/home/BentoCell.tsx +++ b/apps/nextjs/src/components/home/BentoCell.tsx @@ -1,5 +1,5 @@ import type { ComponentProps, ReactNode } from 'react'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; export type BentoArea = | 'about' diff --git a/components/home/KarnatakaMap.tsx b/apps/nextjs/src/components/home/KarnatakaMap.tsx similarity index 100% rename from components/home/KarnatakaMap.tsx rename to apps/nextjs/src/components/home/KarnatakaMap.tsx diff --git a/components/home/LanguagesCard.tsx b/apps/nextjs/src/components/home/LanguagesCard.tsx similarity index 100% rename from components/home/LanguagesCard.tsx rename to apps/nextjs/src/components/home/LanguagesCard.tsx diff --git a/components/home/LinkCell.tsx b/apps/nextjs/src/components/home/LinkCell.tsx similarity index 100% rename from components/home/LinkCell.tsx rename to apps/nextjs/src/components/home/LinkCell.tsx diff --git a/components/home/maplibre.ts b/apps/nextjs/src/components/home/maplibre.ts similarity index 100% rename from components/home/maplibre.ts rename to apps/nextjs/src/components/home/maplibre.ts diff --git a/components/layout/Footer.tsx b/apps/nextjs/src/components/layout/Footer.tsx similarity index 100% rename from components/layout/Footer.tsx rename to apps/nextjs/src/components/layout/Footer.tsx diff --git a/components/layout/Header.tsx b/apps/nextjs/src/components/layout/Header.tsx similarity index 100% rename from components/layout/Header.tsx rename to apps/nextjs/src/components/layout/Header.tsx diff --git a/components/layout/Layout.tsx b/apps/nextjs/src/components/layout/Layout.tsx similarity index 100% rename from components/layout/Layout.tsx rename to apps/nextjs/src/components/layout/Layout.tsx diff --git a/components/layout/Logo.tsx b/apps/nextjs/src/components/layout/Logo.tsx similarity index 100% rename from components/layout/Logo.tsx rename to apps/nextjs/src/components/layout/Logo.tsx diff --git a/components/layout/NavLinks.tsx b/apps/nextjs/src/components/layout/NavLinks.tsx similarity index 100% rename from components/layout/NavLinks.tsx rename to apps/nextjs/src/components/layout/NavLinks.tsx diff --git a/components/layout/ThemeToggle.tsx b/apps/nextjs/src/components/layout/ThemeToggle.tsx similarity index 100% rename from components/layout/ThemeToggle.tsx rename to apps/nextjs/src/components/layout/ThemeToggle.tsx diff --git a/components/layout/styles.ts b/apps/nextjs/src/components/layout/styles.ts similarity index 100% rename from components/layout/styles.ts rename to apps/nextjs/src/components/layout/styles.ts diff --git a/components/team/MemberLoop.tsx b/apps/nextjs/src/components/team/MemberLoop.tsx similarity index 92% rename from components/team/MemberLoop.tsx rename to apps/nextjs/src/components/team/MemberLoop.tsx index 89c6ce6..97d4bdc 100644 --- a/components/team/MemberLoop.tsx +++ b/apps/nextjs/src/components/team/MemberLoop.tsx @@ -1,7 +1,7 @@ import type { CSSProperties } from 'react'; -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { Avatar, AvatarFallback, AvatarImage } from '@packages/ui/components/avatar'; import type { Person } from '@/lib/timeline'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; const MemberList = ({ people, diff --git a/components/team/SpotlightCard.tsx b/apps/nextjs/src/components/team/SpotlightCard.tsx similarity index 96% rename from components/team/SpotlightCard.tsx rename to apps/nextjs/src/components/team/SpotlightCard.tsx index a9d7234..a70091f 100644 --- a/components/team/SpotlightCard.tsx +++ b/apps/nextjs/src/components/team/SpotlightCard.tsx @@ -1,7 +1,7 @@ 'use client'; import { useRef, type ComponentProps, type PointerEvent } from 'react'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; const SpotlightCard = ({ className, diff --git a/components/team/Timeline.tsx b/apps/nextjs/src/components/team/Timeline.tsx similarity index 97% rename from components/team/Timeline.tsx rename to apps/nextjs/src/components/team/Timeline.tsx index 0b04201..6975f24 100644 --- a/components/team/Timeline.tsx +++ b/apps/nextjs/src/components/team/Timeline.tsx @@ -1,8 +1,8 @@ import { ArrowUpRight } from 'lucide-react'; import Link from 'next/link'; import BrandIcon from '@/components/common/BrandIcon'; -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; -import { Badge } from '@/components/ui/badge'; +import { Avatar, AvatarFallback, AvatarImage } from '@packages/ui/components/avatar'; +import { Badge } from '@packages/ui/components/badge'; import type { Milestone, Person, TimelineYear } from '@/lib/timeline'; import SpotlightCard from './SpotlightCard'; import TimelineScroll from './TimelineScroll'; diff --git a/components/team/TimelineScroll.tsx b/apps/nextjs/src/components/team/TimelineScroll.tsx similarity index 100% rename from components/team/TimelineScroll.tsx rename to apps/nextjs/src/components/team/TimelineScroll.tsx diff --git a/hooks/use-scroll-progress.ts b/apps/nextjs/src/hooks/use-scroll-progress.ts similarity index 100% rename from hooks/use-scroll-progress.ts rename to apps/nextjs/src/hooks/use-scroll-progress.ts diff --git a/hooks/use-theme.ts b/apps/nextjs/src/hooks/use-theme.ts similarity index 100% rename from hooks/use-theme.ts rename to apps/nextjs/src/hooks/use-theme.ts diff --git a/hooks/use-visible-sections.ts b/apps/nextjs/src/hooks/use-visible-sections.ts similarity index 100% rename from hooks/use-visible-sections.ts rename to apps/nextjs/src/hooks/use-visible-sections.ts diff --git a/lib/content/authors.ts b/apps/nextjs/src/lib/content/authors.ts similarity index 100% rename from lib/content/authors.ts rename to apps/nextjs/src/lib/content/authors.ts diff --git a/lib/content/collection.ts b/apps/nextjs/src/lib/content/collection.ts similarity index 100% rename from lib/content/collection.ts rename to apps/nextjs/src/lib/content/collection.ts diff --git a/lib/content/markdown.ts b/apps/nextjs/src/lib/content/markdown.ts similarity index 100% rename from lib/content/markdown.ts rename to apps/nextjs/src/lib/content/markdown.ts diff --git a/lib/content/posts.ts b/apps/nextjs/src/lib/content/posts.ts similarity index 100% rename from lib/content/posts.ts rename to apps/nextjs/src/lib/content/posts.ts diff --git a/lib/content/schema.ts b/apps/nextjs/src/lib/content/schema.ts similarity index 100% rename from lib/content/schema.ts rename to apps/nextjs/src/lib/content/schema.ts diff --git a/lib/fonts.ts b/apps/nextjs/src/lib/fonts.ts similarity index 82% rename from lib/fonts.ts rename to apps/nextjs/src/lib/fonts.ts index bbc1528..6e1dbb4 100644 --- a/lib/fonts.ts +++ b/apps/nextjs/src/lib/fonts.ts @@ -2,7 +2,7 @@ import localFont from 'next/font/local'; // micro-optimizing every last detail to improve performance by 0.0001ms export const cascadia = localFont({ - src: '../node_modules/@fontsource-variable/cascadia-code/files/cascadia-code-latin-wght-normal.woff2', + src: '../../node_modules/@fontsource-variable/cascadia-code/files/cascadia-code-latin-wght-normal.woff2', weight: '200 700', style: 'normal', adjustFontFallback: false, @@ -17,7 +17,7 @@ export const cascadia = localFont({ }); export const cascadiaItalic = localFont({ - src: '../node_modules/@fontsource-variable/cascadia-code/files/cascadia-code-latin-wght-italic.woff2', + src: '../../node_modules/@fontsource-variable/cascadia-code/files/cascadia-code-latin-wght-italic.woff2', weight: '200 700', style: 'italic', adjustFontFallback: false, diff --git a/lib/format.ts b/apps/nextjs/src/lib/format.ts similarity index 100% rename from lib/format.ts rename to apps/nextjs/src/lib/format.ts diff --git a/lib/github.ts b/apps/nextjs/src/lib/github.ts similarity index 99% rename from lib/github.ts rename to apps/nextjs/src/lib/github.ts index fedcc5a..ec32c27 100644 --- a/lib/github.ts +++ b/apps/nextjs/src/lib/github.ts @@ -1,5 +1,5 @@ import 'server-only'; -import { env } from './env'; +import { env } from '@packages/env'; export const githubOrg = 'Manipal-OSF'; diff --git a/lib/og.tsx b/apps/nextjs/src/lib/og.tsx similarity index 100% rename from lib/og.tsx rename to apps/nextjs/src/lib/og.tsx diff --git a/lib/rehype-ec.mjs b/apps/nextjs/src/lib/rehype-ec.mjs similarity index 100% rename from lib/rehype-ec.mjs rename to apps/nextjs/src/lib/rehype-ec.mjs diff --git a/lib/resend.ts b/apps/nextjs/src/lib/resend.ts similarity index 88% rename from lib/resend.ts rename to apps/nextjs/src/lib/resend.ts index 5852f81..a35b12e 100644 --- a/lib/resend.ts +++ b/apps/nextjs/src/lib/resend.ts @@ -1,6 +1,6 @@ import 'server-only'; import { Resend } from 'resend'; -import { env } from './env'; +import { env } from '@packages/env'; let resend: Resend | undefined; diff --git a/lib/seo.ts b/apps/nextjs/src/lib/seo.ts similarity index 100% rename from lib/seo.ts rename to apps/nextjs/src/lib/seo.ts diff --git a/lib/site.ts b/apps/nextjs/src/lib/site.ts similarity index 100% rename from lib/site.ts rename to apps/nextjs/src/lib/site.ts diff --git a/lib/team.ts b/apps/nextjs/src/lib/team.ts similarity index 100% rename from lib/team.ts rename to apps/nextjs/src/lib/team.ts diff --git a/lib/theme.ts b/apps/nextjs/src/lib/theme.ts similarity index 100% rename from lib/theme.ts rename to apps/nextjs/src/lib/theme.ts diff --git a/lib/timeline.ts b/apps/nextjs/src/lib/timeline.ts similarity index 100% rename from lib/timeline.ts rename to apps/nextjs/src/lib/timeline.ts diff --git a/mdx-components.tsx b/apps/nextjs/src/mdx-components.tsx similarity index 100% rename from mdx-components.tsx rename to apps/nextjs/src/mdx-components.tsx diff --git a/styles/globals.css b/apps/nextjs/src/styles/globals.css similarity index 55% rename from styles/globals.css rename to apps/nextjs/src/styles/globals.css index 335ac65..912c855 100644 --- a/styles/globals.css +++ b/apps/nextjs/src/styles/globals.css @@ -1,130 +1,8 @@ -@import 'tailwindcss'; -@import 'tw-animate-css'; -@import 'shadcn/tailwind.css'; +@import '@tooling/tailwind/styles.css'; @import '@fontsource-variable/cascadia-code'; @import './typography.css'; -@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); - -@theme inline { - --font-sans: 'Cascadia Code Latin', 'Cascadia Code Variable', ui-sans-serif, - system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-mono: 'Cascadia Code Latin', 'Cascadia Code Variable', ui-monospace, - SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', - monospace; - - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --radius-sm: calc(var(--radius) * 0.6); - --radius-md: calc(var(--radius) * 0.8); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) * 1.4); - --radius-2xl: calc(var(--radius) * 1.8); - --radius-3xl: calc(var(--radius) * 2.2); - --radius-4xl: calc(var(--radius) * 2.6); - - --animate-marquee: marquee var(--marquee-duration, 60s) linear infinite; - - @keyframes marquee { - to { - transform: translateX(-50%); - } - } -} - -/* light theme corresponds to nord palette */ -:root { - --radius: 0.625rem; - --background: #eceff4; - --foreground: #2e3440; - --card: #e5e9f0; - --card-foreground: #2e3440; - --popover: #eceff4; - --popover-foreground: #2e3440; - --primary: #5e81ac; - --primary-foreground: #eceff4; - --secondary: #e5e9f0; - --secondary-foreground: #2e3440; - --accent: #d8dee9; - --accent-foreground: #2e3440; - --muted: #e5e9f0; - --muted-foreground: #4c566a; - --destructive: #bf616a; - --destructive-foreground: #eceff4; - --border: #d8dee9; - --input: #d8dee9; - --ring: #88c0d0; - --awesome-from: #b21e59; - --awesome-to: #825000; -} - -/* whereas dark is catpuccin's */ -[data-theme='dark'] { - --background: #1e1e2e; - --foreground: #cdd6f4; - --card: #181825; - --card-foreground: #cdd6f4; - --popover: #1e1e2e; - --popover-foreground: #cdd6f4; - --primary: #cba6f7; - --primary-foreground: #11111b; - --secondary: #313244; - --secondary-foreground: #cdd6f4; - --accent: #313244; - --accent-foreground: #cdd6f4; - --muted: #181825; - --muted-foreground: #a6adc8; - --destructive: #f38ba8; - --destructive-foreground: #11111b; - --border: #313244; - --input: #313244; - --ring: #b4befe; - --awesome-from: #ff9592; - --awesome-to: #f5e147; -} - -@layer base { - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - @apply border-border outline-ring/50 tracking-tight; - } -} - -/* A two-tone gradient for accent text */ -@utility text-awesome { - color: var(--awesome-from); - - @supports (background-clip: text) { - background-image: linear-gradient( - 90deg, - var(--awesome-from), - var(--awesome-to) - ); - background-clip: text; - color: transparent; - } -} +@source '..'; /* Home page bento grid: two columns on small screens, four from 64rem. */ .bento { diff --git a/styles/typography.css b/apps/nextjs/src/styles/typography.css similarity index 100% rename from styles/typography.css rename to apps/nextjs/src/styles/typography.css diff --git a/types/blog.ts b/apps/nextjs/src/types/blog.ts similarity index 100% rename from types/blog.ts rename to apps/nextjs/src/types/blog.ts diff --git a/apps/nextjs/tsconfig.json b/apps/nextjs/tsconfig.json new file mode 100644 index 0000000..0e6d017 --- /dev/null +++ b/apps/nextjs/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@tooling/typescript/nextjs", + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "next-env.d.ts", + "next.config.ts", + "src/**/*.ts", + "src/**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index dd01468..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig, globalIgnores } from 'eslint/config'; -import nextVitals from 'eslint-config-next/core-web-vitals'; - -export default defineConfig([ - ...nextVitals, - globalIgnores(['.next/**', 'out/**', 'build/**', 'next-env.d.ts']), -]); diff --git a/package.json b/package.json index bd7b776..f5a9ea2 100644 --- a/package.json +++ b/package.json @@ -1,76 +1,27 @@ { - "name": "site", - "version": "0.1.0", + "name": "website", "private": true, "packageManager": "pnpm@11.2.2", "engines": { - "node": ">=22" + "node": ">=22.18.0" }, "scripts": { - "dev": "next dev --turbopack", - "build": "next build --turbopack", - "start": "next start", - "lint": "eslint .", - "typecheck": "next typegen && tsc --noEmit", - "email:dev": "email dev --dir emails --port 3001", - "format": "prettier . -w" - }, - "dependencies": { - "@base-ui/react": "^1.8.0", - "@better-auth/drizzle-adapter": "^1.7.7", - "@fontsource-variable/cascadia-code": "^5.3.0", - "@mdx-js/loader": "^3.1.1", - "@mdx-js/react": "^3.1.1", - "@neondatabase/serverless": "^1.2.0", - "@next/mdx": "^16.4.0", - "@t3-oss/env-nextjs": "^0.13.11", - "@types/mdx": "^2.0.14", - "@vercel/analytics": "^2.0.1", - "@vercel/speed-insights": "^2.0.0", - "better-auth": "^1.7.7", - "class-variance-authority": "^0.7.1", - "cn": "^0.4.0", - "drizzle-orm": "^0.45.3", - "github-slugger": "2.0.0", - "gray-matter": "^4.0.3", - "lucide-react": "^1.52.0", - "maplibre-gl": "^6.13.0", - "mdast-util-to-string": "^4.0.0", - "next": "^16.4.0", - "react": "^19.3.0", - "react-dom": "^19.3.0", - "react-email": "^6.11.1", - "react-markdown": "^10.1.0", - "rehype-expressive-code": "^0.44.2", - "rehype-external-links": "^3.0.0", - "rehype-katex": "^7.0.1", - "rehype-slug": "^6.0.0", - "remark-emoji": "^5.0.2", - "remark-gfm": "^4.0.1", - "remark-math": "^6.0.0", - "remark-parse": "^11.0.0", - "resend": "^6.32.1", - "server-only": "^0.0.1", - "shadcn": "^4.21.4", - "tw-animate-css": "^1.4.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.1.0", - "zod": "^4.6.5" + "dev": "with-env development turbo run dev --filter='./apps/*'", + "build": "with-env production turbo run build", + "start": "pnpm --filter @apps/nextjs start", + "lint": "turbo run lint", + "typecheck": "with-env production turbo run typecheck", + "test": "with-env test turbo run test", + "email:dev": "pnpm --filter @packages/email dev", + "format": "prettier . --write", + "format:check": "prettier . --check" }, "devDependencies": { - "@react-email/ui": "^6.11.1", - "@tailwindcss/postcss": "^4.3.3", - "@types/mdast": "^4.0.4", - "@types/node": "^26.6.4", - "@types/react": "^19.3.0", - "@types/react-dom": "^19.3.0", - "drizzle-kit": "^0.31.11", - "eslint": "^9.39.0", - "eslint-config-next": "^16.4.0", - "postcss": "^8.4.14", - "prettier": "^2.8.3", - "prettier-plugin-tailwindcss": "^0.2.1", - "tailwindcss": "^4.0.0", - "typescript": "~6.0.0" - } + "@packages/env": "workspace:*", + "@tooling/prettier": "workspace:*", + "next": "catalog:", + "prettier": "catalog:", + "turbo": "^2.5.0" + }, + "prettier": "@tooling/prettier" } diff --git a/packages/auth/eslint.config.mjs b/packages/auth/eslint.config.mjs new file mode 100644 index 0000000..81b18e1 --- /dev/null +++ b/packages/auth/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/base'; diff --git a/packages/auth/package.json b/packages/auth/package.json new file mode 100644 index 0000000..b38f564 --- /dev/null +++ b/packages/auth/package.json @@ -0,0 +1,26 @@ +{ + "name": "@packages/auth", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "lint": "eslint .", + "typecheck": "tsc --noEmit", + "test": "node --test tests/*.test.ts" + }, + "dependencies": { + "better-auth": "^1.7.7", + "@better-auth/drizzle-adapter": "^1.7.7", + "@packages/db": "workspace:*" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:", + "drizzle-orm": "catalog:" + } +} diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts new file mode 100644 index 0000000..a9dd473 --- /dev/null +++ b/packages/auth/src/index.ts @@ -0,0 +1,48 @@ +import { drizzleAdapter } from '@better-auth/drizzle-adapter'; +import type { Database } from '@packages/db'; +import { betterAuth, type BetterAuthOptions } from 'better-auth/minimal'; + +export type AppAuthOptions = Omit & { + secret: string; + baseURL: string; + trustedOrigins: string[]; +}; + +/** Apps own their instance, schema, origins, providers, and session policies. */ +export function createAuth< + Schema extends Record, + const Options extends AppAuthOptions +>({ + db, + schema, + options, +}: { + db: Database; + schema: Schema; + options: Options; +}) { + if ('window' in globalThis) { + throw new Error('@packages/auth can only be used on the server.'); + } + if (!options.secret || options.secret.length < 32) { + throw new Error('Provide an auth secret of at least 32 characters.'); + } + if (!options.baseURL || !Array.isArray(options.trustedOrigins)) { + throw new Error('Provide an app-specific auth baseURL and trustedOrigins.'); + } + if (!schema || Object.keys(schema).length === 0) { + throw new Error( + 'Provide the auth tables generated for your app configuration.' + ); + } + + return betterAuth({ + ...options, + database: drizzleAdapter(db, { + provider: 'pg', + schema, + // Neon HTTP does not support interactive transactions. + transaction: false, + }), + }); +} diff --git a/packages/auth/tests/factory.test.ts b/packages/auth/tests/factory.test.ts new file mode 100644 index 0000000..f0e43e8 --- /dev/null +++ b/packages/auth/tests/factory.test.ts @@ -0,0 +1,68 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { createDb } from '@packages/db'; +import { pgTable, text } from 'drizzle-orm/pg-core'; +import { createAuth } from '../src/index.ts'; + +const schema = { user: pgTable('test_user', { id: text('id').primaryKey() }) }; +const db = createDb('postgresql://test:test@database.invalid/test', schema); +const options = { + secret: 'test-auth-secret-with-enough-entropy-for-unit-tests-123456', + baseURL: 'https://one.example.com', + trustedOrigins: ['https://one.example.com'], + telemetry: { enabled: false }, + advanced: { database: { validateSchema: false as const } }, +}; + +test('creates separate app instances and preserves plugin and session types', async () => { + const one = createAuth({ + db, + schema, + options: { + ...options, + plugins: [ + { + id: 'example', + $ERROR_CODES: { + EXAMPLE: { code: 'EXAMPLE', message: 'Example error' }, + }, + }, + ], + user: { + additionalFields: { role: { type: 'string', defaultValue: 'member' } }, + }, + }, + }); + const two = createAuth({ + db, + schema, + options: { + ...options, + baseURL: 'https://two.example.com', + trustedOrigins: ['https://two.example.com'], + }, + }); + + assert.notEqual(one, two); + assert.equal(one.options.baseURL, 'https://one.example.com'); + assert.equal(two.options.baseURL, 'https://two.example.com'); + assert.equal(one.$ERROR_CODES.EXAMPLE.message, 'Example error'); + // This assignment also verifies the factory retains additional session fields. + const role: typeof one.$Infer.Session.user.role = 'member'; + assert.equal(role, 'member'); + await Promise.all([one.$context, two.$context]); +}); + +test('requires explicit credentials and auth tables', () => { + assert.throws( + () => createAuth({ db, schema, options: { ...options, secret: '' } }), + /auth secret/ + ); + const unconfiguredDb = createDb( + 'postgresql://test:test@database.invalid/test' + ); + assert.throws( + () => createAuth({ db: unconfiguredDb, schema: {}, options }), + /auth tables/ + ); +}); diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json new file mode 100644 index 0000000..fa6713b --- /dev/null +++ b/packages/auth/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tooling/typescript/base", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/db/eslint.config.mjs b/packages/db/eslint.config.mjs new file mode 100644 index 0000000..81b18e1 --- /dev/null +++ b/packages/db/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/base'; diff --git a/packages/db/package.json b/packages/db/package.json new file mode 100644 index 0000000..46c6c16 --- /dev/null +++ b/packages/db/package.json @@ -0,0 +1,26 @@ +{ + "name": "@packages/db", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "lint": "eslint .", + "typecheck": "tsc --noEmit", + "test": "node --test tests/*.test.ts" + }, + "dependencies": { + "drizzle-orm": "catalog:", + "@neondatabase/serverless": "^1.2.0", + "@packages/env": "workspace:*" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:", + "drizzle-kit": "^0.31.11" + } +} diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts new file mode 100644 index 0000000..b8380a3 --- /dev/null +++ b/packages/db/src/index.ts @@ -0,0 +1,41 @@ +import { env } from '@packages/env'; +import { drizzle, type NeonHttpDatabase } from 'drizzle-orm/neon-http'; +import type { NeonQueryFunction } from '@neondatabase/serverless'; + +export type Database< + Schema extends Record = Record +> = NeonHttpDatabase & { $client: NeonQueryFunction }; + +/** Construct a client without opening a connection or running a query. */ +export function createDb< + Schema extends Record = Record +>(url: string, schema?: Schema): Database { + if ('window' in globalThis) { + throw new Error('@packages/db can only be used on the server.'); + } + + let validUrl = false; + try { + validUrl = ['postgres:', 'postgresql:'].includes(new URL(url).protocol); + } catch { + // Report configuration errors without including connection credentials. + } + if (!validUrl) { + throw new Error( + 'A valid PostgreSQL connection URL is required to create a database client.' + ); + } + + return drizzle({ connection: url, schema }); +} + +let database: Database | undefined; + +/** Convenience client for apps sharing DATABASE_URL and using direct SQL queries. */ +export function getDb(): Database { + if (!env.DATABASE_URL) { + throw new Error('Set DATABASE_URL before using the database.'); + } + + return (database ??= createDb(env.DATABASE_URL)); +} diff --git a/packages/db/tests/client.test.ts b/packages/db/tests/client.test.ts new file mode 100644 index 0000000..fec9f24 --- /dev/null +++ b/packages/db/tests/client.test.ts @@ -0,0 +1,57 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { spawnSync } from 'node:child_process'; +import { pgTable, text } from 'drizzle-orm/pg-core'; +import { createDb } from '../src/index.ts'; + +test('constructs schema-aware clients without making network requests', (t) => { + const previousFetch = globalThis.fetch; + globalThis.fetch = () => { + throw new Error('Unexpected database request'); + }; + t.after(() => { + globalThis.fetch = previousFetch; + }); + const schema = { + example: pgTable('example', { id: text('id').primaryKey() }), + }; + const db = createDb('postgresql://test:test@database.invalid/test', schema); + assert.ok(db.query.example); + assert.equal(typeof db.select, 'function'); +}); + +test('rejects invalid URLs without echoing credentials', () => { + assert.throws(() => createDb('https://user:private@example.com'), { + message: + 'A valid PostgreSQL connection URL is required to create a database client.', + }); +}); + +test('the convenience client is optional until first use and is memoized', () => { + const moduleUrl = new URL('../src/index.ts', import.meta.url).href; + const args = [ + '--input-type=module', + '-e', + ` + import { getDb } from ${JSON.stringify(moduleUrl)}; + if (!process.env.DATABASE_URL) { + try { getDb(); process.exit(2); } + catch (error) { console.log(error.message); } + } else if (getDb() !== getDb()) { process.exit(3); } + `, + ]; + const missing = spawnSync(process.execPath, args, { + env: { ...process.env, DATABASE_URL: '' }, + encoding: 'utf8', + }); + assert.equal(missing.status, 0, missing.stderr); + assert.match(missing.stdout, /Set DATABASE_URL before using the database/); + const configured = spawnSync(process.execPath, args, { + env: { + ...process.env, + DATABASE_URL: 'postgresql://test:test@database.invalid/test', + }, + encoding: 'utf8', + }); + assert.equal(configured.status, 0, configured.stderr); +}); diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json new file mode 100644 index 0000000..fa6713b --- /dev/null +++ b/packages/db/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tooling/typescript/base", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/email/eslint.config.mjs b/packages/email/eslint.config.mjs new file mode 100644 index 0000000..2f09f88 --- /dev/null +++ b/packages/email/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/react'; diff --git a/packages/email/package.json b/packages/email/package.json new file mode 100644 index 0000000..c2d4565 --- /dev/null +++ b/packages/email/package.json @@ -0,0 +1,29 @@ +{ + "name": "@packages/email", + "private": true, + "type": "module", + "exports": { + "./example": "./templates/example.tsx" + }, + "scripts": { + "lint": "eslint .", + "typecheck": "tsc --noEmit", + "dev": "with-env development email dev --dir templates --port 3001" + }, + "dependencies": { + "react-email": "^6.11.1" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:", + "@react-email/ui": "^6.11.1", + "react": "catalog:", + "react-dom": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@packages/env": "workspace:*" + } +} diff --git a/emails/example.tsx b/packages/email/templates/example.tsx similarity index 100% rename from emails/example.tsx rename to packages/email/templates/example.tsx diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 0000000..5309f40 --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tooling/typescript/react", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/env/bin/with-env.mjs b/packages/env/bin/with-env.mjs new file mode 100755 index 0000000..cddc833 --- /dev/null +++ b/packages/env/bin/with-env.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import { spawn } from 'node:child_process'; +import { constants } from 'node:os'; +import { loadRootEnv } from '../load.mjs'; + +const [mode, command, ...args] = process.argv.slice(2); + +if (!command) { + console.error( + 'Usage: with-env [args...]' + ); + process.exit(1); +} + +loadRootEnv(mode); + +const child = spawn(command, args, { stdio: 'inherit', env: process.env }); +const forwardSignal = (signal) => child.kill(signal); +process.on('SIGINT', forwardSignal); +process.on('SIGTERM', forwardSignal); + +child.on('error', (error) => { + console.error(`Unable to run ${command}: ${error.message}`); + process.exitCode = 1; +}); + +child.on('exit', (code, signal) => { + process.removeListener('SIGINT', forwardSignal); + process.removeListener('SIGTERM', forwardSignal); + process.exitCode = code ?? 128 + (constants.signals[signal] ?? 1); +}); diff --git a/packages/env/eslint.config.mjs b/packages/env/eslint.config.mjs new file mode 100644 index 0000000..81b18e1 --- /dev/null +++ b/packages/env/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/base'; diff --git a/packages/env/load.mjs b/packages/env/load.mjs new file mode 100644 index 0000000..3279c0f --- /dev/null +++ b/packages/env/load.mjs @@ -0,0 +1,16 @@ +import nextEnv from '@next/env'; +import { fileURLToPath } from 'node:url'; + +export const workspaceRoot = fileURLToPath(new URL('../../', import.meta.url)); + +/** Load root .env files without coupling runtime validation to the filesystem. */ +export function loadRootEnv(mode, directory = workspaceRoot) { + if (!['development', 'production', 'test'].includes(mode)) { + throw new Error( + 'Environment mode must be development, production, or test.' + ); + } + + process.env.NODE_ENV = mode; + return nextEnv.loadEnvConfig(directory, mode === 'development'); +} diff --git a/packages/env/package.json b/packages/env/package.json new file mode 100644 index 0000000..312f0ba --- /dev/null +++ b/packages/env/package.json @@ -0,0 +1,29 @@ +{ + "name": "@packages/env", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts", + "./load": "./load.mjs" + }, + "scripts": { + "lint": "eslint .", + "typecheck": "tsc --noEmit", + "test": "node --test tests/*.test.mjs" + }, + "dependencies": { + "@t3-oss/env-nextjs": "^0.13.11", + "@next/env": "catalog:", + "zod": "catalog:" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:" + }, + "bin": { + "with-env": "./bin/with-env.mjs" + } +} diff --git a/lib/env.ts b/packages/env/src/index.ts similarity index 100% rename from lib/env.ts rename to packages/env/src/index.ts diff --git a/packages/env/tests/load.test.mjs b/packages/env/tests/load.test.mjs new file mode 100644 index 0000000..c5f2f4f --- /dev/null +++ b/packages/env/tests/load.test.mjs @@ -0,0 +1,127 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { test } from 'node:test'; +import { workspaceRoot } from '../load.mjs'; + +const loaderUrl = new URL('../load.mjs', import.meta.url).href; +const cli = fileURLToPath(new URL('../bin/with-env.mjs', import.meta.url)); +const key = 'MONOREPO_ENV_TEST_VALUE'; + +function fixture(t) { + const directory = mkdtempSync(path.join(tmpdir(), 'website-env-')); + t.after(() => rmSync(directory, { recursive: true, force: true })); + return directory; +} + +function load(directory, mode, overrides = {}) { + const environment = { ...process.env, ...overrides }; + delete environment.__NEXT_PROCESSED_ENV; + if (!(key in overrides)) delete environment[key]; + const result = spawnSync( + process.execPath, + [ + '--input-type=module', + '-e', + ` + import { loadRootEnv } from ${JSON.stringify(loaderUrl)}; + loadRootEnv(${JSON.stringify(mode)}, ${JSON.stringify(directory)}); + console.log(process.env.${key} ?? 'unset'); + `, + ], + { cwd: tmpdir(), env: environment, encoding: 'utf8' } + ); + assert.equal(result.status, 0, result.stderr); + return result.stdout.trim(); +} + +test('loads root files independently of the working directory and respects precedence', (t) => { + const directory = fixture(t); + writeFileSync(path.join(directory, '.env'), `${key}=base\n`); + writeFileSync(path.join(directory, '.env.local'), `${key}=local\n`); + writeFileSync( + path.join(directory, '.env.production.local'), + `${key}=production\n` + ); + assert.equal(load(directory, 'development'), 'local'); + assert.equal(load(directory, 'production'), 'production'); + assert.equal( + load(directory, 'production', { [key]: 'provided' }), + 'provided' + ); + assert.equal(load(directory, 'test'), 'base'); +}); + +test('missing environment files are valid', (t) => { + assert.equal(load(fixture(t), 'production'), 'unset'); +}); + +test('CLI resolves the repository root and preserves command exit codes', () => { + assert.equal( + workspaceRoot, + fileURLToPath(new URL('../../../', import.meta.url)) + ); + const result = spawnSync( + process.execPath, + [cli, 'test', process.execPath, '-e', 'process.exit(7)'], + { + cwd: tmpdir(), + } + ); + assert.equal(result.status, 7); +}); + +test('validation accepts missing services and rejects malformed configuration', () => { + const environment = { ...process.env }; + for (const name of [ + 'DATABASE_URL', + 'BETTER_AUTH_SECRET', + 'BETTER_AUTH_URL', + 'RESEND_API_KEY', + 'RESEND_FROM_EMAIL', + 'GITHUB_TOKEN', + ]) { + environment[name] = ''; + } + const args = [ + '--input-type=module', + '-e', + `import ${JSON.stringify( + new URL('../src/index.ts', import.meta.url).href + )}`, + ]; + assert.equal( + spawnSync(process.execPath, args, { env: environment }).status, + 0 + ); + assert.notEqual( + spawnSync(process.execPath, args, { + env: { ...environment, DATABASE_URL: 'https://invalid.example.com' }, + }).status, + 0 + ); +}); + +test('server variables cannot be read in browser code', () => { + const result = spawnSync( + process.execPath, + [ + '--input-type=module', + '-e', + ` + globalThis.window = {}; + const { env } = await import(${JSON.stringify( + new URL('../src/index.ts', import.meta.url).href + )}); + try { env.DATABASE_URL; process.exit(2); } + catch (error) { console.log(error.message); } + `, + ], + { encoding: 'utf8' } + ); + assert.equal(result.status, 0, result.stderr); + assert.match(result.stdout, /server-side environment variable/); +}); diff --git a/packages/env/tsconfig.json b/packages/env/tsconfig.json new file mode 100644 index 0000000..fa6713b --- /dev/null +++ b/packages/env/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tooling/typescript/base", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/ui/components.json b/packages/ui/components.json new file mode 100644 index 0000000..dea85ff --- /dev/null +++ b/packages/ui/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "base-nova", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "../../tooling/tailwind/styles.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@packages/ui/components", + "ui": "@packages/ui/components", + "utils": "@packages/ui/lib/utils", + "lib": "@packages/ui/lib", + "hooks": "@packages/ui/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/packages/ui/eslint.config.mjs b/packages/ui/eslint.config.mjs new file mode 100644 index 0000000..2f09f88 --- /dev/null +++ b/packages/ui/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/react'; diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..2dc7e62 --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,37 @@ +{ + "name": "@packages/ui", + "private": true, + "type": "module", + "exports": { + "./components/*": "./src/components/*.tsx", + "./lib/*": "./src/lib/*.ts", + "./hooks/*": "./src/hooks/*.ts" + }, + "scripts": { + "lint": "eslint .", + "typecheck": "tsc --noEmit", + "ui:add": "shadcn add" + }, + "dependencies": { + "@base-ui/react": "catalog:", + "class-variance-authority": "^0.7.1", + "cn": "^0.4.0" + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/node": "catalog:", + "eslint": "catalog:", + "typescript": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "shadcn": "catalog:", + "@tooling/tailwind": "workspace:*" + }, + "peerDependencies": { + "react": "^19.3.0", + "react-dom": "^19.3.0" + } +} diff --git a/components/ui/avatar.tsx b/packages/ui/src/components/avatar.tsx similarity index 98% rename from components/ui/avatar.tsx rename to packages/ui/src/components/avatar.tsx index 62addc6..f6572fc 100644 --- a/components/ui/avatar.tsx +++ b/packages/ui/src/components/avatar.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { Avatar as AvatarPrimitive } from '@base-ui/react/avatar'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; function Avatar({ className, diff --git a/components/ui/badge.tsx b/packages/ui/src/components/badge.tsx similarity index 97% rename from components/ui/badge.tsx rename to packages/ui/src/components/badge.tsx index 292a7fc..1c5137f 100644 --- a/components/ui/badge.tsx +++ b/packages/ui/src/components/badge.tsx @@ -1,7 +1,7 @@ import { mergeProps } from '@base-ui/react/merge-props'; import { useRender } from '@base-ui/react/use-render'; import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; const badgeVariants = cva( 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!', diff --git a/components/ui/button.tsx b/packages/ui/src/components/button.tsx similarity index 98% rename from components/ui/button.tsx rename to packages/ui/src/components/button.tsx index 34efad7..a530b76 100644 --- a/components/ui/button.tsx +++ b/packages/ui/src/components/button.tsx @@ -1,6 +1,6 @@ import { Button as ButtonPrimitive } from '@base-ui/react/button'; import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/lib/utils'; +import { cn } from '@packages/ui/lib/utils'; const buttonVariants = cva( "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", diff --git a/lib/utils.ts b/packages/ui/src/lib/utils.ts similarity index 100% rename from lib/utils.ts rename to packages/ui/src/lib/utils.ts diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000..5309f40 --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@tooling/typescript/react", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53b94fd..2755b81 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,16 +4,94 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@base-ui/react': + specifier: ^1.8.0 + version: 1.8.0 + '@next/env': + specifier: ^16.4.0 + version: 16.4.0 + '@tailwindcss/postcss': + specifier: ^4.3.3 + version: 4.3.3 + '@types/node': + specifier: ^26.6.4 + version: 26.6.4 + '@types/react': + specifier: ^19.3.0 + version: 19.3.0 + '@types/react-dom': + specifier: ^19.3.0 + version: 19.3.0 + drizzle-orm: + specifier: ^0.45.3 + version: 0.45.3 + eslint: + specifier: ^9.39.0 + version: 9.39.5 + eslint-config-next: + specifier: ^16.4.0 + version: 16.4.0 + next: + specifier: ^16.4.0 + version: 16.4.0 + postcss: + specifier: ^8.4.14 + version: 8.5.29 + prettier: + specifier: ^2.8.3 + version: 2.8.8 + prettier-plugin-tailwindcss: + specifier: ^0.2.1 + version: 0.2.8 + react: + specifier: ^19.3.0 + version: 19.3.0 + react-dom: + specifier: ^19.3.0 + version: 19.3.0 + server-only: + specifier: ^0.0.1 + version: 0.0.1 + shadcn: + specifier: ^4.21.4 + version: 4.21.4 + tailwindcss: + specifier: ^4.0.0 + version: 4.3.3 + typescript: + specifier: ~6.0.0 + version: 6.0.3 + zod: + specifier: ^4.6.5 + version: 4.6.5 + importers: .: + devDependencies: + '@packages/env': + specifier: workspace:* + version: link:packages/env + '@tooling/prettier': + specifier: workspace:* + version: link:tooling/prettier + next: + specifier: 'catalog:' + version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + prettier: + specifier: 'catalog:' + version: 2.8.8 + turbo: + specifier: ^2.5.0 + version: 2.11.9 + + apps/nextjs: dependencies: '@base-ui/react': - specifier: ^1.8.0 + specifier: 'catalog:' version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@better-auth/drizzle-adapter': - specifier: ^1.7.7 - version: 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6)) '@fontsource-variable/cascadia-code': specifier: ^5.3.0 version: 5.3.0 @@ -23,15 +101,24 @@ importers: '@mdx-js/react': specifier: ^3.1.1 version: 3.1.1(@types/react@19.3.0)(react@19.3.0) - '@neondatabase/serverless': - specifier: ^1.2.0 - version: 1.2.0 '@next/mdx': specifier: ^16.4.0 version: 16.4.0(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.3.0)(react@19.3.0)) - '@t3-oss/env-nextjs': - specifier: ^0.13.11 - version: 0.13.11(typescript@6.0.3)(zod@4.6.5) + '@packages/auth': + specifier: workspace:* + version: link:../../packages/auth + '@packages/db': + specifier: workspace:* + version: link:../../packages/db + '@packages/email': + specifier: workspace:* + version: link:../../packages/email + '@packages/env': + specifier: workspace:* + version: link:../../packages/env + '@packages/ui': + specifier: workspace:* + version: link:../../packages/ui '@types/mdx': specifier: ^2.0.14 version: 2.0.14 @@ -41,18 +128,6 @@ importers: '@vercel/speed-insights': specifier: ^2.0.0 version: 2.0.0(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) - better-auth: - specifier: ^1.7.7 - version: 1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - cn: - specifier: ^0.4.0 - version: 0.4.0 - drizzle-orm: - specifier: ^0.45.3 - version: 0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6) github-slugger: specifier: 2.0.0 version: 2.0.0 @@ -69,17 +144,14 @@ importers: specifier: ^4.0.0 version: 4.0.0 next: - specifier: ^16.4.0 + specifier: 'catalog:' version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: - specifier: ^19.3.0 + specifier: 'catalog:' version: 19.3.0 react-dom: - specifier: ^19.3.0 + specifier: 'catalog:' version: 19.3.0(react@19.3.0) - react-email: - specifier: ^6.11.1 - version: 6.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react-markdown: specifier: ^10.1.0 version: 10.1.0(@types/react@19.3.0)(react@19.3.0) @@ -111,14 +183,8 @@ importers: specifier: ^6.32.1 version: 6.32.1(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) server-only: - specifier: ^0.0.1 + specifier: 'catalog:' version: 0.0.1 - shadcn: - specifier: ^4.21.4 - version: 4.21.4 - tw-animate-css: - specifier: ^1.4.0 - version: 1.4.0 unified: specifier: ^11.0.5 version: 11.0.5 @@ -126,50 +192,276 @@ importers: specifier: ^5.1.0 version: 5.1.0 zod: - specifier: ^4.6.5 + specifier: 'catalog:' version: 4.6.5 devDependencies: - '@react-email/ui': - specifier: ^6.11.1 - version: 6.11.1(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tailwindcss/postcss': - specifier: ^4.3.3 - version: 4.3.3 + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/tailwind': + specifier: workspace:* + version: link:../../tooling/tailwind + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript '@types/mdast': specifier: ^4.0.4 version: 4.0.4 '@types/node': - specifier: ^26.6.4 + specifier: 'catalog:' version: 26.6.4 '@types/react': - specifier: ^19.3.0 + specifier: 'catalog:' version: 19.3.0 '@types/react-dom': - specifier: ^19.3.0 + specifier: 'catalog:' version: 19.3.0(@types/react@19.3.0) + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + postcss: + specifier: 'catalog:' + version: 8.5.29 + shadcn: + specifier: 'catalog:' + version: 4.21.4 + typescript: + specifier: 'catalog:' + version: 6.0.3 + + packages/auth: + dependencies: + '@better-auth/drizzle-adapter': + specifier: ^1.7.7 + version: 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6)) + '@packages/db': + specifier: workspace:* + version: link:../db + better-auth: + specifier: ^1.7.7 + version: 1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript + '@types/node': + specifier: 'catalog:' + version: 26.6.4 + drizzle-orm: + specifier: 'catalog:' + version: 0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6) + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + typescript: + specifier: 'catalog:' + version: 6.0.3 + + packages/db: + dependencies: + '@neondatabase/serverless': + specifier: ^1.2.0 + version: 1.2.0 + '@packages/env': + specifier: workspace:* + version: link:../env + drizzle-orm: + specifier: 'catalog:' + version: 0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6) + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript + '@types/node': + specifier: 'catalog:' + version: 26.6.4 drizzle-kit: specifier: ^0.31.11 version: 0.31.11 eslint: - specifier: ^9.39.0 + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + typescript: + specifier: 'catalog:' + version: 6.0.3 + + packages/email: + dependencies: + react-email: + specifier: ^6.11.1 + version: 6.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + devDependencies: + '@packages/env': + specifier: workspace:* + version: link:../env + '@react-email/ui': + specifier: ^6.11.1 + version: 6.11.1(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript + '@types/node': + specifier: 'catalog:' + version: 26.6.4 + '@types/react': + specifier: 'catalog:' + version: 19.3.0 + '@types/react-dom': + specifier: 'catalog:' + version: 19.3.0(@types/react@19.3.0) + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + react: + specifier: 'catalog:' + version: 19.3.0 + react-dom: + specifier: 'catalog:' + version: 19.3.0(react@19.3.0) + typescript: + specifier: 'catalog:' + version: 6.0.3 + + packages/env: + dependencies: + '@next/env': + specifier: 'catalog:' + version: 16.4.0 + '@t3-oss/env-nextjs': + specifier: ^0.13.11 + version: 0.13.11(typescript@6.0.3)(zod@4.6.5) + zod: + specifier: 'catalog:' + version: 4.6.5 + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript + '@types/node': + specifier: 'catalog:' + version: 26.6.4 + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + typescript: + specifier: 'catalog:' + version: 6.0.3 + + packages/ui: + dependencies: + '@base-ui/react': + specifier: 'catalog:' + version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + cn: + specifier: ^0.4.0 + version: 0.4.0 + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../../tooling/eslint + '@tooling/tailwind': + specifier: workspace:* + version: link:../../tooling/tailwind + '@tooling/typescript': + specifier: workspace:* + version: link:../../tooling/typescript + '@types/node': + specifier: 'catalog:' + version: 26.6.4 + '@types/react': + specifier: 'catalog:' + version: 19.3.0 + '@types/react-dom': + specifier: 'catalog:' + version: 19.3.0(@types/react@19.3.0) + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + react: + specifier: 'catalog:' + version: 19.3.0 + react-dom: + specifier: 'catalog:' + version: 19.3.0(react@19.3.0) + shadcn: + specifier: 'catalog:' + version: 4.21.4 + typescript: + specifier: 'catalog:' + version: 6.0.3 + + tooling/eslint: + dependencies: + eslint: + specifier: 'catalog:' version: 9.39.5(jiti@2.7.0) eslint-config-next: - specifier: ^16.4.0 + specifier: 'catalog:' version: 16.4.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) - postcss: - specifier: ^8.4.14 - version: 8.5.29 + next: + specifier: 'catalog:' + version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + + tooling/prettier: + dependencies: prettier: - specifier: ^2.8.3 + specifier: 'catalog:' version: 2.8.8 prettier-plugin-tailwindcss: - specifier: ^0.2.1 + specifier: 'catalog:' version: 0.2.8(prettier@2.8.8) + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../eslint + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + + tooling/tailwind: + dependencies: + '@tailwindcss/postcss': + specifier: 'catalog:' + version: 4.3.3 + postcss: + specifier: 'catalog:' + version: 8.5.29 + shadcn: + specifier: 'catalog:' + version: 4.21.4 tailwindcss: - specifier: ^4.0.0 + specifier: 'catalog:' version: 4.3.3 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + devDependencies: + '@tooling/eslint': + specifier: workspace:* + version: link:../eslint + eslint: + specifier: 'catalog:' + version: 9.39.5(jiti@2.7.0) + + tooling/typescript: + devDependencies: typescript: - specifier: ~6.0.0 + specifier: 'catalog:' version: 6.0.3 packages: @@ -1604,6 +1896,36 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@turbo/darwin-64@2.11.9': + resolution: {integrity: sha512-OkW+EESJjo248CThWe9DfuUqzGcRwHe1DXKWRw9DSZ0lMkocKbbwNMjWVCiO+WNBcARDM0ibu0c9SbuIe4mw6w==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.11.9': + resolution: {integrity: sha512-NIbFEogMaIyOi2egLH7XtuW0DXmPOpydnanyB3rw/WXCPYl1OAFRPHPGixIaakGnfNLey8LMmKemgNtqtFKdcg==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.11.9': + resolution: {integrity: sha512-RkD/Atqqek2WNnYJlmPogZpXjAW+cSsPXDn7E0mufSNN86ClXCSKme/BBYMeIvPoFZ4egPJLF+JpYkuuNkMYhg==} + cpu: [x64] + os: [android, linux] + + '@turbo/linux-arm64@2.11.9': + resolution: {integrity: sha512-iW/0YGS9D9YlgD4ad2IEEolD9PuNJGdkEI650AELLln8YaGsloiH8QyTUnajjxPufMuY/eWRWxO+PMBYsGvVlA==} + cpu: [arm64] + os: [android, linux] + + '@turbo/windows-64@2.11.9': + resolution: {integrity: sha512-rg/kuQmSm9m/z8W5HYHLMSnTbLDXBs/9liVZh9YnfkGYm0DlFj2SV9/0fQy/EpJTq81O36kMb7p8Fmt9f67ocA==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.11.9': + resolution: {integrity: sha512-PgjBpLPW/WDsKzeBmNuw2QHtPxT/PtcloN3rHFTqVyMsqkLlyHVJbSusuhYoYFdi08lZ9Stryw66UOuPg/yW0w==} + cpu: [arm64] + os: [win32] + '@tybys/wasm-util@0.10.4': resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} @@ -4821,6 +5143,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + turbo@2.11.9: + resolution: {integrity: sha512-k2ev5dv9OgP2pJwaPuydkZdid+haX2U5TDGcPtpAz0gb0nbRR3eXY/cpfrlvHih52YRTxWIcRVKc0ri3C2Scrg==} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -6066,11 +6392,11 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@react-email/ui@6.11.1(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@react-email/ui@6.11.1(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: esbuild: 0.28.2 jiti: 2.6.1 - next: 16.3.3(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next: 16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -6260,6 +6586,24 @@ snapshots: minimatch: 10.2.6 path-browserify: 1.0.1 + '@turbo/darwin-64@2.11.9': + optional: true + + '@turbo/darwin-arm64@2.11.9': + optional: true + + '@turbo/linux-64@2.11.9': + optional: true + + '@turbo/linux-arm64@2.11.9': + optional: true + + '@turbo/windows-64@2.11.9': + optional: true + + '@turbo/windows-arm64@2.11.9': + optional: true + '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 @@ -6652,7 +6996,7 @@ snapshots: bcp-47-match@2.0.3: {} - better-auth@1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + better-auth@1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) '@better-auth/drizzle-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6)) @@ -7293,7 +7637,7 @@ snapshots: '@next/eslint-plugin-next': 16.4.0(eslint@9.39.5(jiti@2.7.0)) eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.7.0)) @@ -7316,7 +7660,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -7331,14 +7675,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -7353,7 +7697,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.17.0 is-glob: 4.0.3 @@ -8951,7 +9295,7 @@ snapshots: dependencies: content-type: 2.1.0 - next@16.3.3(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@next/env': 16.3.3 '@swc/helpers': 0.5.23 @@ -10060,6 +10404,15 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + turbo@2.11.9: + optionalDependencies: + '@turbo/darwin-64': 2.11.9 + '@turbo/darwin-arm64': 2.11.9 + '@turbo/linux-64': 2.11.9 + '@turbo/linux-arm64': 2.11.9 + '@turbo/windows-64': 2.11.9 + '@turbo/windows-arm64': 2.11.9 + tw-animate-css@1.4.0: {} type-check@0.4.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d27fb97..3ba5fd7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,30 @@ +packages: + - apps/* + - packages/* + - tooling/* + +catalog: + '@base-ui/react': '^1.8.0' + 'shadcn': '^4.21.4' + '@next/env': '^16.4.0' + '@tailwindcss/postcss': '^4.3.3' + '@types/node': '^26.6.4' + '@types/react': '^19.3.0' + '@types/react-dom': '^19.3.0' + 'drizzle-orm': '^0.45.3' + 'eslint': '^9.39.0' + 'eslint-config-next': '^16.4.0' + 'next': '^16.4.0' + 'postcss': '^8.4.14' + 'prettier': '^2.8.3' + 'prettier-plugin-tailwindcss': '^0.2.1' + 'react': '^19.3.0' + 'react-dom': '^19.3.0' + 'server-only': '^0.0.1' + 'tailwindcss': '^4.0.0' + 'typescript': '~6.0.0' + 'zod': '^4.6.5' + allowBuilds: esbuild: true unrs-resolver: false diff --git a/tooling/eslint/base.mjs b/tooling/eslint/base.mjs new file mode 100644 index 0000000..0c62df1 --- /dev/null +++ b/tooling/eslint/base.mjs @@ -0,0 +1,14 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; +import nextTypescript from 'eslint-config-next/typescript'; + +export default defineConfig([ + ...nextTypescript, + globalIgnores([ + '**/node_modules/**', + '**/.next/**', + '**/.turbo/**', + '**/.react-email/**', + '**/dist/**', + '**/next-env.d.ts', + ]), +]); diff --git a/tooling/eslint/eslint.config.mjs b/tooling/eslint/eslint.config.mjs new file mode 100644 index 0000000..e6b6f63 --- /dev/null +++ b/tooling/eslint/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from './base.mjs'; diff --git a/tooling/eslint/nextjs.mjs b/tooling/eslint/nextjs.mjs new file mode 100644 index 0000000..9bb5023 --- /dev/null +++ b/tooling/eslint/nextjs.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from 'eslint/config'; +import nextVitals from 'eslint-config-next/core-web-vitals'; +import base from './base.mjs'; + +export default defineConfig([...nextVitals, ...base]); diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json new file mode 100644 index 0000000..c7ca331 --- /dev/null +++ b/tooling/eslint/package.json @@ -0,0 +1,18 @@ +{ + "name": "@tooling/eslint", + "private": true, + "type": "module", + "exports": { + "./base": "./base.mjs", + "./nextjs": "./nextjs.mjs", + "./react": "./react.mjs" + }, + "dependencies": { + "eslint": "catalog:", + "eslint-config-next": "catalog:", + "next": "catalog:" + }, + "scripts": { + "lint": "eslint ." + } +} diff --git a/tooling/eslint/react.mjs b/tooling/eslint/react.mjs new file mode 100644 index 0000000..5e6abfc --- /dev/null +++ b/tooling/eslint/react.mjs @@ -0,0 +1,22 @@ +import { defineConfig } from 'eslint/config'; +import next from 'eslint-config-next'; +import base from './base.mjs'; + +// Reuse the installed React and Hooks rules without Next.js application rules. +const react = next.find((config) => config.name === 'next'); + +export default defineConfig([ + { + ...react, + name: 'shared/react', + plugins: Object.fromEntries( + Object.entries(react.plugins).filter(([name]) => name !== '@next/next') + ), + rules: Object.fromEntries( + Object.entries(react.rules).filter( + ([name]) => !name.startsWith('@next/next/') + ) + ), + }, + ...base, +]); diff --git a/tooling/prettier/eslint.config.mjs b/tooling/prettier/eslint.config.mjs new file mode 100644 index 0000000..81b18e1 --- /dev/null +++ b/tooling/prettier/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/base'; diff --git a/tooling/prettier/index.cjs b/tooling/prettier/index.cjs new file mode 100644 index 0000000..0c64122 --- /dev/null +++ b/tooling/prettier/index.cjs @@ -0,0 +1,10 @@ +module.exports = { + tabWidth: 2, + useTabs: false, + semi: true, + singleQuote: true, + jsxSingleQuote: true, + bracketSpacing: true, + bracketSameLine: false, + arrowParens: 'always', +}; diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json new file mode 100644 index 0000000..9ca22af --- /dev/null +++ b/tooling/prettier/package.json @@ -0,0 +1,17 @@ +{ + "name": "@tooling/prettier", + "private": true, + "type": "module", + "exports": "./index.cjs", + "dependencies": { + "prettier": "catalog:", + "prettier-plugin-tailwindcss": "catalog:" + }, + "scripts": { + "lint": "eslint ." + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "eslint": "catalog:" + } +} diff --git a/tooling/tailwind/eslint.config.mjs b/tooling/tailwind/eslint.config.mjs new file mode 100644 index 0000000..81b18e1 --- /dev/null +++ b/tooling/tailwind/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/base'; diff --git a/tooling/tailwind/package.json b/tooling/tailwind/package.json new file mode 100644 index 0000000..9e8b3a6 --- /dev/null +++ b/tooling/tailwind/package.json @@ -0,0 +1,23 @@ +{ + "name": "@tooling/tailwind", + "private": true, + "type": "module", + "exports": { + "./styles.css": "./styles.css", + "./postcss": "./postcss.mjs" + }, + "dependencies": { + "tailwindcss": "catalog:", + "@tailwindcss/postcss": "catalog:", + "postcss": "catalog:", + "tw-animate-css": "^1.4.0", + "shadcn": "catalog:" + }, + "scripts": { + "lint": "eslint ." + }, + "devDependencies": { + "@tooling/eslint": "workspace:*", + "eslint": "catalog:" + } +} diff --git a/postcss.config.js b/tooling/tailwind/postcss.mjs similarity index 73% rename from postcss.config.js rename to tooling/tailwind/postcss.mjs index e564072..a34a3d5 100644 --- a/postcss.config.js +++ b/tooling/tailwind/postcss.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { plugins: { '@tailwindcss/postcss': {}, }, diff --git a/tooling/tailwind/styles.css b/tooling/tailwind/styles.css new file mode 100644 index 0000000..3d1a19c --- /dev/null +++ b/tooling/tailwind/styles.css @@ -0,0 +1,127 @@ +@import 'tailwindcss' source(none); +@import 'tw-animate-css'; +@import 'shadcn/tailwind.css'; + +@source '../../packages/ui/src'; + +@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); + +@theme inline { + --font-sans: 'Cascadia Code Latin', 'Cascadia Code Variable', ui-sans-serif, + system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-mono: 'Cascadia Code Latin', 'Cascadia Code Variable', ui-monospace, + SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace; + + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --radius-sm: calc(var(--radius) * 0.6); + --radius-md: calc(var(--radius) * 0.8); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); + --radius-2xl: calc(var(--radius) * 1.8); + --radius-3xl: calc(var(--radius) * 2.2); + --radius-4xl: calc(var(--radius) * 2.6); + + --animate-marquee: marquee var(--marquee-duration, 60s) linear infinite; + + @keyframes marquee { + to { + transform: translateX(-50%); + } + } +} + +/* light theme corresponds to nord palette */ +:root { + --radius: 0.625rem; + --background: #eceff4; + --foreground: #2e3440; + --card: #e5e9f0; + --card-foreground: #2e3440; + --popover: #eceff4; + --popover-foreground: #2e3440; + --primary: #5e81ac; + --primary-foreground: #eceff4; + --secondary: #e5e9f0; + --secondary-foreground: #2e3440; + --accent: #d8dee9; + --accent-foreground: #2e3440; + --muted: #e5e9f0; + --muted-foreground: #4c566a; + --destructive: #bf616a; + --destructive-foreground: #eceff4; + --border: #d8dee9; + --input: #d8dee9; + --ring: #88c0d0; + --awesome-from: #b21e59; + --awesome-to: #825000; +} + +/* whereas dark is catpuccin's */ +[data-theme='dark'] { + --background: #1e1e2e; + --foreground: #cdd6f4; + --card: #181825; + --card-foreground: #cdd6f4; + --popover: #1e1e2e; + --popover-foreground: #cdd6f4; + --primary: #cba6f7; + --primary-foreground: #11111b; + --secondary: #313244; + --secondary-foreground: #cdd6f4; + --accent: #313244; + --accent-foreground: #cdd6f4; + --muted: #181825; + --muted-foreground: #a6adc8; + --destructive: #f38ba8; + --destructive-foreground: #11111b; + --border: #313244; + --input: #313244; + --ring: #b4befe; + --awesome-from: #ff9592; + --awesome-to: #f5e147; +} + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + @apply border-border outline-ring/50 tracking-tight; + } +} + +/* A two-tone gradient for accent text */ +@utility text-awesome { + color: var(--awesome-from); + + @supports (background-clip: text) { + background-image: linear-gradient( + 90deg, + var(--awesome-from), + var(--awesome-to) + ); + background-clip: text; + color: transparent; + } +} diff --git a/tooling/typescript/base.json b/tooling/typescript/base.json new file mode 100644 index 0000000..1b4d9fb --- /dev/null +++ b/tooling/typescript/base.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "isolatedModules": true, + "allowImportingTsExtensions": true, + "forceConsistentCasingInFileNames": true, + "types": ["node"] + } +} diff --git a/tooling/typescript/nextjs.json b/tooling/typescript/nextjs.json new file mode 100644 index 0000000..ee20079 --- /dev/null +++ b/tooling/typescript/nextjs.json @@ -0,0 +1,12 @@ +{ + "extends": "./react.json", + "compilerOptions": { + "allowJs": true, + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + } +} diff --git a/tooling/typescript/package.json b/tooling/typescript/package.json new file mode 100644 index 0000000..4914606 --- /dev/null +++ b/tooling/typescript/package.json @@ -0,0 +1,12 @@ +{ + "name": "@tooling/typescript", + "private": true, + "exports": { + "./base": "./base.json", + "./nextjs": "./nextjs.json", + "./react": "./react.json" + }, + "devDependencies": { + "typescript": "catalog:" + } +} diff --git a/tooling/typescript/react.json b/tooling/typescript/react.json new file mode 100644 index 0000000..f2d6af7 --- /dev/null +++ b/tooling/typescript/react.json @@ -0,0 +1,7 @@ +{ + "extends": "./base.json", + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "jsx": "react-jsx" + } +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index d9e4439..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "paths": { "@/*": ["./*"] }, - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [{ "name": "next" }] - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" - ], - "exclude": ["node_modules"] -} diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..dfbfaef --- /dev/null +++ b/turbo.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "globalDependencies": [".env*"], + "globalEnv": [ + "DATABASE_URL", + "BETTER_AUTH_SECRET", + "BETTER_AUTH_URL", + "RESEND_API_KEY", + "RESEND_FROM_EMAIL", + "GITHUB_TOKEN" + ], + "globalPassThroughEnv": ["CI", "VERCEL", "VERCEL_*", "NEXT_PRIVATE_*"], + "tasks": { + "topo": { + "dependsOn": ["^topo"] + }, + "dev": { + "cache": false, + "persistent": true + }, + "build": { + "dependsOn": ["^build"], + "outputs": [".next/**", "!.next/cache/**"] + }, + "lint": { + "dependsOn": ["^topo"], + "outputs": [] + }, + "typecheck": { + "dependsOn": ["^topo"], + "outputs": [] + }, + "test": { + "dependsOn": ["^topo"], + "outputs": [] + } + } +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..cb0f2c1 --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "nextjs", + "installCommand": "pnpm install --frozen-lockfile", + "buildCommand": "pnpm build --filter=@apps/nextjs...", + "devCommand": "pnpm --filter @apps/nextjs dev --port $PORT", + "outputDirectory": "apps/nextjs/.next" +} From 6c615a85c44f5e49428ea4eb22bcaacaafd3e686 Mon Sep 17 00:00:00 2001 From: Gaurav Ghosh Date: Wed, 21 Oct 2026 17:49:56 +0530 Subject: [PATCH 2/2] refactor: migrate website from Next.js to Astro - Replace React pages and components with Astro and browser scripts - Preserve content, URLs, SEO, themes, and interactive features - Keep hourly GitHub data updates through Vercel ISR - Convert used shared UI components and remove unused components - Replace Next.js dependencies, environment loading, and tooling - Update deployment packaging, CI, documentation, and regression tests --- .github/workflows/ci.yml | 2 + .gitignore | 10 +- .prettierignore | 2 + README.md | 54 +- WEBSITE_CONFIG.md | 10 +- apps/astro/astro.config.mjs | 31 + .../content/authors/karthik-prabhu.md | 0 apps/{nextjs => astro}/content/posts/.gitkeep | 0 .../content/posts/advice-from-an-alumnus.md | 0 apps/astro/eslint.config.mjs | 1 + apps/astro/package.json | 53 + apps/{nextjs => astro}/postcss.config.mjs | 0 .../src/app => astro/public}/apple-icon.png | Bin .../public/authors/karthik-prabhu.jpg | Bin apps/{nextjs => astro}/public/discord.png | Bin apps/{nextjs => astro}/public/github.webp | Bin .../{nextjs/src/app => astro/public}/icon.png | Bin apps/{nextjs => astro}/public/logo.png | Bin apps/{nextjs => astro}/public/osf.svg | 0 apps/{nextjs => astro}/public/placeholder.png | Bin apps/{nextjs => astro}/public/team.jpg | Bin apps/{nextjs => astro}/public/team.png | Bin apps/astro/scripts/build-local.mjs | 10 + apps/astro/src/assets/NotoSans-Regular.ttf | Bin 0 -> 569208 bytes apps/astro/src/assets/OFL.txt | 93 + .../src/components/authors/AuthorAvatar.astro | 17 + .../src/components/authors/AuthorCard.astro | 82 + .../components/authors/AuthorProfiles.astro | 21 + apps/astro/src/components/blog/BlogCard.astro | 43 + .../src/components/blog/CoverImage.astro | 26 + .../src/components/blog/HeadingList.astro | 26 + .../blog/MobileTableOfContents.astro | 63 + .../src/components/blog/Placeholder.astro | 22 + .../src/components/blog/PostHeader.astro | 27 + apps/astro/src/components/blog/PostList.astro | 16 + apps/astro/src/components/blog/PostMeta.astro | 52 + .../src/components/blog/PostNavigation.astro | 54 + .../astro/src/components/blog/Separator.astro | 1 + .../src/components/blog/TableOfContents.astro | 29 + apps/astro/src/components/blog/Tags.astro | 21 + .../src/components/common/BrandIcon.astro} | 28 +- .../src/components/common/Breadcrumbs.astro | 50 + .../src/components/common/Container.astro | 12 + apps/astro/src/components/common/JsonLd.astro | 11 + .../src/components/home/ActivityCard.astro | 67 + .../astro/src/components/home/BentoCell.astro | 33 + .../src/components/home/KarnatakaMap.astro | 114 + .../src/components/home/LanguagesCard.astro | 46 + apps/astro/src/components/home/LinkCell.astro | 48 + apps/astro/src/components/home/Stat.astro | 15 + .../src/components/home/Unavailable.astro | 5 + apps/astro/src/components/home/maplibre.ts | 5 + .../src/components/icons/ArrowLeft.astro | 27 + .../src/components/icons/ArrowRight.astro | 27 + .../src/components/icons/ArrowUpRight.astro | 27 + .../src/components/icons/BookMarked.astro | 31 + .../src/components/icons/ChevronDown.astro | 26 + .../src/components/icons/ChevronRight.astro | 26 + apps/astro/src/components/icons/GitFork.astro | 30 + apps/astro/src/components/icons/Globe.astro | 28 + apps/astro/src/components/icons/Hash.astro | 29 + apps/astro/src/components/icons/House.astro | 29 + apps/astro/src/components/icons/Mail.astro | 27 + apps/astro/src/components/icons/MapPin.astro | 29 + .../astro/src/components/icons/Maximize.astro | 29 + .../astro/src/components/icons/Minimize.astro | 29 + apps/astro/src/components/icons/Minus.astro | 26 + apps/astro/src/components/icons/Moon.astro | 28 + apps/astro/src/components/icons/Plus.astro | 27 + apps/astro/src/components/icons/Rss.astro | 28 + apps/astro/src/components/icons/Star.astro | 28 + apps/astro/src/components/icons/Sun.astro | 34 + apps/astro/src/components/icons/Users.astro | 29 + .../src/components/icons/UsersRound.astro | 28 + apps/astro/src/components/layout/Footer.astro | 41 + apps/astro/src/components/layout/Header.astro | 19 + apps/astro/src/components/layout/Logo.astro | 24 + .../src/components/layout/NavLinks.astro | 18 + .../src/components/layout/ThemeToggle.astro | 66 + .../src/components/layout/styles.ts | 0 .../src/components/team/MemberLoop.astro | 45 + .../src/components/team/MilestoneCard.astro | 60 + .../src/components/team/PersonLink.astro | 25 + .../src/components/team/SpotlightCard.astro | 33 + apps/astro/src/components/team/Timeline.astro | 22 + .../src/components/team/TimelineScroll.astro} | 35 +- apps/astro/src/components/team/YearRow.astro | 35 + apps/astro/src/content.config.ts | 18 + apps/astro/src/env.d.ts | 6 + apps/astro/src/layouts/SiteLayout.astro | 114 + apps/astro/src/lib/content/authors.ts | 49 + apps/astro/src/lib/content/frontmatter.ts | 48 + .../src/lib/content/markdown.ts | 2 +- apps/astro/src/lib/content/posts.ts | 43 + .../src/lib/content/schema.ts | 7 +- apps/{nextjs => astro}/src/lib/format.ts | 0 apps/{nextjs => astro}/src/lib/github.ts | 107 +- apps/astro/src/lib/map.ts | 47 + apps/astro/src/lib/og.ts | 40 + apps/{nextjs => astro}/src/lib/resend.ts | 1 - apps/astro/src/lib/seo.ts | 17 + apps/{nextjs => astro}/src/lib/site.ts | 0 apps/{nextjs => astro}/src/lib/team.ts | 20 +- apps/{nextjs => astro}/src/lib/theme.ts | 4 +- apps/{nextjs => astro}/src/lib/timeline.ts | 0 apps/astro/src/pages/404.astro | 11 + apps/astro/src/pages/authors/[id].astro | 64 + apps/astro/src/pages/authors/index.astro | 36 + apps/astro/src/pages/blog/[uid]/index.astro | 113 + .../src/pages/blog/[uid]/opengraph-image.ts | 20 + .../src/pages/blog/feed.xml.ts} | 26 +- apps/astro/src/pages/blog/index.astro | 36 + apps/astro/src/pages/events.ts | 3 + apps/astro/src/pages/index.astro | 190 + .../src/pages/manifest.webmanifest.ts} | 6 +- apps/astro/src/pages/opengraph-image.ts | 8 + apps/astro/src/pages/robots.txt.ts | 7 + apps/astro/src/pages/services.ts | 3 + .../src/pages/sitemap.xml.ts} | 21 +- apps/astro/src/pages/team.astro | 81 + apps/astro/src/scripts/campus-map.ts | 280 + apps/astro/src/scripts/reading.ts | 53 + apps/astro/src/styles/fonts.css | 16 + apps/{nextjs => astro}/src/styles/globals.css | 2 +- .../src/styles/typography.css | 4 +- apps/{nextjs => astro}/src/types/blog.ts | 0 apps/astro/tests/content.test.ts | 52 + apps/astro/tests/github.test.ts | 65 + apps/astro/tsconfig.json | 13 + apps/nextjs/components.json | 21 - apps/nextjs/eslint.config.mjs | 1 - apps/nextjs/next.config.ts | 65 - apps/nextjs/package.json | 63 - apps/nextjs/src/app/authors/[id]/page.tsx | 82 - apps/nextjs/src/app/authors/page.tsx | 35 - .../src/app/blog/[uid]/opengraph-image.tsx | 30 - apps/nextjs/src/app/blog/[uid]/page.tsx | 135 - apps/nextjs/src/app/blog/page.tsx | 37 - apps/nextjs/src/app/error.tsx | 7 - apps/nextjs/src/app/global-error.tsx | 18 - apps/nextjs/src/app/layout.tsx | 55 - apps/nextjs/src/app/not-found.tsx | 5 - apps/nextjs/src/app/opengraph-image.tsx | 13 - apps/nextjs/src/app/page.tsx | 226 - apps/nextjs/src/app/robots.ts | 11 - apps/nextjs/src/app/team/page.tsx | 77 - .../src/components/authors/AuthorAvatar.tsx | 37 - .../src/components/authors/AuthorCard.tsx | 86 - .../src/components/authors/AuthorProfiles.tsx | 19 - apps/nextjs/src/components/blog/BlogCard.tsx | 51 - .../nextjs/src/components/blog/CoverImage.tsx | 33 - .../src/components/blog/HeadingList.tsx | 37 - .../src/components/blog/MarkdownRenderer.tsx | 13 - .../components/blog/MobileTableOfContents.tsx | 88 - .../nextjs/src/components/blog/PostHeader.tsx | 32 - apps/nextjs/src/components/blog/PostList.tsx | 16 - apps/nextjs/src/components/blog/PostMeta.tsx | 60 - .../src/components/blog/PostNavigation.tsx | 68 - .../src/components/blog/TableOfContents.tsx | 29 - apps/nextjs/src/components/blog/Tags.tsx | 19 - .../src/components/common/Breadcrumbs.tsx | 51 - .../src/components/common/Container.tsx | 9 - apps/nextjs/src/components/common/JsonLd.tsx | 14 - .../src/components/common/ServerError.tsx | 17 - .../src/components/common/StatusMessage.tsx | 18 - .../src/components/common/ThemeScript.tsx | 8 - .../nextjs/src/components/common/UnderDev.tsx | 13 - .../src/components/home/ActivityCard.tsx | 75 - apps/nextjs/src/components/home/BentoCell.tsx | 56 - .../src/components/home/KarnatakaMap.tsx | 455 -- .../src/components/home/LanguagesCard.tsx | 43 - apps/nextjs/src/components/home/LinkCell.tsx | 76 - apps/nextjs/src/components/home/maplibre.ts | 5 - apps/nextjs/src/components/layout/Footer.tsx | 47 - apps/nextjs/src/components/layout/Header.tsx | 23 - apps/nextjs/src/components/layout/Layout.tsx | 24 - apps/nextjs/src/components/layout/Logo.tsx | 18 - .../nextjs/src/components/layout/NavLinks.tsx | 28 - .../src/components/layout/ThemeToggle.tsx | 30 - .../nextjs/src/components/team/MemberLoop.tsx | 59 - .../src/components/team/SpotlightCard.tsx | 47 - apps/nextjs/src/components/team/Timeline.tsx | 136 - apps/nextjs/src/hooks/use-scroll-progress.ts | 34 - apps/nextjs/src/hooks/use-theme.ts | 49 - apps/nextjs/src/hooks/use-visible-sections.ts | 47 - apps/nextjs/src/lib/content/authors.ts | 78 - apps/nextjs/src/lib/content/collection.ts | 48 - apps/nextjs/src/lib/content/posts.ts | 74 - apps/nextjs/src/lib/fonts.ts | 33 - apps/nextjs/src/lib/og.tsx | 68 - apps/nextjs/src/lib/rehype-ec.mjs | 46 - apps/nextjs/src/lib/seo.ts | 47 - apps/nextjs/src/mdx-components.tsx | 7 - apps/nextjs/tsconfig.json | 17 - package.json | 8 +- packages/env/load.mjs | 23 +- packages/env/package.json | 7 +- packages/env/src/index.ts | 4 +- packages/env/tests/load.test.mjs | 33 +- packages/ui/components.json | 21 - packages/ui/eslint.config.mjs | 2 +- packages/ui/package.json | 23 +- packages/ui/src/components/avatar.astro | 47 + packages/ui/src/components/avatar.tsx | 108 - packages/ui/src/components/badge.astro | 19 + packages/ui/src/components/badge.tsx | 51 - packages/ui/src/components/button.tsx | 57 - packages/ui/tsconfig.json | 4 +- pnpm-lock.yaml | 5443 +++++++++-------- pnpm-workspace.yaml | 10 +- scripts/prepare-vercel.mjs | 54 + scripts/verify-vercel.mjs | 59 + tooling/eslint/astro.mjs | 4 + tooling/eslint/base.mjs | 22 +- tooling/eslint/nextjs.mjs | 5 - tooling/eslint/package.json | 12 +- tooling/eslint/react.mjs | 32 +- tooling/prettier/index.cjs | 5 + tooling/prettier/package.json | 3 +- tooling/tailwind/package.json | 3 +- tooling/tailwind/styles.css | 1 - tooling/typescript/nextjs.json | 12 - tooling/typescript/package.json | 1 - turbo.json | 4 +- vercel.json | 48 +- 225 files changed, 6836 insertions(+), 6436 deletions(-) create mode 100644 apps/astro/astro.config.mjs rename apps/{nextjs => astro}/content/authors/karthik-prabhu.md (100%) rename apps/{nextjs => astro}/content/posts/.gitkeep (100%) rename apps/{nextjs => astro}/content/posts/advice-from-an-alumnus.md (100%) create mode 100644 apps/astro/eslint.config.mjs create mode 100644 apps/astro/package.json rename apps/{nextjs => astro}/postcss.config.mjs (100%) rename apps/{nextjs/src/app => astro/public}/apple-icon.png (100%) rename apps/{nextjs => astro}/public/authors/karthik-prabhu.jpg (100%) rename apps/{nextjs => astro}/public/discord.png (100%) rename apps/{nextjs => astro}/public/github.webp (100%) rename apps/{nextjs/src/app => astro/public}/icon.png (100%) rename apps/{nextjs => astro}/public/logo.png (100%) rename apps/{nextjs => astro}/public/osf.svg (100%) rename apps/{nextjs => astro}/public/placeholder.png (100%) rename apps/{nextjs => astro}/public/team.jpg (100%) rename apps/{nextjs => astro}/public/team.png (100%) create mode 100644 apps/astro/scripts/build-local.mjs create mode 100644 apps/astro/src/assets/NotoSans-Regular.ttf create mode 100644 apps/astro/src/assets/OFL.txt create mode 100644 apps/astro/src/components/authors/AuthorAvatar.astro create mode 100644 apps/astro/src/components/authors/AuthorCard.astro create mode 100644 apps/astro/src/components/authors/AuthorProfiles.astro create mode 100644 apps/astro/src/components/blog/BlogCard.astro create mode 100644 apps/astro/src/components/blog/CoverImage.astro create mode 100644 apps/astro/src/components/blog/HeadingList.astro create mode 100644 apps/astro/src/components/blog/MobileTableOfContents.astro create mode 100644 apps/astro/src/components/blog/Placeholder.astro create mode 100644 apps/astro/src/components/blog/PostHeader.astro create mode 100644 apps/astro/src/components/blog/PostList.astro create mode 100644 apps/astro/src/components/blog/PostMeta.astro create mode 100644 apps/astro/src/components/blog/PostNavigation.astro create mode 100644 apps/astro/src/components/blog/Separator.astro create mode 100644 apps/astro/src/components/blog/TableOfContents.astro create mode 100644 apps/astro/src/components/blog/Tags.astro rename apps/{nextjs/src/components/common/BrandIcon.tsx => astro/src/components/common/BrandIcon.astro} (93%) create mode 100644 apps/astro/src/components/common/Breadcrumbs.astro create mode 100644 apps/astro/src/components/common/Container.astro create mode 100644 apps/astro/src/components/common/JsonLd.astro create mode 100644 apps/astro/src/components/home/ActivityCard.astro create mode 100644 apps/astro/src/components/home/BentoCell.astro create mode 100644 apps/astro/src/components/home/KarnatakaMap.astro create mode 100644 apps/astro/src/components/home/LanguagesCard.astro create mode 100644 apps/astro/src/components/home/LinkCell.astro create mode 100644 apps/astro/src/components/home/Stat.astro create mode 100644 apps/astro/src/components/home/Unavailable.astro create mode 100644 apps/astro/src/components/home/maplibre.ts create mode 100644 apps/astro/src/components/icons/ArrowLeft.astro create mode 100644 apps/astro/src/components/icons/ArrowRight.astro create mode 100644 apps/astro/src/components/icons/ArrowUpRight.astro create mode 100644 apps/astro/src/components/icons/BookMarked.astro create mode 100644 apps/astro/src/components/icons/ChevronDown.astro create mode 100644 apps/astro/src/components/icons/ChevronRight.astro create mode 100644 apps/astro/src/components/icons/GitFork.astro create mode 100644 apps/astro/src/components/icons/Globe.astro create mode 100644 apps/astro/src/components/icons/Hash.astro create mode 100644 apps/astro/src/components/icons/House.astro create mode 100644 apps/astro/src/components/icons/Mail.astro create mode 100644 apps/astro/src/components/icons/MapPin.astro create mode 100644 apps/astro/src/components/icons/Maximize.astro create mode 100644 apps/astro/src/components/icons/Minimize.astro create mode 100644 apps/astro/src/components/icons/Minus.astro create mode 100644 apps/astro/src/components/icons/Moon.astro create mode 100644 apps/astro/src/components/icons/Plus.astro create mode 100644 apps/astro/src/components/icons/Rss.astro create mode 100644 apps/astro/src/components/icons/Star.astro create mode 100644 apps/astro/src/components/icons/Sun.astro create mode 100644 apps/astro/src/components/icons/Users.astro create mode 100644 apps/astro/src/components/icons/UsersRound.astro create mode 100644 apps/astro/src/components/layout/Footer.astro create mode 100644 apps/astro/src/components/layout/Header.astro create mode 100644 apps/astro/src/components/layout/Logo.astro create mode 100644 apps/astro/src/components/layout/NavLinks.astro create mode 100644 apps/astro/src/components/layout/ThemeToggle.astro rename apps/{nextjs => astro}/src/components/layout/styles.ts (100%) create mode 100644 apps/astro/src/components/team/MemberLoop.astro create mode 100644 apps/astro/src/components/team/MilestoneCard.astro create mode 100644 apps/astro/src/components/team/PersonLink.astro create mode 100644 apps/astro/src/components/team/SpotlightCard.astro create mode 100644 apps/astro/src/components/team/Timeline.astro rename apps/{nextjs/src/components/team/TimelineScroll.tsx => astro/src/components/team/TimelineScroll.astro} (61%) create mode 100644 apps/astro/src/components/team/YearRow.astro create mode 100644 apps/astro/src/content.config.ts create mode 100644 apps/astro/src/env.d.ts create mode 100644 apps/astro/src/layouts/SiteLayout.astro create mode 100644 apps/astro/src/lib/content/authors.ts create mode 100644 apps/astro/src/lib/content/frontmatter.ts rename apps/{nextjs => astro}/src/lib/content/markdown.ts (96%) create mode 100644 apps/astro/src/lib/content/posts.ts rename apps/{nextjs => astro}/src/lib/content/schema.ts (85%) rename apps/{nextjs => astro}/src/lib/format.ts (100%) rename apps/{nextjs => astro}/src/lib/github.ts (80%) create mode 100644 apps/astro/src/lib/map.ts create mode 100644 apps/astro/src/lib/og.ts rename apps/{nextjs => astro}/src/lib/resend.ts (93%) create mode 100644 apps/astro/src/lib/seo.ts rename apps/{nextjs => astro}/src/lib/site.ts (100%) rename apps/{nextjs => astro}/src/lib/team.ts (91%) rename apps/{nextjs => astro}/src/lib/theme.ts (86%) rename apps/{nextjs => astro}/src/lib/timeline.ts (100%) create mode 100644 apps/astro/src/pages/404.astro create mode 100644 apps/astro/src/pages/authors/[id].astro create mode 100644 apps/astro/src/pages/authors/index.astro create mode 100644 apps/astro/src/pages/blog/[uid]/index.astro create mode 100644 apps/astro/src/pages/blog/[uid]/opengraph-image.ts rename apps/{nextjs/src/app/blog/feed.xml/route.ts => astro/src/pages/blog/feed.xml.ts} (83%) create mode 100644 apps/astro/src/pages/blog/index.astro create mode 100644 apps/astro/src/pages/events.ts create mode 100644 apps/astro/src/pages/index.astro rename apps/{nextjs/src/app/manifest.ts => astro/src/pages/manifest.webmanifest.ts} (75%) create mode 100644 apps/astro/src/pages/opengraph-image.ts create mode 100644 apps/astro/src/pages/robots.txt.ts create mode 100644 apps/astro/src/pages/services.ts rename apps/{nextjs/src/app/sitemap.ts => astro/src/pages/sitemap.xml.ts} (65%) create mode 100644 apps/astro/src/pages/team.astro create mode 100644 apps/astro/src/scripts/campus-map.ts create mode 100644 apps/astro/src/scripts/reading.ts create mode 100644 apps/astro/src/styles/fonts.css rename apps/{nextjs => astro}/src/styles/globals.css (98%) rename apps/{nextjs => astro}/src/styles/typography.css (98%) rename apps/{nextjs => astro}/src/types/blog.ts (100%) create mode 100644 apps/astro/tests/content.test.ts create mode 100644 apps/astro/tests/github.test.ts create mode 100644 apps/astro/tsconfig.json delete mode 100644 apps/nextjs/components.json delete mode 100644 apps/nextjs/eslint.config.mjs delete mode 100644 apps/nextjs/next.config.ts delete mode 100644 apps/nextjs/package.json delete mode 100644 apps/nextjs/src/app/authors/[id]/page.tsx delete mode 100644 apps/nextjs/src/app/authors/page.tsx delete mode 100644 apps/nextjs/src/app/blog/[uid]/opengraph-image.tsx delete mode 100644 apps/nextjs/src/app/blog/[uid]/page.tsx delete mode 100644 apps/nextjs/src/app/blog/page.tsx delete mode 100644 apps/nextjs/src/app/error.tsx delete mode 100644 apps/nextjs/src/app/global-error.tsx delete mode 100644 apps/nextjs/src/app/layout.tsx delete mode 100644 apps/nextjs/src/app/not-found.tsx delete mode 100644 apps/nextjs/src/app/opengraph-image.tsx delete mode 100644 apps/nextjs/src/app/page.tsx delete mode 100644 apps/nextjs/src/app/robots.ts delete mode 100644 apps/nextjs/src/app/team/page.tsx delete mode 100644 apps/nextjs/src/components/authors/AuthorAvatar.tsx delete mode 100644 apps/nextjs/src/components/authors/AuthorCard.tsx delete mode 100644 apps/nextjs/src/components/authors/AuthorProfiles.tsx delete mode 100644 apps/nextjs/src/components/blog/BlogCard.tsx delete mode 100644 apps/nextjs/src/components/blog/CoverImage.tsx delete mode 100644 apps/nextjs/src/components/blog/HeadingList.tsx delete mode 100644 apps/nextjs/src/components/blog/MarkdownRenderer.tsx delete mode 100644 apps/nextjs/src/components/blog/MobileTableOfContents.tsx delete mode 100644 apps/nextjs/src/components/blog/PostHeader.tsx delete mode 100644 apps/nextjs/src/components/blog/PostList.tsx delete mode 100644 apps/nextjs/src/components/blog/PostMeta.tsx delete mode 100644 apps/nextjs/src/components/blog/PostNavigation.tsx delete mode 100644 apps/nextjs/src/components/blog/TableOfContents.tsx delete mode 100644 apps/nextjs/src/components/blog/Tags.tsx delete mode 100644 apps/nextjs/src/components/common/Breadcrumbs.tsx delete mode 100644 apps/nextjs/src/components/common/Container.tsx delete mode 100644 apps/nextjs/src/components/common/JsonLd.tsx delete mode 100644 apps/nextjs/src/components/common/ServerError.tsx delete mode 100644 apps/nextjs/src/components/common/StatusMessage.tsx delete mode 100644 apps/nextjs/src/components/common/ThemeScript.tsx delete mode 100644 apps/nextjs/src/components/common/UnderDev.tsx delete mode 100644 apps/nextjs/src/components/home/ActivityCard.tsx delete mode 100644 apps/nextjs/src/components/home/BentoCell.tsx delete mode 100644 apps/nextjs/src/components/home/KarnatakaMap.tsx delete mode 100644 apps/nextjs/src/components/home/LanguagesCard.tsx delete mode 100644 apps/nextjs/src/components/home/LinkCell.tsx delete mode 100644 apps/nextjs/src/components/home/maplibre.ts delete mode 100644 apps/nextjs/src/components/layout/Footer.tsx delete mode 100644 apps/nextjs/src/components/layout/Header.tsx delete mode 100644 apps/nextjs/src/components/layout/Layout.tsx delete mode 100644 apps/nextjs/src/components/layout/Logo.tsx delete mode 100644 apps/nextjs/src/components/layout/NavLinks.tsx delete mode 100644 apps/nextjs/src/components/layout/ThemeToggle.tsx delete mode 100644 apps/nextjs/src/components/team/MemberLoop.tsx delete mode 100644 apps/nextjs/src/components/team/SpotlightCard.tsx delete mode 100644 apps/nextjs/src/components/team/Timeline.tsx delete mode 100644 apps/nextjs/src/hooks/use-scroll-progress.ts delete mode 100644 apps/nextjs/src/hooks/use-theme.ts delete mode 100644 apps/nextjs/src/hooks/use-visible-sections.ts delete mode 100644 apps/nextjs/src/lib/content/authors.ts delete mode 100644 apps/nextjs/src/lib/content/collection.ts delete mode 100644 apps/nextjs/src/lib/content/posts.ts delete mode 100644 apps/nextjs/src/lib/fonts.ts delete mode 100644 apps/nextjs/src/lib/og.tsx delete mode 100644 apps/nextjs/src/lib/rehype-ec.mjs delete mode 100644 apps/nextjs/src/lib/seo.ts delete mode 100644 apps/nextjs/src/mdx-components.tsx delete mode 100644 apps/nextjs/tsconfig.json delete mode 100644 packages/ui/components.json create mode 100644 packages/ui/src/components/avatar.astro delete mode 100644 packages/ui/src/components/avatar.tsx create mode 100644 packages/ui/src/components/badge.astro delete mode 100644 packages/ui/src/components/badge.tsx delete mode 100644 packages/ui/src/components/button.tsx create mode 100644 scripts/prepare-vercel.mjs create mode 100644 scripts/verify-vercel.mjs create mode 100644 tooling/eslint/astro.mjs delete mode 100644 tooling/eslint/nextjs.mjs delete mode 100644 tooling/typescript/nextjs.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 927999a..2151fed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,3 +23,5 @@ jobs: - run: pnpm lint - run: pnpm test - run: pnpm build + - run: node scripts/prepare-vercel.mjs + - run: node scripts/verify-vercel.mjs diff --git a/.gitignore b/.gitignore index 692ddac..409dc3c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,8 @@ node_modules/ # testing coverage/ -# next.js -.next/ -out/ +# Astro +.astro/ # production build/ @@ -38,7 +37,6 @@ email-out/ # typescript *.tsbuildinfo -next-env.d.ts /.yarn /.yarnrc.yml @@ -47,3 +45,7 @@ next-env.d.ts .turbo/ dist/ .cache/ + +# Legacy local Next build artifacts +.next/ +next-env.d.ts diff --git a/.prettierignore b/.prettierignore index 6e1d1a5..2d98082 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,3 +7,5 @@ **/next-env.d.ts **/*.tsbuildinfo pnpm-lock.yaml +**/.astro +**/.vercel diff --git a/README.md b/README.md index 12ffafd..8d94f03 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,52 @@ # Manipal OSF website -The Manipal OSF website lives in a pnpm and Turborepo monorepo modeled on [create-t3-turbo](https://github.com/t3-oss/create-t3-turbo). Next.js uses Turbopack for development and production builds. +The Manipal OSF website lives in a pnpm and Turborepo monorepo modeled on [create-t3-turbo](https://github.com/t3-oss/create-t3-turbo). The public website uses Astro components and TypeScript browser scripts, with Vercel ISR for live GitHub data. ## Development -Use Node.js 24 LTS (minimum 22.18 for native TypeScript test execution) and pnpm 11.2.2. Run commands from the repository root: +Use Node.js 24 LTS (minimum 22.22 for Astro) and pnpm 11.2.2. Run commands from the repository root: ```sh pnpm install pnpm dev ``` -Open http://localhost:3000. The public website needs no service credentials. An optional `GITHUB_TOKEN` increases the GitHub API rate limit for statistics. +Open http://localhost:4321. The public website needs no service credentials. An optional `GITHUB_TOKEN` increases the GitHub API rate limit for statistics. ```sh pnpm typecheck pnpm lint pnpm test -pnpm build -pnpm start +pnpm build # Vercel deployment output +pnpm build:local # Node production build +pnpm start # Serve the Node build on port 4321 pnpm format ``` -`dev` starts workspaces under `apps/`. `build`, `lint`, `typecheck`, and `test` use Turbo's dependency graph and cache. Development servers and email previews are uncached. Build artifacts exclude `.next/cache` from Turbo storage. Environment changes invalidate task caches. +`dev` starts workspaces under `apps/`. `build`, `lint`, `typecheck`, and `test` use Turbo's dependency graph and cache. Development servers and email previews are uncached. Turbo caches `dist/`, `.astro/`, and `.vercel/output/` build artifacts. Environment changes invalidate task caches. To target the website directly: ```sh -pnpm --filter @apps/nextjs dev -pnpm build --filter=@apps/nextjs... -pnpm --filter @apps/nextjs ui:add input +pnpm --filter @apps/astro dev +pnpm build --filter=@apps/astro... ``` ## Workspace structure -| Location | Package | Responsibility | -| ---------------- | ----------------- | ------------------------------------------------------------------ | -| `apps/nextjs` | `@apps/nextjs` | App Router website, content, public assets, and site-specific code | -| `packages/env` | `@packages/env` | T3 Env validation and root environment loading | -| `packages/db` | `@packages/db` | Lazy Neon HTTP / Drizzle database clients | -| `packages/auth` | `@packages/auth` | Configurable Better Auth factory | -| `packages/ui` | `@packages/ui` | Shared Base UI components and class helpers | -| `packages/email` | `@packages/email` | React Email templates and local preview server | -| `tooling/*` | `@tooling/*` | ESLint, Prettier, TypeScript, and Tailwind configuration | +| Location | Package | Responsibility | +| ---------------- | ----------------- | ------------------------------------------------------------- | +| `apps/astro` | `@apps/astro` | Astro website, content, public assets, and site-specific code | +| `packages/env` | `@packages/env` | T3 Env validation and root environment loading | +| `packages/db` | `@packages/db` | Lazy Neon HTTP / Drizzle database clients | +| `packages/auth` | `@packages/auth` | Configurable Better Auth factory | +| `packages/ui` | `@packages/ui` | Astro avatar/badge components and class helpers | +| `packages/email` | `@packages/email` | React Email templates and local preview server | +| `tooling/*` | `@tooling/*` | ESLint, Prettier, TypeScript, and Tailwind configuration | Workspace imports use real package exports and `workspace:*` dependencies. The website's `@/*` alias refers to its `src/` directory. Shared dependencies are versioned centrally in the pnpm catalog. -See [website configuration](./WEBSITE_CONFIG.md) for posts, authors, images, and publishing. Content lives under `apps/nextjs/content/`. The MDX registry lives in `apps/nextjs/src/mdx-components.tsx`, beside `src/app/`. +See [website configuration](./WEBSITE_CONFIG.md) for posts, authors, images, and publishing. Content lives under `apps/astro/content/`. Astro collections validate Markdown posts and authors, and pages live under `apps/astro/src/pages/`. Public URLs continue to use post frontmatter IDs and author filenames. ## Environment variables @@ -56,7 +56,7 @@ Keep environment files at the repository root: cp .env.example .env ``` -`with-env` loads root environment files before running Turbo or an application command. It uses Next.js environment loading, resolving the root from the loader's location rather than the current directory. Existing process variables win, followed by `.env..local`, `.env.local`, `.env.`, and `.env`. Test mode skips `.env.local`. Vercel supplies process variables through project settings and needs no committed environment file. +`with-env` loads root environment files before running Turbo or an application command. It uses `dotenv` and `dotenv-expand`, resolving the root from the loader's location rather than the current directory. Existing process variables win, followed by `.env..local`, `.env.local`, `.env.`, and `.env`. Test mode skips `.env.local`. Vercel supplies process variables through project settings and needs no committed environment file. Import `env` from `@packages/env` in server code. T3 Env and Zod validate supplied values, treat empty strings as unset, and prevent access to server variables in browser code. The filesystem loader is separate at `@packages/env/load`; do not import it into application runtime code. @@ -81,9 +81,11 @@ The website does not instantiate auth or mount auth endpoints. Auth tables, logi ## Shared UI and Tailwind -Import components from `@packages/ui/components/button` (or `badge` / `avatar`) and `cn` from `@packages/ui/lib/utils`. Add shadcn components from the website workspace using `pnpm --filter @apps/nextjs ui:add `; its aliases route shared primitives to the UI package. +Import Astro components from `@packages/ui/components/avatar` and `@packages/ui/components/badge`, and `cn` from `@packages/ui/lib/utils`. The unused button and extra avatar components have been removed. There is no React/shadcn component-generation command. -`@tooling/tailwind/styles.css` provides Tailwind v4, shared animation imports, theme tokens, the `data-theme` dark variant, common base styles, and shared UI source registration. Applications import this CSS and register their own source directory with `@source`. App-specific layout and typography remain local. `@tooling/tailwind/postcss` exports the PostCSS configuration. Keep the existing Nord light and Catppuccin dark palettes. +`@tooling/tailwind/styles.css` provides Tailwind v4, animation imports, theme tokens, the `data-theme` dark variant, common base styles, and shared UI source registration. Applications import this CSS and register their own source directory with `@source`. The website retains its Nord light and Catppuccin dark palettes and self-hosted Cascadia Code font. + +The website ships Astro HTML with small browser modules for theme switching, map controls, reading progress, and timeline effects. MapLibre is loaded near the viewport, with campus links available when the map cannot load. React remains in the email package for React Email templates. ## Email templates @@ -97,8 +99,12 @@ The website retains its lazy `getResend()` helper at `@/lib/resend`. There are n ## Vercel and additional apps -The root `vercel.json` deploys `@apps/nextjs` using pnpm, a filtered Turbo build, and `apps/nextjs/.next` as the output directory. Keep the existing Vercel project's Root Directory at the repository root (empty/default), select Node.js 24, and enable [Corepack](https://vercel.com/docs/builds/configure-a-build#corepack) (`ENABLE_EXPERIMENTAL_COREPACK=1`) so Vercel uses the package-manager version pinned in `package.json`. Remove conflicting dashboard command overrides. A matching root Next.js dependency supports framework detection with pnpm's isolated installation. +The root `vercel.json` deploys `@apps/astro` using a filtered Turbo build and the Vercel adapter's Build Output API artifacts. The deployment command copies `apps/astro/.vercel/output` into the root `.vercel/output` expected by Vercel, including functions, hourly ISR configuration, redirects, and PNG content types. Keep the Vercel project's Root Directory at the repository root, select Node.js 24, and enable Corepack (`ENABLE_EXPERIMENTAL_COREPACK=1`) to use the pinned pnpm version. Remove conflicting dashboard command overrides. No root framework dependency is needed. + +Content pages, feeds, metadata, and social preview PNGs are prerendered. Home and team pages render on demand and use a 3,600-second ISR expiration; after expiry, a request triggers regeneration. Failed GitHub loads return an uncached 503 page with offline messaging or the authored timeline so failed regeneration does not replace successful cached content. Actual Vercel cache hits and regeneration must be verified on a deployment; local Node runs do not emulate the platform cache. + +For a local production server, run `pnpm build:local`, then `pnpm start`. The local build explicitly selects `@astrojs/node`; the default `pnpm build` selects `@astrojs/vercel`. You can override the local server's interface and port using `HOST` and `PORT`. Add future applications under `apps/`, name them `@apps/`, declare shared packages using `workspace:*`, and extend shared tooling. Each future app should have its own Vercel project, environment values, and app-specific deployment configuration. The root config remains specific to the current website; it does not deploy every app. For a project rooted in a new app directory, enable access to files outside that root so shared packages are available. Do not reuse the website's root build and output settings for another app. -GitHub Actions installs with the frozen lockfile and runs typecheck, lint, service-package tests, and the production build. No live database, migration, email, or deployment is required for these checks. +GitHub Actions installs with the frozen lockfile and runs typecheck, lint, content/GitHub and service-package tests, the Vercel production build, and execution of the packaged server functions with GitHub offline. No live database, migration, email, or deployment is required for these checks. diff --git a/WEBSITE_CONFIG.md b/WEBSITE_CONFIG.md index ac39f10..54b517a 100644 --- a/WEBSITE_CONFIG.md +++ b/WEBSITE_CONFIG.md @@ -1,16 +1,16 @@ # Website configuration -The website is in `apps/nextjs/`. Source files are under `src/`, while `content/`, `public/`, and Next.js configuration are at the app root. Run `pnpm dev` from the repository root. No environment variables are needed for the public site. Shared environment files belong at the repository root; never prefix secrets with `NEXT_PUBLIC_`. Paths below are relative to `apps/nextjs/`. +The website is in `apps/astro/`. Source files are under `src/`, while `content/`, `public/`, and Astro configuration are at the app root. Run `pnpm dev` from the repository root. No environment variables are needed for the public site. Shared environment files belong at the repository root; never prefix secrets with `PUBLIC_`. Paths below are relative to `apps/astro/`. ## Home page -The home page is a bento grid (`src/app/page.tsx`, laid out by the `.bento` rules in `src/styles/globals.css`). Its statistics, language breakdown, and commit calendar come from the public GitHub API for the [Manipal-OSF](https://github.com/Manipal-OSF) organization (`src/lib/github.ts`). Responses are cached for a day and the page re-renders hourly; if GitHub is unreachable, those cells say so instead of failing the page. Unauthenticated requests are limited to 60 an hour, so set `GITHUB_TOKEN` in the repository-root `.env` or the hosting environment if builds or previews run often. A fine-grained token without any permissions is enough. +The home page is a bento grid (`src/pages/index.astro`, laid out by the `.bento` rules in `src/styles/globals.css`). Its statistics, language breakdown, and commit calendar come from the public GitHub API for the [Manipal-OSF](https://github.com/Manipal-OSF) organization (`src/lib/github.ts`). Home and team pages use Vercel ISR with a one-hour expiration. Duplicate GitHub calls within one render share a response. If GitHub is unreachable, the website returns an uncached 503 fallback, preserving offline messaging and the authored team timeline. On Vercel, unsuccessful regeneration retains the previous cached page. Unauthenticated requests are limited to 60 an hour, so set `GITHUB_TOKEN` in the repository-root `.env` or the hosting environment if live page regeneration or previews run often. A fine-grained token without any permissions is enough. -The map uses [MapLibre](https://maplibre.org/) with [OpenFreeMap](https://openfreemap.org/) tiles; edit `regions` in `src/components/home/KarnatakaMap.tsx` to change the places in its menu. +The map uses [MapLibre](https://maplibre.org/) with [OpenFreeMap](https://openfreemap.org/) tiles; edit `regions` in `src/lib/map.ts` to change the places in its menu. ## SEO -It's added now +The shared Astro layout renders canonical URLs, social metadata, RSS discovery, icons, and the manifest. Pages retain their JSON-LD structured data. `/sitemap.xml`, `/robots.txt`, `/blog/feed.xml`, `/opengraph-image`, and each published post's `/blog//opengraph-image` are generated at build time. Social previews use a bundled Noto Sans font; its license is included beside the font. ## Write a blog post @@ -68,6 +68,6 @@ Only `name` is required. `avatar` must be a local public path (place the image i ## Publish -Change `status` to `published`, commit the Markdown and any images, and deploy. App Router Server Components and `generateStaticParams` generate blog pages during the production build; additions, edits, and removals require a rebuild and deployment. During development, the content loader reads files on each page request. Reload the page to see content changes; new published IDs work without restarting the dev server. +Change `status` to `published`, commit the Markdown and any images, and deploy. Astro content collections and `getStaticPaths` generate blog and author pages during the production build; additions, edits, and removals require a rebuild and deployment. During development, Astro watches the content collections; saved changes and new published IDs work without restarting the dev server. Unknown or draft post URLs return 404. Historical hosted posts must be exported and converted to this format separately, preserving their IDs if their existing URLs need to keep working. diff --git a/apps/astro/astro.config.mjs b/apps/astro/astro.config.mjs new file mode 100644 index 0000000..79d542e --- /dev/null +++ b/apps/astro/astro.config.mjs @@ -0,0 +1,31 @@ +import { defineConfig } from 'astro/config'; +import vercel from '@astrojs/vercel'; +import node from '@astrojs/node'; +import { unified } from '@astrojs/markdown-remark'; +import remarkGfm from 'remark-gfm'; +import rehypeSlug from 'rehype-slug'; +import { loadRootEnv } from '@packages/env/load'; + +loadRootEnv( + process.env.NODE_ENV === 'development' ? 'development' : 'production', +); +const local = process.env.ASTRO_TARGET === 'node'; + +export default defineConfig({ + site: 'https://manipalosf.org', + output: 'static', + trailingSlash: 'never', + adapter: local + ? node({ mode: 'standalone' }) + : vercel({ isr: { expiration: 3600 } }), + markdown: { + processor: unified({ + remarkPlugins: [remarkGfm], + smartypants: false, + rehypePlugins: [rehypeSlug], + remarkRehype: { allowDangerousHtml: false }, + }), + shikiConfig: { theme: 'github-dark' }, + }, + vite: { ssr: { noExternal: ['@packages/ui'] } }, +}); diff --git a/apps/nextjs/content/authors/karthik-prabhu.md b/apps/astro/content/authors/karthik-prabhu.md similarity index 100% rename from apps/nextjs/content/authors/karthik-prabhu.md rename to apps/astro/content/authors/karthik-prabhu.md diff --git a/apps/nextjs/content/posts/.gitkeep b/apps/astro/content/posts/.gitkeep similarity index 100% rename from apps/nextjs/content/posts/.gitkeep rename to apps/astro/content/posts/.gitkeep diff --git a/apps/nextjs/content/posts/advice-from-an-alumnus.md b/apps/astro/content/posts/advice-from-an-alumnus.md similarity index 100% rename from apps/nextjs/content/posts/advice-from-an-alumnus.md rename to apps/astro/content/posts/advice-from-an-alumnus.md diff --git a/apps/astro/eslint.config.mjs b/apps/astro/eslint.config.mjs new file mode 100644 index 0000000..a624176 --- /dev/null +++ b/apps/astro/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@tooling/eslint/astro'; diff --git a/apps/astro/package.json b/apps/astro/package.json new file mode 100644 index 0000000..f1c6ad2 --- /dev/null +++ b/apps/astro/package.json @@ -0,0 +1,53 @@ +{ + "name": "@apps/astro", + "private": true, + "type": "module", + "scripts": { + "dev": "with-env development astro dev", + "build": "with-env production astro build", + "build:local": "with-env production node scripts/build-local.mjs", + "start": "with-env production node dist/server/entry.mjs", + "typecheck": "with-env production astro check", + "lint": "eslint .", + "test": "node --import tsx --test tests/*.test.ts" + }, + "dependencies": { + "@astrojs/markdown-remark": "^7.3.3", + "@astrojs/node": "^11.1.9", + "@astrojs/vercel": "^11.0.16", + "@fontsource-variable/cascadia-code": "^5.3.0", + "@packages/auth": "workspace:*", + "@packages/db": "workspace:*", + "@packages/email": "workspace:*", + "@packages/env": "workspace:*", + "@packages/ui": "workspace:*", + "@resvg/resvg-js": "^2.6.2", + "@vercel/analytics": "^2.0.1", + "@vercel/speed-insights": "^2.0.0", + "astro": "^7.4.1", + "github-slugger": "2.0.0", + "maplibre-gl": "^6.13.0", + "mdast-util-to-string": "^4.0.0", + "rehype-slug": "^6.0.0", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "resend": "^6.32.1", + "satori": "^0.32.0", + "satori-html": "^0.3.2", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "zod": "catalog:" + }, + "devDependencies": { + "@astrojs/check": "^0.9.11", + "@tooling/eslint": "workspace:*", + "@tooling/tailwind": "workspace:*", + "@tooling/typescript": "workspace:*", + "@types/mdast": "^4.0.4", + "@types/node": "catalog:", + "eslint": "catalog:", + "postcss": "catalog:", + "tsx": "^4.20.0", + "typescript": "catalog:" + } +} diff --git a/apps/nextjs/postcss.config.mjs b/apps/astro/postcss.config.mjs similarity index 100% rename from apps/nextjs/postcss.config.mjs rename to apps/astro/postcss.config.mjs diff --git a/apps/nextjs/src/app/apple-icon.png b/apps/astro/public/apple-icon.png similarity index 100% rename from apps/nextjs/src/app/apple-icon.png rename to apps/astro/public/apple-icon.png diff --git a/apps/nextjs/public/authors/karthik-prabhu.jpg b/apps/astro/public/authors/karthik-prabhu.jpg similarity index 100% rename from apps/nextjs/public/authors/karthik-prabhu.jpg rename to apps/astro/public/authors/karthik-prabhu.jpg diff --git a/apps/nextjs/public/discord.png b/apps/astro/public/discord.png similarity index 100% rename from apps/nextjs/public/discord.png rename to apps/astro/public/discord.png diff --git a/apps/nextjs/public/github.webp b/apps/astro/public/github.webp similarity index 100% rename from apps/nextjs/public/github.webp rename to apps/astro/public/github.webp diff --git a/apps/nextjs/src/app/icon.png b/apps/astro/public/icon.png similarity index 100% rename from apps/nextjs/src/app/icon.png rename to apps/astro/public/icon.png diff --git a/apps/nextjs/public/logo.png b/apps/astro/public/logo.png similarity index 100% rename from apps/nextjs/public/logo.png rename to apps/astro/public/logo.png diff --git a/apps/nextjs/public/osf.svg b/apps/astro/public/osf.svg similarity index 100% rename from apps/nextjs/public/osf.svg rename to apps/astro/public/osf.svg diff --git a/apps/nextjs/public/placeholder.png b/apps/astro/public/placeholder.png similarity index 100% rename from apps/nextjs/public/placeholder.png rename to apps/astro/public/placeholder.png diff --git a/apps/nextjs/public/team.jpg b/apps/astro/public/team.jpg similarity index 100% rename from apps/nextjs/public/team.jpg rename to apps/astro/public/team.jpg diff --git a/apps/nextjs/public/team.png b/apps/astro/public/team.png similarity index 100% rename from apps/nextjs/public/team.png rename to apps/astro/public/team.png diff --git a/apps/astro/scripts/build-local.mjs b/apps/astro/scripts/build-local.mjs new file mode 100644 index 0000000..9ec75c5 --- /dev/null +++ b/apps/astro/scripts/build-local.mjs @@ -0,0 +1,10 @@ +import { spawnSync } from 'node:child_process'; +const result = spawnSync( + process.execPath, + ['node_modules/astro/bin/astro.mjs', 'build'], + { + stdio: 'inherit', + env: { ...process.env, ASTRO_TARGET: 'node' }, + }, +); +process.exit(result.status ?? 1); diff --git a/apps/astro/src/assets/NotoSans-Regular.ttf b/apps/astro/src/assets/NotoSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d55220958aa51eeeb85048d746eabe43d2cd9f14 GIT binary patch literal 569208 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.IN%>(p_~|wOn`C-PPH; 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

*akG6iL#jt$xbL%{HDIRBEp2t@jH9LI?&cAv7 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

diff --git a/apps/astro/src/components/authors/AuthorProfiles.astro b/apps/astro/src/components/authors/AuthorProfiles.astro new file mode 100644 index 0000000..fe6a405 --- /dev/null +++ b/apps/astro/src/components/authors/AuthorProfiles.astro @@ -0,0 +1,21 @@ +--- +import type { PostAuthor } from '@/types/blog'; +import AuthorCard from './AuthorCard.astro'; +interface Props { + authors: PostAuthor[]; +} +const profiles = Astro.props.authors.filter((author) => author.isRegistered); +--- + +{ + profiles.length > 0 && ( +
+

+ {profiles.length === 1 ? 'About the author' : 'About the authors'} +

+ {profiles.map((author) => ( + + ))} +
+ ) +} diff --git a/apps/astro/src/components/blog/BlogCard.astro b/apps/astro/src/components/blog/BlogCard.astro new file mode 100644 index 0000000..b88c3e7 --- /dev/null +++ b/apps/astro/src/components/blog/BlogCard.astro @@ -0,0 +1,43 @@ +--- +import { resolveAuthors } from '@/lib/content/authors'; +import type { BlogPost } from '@/types/blog'; +import CoverImage from './CoverImage.astro'; +import PostMeta from './PostMeta.astro'; +import Tags from './Tags.astro'; +type BlogCardProps = { + post: Pick< + BlogPost, + | 'id' + | 'title' + | 'description' + | 'authors' + | 'publishDate' + | 'readingTime' + | 'tags' + | 'coverImage' + >; +}; +const { post } = Astro.props as BlogCardProps; +const authors = await resolveAuthors(post.authors); +--- + +
+

{post.title}

{ + post.description && ( +

{post.description}

+ ) + } +
diff --git a/apps/astro/src/components/blog/CoverImage.astro b/apps/astro/src/components/blog/CoverImage.astro new file mode 100644 index 0000000..15114d6 --- /dev/null +++ b/apps/astro/src/components/blog/CoverImage.astro @@ -0,0 +1,26 @@ +--- +import { Image } from 'astro:assets'; +import { cn } from '@packages/ui/lib/utils'; +interface Props { + src: string | null; + alt: string; + sizes: string; + preload?: boolean; + className?: string; +} +const { src, alt, sizes, preload, className } = Astro.props; +--- + +
+ {src +
diff --git a/apps/astro/src/components/blog/HeadingList.astro b/apps/astro/src/components/blog/HeadingList.astro new file mode 100644 index 0000000..9b3276e --- /dev/null +++ b/apps/astro/src/components/blog/HeadingList.astro @@ -0,0 +1,26 @@ +--- +import type { PostHeading } from '@/types/blog'; +interface Props { + headings: PostHeading[]; +} +const { headings } = Astro.props; +const indent = { 2: '', 3: 'ml-4', 4: 'ml-8' }; +--- + +
    + { + headings.map((heading) => ( +
  1. + + {heading.text} + +
  2. + )) + } +
+ diff --git a/apps/astro/src/components/blog/MobileTableOfContents.astro b/apps/astro/src/components/blog/MobileTableOfContents.astro new file mode 100644 index 0000000..93bbe35 --- /dev/null +++ b/apps/astro/src/components/blog/MobileTableOfContents.astro @@ -0,0 +1,63 @@ +--- +import HeadingList from './HeadingList.astro'; +import ChevronDown from '@/components/icons/ChevronDown.astro'; +import type { PostHeading } from '@/types/blog'; +import { cn } from '@packages/ui/lib/utils'; +interface Props { + headings: PostHeading[]; + className?: string; +} +const { headings, className } = Astro.props; +const circumference = 2 * Math.PI * 10; +--- + +{ + headings.length > 0 && ( +
+ + + + + + + Overview + + + +
+ +
+
+ ) +} diff --git a/apps/astro/src/components/blog/Placeholder.astro b/apps/astro/src/components/blog/Placeholder.astro new file mode 100644 index 0000000..92575d2 --- /dev/null +++ b/apps/astro/src/components/blog/Placeholder.astro @@ -0,0 +1,22 @@ +--- +import { cn } from '@packages/ui/lib/utils'; + +const base = + 'group flex size-full items-center gap-2 rounded-lg border p-3 transition-colors'; + +const { align, text } = Astro.props as { + align: 'start' | 'end'; + text: string; +}; +--- + +
+ {text} +
diff --git a/apps/astro/src/components/blog/PostHeader.astro b/apps/astro/src/components/blog/PostHeader.astro new file mode 100644 index 0000000..c953a3b --- /dev/null +++ b/apps/astro/src/components/blog/PostHeader.astro @@ -0,0 +1,27 @@ +--- +import type { BlogPost, PostAuthor } from '@/types/blog'; +import PostMeta from './PostMeta.astro'; +import Tags from './Tags.astro'; +interface PostHeaderProps { + post: Pick< + BlogPost, + 'title' | 'description' | 'publishDate' | 'readingTime' | 'tags' + >; + authors: PostAuthor[]; +} +const { post, authors } = Astro.props as PostHeaderProps; +--- + +
+

+ {post.title} +

{ + post.description &&

{post.description}

+ } +
diff --git a/apps/astro/src/components/blog/PostList.astro b/apps/astro/src/components/blog/PostList.astro new file mode 100644 index 0000000..3c2631f --- /dev/null +++ b/apps/astro/src/components/blog/PostList.astro @@ -0,0 +1,16 @@ +--- +import BlogCard from './BlogCard.astro'; +import type { BlogPost } from '@/types/blog'; +type PostListProps = { posts: BlogPost[] }; +const { posts } = Astro.props as PostListProps; +--- + +
    + { + posts.map((post) => ( +
  • + +
  • + )) + } +
diff --git a/apps/astro/src/components/blog/PostMeta.astro b/apps/astro/src/components/blog/PostMeta.astro new file mode 100644 index 0000000..f87922f --- /dev/null +++ b/apps/astro/src/components/blog/PostMeta.astro @@ -0,0 +1,52 @@ +--- +import AuthorAvatar from '@/components/authors/AuthorAvatar.astro'; +import { formatDate } from '@/lib/format'; +import { cn } from '@packages/ui/lib/utils'; +import type { PostAuthor } from '@/types/blog'; +interface PostMetaProps { + authors: PostAuthor[]; + publishDate: string; + readingTime: string; + linkAuthors?: boolean; + className?: string; +} +import Separator from './Separator.astro'; +const { + authors, + publishDate, + readingTime, + linkAuthors = false, + className, +} = Astro.props as PostMetaProps; +--- + +
+ { + authors.map((author) => ( + + + {linkAuthors && author.isRegistered ? ( + + {author.name} + + ) : ( + {author.name} + )} + + )) + }{readingTime} +
diff --git a/apps/astro/src/components/blog/PostNavigation.astro b/apps/astro/src/components/blog/PostNavigation.astro new file mode 100644 index 0000000..4bb408d --- /dev/null +++ b/apps/astro/src/components/blog/PostNavigation.astro @@ -0,0 +1,54 @@ +--- +import ArrowLeft from '@/components/icons/ArrowLeft.astro'; +import ArrowRight from '@/components/icons/ArrowRight.astro'; +import { cn } from '@packages/ui/lib/utils'; +import type { BlogPost } from '@/types/blog'; +type PostLink = Pick; +interface PostNavigationProps { + newer: PostLink | null; + older: PostLink | null; +} +const base = + 'group flex size-full items-center gap-2 rounded-lg border p-3 transition-colors'; +import Placeholder from './Placeholder.astro'; +const { newer, older } = Astro.props as PostNavigationProps; +--- + + diff --git a/apps/astro/src/components/blog/Separator.astro b/apps/astro/src/components/blog/Separator.astro new file mode 100644 index 0000000..8a31014 --- /dev/null +++ b/apps/astro/src/components/blog/Separator.astro @@ -0,0 +1 @@ + diff --git a/apps/astro/src/components/blog/TableOfContents.astro b/apps/astro/src/components/blog/TableOfContents.astro new file mode 100644 index 0000000..080af74 --- /dev/null +++ b/apps/astro/src/components/blog/TableOfContents.astro @@ -0,0 +1,29 @@ +--- +import { cn } from '@packages/ui/lib/utils'; +import type { PostHeading } from '@/types/blog'; +import HeadingList from './HeadingList.astro'; +interface TableOfContentsProps { + headings: PostHeading[]; + className?: string; +} +const { headings, className } = Astro.props as TableOfContentsProps; +--- + +{ + headings.length > 0 ? ( + + ) : null +} diff --git a/apps/astro/src/components/blog/Tags.astro b/apps/astro/src/components/blog/Tags.astro new file mode 100644 index 0000000..3459d6f --- /dev/null +++ b/apps/astro/src/components/blog/Tags.astro @@ -0,0 +1,21 @@ +--- +import Hash from '@/components/icons/Hash.astro'; +import { cn } from '@packages/ui/lib/utils'; +const { tags, className } = Astro.props as { + tags: string[]; + className?: string; +}; +--- + +{ + tags.length > 0 ? ( +
    + {tags.map((tag) => ( +
  • + + {tag} +
  • + ))} +
+ ) : null +} diff --git a/apps/nextjs/src/components/common/BrandIcon.tsx b/apps/astro/src/components/common/BrandIcon.astro similarity index 93% rename from apps/nextjs/src/components/common/BrandIcon.tsx rename to apps/astro/src/components/common/BrandIcon.astro index 83c0567..0dbd757 100644 --- a/apps/nextjs/src/components/common/BrandIcon.tsx +++ b/apps/astro/src/components/common/BrandIcon.astro @@ -1,8 +1,8 @@ -import type { SVGProps } from 'react'; +--- +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; import type { socialLinks } from '@/lib/site'; - export type Brand = (typeof socialLinks)[number]['label'] | 'LinkedIn' | 'X'; - const brandPaths: Record = { Instagram: 'M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077', @@ -16,15 +16,15 @@ const brandPaths: Record = { 'M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z', X: 'M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z', }; +const { brand, className, ...props } = Astro.props as { + brand: Brand; +} & SVGAttributes & { className?: string }; +--- -// Simple Icons brand marks for the social links; they inherit the text color. -const BrandIcon = ({ - brand, - ...props -}: { brand: Brand } & SVGProps) => ( - -); - -export default BrandIcon; + diff --git a/apps/astro/src/components/common/Breadcrumbs.astro b/apps/astro/src/components/common/Breadcrumbs.astro new file mode 100644 index 0000000..1461314 --- /dev/null +++ b/apps/astro/src/components/common/Breadcrumbs.astro @@ -0,0 +1,50 @@ +--- +import ChevronRight from '@/components/icons/ChevronRight.astro'; +import House from '@/components/icons/House.astro'; +import { absoluteUrl } from '@/lib/seo'; +import JsonLd from './JsonLd.astro'; +interface BreadcrumbItem { + label: string; + href?: string; +} +const { items } = Astro.props as { items: BreadcrumbItem[] }; +--- + + diff --git a/apps/astro/src/components/common/Container.astro b/apps/astro/src/components/common/Container.astro new file mode 100644 index 0000000..ff3aa84 --- /dev/null +++ b/apps/astro/src/components/common/Container.astro @@ -0,0 +1,12 @@ +--- +import type { HTMLAttributes } from 'astro/types'; +import { cn } from '@packages/ui/lib/utils'; +interface Props extends HTMLAttributes<'div'> { + className?: string; +} +const { className, class: classes, ...props } = Astro.props; +--- + +
+ +
diff --git a/apps/astro/src/components/common/JsonLd.astro b/apps/astro/src/components/common/JsonLd.astro new file mode 100644 index 0000000..655a4b9 --- /dev/null +++ b/apps/astro/src/components/common/JsonLd.astro @@ -0,0 +1,11 @@ +--- +interface Props { + data: Record; +} +const json = JSON.stringify({ + '@context': 'https://schema.org', + ...Astro.props.data, +}).replace(/ diff --git a/apps/astro/src/components/home/ActivityCard.astro b/apps/astro/src/components/home/ActivityCard.astro new file mode 100644 index 0000000..dfa57b4 --- /dev/null +++ b/apps/astro/src/components/home/ActivityCard.astro @@ -0,0 +1,67 @@ +--- +import { ACTIVITY_WEEKS, type OrgStats } from '@/lib/github'; +import { cn } from '@packages/ui/lib/utils'; +interface ActivityCardProps { + activity: OrgStats['activity']; + totalCommits: number; +} +const formatDay = (date: string) => + new Intl.DateTimeFormat('en-US', { + month: 'short', + day: 'numeric', + timeZone: 'UTC', + }).format(new Date(`${date}T00:00:00Z`)); +const opacity = [0, 0.3, 0.55, 0.8, 1]; +const NARROW_WEEKS = 16; +const hiddenWhenNarrow = (ACTIVITY_WEEKS - NARROW_WEEKS) * 7; +const level = (count: number) => + count === 0 ? 0 : count < 3 ? 1 : count < 6 ? 2 : count < 10 ? 3 : 4; +const { activity, totalCommits } = Astro.props as ActivityCardProps; +--- + +
+

Activity

+
diff --git a/apps/astro/src/components/home/BentoCell.astro b/apps/astro/src/components/home/BentoCell.astro new file mode 100644 index 0000000..9f2cda9 --- /dev/null +++ b/apps/astro/src/components/home/BentoCell.astro @@ -0,0 +1,33 @@ +--- +import { cn } from '@packages/ui/lib/utils'; +interface Props { + area: string; + note?: string; + noteClassName?: string; + className?: string; +} +const { area, note, noteClassName, className } = Astro.props; +--- + +
+ + { + note && ( + + ) + } +
diff --git a/apps/astro/src/components/home/KarnatakaMap.astro b/apps/astro/src/components/home/KarnatakaMap.astro new file mode 100644 index 0000000..2181bf1 --- /dev/null +++ b/apps/astro/src/components/home/KarnatakaMap.astro @@ -0,0 +1,114 @@ +--- +import Plus from '@/components/icons/Plus.astro'; +import Minus from '@/components/icons/Minus.astro'; +import Maximize from '@/components/icons/Maximize.astro'; +import Minimize from '@/components/icons/Minimize.astro'; +import MapPin from '@/components/icons/MapPin.astro'; +import { campuses, regions } from '@/lib/map'; +const controlClassName = + 'text-foreground hover:bg-muted hover:text-primary focus-visible:ring-ring/50 flex size-9 cursor-pointer items-center justify-center transition-colors outline-none focus-visible:ring-3 disabled:cursor-default disabled:opacity-50 [&>svg]:size-5'; +--- + + + +
+
+
+ + + +
+ + + +
+ diff --git a/apps/astro/src/components/home/LanguagesCard.astro b/apps/astro/src/components/home/LanguagesCard.astro new file mode 100644 index 0000000..0d5c0fd --- /dev/null +++ b/apps/astro/src/components/home/LanguagesCard.astro @@ -0,0 +1,46 @@ +--- +import type { LanguageShare } from '@/lib/github'; +const percent = (share: number) => + share >= 0.1 ? `${Math.round(share * 100)}%` : `${(share * 100).toFixed(1)}%`; +const { languages } = Astro.props as { languages: LanguageShare[] }; +--- + +
+

Languages

`${name} ${percent(share)}`) + .join(', ')} + class='bg-border flex h-3 w-full gap-0.5 overflow-hidden rounded-full' + > + { + languages.map(({ name, share, color }) => ( + + )) + } +
    + { + languages.map(({ name, share, color }) => ( +
  • + <> +
  • + )) + } +
+
diff --git a/apps/astro/src/components/home/LinkCell.astro b/apps/astro/src/components/home/LinkCell.astro new file mode 100644 index 0000000..c49bf44 --- /dev/null +++ b/apps/astro/src/components/home/LinkCell.astro @@ -0,0 +1,48 @@ +--- +import BentoCell from './BentoCell.astro'; +import ArrowUpRight from '@/components/icons/ArrowUpRight.astro'; +interface Props { + area: string; + href: string; + title: string; + detail?: string; + note?: string; + image?: string; +} +const { area, href, title, detail, note, image } = Astro.props; +const external = href.startsWith('http'); +--- + + + + { + image && ( + + ) + } + + {title}{ + detail && {detail} + } + + + diff --git a/apps/astro/src/components/home/Stat.astro b/apps/astro/src/components/home/Stat.astro new file mode 100644 index 0000000..098c517 --- /dev/null +++ b/apps/astro/src/components/home/Stat.astro @@ -0,0 +1,15 @@ +--- +interface Props { + value: number; + label: string; +} +const { value, label } = Astro.props; +--- + +
+
+ {label} +
{value}
+
diff --git a/apps/astro/src/components/home/Unavailable.astro b/apps/astro/src/components/home/Unavailable.astro new file mode 100644 index 0000000..8a8cee1 --- /dev/null +++ b/apps/astro/src/components/home/Unavailable.astro @@ -0,0 +1,5 @@ +

+ +

diff --git a/apps/astro/src/components/home/maplibre.ts b/apps/astro/src/components/home/maplibre.ts new file mode 100644 index 0000000..84ae7c8 --- /dev/null +++ b/apps/astro/src/components/home/maplibre.ts @@ -0,0 +1,5 @@ +import 'maplibre-gl/dist/maplibre-gl.css'; +import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?url'; +import { setWorkerUrl } from 'maplibre-gl'; +setWorkerUrl(workerUrl); +export { Map, Marker, Popup } from 'maplibre-gl'; diff --git a/apps/astro/src/components/icons/ArrowLeft.astro b/apps/astro/src/components/icons/ArrowLeft.astro new file mode 100644 index 0000000..f85ae11 --- /dev/null +++ b/apps/astro/src/components/icons/ArrowLeft.astro @@ -0,0 +1,27 @@ +--- +// Lucide arrow-left, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/ArrowRight.astro b/apps/astro/src/components/icons/ArrowRight.astro new file mode 100644 index 0000000..dcdeb32 --- /dev/null +++ b/apps/astro/src/components/icons/ArrowRight.astro @@ -0,0 +1,27 @@ +--- +// Lucide arrow-right, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/ArrowUpRight.astro b/apps/astro/src/components/icons/ArrowUpRight.astro new file mode 100644 index 0000000..b54d789 --- /dev/null +++ b/apps/astro/src/components/icons/ArrowUpRight.astro @@ -0,0 +1,27 @@ +--- +// Lucide arrow-up-right, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/BookMarked.astro b/apps/astro/src/components/icons/BookMarked.astro new file mode 100644 index 0000000..09c8a82 --- /dev/null +++ b/apps/astro/src/components/icons/BookMarked.astro @@ -0,0 +1,31 @@ +--- +// Lucide book-bookmark, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/ChevronDown.astro b/apps/astro/src/components/icons/ChevronDown.astro new file mode 100644 index 0000000..96a04c4 --- /dev/null +++ b/apps/astro/src/components/icons/ChevronDown.astro @@ -0,0 +1,26 @@ +--- +// Lucide chevron-down, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/ChevronRight.astro b/apps/astro/src/components/icons/ChevronRight.astro new file mode 100644 index 0000000..d655c2d --- /dev/null +++ b/apps/astro/src/components/icons/ChevronRight.astro @@ -0,0 +1,26 @@ +--- +// Lucide chevron-right, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/GitFork.astro b/apps/astro/src/components/icons/GitFork.astro new file mode 100644 index 0000000..41f6608 --- /dev/null +++ b/apps/astro/src/components/icons/GitFork.astro @@ -0,0 +1,30 @@ +--- +// Lucide git-fork, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Globe.astro b/apps/astro/src/components/icons/Globe.astro new file mode 100644 index 0000000..f83380d --- /dev/null +++ b/apps/astro/src/components/icons/Globe.astro @@ -0,0 +1,28 @@ +--- +// Lucide globe, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Hash.astro b/apps/astro/src/components/icons/Hash.astro new file mode 100644 index 0000000..76739f3 --- /dev/null +++ b/apps/astro/src/components/icons/Hash.astro @@ -0,0 +1,29 @@ +--- +// Lucide hash, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/House.astro b/apps/astro/src/components/icons/House.astro new file mode 100644 index 0000000..6912c34 --- /dev/null +++ b/apps/astro/src/components/icons/House.astro @@ -0,0 +1,29 @@ +--- +// Lucide house, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Mail.astro b/apps/astro/src/components/icons/Mail.astro new file mode 100644 index 0000000..01874db --- /dev/null +++ b/apps/astro/src/components/icons/Mail.astro @@ -0,0 +1,27 @@ +--- +// Lucide mail, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/MapPin.astro b/apps/astro/src/components/icons/MapPin.astro new file mode 100644 index 0000000..a5bef9f --- /dev/null +++ b/apps/astro/src/components/icons/MapPin.astro @@ -0,0 +1,29 @@ +--- +// Lucide map-pin, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Maximize.astro b/apps/astro/src/components/icons/Maximize.astro new file mode 100644 index 0000000..8e92bcd --- /dev/null +++ b/apps/astro/src/components/icons/Maximize.astro @@ -0,0 +1,29 @@ +--- +// Lucide maximize, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Minimize.astro b/apps/astro/src/components/icons/Minimize.astro new file mode 100644 index 0000000..b71f53c --- /dev/null +++ b/apps/astro/src/components/icons/Minimize.astro @@ -0,0 +1,29 @@ +--- +// Lucide minimize, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Minus.astro b/apps/astro/src/components/icons/Minus.astro new file mode 100644 index 0000000..cc2dcc4 --- /dev/null +++ b/apps/astro/src/components/icons/Minus.astro @@ -0,0 +1,26 @@ +--- +// Lucide minus, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Moon.astro b/apps/astro/src/components/icons/Moon.astro new file mode 100644 index 0000000..46b64bf --- /dev/null +++ b/apps/astro/src/components/icons/Moon.astro @@ -0,0 +1,28 @@ +--- +// Lucide moon, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Plus.astro b/apps/astro/src/components/icons/Plus.astro new file mode 100644 index 0000000..91e6d23 --- /dev/null +++ b/apps/astro/src/components/icons/Plus.astro @@ -0,0 +1,27 @@ +--- +// Lucide plus, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Rss.astro b/apps/astro/src/components/icons/Rss.astro new file mode 100644 index 0000000..8bcf0f5 --- /dev/null +++ b/apps/astro/src/components/icons/Rss.astro @@ -0,0 +1,28 @@ +--- +// Lucide rss, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Star.astro b/apps/astro/src/components/icons/Star.astro new file mode 100644 index 0000000..50b690f --- /dev/null +++ b/apps/astro/src/components/icons/Star.astro @@ -0,0 +1,28 @@ +--- +// Lucide star, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Sun.astro b/apps/astro/src/components/icons/Sun.astro new file mode 100644 index 0000000..872f94f --- /dev/null +++ b/apps/astro/src/components/icons/Sun.astro @@ -0,0 +1,34 @@ +--- +// Lucide sun, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/Users.astro b/apps/astro/src/components/icons/Users.astro new file mode 100644 index 0000000..4461980 --- /dev/null +++ b/apps/astro/src/components/icons/Users.astro @@ -0,0 +1,29 @@ +--- +// Lucide users, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/icons/UsersRound.astro b/apps/astro/src/components/icons/UsersRound.astro new file mode 100644 index 0000000..8f43c82 --- /dev/null +++ b/apps/astro/src/components/icons/UsersRound.astro @@ -0,0 +1,28 @@ +--- +// Lucide users-round, ISC license: https://lucide.dev/license +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/layout/Footer.astro b/apps/astro/src/components/layout/Footer.astro new file mode 100644 index 0000000..acf342b --- /dev/null +++ b/apps/astro/src/components/layout/Footer.astro @@ -0,0 +1,41 @@ +--- +import Rss from '@/components/icons/Rss.astro'; +import { feedPath } from '@/lib/seo'; +import { socialLinks } from '@/lib/site'; +import BrandIcon from '@/components/common/BrandIcon.astro'; +import Logo from './Logo.astro'; +import { iconButton } from './styles'; +const year = new Date().getFullYear(); +--- + +
+
+
+

+ {`Copyright © ${year} - All rights reserved`} +

+
+ { + socialLinks.map(({ href, label }) => ( + + + + )) + } +
+
+
diff --git a/apps/astro/src/components/layout/Header.astro b/apps/astro/src/components/layout/Header.astro new file mode 100644 index 0000000..e9b445b --- /dev/null +++ b/apps/astro/src/components/layout/Header.astro @@ -0,0 +1,19 @@ +--- +import Logo from './Logo.astro'; +import NavLinks from './NavLinks.astro'; +import ThemeToggle from './ThemeToggle.astro'; +--- + +
+
+
+
+
diff --git a/apps/astro/src/components/layout/Logo.astro b/apps/astro/src/components/layout/Logo.astro new file mode 100644 index 0000000..ae24ab7 --- /dev/null +++ b/apps/astro/src/components/layout/Logo.astro @@ -0,0 +1,24 @@ +--- +import type { HTMLAttributes } from 'astro/types'; +type SVGAttributes = HTMLAttributes<'svg'>; +interface Props extends SVGAttributes { + className?: string; +} +const { className, ...props } = Astro.props; +--- + + diff --git a/apps/astro/src/components/layout/NavLinks.astro b/apps/astro/src/components/layout/NavLinks.astro new file mode 100644 index 0000000..182253f --- /dev/null +++ b/apps/astro/src/components/layout/NavLinks.astro @@ -0,0 +1,18 @@ +--- +import { activeNavItem, navItems } from '@/lib/site'; +const active = activeNavItem(Astro.url.pathname); +--- + +{ + navItems.map((item) => ( +
  • + + {item.label} + +
  • + )) +} diff --git a/apps/astro/src/components/layout/ThemeToggle.astro b/apps/astro/src/components/layout/ThemeToggle.astro new file mode 100644 index 0000000..49fe390 --- /dev/null +++ b/apps/astro/src/components/layout/ThemeToggle.astro @@ -0,0 +1,66 @@ +--- +import Sun from '@/components/icons/Sun.astro'; +import Moon from '@/components/icons/Moon.astro'; +import { iconButton } from './styles'; +--- + + + + diff --git a/apps/nextjs/src/components/layout/styles.ts b/apps/astro/src/components/layout/styles.ts similarity index 100% rename from apps/nextjs/src/components/layout/styles.ts rename to apps/astro/src/components/layout/styles.ts diff --git a/apps/astro/src/components/team/MemberLoop.astro b/apps/astro/src/components/team/MemberLoop.astro new file mode 100644 index 0000000..60caab2 --- /dev/null +++ b/apps/astro/src/components/team/MemberLoop.astro @@ -0,0 +1,45 @@ +--- +import Avatar from '@packages/ui/components/avatar'; +import type { Person } from '@/lib/timeline'; +interface Props { + people: Person[]; + secondsPerPerson?: number; +} +const { people, secondsPerPerson = 3 } = Astro.props; +--- + +
    +
    + { + [false, true].map((hidden) => ( + + )) + } +
    +
    diff --git a/apps/astro/src/components/team/MilestoneCard.astro b/apps/astro/src/components/team/MilestoneCard.astro new file mode 100644 index 0000000..904a0f5 --- /dev/null +++ b/apps/astro/src/components/team/MilestoneCard.astro @@ -0,0 +1,60 @@ +--- +import ArrowUpRight from '@/components/icons/ArrowUpRight.astro'; +import BrandIcon from '@/components/common/BrandIcon.astro'; +import Badge from '@packages/ui/components/badge'; +import type { Milestone } from '@/lib/timeline'; +import SpotlightCard from './SpotlightCard.astro'; + +import PersonLink from './PersonLink.astro'; + +const { milestone } = Astro.props as { milestone: Milestone }; +--- + +
  • +
    +
    + {milestone.when}{ + milestone.tags && ( +
      + {milestone.tags.map((tag) => ( +
    • + + {tag} + +
    • + ))} +
    + ) + } +

    {milestone.title}

    + {milestone.description} +

    { + milestone.people && ( +
      + {milestone.people.map((person) => ( +
    • + +
    • + ))} +
    + ) + }{ + milestone.link && ( + + + {milestone.link.label} + + + ) + } +
    +
  • diff --git a/apps/astro/src/components/team/PersonLink.astro b/apps/astro/src/components/team/PersonLink.astro new file mode 100644 index 0000000..262608a --- /dev/null +++ b/apps/astro/src/components/team/PersonLink.astro @@ -0,0 +1,25 @@ +--- +import Avatar from '@packages/ui/components/avatar'; +import type { Person } from '@/lib/timeline'; +interface Props { + person: Person; +} +const { person } = Astro.props; +const Tag = person.href ? 'a' : 'span'; +const external = person.href?.startsWith('http'); +--- + + + { + person.name + }{ + person.role && ( + {person.role} + ) + } + diff --git a/apps/astro/src/components/team/SpotlightCard.astro b/apps/astro/src/components/team/SpotlightCard.astro new file mode 100644 index 0000000..996335d --- /dev/null +++ b/apps/astro/src/components/team/SpotlightCard.astro @@ -0,0 +1,33 @@ +--- +import { cn } from '@packages/ui/lib/utils'; +interface Props { + className?: string; +} +--- + +
    + +
    +
    + diff --git a/apps/astro/src/components/team/Timeline.astro b/apps/astro/src/components/team/Timeline.astro new file mode 100644 index 0000000..4f9cbea --- /dev/null +++ b/apps/astro/src/components/team/Timeline.astro @@ -0,0 +1,22 @@ +--- +import type { TimelineYear } from '@/lib/timeline'; + +import TimelineScroll from './TimelineScroll.astro'; + +import YearRow from './YearRow.astro'; +const { data } = Astro.props as { data: TimelineYear[] }; +--- + +
    +
      + {data.map((entry) => )} +
    +
    diff --git a/apps/nextjs/src/components/team/TimelineScroll.tsx b/apps/astro/src/components/team/TimelineScroll.astro similarity index 61% rename from apps/nextjs/src/components/team/TimelineScroll.tsx rename to apps/astro/src/components/team/TimelineScroll.astro index 6a7e7a8..635f3ca 100644 --- a/apps/nextjs/src/components/team/TimelineScroll.tsx +++ b/apps/astro/src/components/team/TimelineScroll.astro @@ -1,20 +1,11 @@ -'use client'; - -import { useEffect, useRef } from 'react'; - -const clamp = (value: number) => Math.min(1, Math.max(0, value)); - -const TimelineScroll = () => { - const ref = useRef(null); - - useEffect(() => { - const timeline = ref.current?.closest('.timeline'); + diff --git a/apps/astro/src/components/team/YearRow.astro b/apps/astro/src/components/team/YearRow.astro new file mode 100644 index 0000000..afeb308 --- /dev/null +++ b/apps/astro/src/components/team/YearRow.astro @@ -0,0 +1,35 @@ +--- +import type { TimelineYear } from '@/lib/timeline'; + +import MilestoneCard from './MilestoneCard.astro'; + +const { entry } = Astro.props as { entry: TimelineYear }; +--- + +
  • +
    + +
    +

    + {entry.year} +

      + { + entry.milestones.map((milestone) => ( + + )) + } +
    +
    +
  • diff --git a/apps/astro/src/content.config.ts b/apps/astro/src/content.config.ts new file mode 100644 index 0000000..9476233 --- /dev/null +++ b/apps/astro/src/content.config.ts @@ -0,0 +1,18 @@ +import { defineCollection } from 'astro:content'; +import { glob } from 'astro/loaders'; +import { postSchema, authorSchema } from './lib/content/frontmatter'; +import { slug } from './lib/content/schema'; +export const collections = { + posts: defineCollection({ + loader: glob({ pattern: '*.md', base: './content/posts' }), + schema: postSchema, + }), + authors: defineCollection({ + loader: glob({ + pattern: '*.md', + base: './content/authors', + generateId: ({ entry }) => slug.parse(entry.replace(/\.md$/, '')), + }), + schema: authorSchema, + }), +}; diff --git a/apps/astro/src/env.d.ts b/apps/astro/src/env.d.ts new file mode 100644 index 0000000..c7b17fa --- /dev/null +++ b/apps/astro/src/env.d.ts @@ -0,0 +1,6 @@ +/// + +declare module '*?inline' { + const asset: string; + export default asset; +} diff --git a/apps/astro/src/layouts/SiteLayout.astro b/apps/astro/src/layouts/SiteLayout.astro new file mode 100644 index 0000000..814edc9 --- /dev/null +++ b/apps/astro/src/layouts/SiteLayout.astro @@ -0,0 +1,114 @@ +--- +import Analytics from '@vercel/analytics/astro'; +import SpeedInsights from '@vercel/speed-insights/astro'; +import Header from '@/components/layout/Header.astro'; +import Footer from '@/components/layout/Footer.astro'; +import { absoluteUrl, feedPath, type PageMetadata } from '@/lib/seo'; +import { siteDescription, siteName } from '@/lib/site'; +import { themeScript } from '@/lib/theme'; +import '@/styles/globals.css'; +interface Props { + metadata?: PageMetadata; +} +const { metadata = { path: Astro.url.pathname } } = Astro.props; +const title = metadata.title ? `${metadata.title} | ${siteName}` : siteName; +const description = metadata.description ?? siteDescription; +const image = absoluteUrl(metadata.image ?? '/opengraph-image'); +--- + + + + + + + diff --git a/packages/ui/src/components/avatar.tsx b/packages/ui/src/components/avatar.tsx deleted file mode 100644 index f6572fc..0000000 --- a/packages/ui/src/components/avatar.tsx +++ /dev/null @@ -1,108 +0,0 @@ -'use client'; - -import * as React from 'react'; -import { Avatar as AvatarPrimitive } from '@base-ui/react/avatar'; -import { cn } from '@packages/ui/lib/utils'; - -function Avatar({ - className, - size = 'default', - ...props -}: AvatarPrimitive.Root.Props & { - size?: 'default' | 'sm' | 'lg'; -}) { - return ( - - ); -} - -function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) { - return ( - - ); -} - -function AvatarFallback({ - className, - ...props -}: AvatarPrimitive.Fallback.Props) { - return ( - - ); -} - -function AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) { - return ( - svg]:hidden', - 'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2', - 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2', - className - )} - {...props} - /> - ); -} - -function AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) { - return ( -
    - ); -} - -function AvatarGroupCount({ - className, - ...props -}: React.ComponentProps<'div'>) { - return ( -
    svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3', - className - )} - {...props} - /> - ); -} - -export { - Avatar, - AvatarImage, - AvatarFallback, - AvatarGroup, - AvatarGroupCount, - AvatarBadge, -}; diff --git a/packages/ui/src/components/badge.astro b/packages/ui/src/components/badge.astro new file mode 100644 index 0000000..6501dfd --- /dev/null +++ b/packages/ui/src/components/badge.astro @@ -0,0 +1,19 @@ +--- +import { cn } from '../lib/utils'; +interface Props { + variant?: 'outline' | 'default'; + className?: string; +} +const { variant = 'default', className } = Astro.props; +--- + + diff --git a/packages/ui/src/components/badge.tsx b/packages/ui/src/components/badge.tsx deleted file mode 100644 index 1c5137f..0000000 --- a/packages/ui/src/components/badge.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { mergeProps } from '@base-ui/react/merge-props'; -import { useRender } from '@base-ui/react/use-render'; -import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@packages/ui/lib/utils'; - -const badgeVariants = cva( - 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!', - { - variants: { - variant: { - default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80', - secondary: - 'bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80', - destructive: - 'bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20', - outline: - 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground', - ghost: - 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50', - link: 'text-primary underline-offset-4 hover:underline', - }, - }, - defaultVariants: { - variant: 'default', - }, - } -); - -function Badge({ - className, - variant = 'default', - render, - ...props -}: useRender.ComponentProps<'span'> & VariantProps) { - return useRender({ - defaultTagName: 'span', - props: mergeProps<'span'>( - { - className: cn(badgeVariants({ variant }), className), - }, - props - ), - render, - state: { - slot: 'badge', - variant, - }, - }); -} - -export { Badge, badgeVariants }; diff --git a/packages/ui/src/components/button.tsx b/packages/ui/src/components/button.tsx deleted file mode 100644 index a530b76..0000000 --- a/packages/ui/src/components/button.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Button as ButtonPrimitive } from '@base-ui/react/button'; -import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@packages/ui/lib/utils'; - -const buttonVariants = cva( - "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", - { - variants: { - variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/80', - outline: - 'border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50', - secondary: - 'bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground', - ghost: - 'hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50', - destructive: - 'bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40', - link: 'text-primary underline-offset-4 hover:underline', - }, - size: { - default: - 'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2', - xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", - sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5", - lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2', - icon: 'size-8', - 'icon-xs': - "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3", - 'icon-sm': - 'size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg', - 'icon-lg': 'size-9', - }, - }, - defaultVariants: { - variant: 'default', - size: 'default', - }, - } -); - -function Button({ - className, - variant = 'default', - size = 'default', - ...props -}: ButtonPrimitive.Props & VariantProps) { - return ( - - ); -} - -export { Button, buttonVariants }; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 5309f40..8f191ed 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tooling/typescript/react", - "include": ["**/*.ts", "**/*.tsx"], + "extends": "astro/tsconfigs/strict", + "include": ["**/*.ts", "**/*.astro"], "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2755b81..9ff85af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,12 +6,6 @@ settings: catalogs: default: - '@base-ui/react': - specifier: ^1.8.0 - version: 1.8.0 - '@next/env': - specifier: ^16.4.0 - version: 16.4.0 '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 @@ -30,33 +24,21 @@ catalogs: eslint: specifier: ^9.39.0 version: 9.39.5 - eslint-config-next: - specifier: ^16.4.0 - version: 16.4.0 - next: - specifier: ^16.4.0 - version: 16.4.0 postcss: specifier: ^8.4.14 version: 8.5.29 prettier: - specifier: ^2.8.3 - version: 2.8.8 + specifier: ^3.9.9 + version: 3.9.9 prettier-plugin-tailwindcss: - specifier: ^0.2.1 - version: 0.2.8 + specifier: ^0.7.4 + version: 0.7.4 react: specifier: ^19.3.0 version: 19.3.0 react-dom: specifier: ^19.3.0 version: 19.3.0 - server-only: - specifier: ^0.0.1 - version: 0.0.1 - shadcn: - specifier: ^4.21.4 - version: 4.21.4 tailwindcss: specifier: ^4.0.0 version: 4.3.3 @@ -77,33 +59,27 @@ importers: '@tooling/prettier': specifier: workspace:* version: link:tooling/prettier - next: - specifier: 'catalog:' - version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) prettier: specifier: 'catalog:' - version: 2.8.8 + version: 3.9.9 turbo: specifier: ^2.5.0 version: 2.11.9 - apps/nextjs: - dependencies: - '@base-ui/react': - specifier: 'catalog:' - version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + apps/astro: + dependencies: + '@astrojs/markdown-remark': + specifier: ^7.3.3 + version: 7.3.3 + '@astrojs/node': + specifier: ^11.1.9 + version: 11.1.9(astro@7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@astrojs/vercel': + specifier: ^11.0.16 + version: 11.0.16(astro@7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(ws@8.21.3) '@fontsource-variable/cascadia-code': specifier: ^5.3.0 version: 5.3.0 - '@mdx-js/loader': - specifier: ^3.1.1 - version: 3.1.1 - '@mdx-js/react': - specifier: ^3.1.1 - version: 3.1.1(@types/react@19.3.0)(react@19.3.0) - '@next/mdx': - specifier: ^16.4.0 - version: 16.4.0(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.3.0)(react@19.3.0)) '@packages/auth': specifier: workspace:* version: link:../../packages/auth @@ -119,72 +95,45 @@ importers: '@packages/ui': specifier: workspace:* version: link:../../packages/ui - '@types/mdx': - specifier: ^2.0.14 - version: 2.0.14 + '@resvg/resvg-js': + specifier: ^2.6.2 + version: 2.6.2 '@vercel/analytics': specifier: ^2.0.1 - version: 2.0.1(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) + version: 2.0.1(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@vercel/speed-insights': specifier: ^2.0.0 - version: 2.0.0(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) + version: 2.0.0(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) + astro: + specifier: ^7.4.1 + version: 7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) github-slugger: specifier: 2.0.0 version: 2.0.0 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - lucide-react: - specifier: ^1.52.0 - version: 1.52.0(@types/react@19.3.0)(react@19.3.0) maplibre-gl: specifier: ^6.13.0 version: 6.13.0 mdast-util-to-string: specifier: ^4.0.0 version: 4.0.0 - next: - specifier: 'catalog:' - version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - react: - specifier: 'catalog:' - version: 19.3.0 - react-dom: - specifier: 'catalog:' - version: 19.3.0(react@19.3.0) - react-markdown: - specifier: ^10.1.0 - version: 10.1.0(@types/react@19.3.0)(react@19.3.0) - rehype-expressive-code: - specifier: ^0.44.2 - version: 0.44.2 - rehype-external-links: - specifier: ^3.0.0 - version: 3.0.0 - rehype-katex: - specifier: ^7.0.1 - version: 7.0.1 rehype-slug: specifier: ^6.0.0 version: 6.0.0 - remark-emoji: - specifier: ^5.0.2 - version: 5.0.2 remark-gfm: specifier: ^4.0.1 version: 4.0.1 - remark-math: - specifier: ^6.0.0 - version: 6.0.0 remark-parse: specifier: ^11.0.0 version: 11.0.0 resend: specifier: ^6.32.1 version: 6.32.1(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) - server-only: - specifier: 'catalog:' - version: 0.0.1 + satori: + specifier: ^0.32.0 + version: 0.32.0 + satori-html: + specifier: ^0.3.2 + version: 0.3.2 unified: specifier: ^11.0.5 version: 11.0.5 @@ -195,6 +144,9 @@ importers: specifier: 'catalog:' version: 4.6.5 devDependencies: + '@astrojs/check': + specifier: ^0.9.11 + version: 0.9.11(@emnapi/runtime@1.11.3)(prettier-plugin-astro@0.14.1)(prettier@3.9.9)(typescript@6.0.3) '@tooling/eslint': specifier: workspace:* version: link:../../tooling/eslint @@ -210,21 +162,15 @@ importers: '@types/node': specifier: 'catalog:' version: 26.6.4 - '@types/react': - specifier: 'catalog:' - version: 19.3.0 - '@types/react-dom': - specifier: 'catalog:' - version: 19.3.0(@types/react@19.3.0) eslint: specifier: 'catalog:' version: 9.39.5(jiti@2.7.0) postcss: specifier: 'catalog:' version: 8.5.29 - shadcn: - specifier: 'catalog:' - version: 4.21.4 + tsx: + specifier: ^4.20.0 + version: 4.23.15 typescript: specifier: 'catalog:' version: 6.0.3 @@ -239,7 +185,7 @@ importers: version: link:../db better-auth: specifier: ^1.7.7 - version: 1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@tooling/eslint': specifier: workspace:* @@ -333,12 +279,15 @@ importers: packages/env: dependencies: - '@next/env': - specifier: 'catalog:' - version: 16.4.0 - '@t3-oss/env-nextjs': + '@t3-oss/env-core': specifier: ^0.13.11 version: 0.13.11(typescript@6.0.3)(zod@4.6.5) + dotenv: + specifier: ^17.0.0 + version: 17.4.2 + dotenv-expand: + specifier: ^12.0.0 + version: 12.0.3 zod: specifier: 'catalog:' version: 4.6.5 @@ -361,16 +310,13 @@ importers: packages/ui: dependencies: - '@base-ui/react': - specifier: 'catalog:' - version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 cn: specifier: ^0.4.0 version: 0.4.0 devDependencies: + '@astrojs/check': + specifier: ^0.9.11 + version: 0.9.11(@emnapi/runtime@1.11.3)(prettier-plugin-astro@0.14.1)(prettier@3.9.9)(typescript@6.0.3) '@tooling/eslint': specifier: workspace:* version: link:../../tooling/eslint @@ -383,48 +329,51 @@ importers: '@types/node': specifier: 'catalog:' version: 26.6.4 - '@types/react': - specifier: 'catalog:' - version: 19.3.0 - '@types/react-dom': - specifier: 'catalog:' - version: 19.3.0(@types/react@19.3.0) + astro: + specifier: ^7.4.1 + version: 7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) eslint: specifier: 'catalog:' version: 9.39.5(jiti@2.7.0) - react: - specifier: 'catalog:' - version: 19.3.0 - react-dom: - specifier: 'catalog:' - version: 19.3.0(react@19.3.0) - shadcn: - specifier: 'catalog:' - version: 4.21.4 typescript: specifier: 'catalog:' version: 6.0.3 tooling/eslint: dependencies: + '@eslint/js': + specifier: ^9.39.0 + version: 9.39.5 eslint: specifier: 'catalog:' version: 9.39.5(jiti@2.7.0) - eslint-config-next: - specifier: 'catalog:' - version: 16.4.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) - next: - specifier: 'catalog:' - version: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + eslint-plugin-astro: + specifier: ^2.0.0 + version: 2.1.1(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-react: + specifier: ^7.37.0 + version: 7.37.5(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-react-hooks: + specifier: ^7.0.0 + version: 7.1.1(eslint@9.39.5(jiti@2.7.0)) + globals: + specifier: ^16.0.0 + version: 16.4.0 + typescript-eslint: + specifier: ^8.0.0 + version: 8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) tooling/prettier: dependencies: prettier: specifier: 'catalog:' - version: 2.8.8 + version: 3.9.9 + prettier-plugin-astro: + specifier: ^0.14.0 + version: 0.14.1 prettier-plugin-tailwindcss: specifier: 'catalog:' - version: 0.2.8(prettier@2.8.8) + version: 0.7.4(prettier-plugin-astro@0.14.1)(prettier@3.9.9) devDependencies: '@tooling/eslint': specifier: workspace:* @@ -441,9 +390,6 @@ importers: postcss: specifier: 'catalog:' version: 8.5.29 - shadcn: - specifier: 'catalog:' - version: 4.21.4 tailwindcss: specifier: 'catalog:' version: 4.3.3 @@ -470,6 +416,135 @@ packages: resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==} engines: {node: '>=10'} + '@astrojs/astro2tsx@0.1.3': + resolution: {integrity: sha512-GMDC7Eo0myBUA/QLBl0u+OcegJ8LiBhccmNZR34KmprQNP8gQUJlWlOOZWUsxNA2rNS6GuPYcGDyLoPnjmn4/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/check@0.9.11': + resolution: {integrity: sha512-TcDC2KT3t0XHFv/geBsA02/HuVXuzLwAfAzLPG2FvBW/DL3tzxu2voVaqcKSN56dN2DNlYC/3FKrmxrDs6actg==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + + '@astrojs/compiler-binding-android-arm64@0.5.2': + resolution: {integrity: sha512-kckIxon6Rm/Bxzh9mGPYpRRqUbToUQoHptCmpMmE+Yt0Xumq8CqrKUidyYhrBsrHVO7bxuRzzWUUqvpf+iYceQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@astrojs/compiler-binding-darwin-arm64@0.5.2': + resolution: {integrity: sha512-1ZG5Ar3dD8HtodX9XH1mRmE0qBXZlvjYXSFfpgFwocqfWnvhFuqtGUNseL8wgfImiRMztIjpQqlogQFQQtgiag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@astrojs/compiler-binding-darwin-x64@0.5.2': + resolution: {integrity: sha512-+kl35S7hiHJ2cb7eujwEsPFYYuSgE11uEE2Z20lAJ+undpgulMcW+weQqFPOSSZccEKHOiLIY+kQHkb4e4092w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2': + resolution: {integrity: sha512-BqlR0EHNQLPLwgL9+xogjsAc7zGf0cHho2CPdhv0P1yqbVMwGVaGAqrANP6VYAXCqSC43AF4Czcxc2n+oqdesg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.2': + resolution: {integrity: sha512-GRGyby3AZWw5d6JQzidyxPyvGgHWsSusrpgKyFVpDTKctABF7L3Pd5V1cRJbV36/rcu+Eh292/wL7pF7MkmGkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.2': + resolution: {integrity: sha512-9XAqGTMQAtIslMsjK3xdyY6OI9d59OZqcLBB6pvD/DcoR0daYswfrKx2azdDERDY4AqAnWPC7odVM1BmxYv3Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@astrojs/compiler-binding-linux-x64-musl@0.5.2': + resolution: {integrity: sha512-jOViewGeTh9bSfS8vK72ECxoy2yvmA+Pd/ZcEvBI5c7+7IcfHwZ5qA4L9fRYuOhSrAifvQ2dV4vm1XAtloaWBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@astrojs/compiler-binding-wasm32-wasi@0.5.2': + resolution: {integrity: sha512-Z7p64doar1uvR5C9Xs6j1CV9lGlPVQX7OQ2aAtZ/xKC5aGS6GB13nyc2UfQXTQLvZrvVwsyaflTQy6ziY5Bekw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': + resolution: {integrity: sha512-Tr13bh+ahTWsjXjzctK7pFpWV+dUU4FtBfETlR7gO+ueex0F+RDch7eRr0YfKysaRhk9tWm14lsCJ5uWyFPNHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.2': + resolution: {integrity: sha512-SfKkI+jOQYLh6wojPvVPV0lFfQnxisweN9B+qCzRvZp7DHAuGif8Y0WcC5PUgN4jb8VKy57LggQDtggR46Du1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@astrojs/compiler-binding@0.5.2': + resolution: {integrity: sha512-lEn76+0JcMQ5RDXU0wSMWJg2ZppiZvSULpghC29cfv4o9bhvWFDbQjsCtvjjXN9iVLFQ7fL3wTR2L2UU13mP8g==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/compiler-rs@0.5.2': + resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==} + engines: {node: '>=22.12.0'} + + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + + '@astrojs/compiler@4.0.0': + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} + + '@astrojs/internal-helpers@0.13.0': + resolution: {integrity: sha512-20jxQqnSmpskcGyad7N5l6Xf1gz0UCa6lNde44bEBdaXGpncEYfAZJ142r2ZgzBaG4dUyzGmhqZWv1INU2eiHQ==} + + '@astrojs/language-server@2.17.2': + resolution: {integrity: sha512-WzqCBYo0RtKrkPLPMnTz2+UOQPosaFhoG/PvoSyPIgBU0BKeS6qeaYv7Rscq7P1LxJdoN0VosQF2h2TZTsIGHg==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@7.3.3': + resolution: {integrity: sha512-yC7XCJtRztiR3GiP8e0WwUAGJeKm5goMDDzcZykfbOOpQUDztBWG66fBeIOfl1uVxvhdI0iLzkeaHgqPhaRfUg==} + + '@astrojs/markdown-satteri@0.4.4': + resolution: {integrity: sha512-Byhe9CAiGFJrhMACKpgN/FPf4lcwapqwFQAB7E1sPELTEJINfBIpgnEYOBTXzr//fvSSNhfp/X3AqN4mUV9p+A==} + + '@astrojs/node@11.1.9': + resolution: {integrity: sha512-fmWwCINRIf0gyFZlOlYaJGZnoeB5JJAXJvUXlHorhhemOxkftrOcMalwPIyNG2Q3KhncRvYMiJ8nGHsWrdtrpg==} + peerDependencies: + astro: ^7.2.1 + + '@astrojs/prism@4.1.0': + resolution: {integrity: sha512-zvRaL3MKTAXWfVQrHAlYtocRZWXBM6ruF3Bl7Lc7QgFHLRTfwMKo33KczlkvkXDY+qcytKhAWOT9dwUUYLUxAw==} + engines: {node: '>=22.22.0'} + + '@astrojs/telemetry@3.4.0': + resolution: {integrity: sha512-Qt2T6RGtYacyV8OZU3IcyFbsp69s6qIcnWvQvn7/p9MKebPCpEswP5Ji4RhifG3DfeBX7e07Pjj5smkd+Tfp7Q==} + engines: {node: '>=22.22.0'} + + '@astrojs/vercel@11.0.16': + resolution: {integrity: sha512-hqDyOlTkyoU8ib4EpNfDYmSN1NrBDKuEjLi6CUtUsMsb4NmvF+KrJaKH9/+VHaNNV7qpPpyuwSZGhk8GxUndig==} + peerDependencies: + astro: ^7.0.0 + + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -486,28 +561,14 @@ packages: resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.29.7': - resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.7': - resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.29.7': - resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} @@ -518,24 +579,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.29.7': - resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.29.7': - resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -562,40 +605,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.29.7': - resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.29.7': - resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.29.7': - resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.29.9': - resolution: {integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.29.7': - resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.29.10': - resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} - engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -612,33 +621,6 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - '@base-ui/react@1.8.0': - resolution: {integrity: sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@date-fns/tz': ^1.2.0 - '@types/react': ^17 || ^18 || ^19 - date-fns: ^4.0.0 - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - peerDependenciesMeta: - '@date-fns/tz': - optional: true - '@types/react': - optional: true - date-fns: - optional: true - - '@base-ui/utils@0.4.0': - resolution: {integrity: sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw==} - peerDependencies: - '@types/react': ^17 || ^18 || ^19 - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - peerDependenciesMeta: - '@types/react': - optional: true - '@better-auth/core@1.7.7': resolution: {integrity: sha512-srgFzHEjB2WWlokFz1i4BfG41sNhsA105Pukgqu6RrEh5A+LSkzf1mCHydVipkjt9l5qswtBMi7IL6ouHbZL4Q==} peerDependencies: @@ -718,31 +700,108 @@ packages: '@better-fetch/fetch@1.3.2': resolution: {integrity: sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==} - '@ctrl/tinycolor@4.2.1': - resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==} - engines: {node: '>=14'} + '@bruits/satteri-darwin-arm64@0.10.5': + resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + cpu: [arm64] + os: [darwin] - '@dotenvx/dotenvx@1.75.1': - resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} - hasBin: true + '@bruits/satteri-darwin-x64@0.10.5': + resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + cpu: [x64] + os: [darwin] + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-arm64-musl@0.10.5': + resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@bruits/satteri-linux-x64-gnu@0.10.5': + resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-x64-musl@0.10.5': + resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@bruits/satteri-wasm32-wasi@0.10.5': + resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + cpu: [arm64] + os: [win32] + + '@bruits/satteri-win32-x64-msvc@0.10.5': + resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@4.0.1': + resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} + engines: {node: '>=18'} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} - '@dotenvx/primitives@0.8.0': - resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -1202,12 +1261,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@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} @@ -1240,42 +1293,9 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@expressive-code/core@0.44.2': - resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==} - - '@expressive-code/plugin-frames@0.44.2': - resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==} - - '@expressive-code/plugin-shiki@0.44.2': - resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==} - - '@expressive-code/plugin-text-markers@0.44.2': - resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==} - - '@floating-ui/core@1.8.0': - resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - - '@floating-ui/dom@1.8.0': - resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - - '@floating-ui/react-dom@2.1.9': - resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.12': - resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@fontsource-variable/cascadia-code@5.3.0': resolution: {integrity: sha512-6I6M029Lum62MGmP0o+rXRrIBiIiptNDC4slPKLPUJiSB7NHZTLb+Ihk9G7jLvUfWziGXHJLjJPJLBzlEPjS1g==} - '@hono/node-server@2.1.3': - resolution: {integrity: sha512-TA//nWMqPhbfdfneACk6t5a9eqbS9lABEPyKn0/xZTah3H3U2XaVg85rJFl0/Fyit0I552YDHgXGVSf3GwqbUw==} - engines: {node: '>=20'} - peerDependencies: - hono: ^4 - '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -1458,6 +1478,10 @@ packages: cpu: [x64] os: [win32] + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1478,6 +1502,11 @@ packages: resolution: {integrity: sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==} engines: {node: '>= 22'} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@mapbox/point-geometry@1.1.0': resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} @@ -1503,32 +1532,15 @@ packages: '@maplibre/vt-pbf@4.3.2': resolution: {integrity: sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==} - '@mdx-js/loader@3.1.1': - resolution: {integrity: sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==} - peerDependencies: - webpack: '>=5' - peerDependenciesMeta: - webpack: - optional: true - '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mdx-js/react@3.1.1': - resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - - '@modelcontextprotocol/sdk@1.32.1': - resolution: {integrity: sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==} - engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@napi-rs/wasm-runtime@1.2.5': resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} @@ -1544,47 +1556,18 @@ packages: '@next/env@16.3.3': resolution: {integrity: sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==} - '@next/env@16.4.0': - resolution: {integrity: sha512-pyLlT5oafGlX8X7xjgGNXz5dNIDSxREm+qD6i9VLSZiZFopA/XWl8NM/KPmLx/8EG/++c49iid3gNWSQW1+2dQ==} - - '@next/eslint-plugin-next@16.4.0': - resolution: {integrity: sha512-ffeflB/dL8RrvWejQximw01pOpKHN692Y3FjDB82DCd0YVvXvBD6vY7mcZp27yvSVFVM6wA73xVodEKF4spizA==} - - '@next/mdx@16.4.0': - resolution: {integrity: sha512-qKI9HvbqwSo1F8ebVsia0meLm2iu/DxaB1ynWNKRn4bny0xjQJBGixzEdJ9wsPqCwPcG4Qn4z5Rai1Pee/AQFQ==} - peerDependencies: - '@mdx-js/loader': '>=0.15.0' - '@mdx-js/react': '>=0.15.0' - peerDependenciesMeta: - '@mdx-js/loader': - optional: true - '@mdx-js/react': - optional: true - '@next/swc-darwin-arm64@16.3.3': resolution: {integrity: sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.4.0': - resolution: {integrity: sha512-yyZ+9MgViAKLLb5l1gPBGjRwnq3teNLb5Zx6JEw8LzNSTjlsnp+baUHFxTgl7PpjCmKf48VQfyipG1eBflb48Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-x64@16.3.3': resolution: {integrity: sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.4.0': - resolution: {integrity: sha512-RePEEejEj1Auf5s9qEcG0JbcDP3ceNUS/ofNX8AhxzgIjTVlZIHMatlp16YplcSMpsVo/ZMQHJTjbMYJznjGUg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-linux-arm64-gnu@16.3.3': resolution: {integrity: sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==} engines: {node: '>= 10'} @@ -1592,13 +1575,6 @@ packages: os: [linux] libc: [glibc] - '@next/swc-linux-arm64-gnu@16.4.0': - resolution: {integrity: sha512-HhsyCqd+NpmvDDVY/LqkAN24f+QVvXh3ie+PfcwKinWL2Mu826JymQxJXGjAIfmJ4VlHjp4Pe/nZtXtUoEMAqw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@next/swc-linux-arm64-musl@16.3.3': resolution: {integrity: sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==} engines: {node: '>= 10'} @@ -1606,13 +1582,6 @@ packages: os: [linux] libc: [musl] - '@next/swc-linux-arm64-musl@16.4.0': - resolution: {integrity: sha512-sN9Pf+Zh+RpZAOmbR7d8KAA8T61CVhawtbEJ2Bk6QrRzx6Z/6haaF4UiwBzytM96GRRRWZh9/WALIEO3npMamA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@next/swc-linux-x64-gnu@16.3.3': resolution: {integrity: sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==} engines: {node: '>= 10'} @@ -1620,22 +1589,8 @@ packages: os: [linux] libc: [glibc] - '@next/swc-linux-x64-gnu@16.4.0': - resolution: {integrity: sha512-D5M5xLWQVd1CvR+L7BickM1weRfmM41x3L1NWcnKY/oyJJqr1qwaCgmu3dMAhLBOMdZwSuDCRV6DJRRpiUkbDQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@next/swc-linux-x64-musl@16.3.3': - resolution: {integrity: sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@next/swc-linux-x64-musl@16.4.0': - resolution: {integrity: sha512-8d5WLS6a9YalqpOgXdlbvonFu+sIgjA+CO6tGzetrpPVcUL56foa7B7664h41rAlbLi5fJwK4vWji3zf4QDy+w==} + '@next/swc-linux-x64-musl@16.3.3': + resolution: {integrity: sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1647,24 +1602,12 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.4.0': - resolution: {integrity: sha512-sQuOIiW3snb48UwrBcDMvFA/u03qtw2LeuSIxFIQ9AJuW9UG/4Ddsfo+eV73PnZwBhyncMtsKVh7PrzMol2/fA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-x64-msvc@16.3.3': resolution: {integrity: sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.4.0': - resolution: {integrity: sha512-6/33lCuxpdHUy27RegyGM/5uTpF7YZd3UR4D0gpkOA/tWY5YR7msbQjqPgCZmSmxrrTLGCXYA4A8vT2H5DPGTQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@noble/ciphers@2.4.0': resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} engines: {node: '>= 20.19.0'} @@ -1673,26 +1616,20 @@ packages: resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} engines: {node: '>= 20.19.0'} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@opentelemetry/semantic-conventions@1.43.0': resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} + + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + '@react-email/render@2.1.0': resolution: {integrity: sha512-F+zE3O6d6sW6Aj2UjvZAA17R7tJKM7kcq2mgV6k4HCT8jeLLFaVP2txMtH1lgqYFRMZ0Gxsd37q2PRyiXLXXxA==} engines: {node: '>=20.0.0'} @@ -1703,19 +1640,197 @@ packages: '@react-email/ui@6.11.1': resolution: {integrity: sha512-Toy+g7u+9USdFV3YKIUEK66c356+/LDumDnpz7eVdjgCC3TCDb/v6WcfTSoU+RSHRkpUQjl7B9MOtQ/dgj5yYQ==} - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@resvg/resvg-js-android-arm64@2.6.2': + resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@resvg/resvg-js-darwin-arm64@2.6.2': + resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@resvg/resvg-js-darwin-x64@2.6.2': + resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@resvg/resvg-js@2.6.2': + resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} + engines: {node: '>= 10'} + + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@shadcn/registry@0.1.3': - resolution: {integrity: sha512-82/OmKAVM9pChDHFVAsDP9PcimPGSKZGdbcdwdGGGcSI69ImpN4ZnqsfZ4hkOFEMal92t3y9djYJHMjO4PcVZA==} - engines: {node: '>=20.18.1'} - '@shikijs/core@4.5.0': resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} engines: {node: '>=20'} @@ -1747,13 +1862,10 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -1784,23 +1896,6 @@ packages: zod: optional: true - '@t3-oss/env-nextjs@0.13.11': - resolution: {integrity: sha512-NC+3j7YWgpzdFu1t5y/8wqibTK0lm5RS4bjXA1n8uwik3wIR4iZM4Fa+U2BaMa5k3Qk8RZiYhoAIX0WogmGkzg==} - peerDependencies: - arktype: ^2.1.0 - typescript: '>=5.0.0' - valibot: ^1.0.0-beta.7 || ^1.0.0 - zod: ^3.24.0 || ^4.0.0 - peerDependenciesMeta: - arktype: - optional: true - typescript: - optional: true - valibot: - optional: true - zod: - optional: true - '@tailwindcss/node@4.3.3': resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} @@ -1893,9 +1988,6 @@ packages: '@tailwindcss/postcss@4.3.3': resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} - '@ts-morph/common@0.27.0': - resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - '@turbo/darwin-64@2.11.9': resolution: {integrity: sha512-OkW+EESJjo248CThWe9DfuUqzGcRwHe1DXKWRw9DSZ0lMkocKbbwNMjWVCiO+WNBcARDM0ibu0c9SbuIe4mw6w==} cpu: [x64] @@ -1935,6 +2027,9 @@ packages: '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1950,12 +2045,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/katex@0.16.8': - resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1965,6 +2054,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@26.6.4': resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==} @@ -1982,9 +2074,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/validate-npm-package-name@4.0.2': - resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@types/ws@8.18.2': resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==} @@ -2050,126 +2139,6 @@ packages: '@ungap/structured-clone@1.4.0': resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} - '@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] - '@vercel/analytics@2.0.1': resolution: {integrity: sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==} peerDependencies: @@ -2199,6 +2168,37 @@ packages: vue-router: optional: true + '@vercel/cli-config@0.3.1': + resolution: {integrity: sha512-sISbygqlFXYb8qfPu/+2Cf/A8IjrlAuZePdag3EDQr2PRA455s7UZtl9Ro674CWsB/saBRmz3jEkw0YsQs8OoQ==} + + '@vercel/cli-exec@1.0.1': + resolution: {integrity: sha512-g9XerViJ/paZujufXYcu5XYI2vU2rtB4sgdpjUHde5RnOkdmpu0ngH46LCFGHoPXO/C+qDPSczIHIRN+8Q2YKQ==} + engines: {node: '>= 18'} + + '@vercel/functions@3.10.1': + resolution: {integrity: sha512-Ca7peSyID6CW5a9Pyu6rDK2AC3n9hyJD0aTBuO74x9eL50Z+rgXIR0H0umI6j0gb9NMG7jvrx7DUhMGuuOFxsg==} + engines: {node: '>= 20'} + peerDependencies: + '@aws-sdk/credential-provider-web-identity': '*' + ws: '>=8' + peerDependenciesMeta: + '@aws-sdk/credential-provider-web-identity': + optional: true + ws: + optional: true + + '@vercel/nft@1.11.0': + resolution: {integrity: sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==} + engines: {node: '>=20'} + hasBin: true + + '@vercel/oidc@4.0.1': + resolution: {integrity: sha512-l//xMmDTj2WR6EMtfA2BEF2oR7ViKCD1SCxqFKCn1/8wOZBxgxhxkegSGi90ICTc1rB50ZbKuPIslc8aJxAqew==} + engines: {node: '>= 20'} + + '@vercel/routing-utils@6.6.0': + resolution: {integrity: sha512-Z74zwk1ixcIsMN7Sp788SsZuOEqmJZ4N36WHusr6Vtck5eFAcjyD4oBpjDYRhkxovsh8t13s0L+uVbJYxUPa5w==} + '@vercel/speed-insights@2.0.0': resolution: {integrity: sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w==} peerDependencies: @@ -2225,13 +2225,44 @@ packages: vue-router: optional: true + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -2243,10 +2274,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: - ajv: ^8.0.0 + ajv: ^8.5.0 peerDependenciesMeta: ajv: optional: true @@ -2259,19 +2294,20 @@ packages: ajv: optional: true + ajv-i18n@4.2.0: + resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} + peerDependencies: + ajv: ^8.0.0-beta.0 + ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + am-i-vibing@0.5.0: + resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==} + hasBin: true ansi-regex@6.4.0: resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} @@ -2281,8 +2317,13 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2299,14 +2340,13 @@ packages: resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==} engines: {node: '>= 0.4'} + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + 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'} @@ -2323,24 +2363,36 @@ packages: 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==} - - ast-types@0.16.3: - resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} - engines: {node: '>=4'} - astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + astro-eslint-parser@2.1.0: + resolution: {integrity: sha512-poUfd66bOTY59rQajtusj/+i6kaBc4pKXkBa2XHYjwBZyhWThS1sdlgxLrnmo7NQqLUpvhmEtkOONUBs9WIp9Q==} + engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0} + + astro@7.4.1: + resolution: {integrity: sha512-mzWNEWSef1VQDgFku6Gp0v8Qx53NOkNlOIDQcX9ovxAZ1QXic6cks/FFo+gxPM9anXuat4X1FhB61KTk3XFvgg==} + engines: {node: '>=22.22.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + peerDependencies: + '@astrojs/markdown-remark': ^7.3.0 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + astrojs-compiler-sync@1.1.1: + resolution: {integrity: sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ==} + engines: {node: ^18.18.0 || >=20.9.0} + peerDependencies: + '@astrojs/compiler': '>=0.27.0' + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - atomically@1.7.0: - resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} - engines: {node: '>=10.12.0'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} @@ -2349,10 +2401,6 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.14.0: - resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==} - engines: {node: '>=4'} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -2367,14 +2415,15 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + baseline-browser-mapping@2.11.27: resolution: {integrity: sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ==} engines: {node: '>=6.0.0'} hasBin: true - bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - better-auth@1.7.7: resolution: {integrity: sha512-Zhgxi/c5ylmfB/sX+nwnBbsFf/j6k0L8DvL6CJXZSrXgxc5pPMC/e7j812zNd4L4B4ELmdURCPw3X8nAOUdcjw==} peerDependencies: @@ -2445,9 +2494,8 @@ packages: bidi-js@1.1.0: resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2459,10 +2507,6 @@ packages: resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - browserslist@4.29.3: resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2471,14 +2515,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bundle-name@4.1.1: - resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} - engines: {node: '>=18'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2495,6 +2531,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-lite@1.0.30001815: resolution: {integrity: sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q==} @@ -2505,14 +2544,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -2529,40 +2560,33 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - citty@0.2.2: - resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cn@0.2.6: - resolution: {integrity: sha512-+i4L0zUGgRcEnhsxueVrP7iBGxBx5iD0WOTYg1MwFEu2ZyCmH5Ov2V1cul2Ht5UchRQQgftCf4be/RxspuW6QQ==} - engines: {node: '>=20'} - hasBin: true - cn@0.4.0: resolution: {integrity: sha512-qOAeUhPwPzBxx6jaeQdo646XIKliKHc2j1ZF7Ngb1o0pJZKH5gq8FkA0aVdUdPFUDXNXyUCXpCtoJISo6dhizg==} engines: {node: '>=20'} hasBin: true - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -2584,48 +2608,35 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - conf@10.2.0: - resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} - engines: {node: '>=12'} - conf@15.1.0: resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} engines: {node: '>=20'} - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - content-type@2.1.0: - resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} - engines: {node: '>=18'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -2634,24 +2645,53 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-selector-parser@3.3.0: - resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-gradient-parser@0.0.17: + resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} + engines: {node: '>=16'} + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + 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'} @@ -2664,10 +2704,6 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - debounce-fn@4.0.0: - resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} - engines: {node: '>=10'} - debounce-fn@6.0.0: resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} engines: {node: '>=18'} @@ -2676,14 +2712,6 @@ packages: resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} engines: {node: '>=18'} - 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'} @@ -2696,14 +2724,6 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2711,26 +2731,10 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.1: - resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} - engines: {node: '>=18'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2746,21 +2750,24 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@6.0.3: + resolution: {integrity: sha512-3woMEITftG1wKeO/4d/QXH1DVKctTSZg3jNGPpjp9hNr5Hos8MCFF5McTML5ZtgKDObm2R591B0spRp2IVernA==} + engines: {node: '>=18'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} - direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} - hasBin: true - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2782,9 +2789,13 @@ packages: resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==} engines: {node: '>=20'} - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} @@ -2889,6 +2900,10 @@ packages: sqlite3: optional: true + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2900,19 +2915,17 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.5.449: - resolution: {integrity: sha512-dKeYk/3SFQz+nXi5whp3OuJzeWABEG4zCtkWJ9+Vby1E1iFM2y0gElRtQvNXRPJTsj8WAF4HMP7hvP790QtJ9g==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + resolution: {integrity: sha512-dKeYk/3SFQz+nXi5whp3OuJzeWABEG4zCtkWJ9+Vby1E1iFM2y0gElRtQvNXRPJTsj8WAF4HMP7hvP790QtJ9g==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} - emojilib@2.4.0: - resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + emoji-regex-xs@2.0.1: + resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} + engines: {node: '>=10.0.0'} - emoticon@4.1.0: - resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} @@ -2930,10 +2943,6 @@ packages: resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2942,9 +2951,9 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} + engines: {node: '>=20.19.0'} env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} @@ -2970,6 +2979,9 @@ packages: resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} + es-module-lexer@3.0.4: + resolution: {integrity: sha512-BldNY5mwkVu+cQ5Ymn3e6hB9Sx8XHx4ZevWbiUyZbfKxJxYO27Hf0wfzkxIaD5CAJMaGl3YspKELj0ff/7nCMA==} + es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} @@ -3022,68 +3034,19 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-next@16.4.0: - resolution: {integrity: sha512-2RHLYswzc+hNRktWAjIL6XAvwb1cKcjLawJ5KWywAxn/JivNHtG42ZigL1yobVXDqsimuuL2F9jcEcnHFzbppQ==} - peerDependencies: - eslint: '>=9.0.0' - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.10: - resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.14.0: - resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} - engines: {node: '>=4'} + eslint-plugin-astro@2.1.1: + resolution: {integrity: sha512-oZwtjIfBOxOJT09exeGLQWy5o8/ATxY8RSq0548VMd0q7FqIVxoA5a46fRjnVLrj3pd3aP3/zkrGTuYPPo+iSw==} + engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0} peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + '@typescript-eslint/parser': '>=8.61.0' + eslint: '>=10.0.0' + eslint-plugin-jsx-a11y: '>=6.10.2' 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': + eslint-plugin-jsx-a11y: 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@7.1.1: resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} engines: {node: '>=18'} @@ -3100,6 +3063,10 @@ packages: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + 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} @@ -3127,10 +3094,9 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} @@ -3162,6 +3128,9 @@ packages: estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -3173,53 +3142,19 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eventsource-parser@3.1.1: - resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - - express-rate-limit@8.7.1: - resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - - expressive-code@0.44.2: - resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 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==} @@ -3229,11 +3164,17 @@ packages: fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.8: resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} - fastq@1.20.3: - resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -3244,25 +3185,15 @@ packages: picomatch: optional: true - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} + fflate@0.7.3: + resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==} 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'} - - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -3275,22 +3206,28 @@ packages: flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fnv1a-64@0.1.2: + resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-extra@11.4.1: - resolution: {integrity: sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==} - engines: {node: '>=14.14'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3306,9 +3243,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fuzzysort@3.1.0: - resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} - generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -3317,6 +3251,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.7.0: resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} @@ -3325,10 +3263,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-own-enumerable-keys@1.0.0: - resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} - engines: {node: '>=14.16'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3337,10 +3271,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -3348,16 +3278,16 @@ packages: get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} - 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'} @@ -3374,6 +3304,10 @@ packages: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} + globals@17.13.0: + resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -3385,9 +3319,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} @@ -3416,21 +3349,12 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - hast-util-from-dom@5.0.1: - resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} @@ -3440,8 +3364,8 @@ packages: hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - hast-util-select@6.0.4: - resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} hast-util-to-estree@3.1.3: resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} @@ -3452,6 +3376,9 @@ packages: hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} @@ -3470,17 +3397,17 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.13.13: - resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} - engines: {node: '>=16.9.0'} + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} - html-url-attributes@3.0.1: - resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -3490,22 +3417,21 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - - iconv-lite@0.7.3: - resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -3532,17 +3458,8 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.7.3: - resolution: {integrity: sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -3566,9 +3483,6 @@ packages: 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'} @@ -3588,24 +3502,15 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} hasBin: true is-document.all@1.0.0: resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} engines: {node: '>= 0.4'} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3625,19 +3530,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -3650,33 +3542,14 @@ packages: 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-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -3689,10 +3562,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -3705,10 +3574,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -3725,24 +3590,12 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -3755,16 +3608,15 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + jose@6.2.12: resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.15.2: - resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} - hasBin: true - js-yaml@4.3.2: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true @@ -3783,9 +3635,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@7.0.3: - resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - json-schema-typed@8.0.2: resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} @@ -3795,36 +3644,27 @@ packages: json-stringify-pretty-compact@4.0.0: resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - katex@0.16.47: - resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} - hasBin: true - kdbush@4.1.0: resolution: {integrity: sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -3837,13 +3677,6 @@ packages: resolution: {integrity: sha512-hHaB8C/rfzDDtr/t8YZwxAuPJTT0zHyaPoVzcXwDYhYNAgH/4sIfVhi/XLLIY+bL/FqaIJnjATDbi8ObSELmxg==} engines: {node: '>=22.0.0'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -3857,30 +3690,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.32.0: resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.32.0: resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.32.0: resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.32.0: resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} @@ -3888,6 +3751,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} @@ -3895,6 +3765,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} @@ -3902,6 +3779,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} @@ -3909,25 +3793,47 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.32.0: resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.32.0: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -3936,10 +3842,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -3958,18 +3860,15 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@1.52.0: - resolution: {integrity: sha512-TUgPtl5ZI9WgxOcbu4ckaC5B3l1qxPQrCMgb6OfUB9owx/OvSJfcf93SMgUWAxRw5/1XDfh9uI5F5iNGXCcGDQ==} - peerDependencies: - '@types/react': '*' - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} + maplibre-gl@6.13.0: resolution: {integrity: sha512-ELXk4h+xl0URFQEnVbAN6MGn61P6jq4amUWHiskLVsvHCaKdf1Zq6G8UNOD0AQ3UaXoL5ECc8ovz8yqYEBGPKw==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} @@ -3990,6 +3889,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + mdast-util-find-and-replace@3.0.3: resolution: {integrity: sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw==} @@ -4014,9 +3916,6 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -4041,24 +3940,15 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - media-typer@1.1.1: - resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} - engines: {node: '>= 0.8'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - micromark-core-commonmark@2.0.4: resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} @@ -4083,9 +3973,6 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - micromark-extension-mdx-expression@3.0.1: resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} @@ -4170,10 +4057,6 @@ packages: micromark@4.0.3: resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -4194,10 +4077,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -4216,9 +4095,20 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} @@ -4231,11 +4121,6 @@ packages: resolution: {integrity: sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==} engines: {node: ^20.0.0 || >=22.0.0} - 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==} @@ -4243,9 +4128,9 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - negotiator@1.1.0: - resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} - engines: {node: '>=18'} + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} + engines: {node: '>= 10'} next@16.3.3: resolution: {integrity: sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==} @@ -4268,39 +4153,41 @@ packages: sass: optional: true - next@16.4.0: - resolution: {integrity: sha512-N2C+9q89Z/oLrsepSRS4jRMtwmUZAoZuAHU0e9T6+sAB5DdhADmrnOW+zjYijlrYFmVfmQhGVGy9eMFoB7UgKg==} - engines: {node: '>=20.9.0'} - hasBin: true + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} 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 + encoding: ^0.1.0 peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: + encoding: optional: true - node-emoji@2.2.0: - resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} - engines: {node: '>=18'} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true - node-exports-info@1.6.2: - resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} - engines: {node: '>= 0.4'} + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} node-releases@2.0.57: resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} engines: {node: '>=18'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4309,10 +4196,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -4333,10 +4216,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -4349,103 +4228,94 @@ packages: 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'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - open@11.0.4: - resolution: {integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==} - engines: {node: '>=20'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} own-keys@1.0.2: resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} + engines: {node: '>=20'} p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-queue@9.3.5: + resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==} + engines: {node: '>=20'} + + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} + + package-manager-detector@1.9.0: + resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4454,10 +4324,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4465,8 +4331,11 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -4478,6 +4347,9 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4493,14 +4365,6 @@ packages: resolution: {integrity: sha512-0Z++uU8mvB0EvCPAEUq9BGiPcSravzJ+RPdXfjYlzXffqsogisiKRQqI6ctrSSJ6n985vxrgKtQ5n4sRINcJZg==} engines: {node: '>=18.0.0'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - - pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4508,20 +4372,13 @@ packages: postal-mime@2.7.6: resolution: {integrity: sha512-UUlyE2KlxmvwMGq060onF/VWU3zD6dVW31FwokQ5v26jWd35fbs2MoTFzh+jXnPwAyV2MULMKXcBInGOl5TO6Q==} - 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-selector-parser@7.1.6: resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} engines: {node: '>=4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.23: resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} @@ -4533,81 +4390,82 @@ packages: potpack@2.1.0: resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} - powershell-utils@0.2.1: - resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} - engines: {node: '>=20'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.2.8: - resolution: {integrity: sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==} - engines: {node: '>=12.17.0'} + prettier-plugin-astro@0.14.1: + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier-plugin-tailwindcss@0.7.4: + resolution: {integrity: sha512-UKii4RjY05SNt/WQi6/NcOn/LsT0/ILLXsxygjbRg5/YZelsSu5jTqorYHPDGq4nZy5q5hpCu+XdGZ1xaJEQgw==} + engines: {node: '>=20.19'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' - '@shufo/prettier-plugin-blade': '*' '@trivago/prettier-plugin-sort-imports': '*' - prettier: '>=2.2.0' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' prettier-plugin-organize-attributes: '*' prettier-plugin-organize-imports: '*' - prettier-plugin-style-order: '*' + prettier-plugin-sort-imports: '*' prettier-plugin-svelte: '*' - prettier-plugin-twig-melody: '*' peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true '@prettier/plugin-pug': optional: true '@shopify/prettier-plugin-liquid': optional: true - '@shufo/prettier-plugin-blade': - optional: true '@trivago/prettier-plugin-sort-imports': optional: true + '@zackad/prettier-plugin-twig': + optional: true prettier-plugin-astro: optional: true prettier-plugin-css-order: optional: true - prettier-plugin-import-sort: - optional: true prettier-plugin-jsdoc: optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true prettier-plugin-organize-attributes: optional: true prettier-plugin-organize-imports: optional: true - prettier-plugin-style-order: + prettier-plugin-sort-imports: optional: true prettier-plugin-svelte: optional: true - prettier-plugin-twig-melody: - optional: true - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true prettier@3.9.9: resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} engines: {node: '>=14'} hasBin: true - pretty-ms@9.3.1: - resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} - engines: {node: '>=18'} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + process-ancestry@0.1.0: + resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} + engines: {node: '>=18.0.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4621,32 +4479,20 @@ packages: protocol-buffers-schema@3.6.1: resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==} - proxy-addr@2.0.8: - resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} - engines: {node: '>= 0.10'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.16.0: - resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quickselect@3.0.0: resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + range-parser@1.3.0: resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - react-dom@19.3.0: resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} peerDependencies: @@ -4663,12 +4509,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-markdown@10.1.0: - resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} - peerDependencies: - '@types/react': '>=18' - react: '>=18' - react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -4677,10 +4517,6 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - recast@0.23.21: - resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} - engines: {node: '>= 4'} - recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -4712,14 +4548,8 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - rehype-expressive-code@0.44.2: - resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==} - - rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - - rehype-katex@7.0.1: - resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} rehype-recma@1.0.0: resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} @@ -4727,16 +4557,12 @@ packages: rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} - remark-emoji@5.0.2: - resolution: {integrity: sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==} - engines: {node: '>=18'} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-math@6.0.0: - resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} - remark-mdx@3.1.1: resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} @@ -4746,16 +4572,23 @@ packages: remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remark-smartypants@3.0.3: + resolution: {integrity: sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==} + engines: {node: '>=16.0.0'} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - reselect@5.3.0: - resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==} - resend@6.32.1: resolution: {integrity: sha512-Z9DxkIZt5uvVNkjxjc+r4rCPI0MdDIJ7H+GvU50o9GkhrD0tVTwP6caE8KYEco90sos312l6R72jAEMCBFBiFQ==} engines: {node: '>=20'} @@ -4769,6 +4602,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -4780,27 +4617,28 @@ packages: engines: {node: '>= 0.4'} hasBin: true - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} - rou3@0.9.2: - resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rou3@0.9.2: + resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} safe-array-concat@1.1.4: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} @@ -4814,16 +4652,26 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + satori-html@0.3.2: + resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} + + satori@0.32.0: + resolution: {integrity: sha512-WwYeCWKjxfXvk7SsLSLTJhcPOrB2HCxbptqGIiYor0yqaPu3xA5uMTQ/4Dan5mxClhhk2Wn9ZE1pLGIlGdUxFQ==} + engines: {node: '>=16'} + + satteri@0.10.5: + resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -4840,12 +4688,8 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - server-only@0.0.1: - resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} set-cookie-parser@3.1.2: resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} @@ -4865,11 +4709,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@4.21.4: - resolution: {integrity: sha512-YYfn/hsHbRH2mGwnKBx9tk+DjTQH+RUMS5iCxjKzwzuJ5uoHPqLOFUCJSeX0sXfrcBSfgQaXiOLGKNLjlIQxxw==} - engines: {node: '>=20.18.1'} - hasBin: true - sharp@0.35.5: resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} engines: {node: '>=20.9.0'} @@ -4910,20 +4749,12 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - skin-tone@2.0.0: - resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} - engines: {node: '>=8'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.9.1: + resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} + engines: {node: '>= 18'} socket.io-adapter@2.5.8: resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} @@ -4936,10 +4767,6 @@ packages: resolution: {integrity: sha512-9ZV9zg8vN8hO3Y25DhR7nUkJ1VDnBhq5O/JrXhFT9s6+F0gqytSASTHVfCFc2mJXaTfARroErplXlzFWwETZqQ==} engines: {node: '>=10.2.0'} - socks@2.8.10: - resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.2: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} @@ -4955,15 +4782,13 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - standardwebhooks@1.1.1: resolution: {integrity: sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==} @@ -4971,9 +4796,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -4983,9 +4807,12 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} + + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} string.prototype.matchall@4.1.0: resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} @@ -5009,22 +4836,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - stringify-object@5.0.0: - resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} - engines: {node: '>=14.16'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -5033,10 +4848,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5066,6 +4877,9 @@ packages: babel-plugin-macros: optional: true + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5074,12 +4888,15 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - systeminformation@5.33.15: - resolution: {integrity: sha512-s5RloL0F7xhN0ZjfHtLGnbf7EW74EI0N8NFL+1xR7Oxz9QA33obNZsl7lyfnJOhN04E/kGFPoJPlvY7TZ5fzmw==} - engines: {node: '>=10.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + svgo@4.1.0: + resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} + engines: {node: '>=16'} hasBin: true + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -5091,8 +4908,16 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyclip@1.0.3: + resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} + engines: {node: ^16.14.0 || >= 17.3.0} tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} @@ -5102,17 +4927,19 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyps@0.5.0: + resolution: {integrity: sha512-Llu7nEtVOGHh7jok32l6+udlu+4Np5vsYVB7zeTK614coSsro2qjwte7MFt/ouLM/h4kXqbGXktSMMvMsttSDw==} + tinyqueue@3.0.0: resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -5125,12 +4952,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-morph@26.0.0: - resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -5154,18 +4975,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - type-fest@5.10.0: resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} engines: {node: '>=20'} - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -5182,6 +4995,12 @@ packages: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + typescript-eslint@8.71.1: resolution: {integrity: sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5194,38 +5013,48 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uint8array-extras@1.6.0: resolution: {integrity: sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==} engines: {node: '>=18'} + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@7.30.0: - resolution: {integrity: sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==} - engines: {node: '>=20.18.1'} - - unicode-emoji-modifier-base@1.0.0: - resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} - engines: {node: '>=4'} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + engines: {node: '>=22.19.0'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unifont@1.0.3: + resolution: {integrity: sha512-XGnEwj5sWdCbiBX01mWLSBncS0yMRjnLygau3IfdOlfjMacNIQvTGW4VH7pWBq+gGWArfSef/CensMLjMmIr/A==} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -5238,22 +5067,76 @@ packages: unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unrs-resolver@1.12.2: - resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + unstorage@1.17.6: + resolution: {integrity: sha512-gjKtcmn/KwZuJZO9o2sc0esAQnhmTw0LviDHwevTXbJMYs0dRTp8ZEEWXHU0vTpzbN3cA0yxlTeyXssMp3zDqw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true update-browserslist-db@1.3.3: resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} @@ -5264,22 +5147,17 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.7.0: - resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - validate-npm-package-name@7.0.2: - resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} - engines: {node: ^20.17.0 || >=22.9.0} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -5289,9 +5167,168 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@8.3.4: + resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.71: + resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.71: + resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.71: + resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.71: + resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.71: + resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.71: + resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.71: + resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-jsonrpc@9.0.3: + resolution: {integrity: sha512-qETYf9PCl1lVfwR+oBmMfc4vP2nqLNA35ABxorw3j06+xlKRgDVxbLgKm4Y/xPL0YWdeDjLoI4ImICIT3nB0zQ==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-protocol@3.18.4: + resolution: {integrity: sha512-CCXbyr99dafRJzJH/0Ryk7ly5T8XPmSR0//OuF2w4m+9JiOin7zcAT5iET8GRE7Z9taFBejb3GbM0a0mbjdbrg==} + + vscode-languageserver-textdocument@1.0.15: + resolution: {integrity: sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver-types@3.18.4: + resolution: {integrity: sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} @@ -5316,17 +5353,13 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} ws@8.21.3: resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} @@ -5340,29 +5373,64 @@ packages: utf-8-validate: optional: true - wsl-utils@1.0.1: - resolution: {integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==} - engines: {node: '>=20'} + xdg-app-paths@5.5.1: + resolution: {integrity: sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==} + engines: {node: '>= 6.0'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-language-server@1.23.0: + resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} + hasBin: true + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-spinner@1.2.2: - resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==} - engines: {node: '>=18.19'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} yoctocolors@2.2.0: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} @@ -5370,12 +5438,15 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5383,6 +5454,200 @@ snapshots: '@alloc/quick-lru@5.3.0': {} + '@astrojs/astro2tsx@0.1.3(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - '@emnapi/runtime' + + '@astrojs/check@0.9.11(@emnapi/runtime@1.11.3)(prettier-plugin-astro@0.14.1)(prettier@3.9.9)(typescript@6.0.3)': + dependencies: + '@astrojs/language-server': 2.17.2(@emnapi/runtime@1.11.3)(prettier-plugin-astro@0.14.1)(prettier@3.9.9)(typescript@6.0.3) + chokidar: 5.0.0 + kleur: 4.1.5 + typescript: 6.0.3 + yargs: 18.2.0 + transitivePeerDependencies: + - '@emnapi/runtime' + - prettier + - prettier-plugin-astro + + '@astrojs/compiler-binding-android-arm64@0.5.2': + optional: true + + '@astrojs/compiler-binding-darwin-arm64@0.5.2': + optional: true + + '@astrojs/compiler-binding-darwin-x64@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-arm64-musl@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-x64-gnu@0.5.2': + optional: true + + '@astrojs/compiler-binding-linux-x64-musl@0.5.2': + optional: true + + '@astrojs/compiler-binding-wasm32-wasi@0.5.2': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + optional: true + + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': + optional: true + + '@astrojs/compiler-binding-win32-x64-msvc@0.5.2': + optional: true + + '@astrojs/compiler-binding@0.5.2': + optionalDependencies: + '@astrojs/compiler-binding-android-arm64': 0.5.2 + '@astrojs/compiler-binding-darwin-arm64': 0.5.2 + '@astrojs/compiler-binding-darwin-x64': 0.5.2 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.2 + '@astrojs/compiler-binding-linux-arm64-musl': 0.5.2 + '@astrojs/compiler-binding-linux-x64-gnu': 0.5.2 + '@astrojs/compiler-binding-linux-x64-musl': 0.5.2 + '@astrojs/compiler-binding-wasm32-wasi': 0.5.2 + '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.2 + '@astrojs/compiler-binding-win32-x64-msvc': 0.5.2 + + '@astrojs/compiler-rs@0.5.2': + dependencies: + '@astrojs/compiler-binding': 0.5.2 + + '@astrojs/compiler@2.13.1': {} + + '@astrojs/compiler@4.0.0': {} + + '@astrojs/internal-helpers@0.13.0': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + picomatch: 4.0.7 + retext-smartypants: 6.2.0 + shiki: 4.5.0 + smol-toml: 1.9.1 + unified: 11.0.5 + yaml: 2.9.1 + + '@astrojs/language-server@2.17.2(@emnapi/runtime@1.11.3)(prettier-plugin-astro@0.14.1)(prettier@3.9.9)(typescript@6.0.3)': + dependencies: + '@astrojs/astro2tsx': 0.1.3(@emnapi/runtime@1.11.3) + '@astrojs/yaml2ts': 0.2.4 + '@volar/kit': 2.4.28(typescript@6.0.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28 + '@volar/language-service': 2.4.28 + muggle-string: 0.4.1 + tinyglobby: 0.2.17 + volar-service-css: 0.0.71(@volar/language-service@2.4.28) + volar-service-emmet: 0.0.71(@volar/language-service@2.4.28) + volar-service-html: 0.0.71(@volar/language-service@2.4.28) + volar-service-prettier: 0.0.71(@volar/language-service@2.4.28)(prettier@3.9.9) + volar-service-typescript: 0.0.71(@volar/language-service@2.4.28) + volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28) + volar-service-yaml: 0.0.71(@volar/language-service@2.4.28) + vscode-html-languageservice: 5.6.2 + vscode-uri: 3.2.0 + optionalDependencies: + prettier: 3.9.9 + prettier-plugin-astro: 0.14.1 + transitivePeerDependencies: + - '@emnapi/runtime' + - typescript + + '@astrojs/markdown-remark@7.3.3': + dependencies: + '@astrojs/internal-helpers': 0.13.0 + '@astrojs/prism': 4.1.0 + '@mdx-js/mdx': 3.1.1 + acorn: 8.19.0 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.3 + source-map: 0.8.0 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/markdown-satteri@0.4.4': + dependencies: + '@astrojs/internal-helpers': 0.13.0 + '@astrojs/prism': 4.1.0 + github-slugger: 2.0.0 + satteri: 0.10.5 + + '@astrojs/node@11.1.9(astro@7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@astrojs/internal-helpers': 0.13.0 + astro: 7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + send: 1.2.1 + server-destroy: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.1.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/telemetry@3.4.0': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + package-manager-detector: 1.9.0 + + '@astrojs/vercel@11.0.16(astro@7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(ws@8.21.3)': + dependencies: + '@astrojs/internal-helpers': 0.13.0 + '@vercel/analytics': 2.0.1(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) + '@vercel/functions': 3.10.1(ws@8.21.3) + '@vercel/nft': 1.11.0 + '@vercel/routing-utils': 6.6.0 + astro: 7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + rolldown: 1.2.14 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - '@remix-run/react' + - '@sveltejs/kit' + - encoding + - next + - nuxt + - react + - rollup + - supports-color + - svelte + - vue + - vue-router + - ws + + '@astrojs/yaml2ts@0.2.4': + dependencies: + yaml: 2.9.1 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -5419,10 +5684,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.29.7': - dependencies: - '@babel/types': 7.29.8 - '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 @@ -5431,28 +5692,8 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.10 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': - dependencies: - '@babel/traverse': 7.29.10 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.29.7': dependencies: '@babel/traverse': 7.29.10 @@ -5469,28 +5710,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.29.7': - dependencies: - '@babel/types': 7.29.8 - - '@babel/helper-plugin-utils@7.29.7': {} - - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - dependencies: - '@babel/traverse': 7.29.10 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.29.7': {} @@ -5510,48 +5729,6 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.29.10': {} - '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -5587,29 +5764,6 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@base-ui/react@1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@babel/runtime': 7.29.10 - '@base-ui/utils': 0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@floating-ui/utils': 0.2.12 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - use-sync-external-store: 1.7.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - - '@base-ui/utils@0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@babel/runtime': 7.29.10 - '@floating-ui/utils': 0.2.12 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - reselect: 5.3.0 - use-sync-external-store: 1.7.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5)': dependencies: '@better-auth/utils': 0.4.2 @@ -5667,38 +5821,90 @@ snapshots: '@better-fetch/fetch@1.3.2': {} - '@ctrl/tinycolor@4.2.1': {} + '@bruits/satteri-darwin-arm64@0.10.5': + optional: true + + '@bruits/satteri-darwin-x64@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-arm64-musl@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-gnu@0.10.5': + optional: true + + '@bruits/satteri-linux-x64-musl@0.10.5': + optional: true - '@dotenvx/dotenvx@1.75.1': + '@bruits/satteri-wasm32-wasi@0.10.5': dependencies: - '@dotenvx/primitives': 0.8.0 - commander: 11.1.0 - conf: 10.2.0 - dotenv: 17.4.2 - enquirer: 2.4.1 - env-paths: 2.2.1 - execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.7) - ignore: 5.3.2 - object-treeify: 1.1.33 - open: 8.4.2 - picomatch: 4.0.7 - systeminformation: 5.33.15 - undici: 7.30.0 - which: 4.0.0 - yocto-spinner: 1.2.2 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@bruits/satteri-win32-arm64-msvc@0.10.5': + optional: true + + '@bruits/satteri-win32-x64-msvc@0.10.5': + optional: true + + '@capsizecss/unpack@4.0.1': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.5.1': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@dotenvx/primitives@0.8.0': {} + '@clack/prompts@1.8.1': + dependencies: + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 '@drizzle-team/brocli@0.10.2': {} - '@emnapi/core@1.10.0': + '@emmetio/abbreviation@2.3.3': dependencies: - '@emnapi/wasi-threads': 1.2.1 + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true @@ -5706,13 +5912,16 @@ snapshots: '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.1': + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -5950,11 +6159,6 @@ snapshots: eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0))': - dependencies: - eslint: 9.39.5(jiti@2.7.0) - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.21.2': @@ -5996,54 +6200,8 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@expressive-code/core@0.44.2': - dependencies: - '@ctrl/tinycolor': 4.2.1 - hast-util-select: 6.0.4 - hast-util-to-html: 9.0.5 - hast-util-to-text: 4.0.2 - hastscript: 9.0.1 - postcss: 8.5.29 - postcss-nested: 6.2.0(postcss@8.5.29) - unist-util-visit: 5.1.0 - unist-util-visit-parents: 6.0.2 - - '@expressive-code/plugin-frames@0.44.2': - dependencies: - '@expressive-code/core': 0.44.2 - - '@expressive-code/plugin-shiki@0.44.2': - dependencies: - '@expressive-code/core': 0.44.2 - shiki: 4.5.0 - - '@expressive-code/plugin-text-markers@0.44.2': - dependencies: - '@expressive-code/core': 0.44.2 - - '@floating-ui/core@1.8.0': - dependencies: - '@floating-ui/utils': 0.2.12 - - '@floating-ui/dom@1.8.0': - dependencies: - '@floating-ui/core': 1.8.0 - '@floating-ui/utils': 0.2.12 - - '@floating-ui/react-dom@2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@floating-ui/dom': 1.8.0 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - - '@floating-ui/utils@0.2.12': {} - '@fontsource-variable/cascadia-code@5.3.0': {} - '@hono/node-server@2.1.3(hono@4.13.13)': - dependencies: - hono: 4.13.13 - '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -6167,6 +6325,10 @@ snapshots: '@img/sharp-win32-x64@0.35.5': optional: true + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -6188,6 +6350,19 @@ snapshots: '@mapbox/jsonlint-lines-primitives@2.0.3': {} + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.8.5 + tar: 7.5.22 + transitivePeerDependencies: + - encoding + - supports-color + '@mapbox/point-geometry@1.1.0': {} '@mapbox/tiny-sdf@2.3.0': {} @@ -6223,13 +6398,6 @@ snapshots: '@types/geojson': 7946.0.16 pbf: 5.1.2 - '@mdx-js/loader@3.1.1': - dependencies: - '@mdx-js/mdx': 3.1.1 - source-map: 0.7.6 - transitivePeerDependencies: - - supports-color - '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.9 @@ -6260,38 +6428,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.3.0)(react@19.3.0)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: - '@types/mdx': 2.0.14 - '@types/react': 19.3.0 - react: 19.3.0 + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 - '@modelcontextprotocol/sdk@1.32.1(zod@3.25.76)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@hono/node-server': 2.1.3(hono@4.13.13) - ajv: 8.20.0 - ajv-formats: 3.0.1(ajv@8.20.0) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.1 - express: 5.2.1 - express-rate-limit: 8.7.1(express@5.2.1) - hono: 4.13.13 - jose: 6.2.12 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) - transitivePeerDependencies: - - supports-color + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.4 + optional: true - '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 '@tybys/wasm-util': 0.10.4 optional: true @@ -6299,89 +6452,41 @@ snapshots: '@next/env@16.3.3': {} - '@next/env@16.4.0': {} - - '@next/eslint-plugin-next@16.4.0(eslint@9.39.5(jiti@2.7.0))': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) - fast-glob: 3.3.1 - transitivePeerDependencies: - - eslint - - '@next/mdx@16.4.0(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.3.0)(react@19.3.0))': - dependencies: - source-map: 0.7.6 - optionalDependencies: - '@mdx-js/loader': 3.1.1 - '@mdx-js/react': 3.1.1(@types/react@19.3.0)(react@19.3.0) - '@next/swc-darwin-arm64@16.3.3': optional: true - '@next/swc-darwin-arm64@16.4.0': - optional: true - '@next/swc-darwin-x64@16.3.3': optional: true - '@next/swc-darwin-x64@16.4.0': - optional: true - '@next/swc-linux-arm64-gnu@16.3.3': optional: true - '@next/swc-linux-arm64-gnu@16.4.0': - optional: true - '@next/swc-linux-arm64-musl@16.3.3': optional: true - '@next/swc-linux-arm64-musl@16.4.0': - optional: true - '@next/swc-linux-x64-gnu@16.3.3': optional: true - '@next/swc-linux-x64-gnu@16.4.0': - optional: true - '@next/swc-linux-x64-musl@16.3.3': optional: true - '@next/swc-linux-x64-musl@16.4.0': - optional: true - '@next/swc-win32-arm64-msvc@16.3.3': optional: true - '@next/swc-win32-arm64-msvc@16.4.0': - optional: true - '@next/swc-win32-x64-msvc@16.3.3': optional: true - '@next/swc-win32-x64-msvc@16.4.0': - optional: true - '@noble/ciphers@2.4.0': {} '@noble/hashes@2.4.0': {} - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} + '@opentelemetry/semantic-conventions@1.43.0': {} - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.3 + '@oslojs/encoding@1.1.0': {} - '@nolyfill/is-core-module@1.0.39': {} + '@oxc-project/types@0.154.0': {} - '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgr/core@0.3.6': {} '@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: @@ -6408,43 +6513,115 @@ snapshots: - react-dom - sass - '@rtsao/scc@1.1.0': {} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + optional: true + + '@resvg/resvg-js-android-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-x64@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js@2.6.2': + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 2.6.2 + '@resvg/resvg-js-android-arm64': 2.6.2 + '@resvg/resvg-js-darwin-arm64': 2.6.2 + '@resvg/resvg-js-darwin-x64': 2.6.2 + '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2 + '@resvg/resvg-js-linux-arm64-gnu': 2.6.2 + '@resvg/resvg-js-linux-arm64-musl': 2.6.2 + '@resvg/resvg-js-linux-x64-gnu': 2.6.2 + '@resvg/resvg-js-linux-x64-musl': 2.6.2 + '@resvg/resvg-js-win32-arm64-msvc': 2.6.2 + '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 + '@resvg/resvg-js-win32-x64-msvc': 2.6.2 + + '@rolldown/binding-android-arm-eabi@1.2.14': + optional: true + + '@rolldown/binding-android-arm64@1.2.14': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.14': + optional: true + + '@rolldown/binding-darwin-x64@1.2.14': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.14': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.14': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.14': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.14': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.14': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.14': + optional: true + + '@rolldown/pluginutils@1.0.1': {} - '@sec-ant/readable-stream@0.4.1': {} + '@rollup/pluginutils@5.4.0': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 '@selderee/plugin-htmlparser2@0.11.0': dependencies: domhandler: 5.0.3 selderee: 0.11.0 - '@shadcn/registry@0.1.3': - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@dotenvx/dotenvx': 1.75.1 - cn: 0.2.6 - code-block-writer: 13.0.3 - deepmerge: 4.3.1 - execa: 9.6.1 - fast-glob: 3.3.3 - fs-extra: 11.4.1 - fuzzysort: 3.1.0 - kleur: 4.1.5 - ora: 8.2.0 - postcss: 8.5.29 - prompts: 2.4.2 - recast: 0.23.21 - socks: 2.8.10 - stringify-object: 5.0.0 - tsconfig-paths: 4.2.0 - type-fest: 4.41.0 - undici: 7.30.0 - zod: 3.25.76 - transitivePeerDependencies: - - supports-color - '@shikijs/core@4.5.0': dependencies: '@shikijs/primitive': 4.5.0 @@ -6485,9 +6662,10 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/is@4.6.0': {} - - '@sindresorhus/merge-streams@4.0.0': {} + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.3 + string.prototype.codepointat: 0.2.1 '@socket.io/component-emitter@3.1.2': {} @@ -6504,13 +6682,6 @@ snapshots: typescript: 6.0.3 zod: 4.6.5 - '@t3-oss/env-nextjs@0.13.11(typescript@6.0.3)(zod@4.6.5)': - dependencies: - '@t3-oss/env-core': 0.13.11(typescript@6.0.3)(zod@4.6.5) - optionalDependencies: - typescript: 6.0.3 - zod: 4.6.5 - '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 @@ -6580,12 +6751,6 @@ snapshots: postcss: 8.5.29 tailwindcss: 4.3.3 - '@ts-morph/common@0.27.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 10.2.6 - path-browserify: 1.0.1 - '@turbo/darwin-64@2.11.9': optional: true @@ -6607,7 +6772,6 @@ snapshots: '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 - optional: true '@types/cors@2.8.19': dependencies: @@ -6617,6 +6781,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.9 @@ -6631,10 +6797,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - - '@types/katex@0.16.8': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -6643,6 +6805,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + '@types/node@26.6.4': dependencies: undici-types: 8.9.0 @@ -6659,8 +6825,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/validate-npm-package-name@4.0.2': {} - '@types/ws@8.18.2': dependencies: '@types/node': 26.6.4 @@ -6758,95 +6922,123 @@ snapshots: '@ungap/structured-clone@1.4.0': {} - '@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 + '@vercel/analytics@2.0.1(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': + optionalDependencies: + next: 16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 - '@unrs/resolver-binding-linux-arm64-musl@1.12.2': - optional: true + '@vercel/cli-config@0.3.1': + dependencies: + xdg-app-paths: 5.5.1 + zod: 4.1.11 - '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': - optional: true + '@vercel/cli-exec@1.0.1': + dependencies: + execa: 5.1.1 - '@unrs/resolver-binding-linux-loong64-musl@1.12.2': - optional: true + '@vercel/functions@3.10.1(ws@8.21.3)': + dependencies: + '@vercel/oidc': 4.0.1 + optionalDependencies: + ws: 8.21.3 - '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': - optional: true + '@vercel/nft@1.11.0': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.4.0 + acorn: 8.19.0 + acorn-import-attributes: 1.9.5(acorn@8.19.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.7 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': - optional: true + '@vercel/oidc@4.0.1': + dependencies: + '@vercel/cli-config': 0.3.1 + '@vercel/cli-exec': 1.0.1 + jose: 5.10.0 - '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': - optional: true + '@vercel/routing-utils@6.6.0': + dependencies: + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + optionalDependencies: + ajv: 6.15.0 - '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': - optional: true + '@vercel/speed-insights@2.0.0(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': + optionalDependencies: + next: 16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 - '@unrs/resolver-binding-linux-x64-gnu@1.12.2': - optional: true + '@volar/kit@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + typesafe-path: 0.2.2 + typescript: 6.0.3 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 - '@unrs/resolver-binding-linux-x64-musl@1.12.2': - optional: true + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 - '@unrs/resolver-binding-openharmony-arm64@1.12.2': - optional: true + '@volar/language-server@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.18.4 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 - '@unrs/resolver-binding-wasm32-wasi@1.12.2': + '@volar/language-service@2.4.28': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.18.4 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 - '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': - optional: true + '@volar/source-map@2.4.28': {} - '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': - optional: true + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.2.0 - '@unrs/resolver-binding-win32-x64-msvc@1.12.2': - optional: true + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 - '@vercel/analytics@2.0.1(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': - optionalDependencies: - next: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - react: 19.3.0 + '@vscode/l10n@0.0.18': {} - '@vercel/speed-insights@2.0.0(next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': - optionalDependencies: - next: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - react: 19.3.0 + abbrev@3.0.1: {} accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - accepts@2.0.0: + acorn-import-attributes@1.9.5(acorn@8.19.0): dependencies: - mime-types: 3.0.2 - negotiator: 1.1.0 + acorn: 8.19.0 acorn-jsx@5.3.2(acorn@8.19.0): dependencies: @@ -6854,7 +7046,9 @@ snapshots: acorn@8.19.0: {} - ajv-formats@2.1.1(ajv@8.20.0): + agent-base@7.1.4: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -6862,6 +7056,10 @@ snapshots: optionalDependencies: ajv: 8.20.0 + ajv-i18n@4.2.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -6876,9 +7074,9 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-colors@4.1.3: {} - - ansi-regex@5.0.1: {} + am-i-vibing@0.5.0: + dependencies: + process-ancestry: 0.1.0 ansi-regex@6.4.0: {} @@ -6886,9 +7084,12 @@ snapshots: dependencies: color-convert: 2.0.1 - argparse@1.0.10: + ansi-styles@6.2.3: {} + + anymatch@3.1.3: dependencies: - sprintf-js: 1.0.3 + normalize-path: 3.0.0 + picomatch: 2.3.2 argparse@2.0.1: {} @@ -6910,19 +7111,11 @@ snapshots: 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-iterate@2.0.1: {} - array.prototype.findlastindex@1.2.6: + array.prototype.findlast@1.2.5: 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 @@ -6961,17 +7154,122 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - ast-types-flow@0.0.8: {} + astring@1.9.0: {} + + astro-eslint-parser@2.1.0: + dependencies: + '@astrojs/compiler': 4.0.0 + '@typescript-eslint/scope-manager': 8.71.1 + '@typescript-eslint/types': 8.71.1 + astrojs-compiler-sync: 1.1.1(@astrojs/compiler@4.0.0) + debug: 4.4.3 + entities: 8.1.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + semver: 7.8.5 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - supports-color + + astro@7.4.1(@astrojs/markdown-remark@7.3.3)(@types/node@26.6.4)(@vercel/functions@3.10.1(ws@8.21.3))(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): + dependencies: + '@astrojs/compiler-rs': 0.5.2 + '@astrojs/internal-helpers': 0.13.0 + '@astrojs/markdown-satteri': 0.4.4 + '@astrojs/telemetry': 3.4.0 + '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.8.1 + '@oslojs/encoding': 1.1.0 + am-i-vibing: 0.5.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 2.0.1 + devalue: 6.0.3 + diff: 9.0.0 + dset: 3.1.4 + es-module-lexer: 3.0.4 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.6 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.3.0 + jsonc-parser: 3.3.1 + magic-string: 1.4.3 + magicast: 0.5.5 + mrmime: 2.0.1 + neotraverse: 1.0.1 + obug: 3.0.0 + p-limit: 7.3.3 + p-queue: 9.3.5 + package-manager-detector: 1.9.0 + piccolore: 0.1.3 + picomatch: 4.0.7 + rolldown: 1.2.14 + shiki: 4.5.0 + smol-toml: 1.9.1 + svgo: 4.1.0 + tinyclip: 1.0.3 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tinyps: 0.5.0 + ultrahtml: 1.7.0 + unifont: 1.0.3 + unstorage: 1.17.6(@vercel/functions@3.10.1(ws@8.21.3)) + verkit: 0.5.0 + vite: 8.3.4(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.4(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.6.7 + optionalDependencies: + '@astrojs/markdown-remark': 7.3.3 + sharp: 0.35.5(@types/node@26.6.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - aws4fetch + - db0 + - esbuild + - idb-keyval + - ioredis + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - uploadthing + - yaml - ast-types@0.16.3: + astrojs-compiler-sync@1.1.1(@astrojs/compiler@4.0.0): dependencies: - tslib: 2.8.1 - - astring@1.9.0: {} + '@astrojs/compiler': 4.0.0 + synckit: 0.11.13 async-function@1.0.0: {} - atomically@1.7.0: {} + async-sema@3.1.1: {} atomically@2.1.1: dependencies: @@ -6982,8 +7280,6 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.14.0: {} - axobject-query@4.1.0: {} bail@2.0.2: {} @@ -6992,11 +7288,11 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.11.27: {} + base64-js@0.0.8: {} - bcp-47-match@2.0.3: {} + baseline-browser-mapping@2.11.27: {} - better-auth@1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.4.0(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + better-auth@1.7.7(drizzle-kit@0.31.11)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6))(next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) '@better-auth/drizzle-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.5))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6)) @@ -7018,7 +7314,7 @@ snapshots: optionalDependencies: drizzle-kit: 0.31.11 drizzle-orm: 0.45.3(@neondatabase/serverless@1.2.0)(kysely@0.29.6) - next: 16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next: 16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: @@ -7037,19 +7333,9 @@ snapshots: dependencies: require-from-string: 2.0.2 - body-parser@2.3.0: + bindings@1.5.0: dependencies: - bytes: 3.1.2 - content-type: 2.1.0 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.3 - on-finished: 2.4.1 - qs: 6.16.0 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color + file-uri-to-path: 1.0.0 boolbase@1.0.0: {} @@ -7062,10 +7348,6 @@ snapshots: dependencies: balanced-match: 4.0.4 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - browserslist@4.29.3: dependencies: baseline-browser-mapping: 2.11.27 @@ -7076,12 +7358,6 @@ snapshots: buffer-from@1.1.2: {} - bundle-name@4.1.1: - dependencies: - run-applescript: 7.1.0 - - bytes@3.1.2: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -7101,6 +7377,8 @@ snapshots: callsites@3.1.0: {} + camelize@1.0.1: {} + caniuse-lite@1.0.30001815: {} ccount@2.0.1: {} @@ -7110,10 +7388,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} - - char-regex@1.0.2: {} - character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -7126,28 +7400,24 @@ snapshots: dependencies: readdirp: 5.1.1 - citty@0.2.2: {} - - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 + chownr@3.0.0: {} - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 + ci-info@4.4.0: {} - cli-spinners@2.9.2: {} + citty@0.2.2: {} client-only@0.0.1: {} - clsx@2.1.1: {} + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - cn@0.2.6: {} + clsx@2.1.1: {} cn@0.4.0: {} - code-block-writer@13.0.3: {} - collapse-white-space@2.1.0: {} color-convert@2.0.1: @@ -7162,25 +7432,10 @@ snapshots: commander@13.1.0: {} - commander@14.0.3: {} - - commander@8.3.0: {} + common-ancestor-path@2.0.0: {} concat-map@0.0.1: {} - conf@10.2.0: - dependencies: - ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) - atomically: 1.7.0 - debounce-fn: 4.0.0 - dot-prop: 6.0.1 - env-paths: 2.2.1 - json-schema-typed: 7.0.3 - onetime: 5.1.2 - pkg-up: 3.1.0 - semver: 7.8.5 - conf@15.1.0: dependencies: ajv: 8.20.0 @@ -7193,18 +7448,16 @@ snapshots: semver: 7.8.5 uint8array-extras: 1.6.0 - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - content-type@2.1.0: {} + consola@3.4.2: {} convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} + cookie-es@1.2.3: {} cookie@0.7.2: {} + cookie@2.0.1: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -7216,18 +7469,51 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-selector-parser@3.3.0: {} + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-background-parser@0.1.0: {} + + css-box-shadow@1.0.0-3: {} + + css-color-keywords@1.0.0: {} + + css-gradient-parser@0.0.17: {} + + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.2 css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.2 + css-what@7.0.0: {} + cssesc@3.0.0: {} - csstype@3.2.3: {} + csso@5.0.5: + dependencies: + css-tree: 2.2.1 - damerau-levenshtein@1.0.8: {} + csstype@3.2.3: {} data-view-buffer@1.0.2: dependencies: @@ -7247,20 +7533,12 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debounce-fn@4.0.0: - dependencies: - mimic-fn: 3.1.0 - debounce-fn@6.0.0: dependencies: mimic-function: 5.0.1 debounce@2.2.0: {} - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -7269,29 +7547,16 @@ snapshots: dependencies: character-entities: 2.0.2 - dedent@1.7.2: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} - default-browser-id@5.0.1: {} - - default-browser@5.5.1: - dependencies: - bundle-name: 4.1.1 - default-browser-id: 5.0.1 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -7304,15 +7569,17 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + detect-libc@2.1.2: {} + devalue@6.0.3: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 - diff@8.0.4: {} - - direction@2.0.1: {} + diff@9.0.0: {} doctrine@2.1.0: dependencies: @@ -7340,9 +7607,11 @@ snapshots: dependencies: type-fest: 5.10.0 - dot-prop@6.0.1: + dotenv-expand@12.0.3: dependencies: - is-obj: 2.0.0 + dotenv: 16.6.1 + + dotenv@16.6.1: {} dotenv@17.4.2: {} @@ -7358,6 +7627,8 @@ snapshots: '@neondatabase/serverless': 1.2.0 kysely: 0.29.6 + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7370,13 +7641,14 @@ snapshots: electron-to-chromium@1.5.449: {} - emoji-regex@10.6.0: {} - - emoji-regex@9.2.2: {} + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 - emojilib@2.4.0: {} + emoji-regex-xs@2.0.1: {} - emoticon@4.1.0: {} + emoji-regex@10.6.0: {} encodeurl@2.0.0: {} @@ -7403,16 +7675,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - entities@4.5.0: {} entities@6.0.1: {} - env-paths@2.2.1: {} + entities@8.1.0: {} env-paths@3.0.0: {} @@ -7503,6 +7770,8 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 + es-module-lexer@3.0.4: {} + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -7632,108 +7901,23 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.4.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3): - dependencies: - '@next/eslint-plugin-next': 16.4.0(eslint@9.39.5(jiti@2.7.0)) - eslint: 9.39.5(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.7.0)) - eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.7.0)) - eslint-plugin-react-hooks: 7.1.1(eslint@9.39.5(jiti@2.7.0)) - globals: 16.4.0 - typescript-eslint: 8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) - optionalDependencies: - typescript: 6.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - 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.17.0 - resolve: 2.0.0-next.7 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 9.39.5(jiti@2.7.0) - get-tsconfig: 4.14.3 - 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.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) - eslint: 9.39.5(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)): + eslint-plugin-astro@2.1.1(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)): dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.2.0 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)) + '@jridgewell/sourcemap-codec': 1.6.0 + '@typescript-eslint/types': 8.71.1 + astro-eslint-parser: 2.1.0 eslint: 9.39.5(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) - hasown: 2.0.4 - is-core-module: 2.17.0 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.10 - tsconfig-paths: 3.15.0 + espree: 11.2.0 + globals: 17.13.0 + parse5: 8.0.1 + postcss: 8.5.29 + postcss-selector-parser: 7.1.6 optionalDependencies: '@typescript-eslint/parser': 8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.7.0)): - dependencies: - aria-query: 5.3.2 - array-includes: 3.2.0 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.14.0 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 9.39.5(jiti@2.7.0) - 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@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 @@ -7772,6 +7956,13 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} @@ -7825,7 +8016,11 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.19.0) eslint-visitor-keys: 4.2.1 - esprima@4.0.1: {} + espree@11.2.0: + dependencies: + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) + eslint-visitor-keys: 5.0.1 esquery@1.7.0: dependencies: @@ -7866,6 +8061,8 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.3 + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -7874,11 +8071,7 @@ snapshots: etag@1.8.1: {} - eventsource-parser@3.1.1: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.1 + eventemitter3@5.0.4: {} execa@5.1.1: dependencies: @@ -7892,135 +8085,39 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.1 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.2.0 - - express-rate-limit@8.7.1(express@5.2.1): - dependencies: - debug: 4.4.3 - express: 5.2.1 - ip-address: 10.7.3 - transitivePeerDependencies: - - supports-color - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.8 - qs: 6.16.0 - range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - expressive-code@0.44.2: - dependencies: - '@expressive-code/core': 0.44.2 - '@expressive-code/plugin-frames': 0.44.2 - '@expressive-code/plugin-shiki': 0.44.2 - '@expressive-code/plugin-text-markers': 0.44.2 - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - extend@3.0.2: {} 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: {} fast-sha256@1.3.0: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.8: {} - fastq@1.20.3: + fast-wrap-ansi@0.2.2: dependencies: - reusify: 1.1.0 + fast-string-width: 3.0.2 fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 + fflate@0.7.3: {} file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 + file-uri-to-path@1.0.0: {} find-up@5.0.0: dependencies: @@ -8034,20 +8131,24 @@ snapshots: flatted@3.4.4: {} + flattie@1.1.1: {} + + fnv1a-64@0.1.2: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + for-each@0.3.5: dependencies: is-callable: 1.2.7 - forwarded@0.2.0: {} - fresh@2.0.0: {} - fs-extra@11.4.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - fsevents@2.3.3: optional: true @@ -8067,12 +8168,12 @@ snapshots: functions-have-names@1.2.3: {} - fuzzysort@3.1.0: {} - generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.7.0: {} get-intrinsic@1.3.0: @@ -8088,8 +8189,6 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 - get-own-enumerable-keys@1.0.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8097,11 +8196,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -8112,14 +8206,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} gl-matrix@3.4.4: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -8134,6 +8228,8 @@ snapshots: globals@16.4.0: {} + globals@17.13.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -8143,12 +8239,17 @@ snapshots: graceful-fs@4.2.11: {} - gray-matter@4.0.3: + h3@1.15.11: dependencies: - js-yaml: 3.15.2 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 has-bigints@1.1.0: {} @@ -8172,19 +8273,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-from-dom@5.0.1: - dependencies: - '@types/hast': 3.0.5 - hastscript: 9.0.1 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.5 - hast-util-from-dom: 5.0.1 - hast-util-from-html: 2.0.3 - unist-util-remove-position: 5.0.0 - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.5 @@ -8205,10 +8293,6 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 - hast-util-has-property@3.0.0: - dependencies: - '@types/hast': 3.0.5 - hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -8221,22 +8305,20 @@ snapshots: dependencies: '@types/hast': 3.0.5 - hast-util-select@6.0.4: + hast-util-raw@9.1.0: dependencies: '@types/hast': 3.0.5 '@types/unist': 3.0.3 - bcp-47-match: 2.0.3 - comma-separated-tokens: 2.0.3 - css-selector-parser: 3.3.0 - devlop: 1.1.0 - direction: 2.0.1 - hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.1 - hast-util-whitespace: 3.0.0 - nth-check: 2.1.1 - property-information: 7.2.0 - space-separated-tokens: 2.0.2 + '@ungap/structured-clone': 1.4.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 zwitch: 2.0.4 hast-util-to-estree@3.1.3: @@ -8294,6 +8376,16 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-string@3.0.1: dependencies: '@types/hast': 3.0.5 @@ -8323,7 +8415,9 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.13.13: {} + hex-rgb@4.3.0: {} + + html-escaper@3.0.3: {} html-to-text@9.0.5: dependencies: @@ -8333,8 +8427,6 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 - html-url-attributes@3.0.1: {} - html-void-elements@3.0.0: {} html5parser@3.0.0: {} @@ -8346,6 +8438,8 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@4.3.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -8354,13 +8448,14 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - human-signals@2.1.0: {} - - human-signals@8.0.1: {} - - iconv-lite@0.7.3: + https-proxy-agent@7.0.6: dependencies: - safer-buffer: 2.1.2 + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} ignore@5.3.2: {} @@ -8383,11 +8478,7 @@ snapshots: hasown: 2.0.4 side-channel: 1.1.1 - ip-address@10.7.3: {} - - ipaddr.js@1.9.1: {} - - is-absolute-url@4.0.1: {} + iron-webcrypto@1.2.1: {} is-alphabetical@2.0.1: {} @@ -8419,10 +8510,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-bun-module@2.0.0: - dependencies: - semver: 7.8.5 - is-callable@1.2.7: {} is-core-module@2.17.0: @@ -8442,16 +8529,12 @@ snapshots: is-decimal@2.0.1: {} - is-docker@2.2.1: {} - - is-docker@3.0.0: {} + is-docker@4.0.0: {} is-document.all@1.0.0: dependencies: call-bound: 1.0.4 - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -8472,14 +8555,6 @@ snapshots: is-hexadecimal@2.0.1: {} - is-in-ssh@1.0.0: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@2.0.0: {} - is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -8489,16 +8564,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@7.0.0: {} - - is-obj@2.0.0: {} - - is-obj@3.0.0: {} - is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8506,8 +8573,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 - is-regexp@3.1.0: {} - is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -8516,8 +8581,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -8533,8 +8596,6 @@ snapshots: dependencies: which-typed-array: 1.1.24 - is-unicode-supported@1.3.0: {} - is-unicode-supported@2.1.0: {} is-weakmap@2.0.2: {} @@ -8548,20 +8609,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - isarray@2.0.5: {} isexe@2.0.0: {} - isexe@3.1.5: {} - iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -8575,15 +8626,12 @@ snapshots: jiti@2.7.0: {} + jose@5.10.0: {} + jose@6.2.12: {} js-tokens@4.0.0: {} - js-yaml@3.15.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -8596,25 +8644,17 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema-typed@7.0.3: {} - json-schema-typed@8.0.2: {} json-stable-stringify-without-jsonify@1.0.1: {} json-stringify-pretty-compact@4.0.0: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} jsx-ast-utils@3.3.5: dependencies: @@ -8623,30 +8663,18 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - katex@0.16.47: - dependencies: - commander: 8.3.0 - kdbush@4.1.0: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - kleur@3.0.3: {} kleur@4.1.5: {} kysely@0.29.6: {} - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - leac@0.6.0: {} levn@0.4.1: @@ -8657,36 +8685,69 @@ snapshots: lightningcss-android-arm64@1.32.0: optional: true + lightningcss-android-arm64@1.33.0: + optional: true + lightningcss-darwin-arm64@1.32.0: optional: true + lightningcss-darwin-arm64@1.33.0: + optional: true + lightningcss-darwin-x64@1.32.0: optional: true + lightningcss-darwin-x64@1.33.0: + optional: true + lightningcss-freebsd-x64@1.32.0: optional: true + lightningcss-freebsd-x64@1.33.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + lightningcss-linux-arm64-gnu@1.32.0: optional: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + lightningcss-linux-arm64-musl@1.32.0: optional: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true + lightningcss-linux-x64-gnu@1.32.0: optional: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true + lightningcss-linux-x64-musl@1.32.0: optional: true + lightningcss-linux-x64-musl@1.33.0: + optional: true + lightningcss-win32-arm64-msvc@1.32.0: optional: true + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + lightningcss-win32-x64-msvc@1.32.0: optional: true + lightningcss-win32-x64-msvc@1.33.0: + optional: true + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 @@ -8703,10 +8764,26 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - locate-path@3.0.0: + lightningcss@1.33.0: dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 locate-path@6.0.0: dependencies: @@ -8714,11 +8791,6 @@ snapshots: lodash.merge@4.6.2: {} - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -8736,16 +8808,20 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0): + magic-string@0.30.21: dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 + '@jridgewell/sourcemap-codec': 1.6.0 - magic-string@0.30.21: + magic-string@1.4.3: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + magicast@0.5.5: + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + source-map-js: 1.2.2 + maplibre-gl@6.13.0: dependencies: '@mapbox/point-geometry': 1.1.0 @@ -8775,6 +8851,12 @@ snapshots: math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + mdast-util-find-and-replace@3.0.3: dependencies: '@types/mdast': 4.0.4 @@ -8856,18 +8938,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: - dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.1.0 - mdast-util-to-markdown: 2.2.0 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -8952,16 +9022,12 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - mdn-data@2.27.1: {} - - media-typer@1.1.1: {} + mdn-data@2.0.28: {} - merge-descriptors@2.0.0: {} + mdn-data@2.27.1: {} merge-stream@2.0.0: {} - merge2@1.4.1: {} - micromark-core-commonmark@2.0.4: dependencies: decode-named-character-reference: 1.3.0 @@ -9040,16 +9106,6 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.3 - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.8 - devlop: 1.1.0 - katex: 0.16.47 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - micromark-extension-mdx-expression@3.0.1: dependencies: '@types/estree': 1.0.9 @@ -9242,11 +9298,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -9261,8 +9312,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-fn@3.1.0: {} - mimic-function@5.0.1: {} minimatch@10.2.6: @@ -9277,23 +9326,27 @@ snapshots: minipass@7.1.3: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mrmime@2.0.1: {} + ms@2.1.3: {} + muggle-string@0.4.1: {} + murmurhash-js@1.0.0: {} nanoid@3.3.20: {} nanostores@1.5.5: {} - napi-postinstall@0.3.4: {} - natural-compare@1.4.0: {} negotiator@0.6.3: {} - negotiator@1.1.0: - dependencies: - content-type: 2.1.0 + neotraverse@1.0.1: {} next@16.3.3(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: @@ -9304,7 +9357,7 @@ snapshots: postcss: 8.5.23 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.3.0) + styled-jsx: 5.1.6(react@19.3.0) optionalDependencies: '@next/swc-darwin-arm64': 16.3.3 '@next/swc-darwin-x64': 16.3.3 @@ -9320,37 +9373,9 @@ snapshots: - '@types/node' - babel-plugin-macros - next@16.4.0(@babel/core@7.29.7)(@types/node@26.6.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): - dependencies: - '@next/env': 16.4.0 - '@swc/helpers': 0.5.23 - baseline-browser-mapping: 2.11.27 - caniuse-lite: 1.0.30001815 - postcss: 8.5.23 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.3.0) - optionalDependencies: - '@next/swc-darwin-arm64': 16.4.0 - '@next/swc-darwin-x64': 16.4.0 - '@next/swc-linux-arm64-gnu': 16.4.0 - '@next/swc-linux-arm64-musl': 16.4.0 - '@next/swc-linux-x64-gnu': 16.4.0 - '@next/swc-linux-x64-musl': 16.4.0 - '@next/swc-win32-arm64-msvc': 16.4.0 - '@next/swc-win32-x64-msvc': 16.4.0 - sharp: 0.35.5(@types/node@26.6.4) - transitivePeerDependencies: - - '@babel/core' - - '@types/node' - - babel-plugin-macros - - node-emoji@2.2.0: + nlcst-to-string@4.0.0: dependencies: - '@sindresorhus/is': 4.6.0 - char-regex: 1.0.2 - emojilib: 2.4.0 - skin-tone: 2.0.0 + '@types/nlcst': 2.0.3 node-exports-info@1.6.2: dependencies: @@ -9359,19 +9384,28 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.5: {} + node-releases@2.0.57: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@3.0.0: {} npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -9388,8 +9422,6 @@ snapshots: object-keys@1.1.1: {} - object-treeify@1.1.33: {} - object.assign@4.1.7: dependencies: call-bind: 1.0.9 @@ -9413,12 +9445,6 @@ snapshots: 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 @@ -9426,22 +9452,22 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - on-finished@2.4.1: + obug@3.0.0: {} + + ofetch@1.5.1: dependencies: - ee-first: 1.1.1 + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 - once@1.4.0: + on-finished@2.4.1: dependencies: - wrappy: 1.0.2 + ee-first: 1.1.1 onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - oniguruma-parser@0.12.2: {} oniguruma-to-es@4.3.6: @@ -9450,21 +9476,6 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@11.0.4: - dependencies: - default-browser: 5.5.1 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.2.1 - wsl-utils: 1.0.1 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -9474,17 +9485,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.2.0 + os-paths@4.4.0: {} own-keys@1.0.2: dependencies: @@ -9493,28 +9494,38 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@3.0.0: + p-limit@7.3.3: dependencies: - p-limit: 2.3.0 + yocto-queue: 1.2.2 p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-try@2.2.0: {} + p-queue@9.3.5: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.2 + + p-timeout@7.0.2: {} + + package-manager-detector@1.9.0: {} + + pako@0.2.9: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 + parse-css-color@0.2.1: + dependencies: + color-name: 1.1.4 + hex-rgb: 4.3.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -9525,29 +9536,34 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-ms@4.0.0: {} + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 parse5@7.3.0: dependencies: entities: 6.0.1 + parse5@8.0.1: + dependencies: + entities: 8.1.0 + parseley@0.12.1: dependencies: leac: 0.6.0 peberminta: 0.9.0 - parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@2.0.2: @@ -9555,7 +9571,9 @@ snapshots: lru-cache: 11.5.3 minipass: 7.1.3 - path-to-regexp@8.4.2: {} + path-to-regexp@6.1.0: {} + + path-to-regexp@6.3.0: {} pathe@2.0.3: {} @@ -9565,6 +9583,8 @@ snapshots: peberminta@0.9.0: {} + piccolore@0.1.3: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9573,31 +9593,17 @@ snapshots: picospinner@3.1.2: {} - pkce-challenge@5.0.1: {} - - pkg-up@3.1.0: - dependencies: - find-up: 3.0.0 - possible-typed-array-names@1.1.0: {} postal-mime@2.7.6: {} - postcss-nested@6.2.0(postcss@8.5.29): - dependencies: - postcss: 8.5.29 - postcss-selector-parser: 6.1.4 - - postcss-selector-parser@6.1.4: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-selector-parser@7.1.6: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} + postcss@8.5.23: dependencies: nanoid: 3.3.20 @@ -9612,24 +9618,26 @@ snapshots: potpack@2.1.0: {} - powershell-utils@0.2.1: {} - prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.2.8(prettier@2.8.8): + prettier-plugin-astro@0.14.1: dependencies: - prettier: 2.8.8 + '@astrojs/compiler': 2.13.1 + prettier: 3.9.9 + sass-formatter: 0.7.9 - prettier@2.8.8: {} + prettier-plugin-tailwindcss@0.7.4(prettier-plugin-astro@0.14.1)(prettier@3.9.9): + dependencies: + prettier: 3.9.9 + optionalDependencies: + prettier-plugin-astro: 0.14.1 prettier@3.9.9: {} - pretty-ms@9.3.1: - dependencies: - parse-ms: 4.0.0 - prismjs@1.30.0: {} + process-ancestry@0.1.0: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -9645,30 +9653,13 @@ snapshots: protocol-buffers-schema@3.6.1: {} - proxy-addr@2.0.8: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - punycode@2.3.1: {} - qs@6.16.0: - dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 - - queue-microtask@1.2.3: {} - quickselect@3.0.0: {} - range-parser@1.3.0: {} + radix3@1.1.2: {} - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.3 - unpipe: 1.0.0 + range-parser@1.3.0: {} react-dom@19.3.0(react@19.3.0): dependencies: @@ -9694,50 +9685,24 @@ snapshots: normalize-path: 3.0.0 nypm: 0.6.6 picospinner: 3.1.2 - prismjs: 1.30.0 - prompts: 2.4.2 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - socket.io: 4.8.4 - tailwindcss: 4.3.3 - tsconfig-paths: 4.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - react-is@16.13.1: {} - - react-markdown@10.1.0(@types/react@19.3.0)(react@19.3.0): - dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - '@types/react': 19.3.0 - devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.6 - html-url-attributes: 3.0.1 - mdast-util-to-hast: 13.2.1 + prismjs: 1.30.0 + prompts: 2.4.2 react: 19.3.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - unified: 11.0.5 - unist-util-visit: 5.1.0 - vfile: 6.0.3 + react-dom: 19.3.0(react@19.3.0) + socket.io: 4.8.4 + tailwindcss: 4.3.3 + tsconfig-paths: 4.2.0 transitivePeerDependencies: + - bufferutil - supports-color + - utf-8-validate + + react-is@16.13.1: {} react@19.3.0: {} readdirp@5.1.1: {} - recast@0.23.21: - dependencies: - ast-types: 0.16.3 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.9 @@ -9797,27 +9762,10 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - rehype-expressive-code@0.44.2: - dependencies: - expressive-code: 0.44.2 - - rehype-external-links@3.0.0: - dependencies: - '@types/hast': 3.0.5 - '@ungap/structured-clone': 1.4.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.1.0 - - rehype-katex@7.0.1: + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.5 - '@types/katex': 0.16.8 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.47 - unist-util-visit-parents: 6.0.2 + hast-util-raw: 9.1.0 vfile: 6.0.3 rehype-recma@1.0.0: @@ -9836,12 +9784,10 @@ snapshots: hast-util-to-string: 3.0.1 unist-util-visit: 5.1.0 - remark-emoji@5.0.2: + rehype-stringify@10.0.1: dependencies: - '@types/mdast': 4.0.4 - emoticon: 4.1.0 - mdast-util-find-and-replace: 3.0.3 - node-emoji: 2.2.0 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 unified: 11.0.5 remark-gfm@4.0.1: @@ -9855,15 +9801,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-math@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 - micromark-extension-math: 3.1.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 @@ -9888,15 +9825,24 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + remark-smartypants@3.0.3: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.2.0 unified: 11.0.5 - require-from-string@2.0.2: {} + request-light@0.5.8: {} + + request-light@0.7.0: {} - reselect@5.3.0: {} + require-from-string@2.0.2: {} resend@6.32.1(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)): dependencies: @@ -9907,6 +9853,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve-protobuf-schema@2.1.0: @@ -9922,30 +9870,55 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: + retext-latin@4.0.0: dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - reusify@1.1.0: {} + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 - rou3@0.9.2: {} + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 - router@2.2.0: + retext-stringify@4.0.0: dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 - run-applescript@7.1.0: {} + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 - run-parallel@1.2.0: + rolldown@1.2.14: dependencies: - queue-microtask: 1.2.3 + '@oxc-project/types': 0.154.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 + + rou3@0.9.2: {} + + s.color@0.0.15: {} safe-array-concat@1.1.4: dependencies: @@ -9966,14 +9939,48 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safer-buffer@2.1.2: {} + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 - scheduler@0.28.0: {} + satori-html@0.3.2: + dependencies: + ultrahtml: 1.7.0 + + satori@0.32.0: + dependencies: + '@shuding/opentype.js': 1.4.0-beta.0 + css-background-parser: 0.1.0 + css-box-shadow: 1.0.0-3 + css-gradient-parser: 0.0.17 + css-to-react-native: 3.2.0 + emoji-regex-xs: 2.0.1 + escape-html: 1.0.3 + linebreak: 1.1.0 + parse-css-color: 0.2.1 + postcss-value-parser: 4.2.0 + yoga-layout: 3.2.1 - section-matter@1.0.0: + satteri@0.10.5: dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + optionalDependencies: + '@bruits/satteri-darwin-arm64': 0.10.5 + '@bruits/satteri-darwin-x64': 0.10.5 + '@bruits/satteri-linux-arm64-gnu': 0.10.5 + '@bruits/satteri-linux-arm64-musl': 0.10.5 + '@bruits/satteri-linux-x64-gnu': 0.10.5 + '@bruits/satteri-linux-x64-musl': 0.10.5 + '@bruits/satteri-wasm32-wasi': 0.10.5 + '@bruits/satteri-win32-arm64-msvc': 0.10.5 + '@bruits/satteri-win32-x64-msvc': 0.10.5 + + sax@1.6.1: {} + + scheduler@0.28.0: {} selderee@0.11.0: dependencies: @@ -9999,16 +10006,7 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - server-only@0.0.1: {} + server-destroy@1.0.1: {} set-cookie-parser@3.1.2: {} @@ -10036,46 +10034,6 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@4.21.4: - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.9 - '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@dotenvx/dotenvx': 1.75.1 - '@modelcontextprotocol/sdk': 1.32.1(zod@3.25.76) - '@shadcn/registry': 0.1.3 - '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.29.3 - cn: 0.2.6 - commander: 14.0.3 - dedent: 1.7.2 - deepmerge: 4.3.1 - diff: 8.0.4 - execa: 9.6.1 - fast-glob: 3.3.3 - fs-extra: 11.4.1 - fuzzysort: 3.1.0 - kleur: 4.1.5 - open: 11.0.4 - ora: 8.2.0 - postcss: 8.5.29 - postcss-selector-parser: 7.1.6 - prompts: 2.4.2 - recast: 0.23.21 - socks: 2.8.10 - stringify-object: 5.0.0 - ts-morph: 26.0.0 - tsconfig-paths: 4.2.0 - undici: 7.30.0 - validate-npm-package-name: 7.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) - transitivePeerDependencies: - - '@cfworker/json-schema' - - babel-plugin-macros - - supports-color - sharp@0.35.5(@types/node@26.6.4): dependencies: '@img/colour': 1.1.0 @@ -10157,15 +10115,9 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - skin-tone@2.0.0: - dependencies: - unicode-emoji-modifier-base: 1.0.0 - - smart-buffer@4.2.0: {} + smol-toml@1.9.1: {} socket.io-adapter@2.5.8: dependencies: @@ -10196,11 +10148,6 @@ snapshots: - supports-color - utf-8-validate - socks@2.8.10: - dependencies: - ip-address: 10.7.3 - smart-buffer: 4.2.0 - source-map-js@1.2.2: {} source-map-support@0.5.21: @@ -10212,11 +10159,9 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@2.0.2: {} - - sprintf-js@1.0.3: {} + source-map@0.8.0: {} - stable-hash@0.0.5: {} + space-separated-tokens@2.0.2: {} standardwebhooks@1.1.1: dependencies: @@ -10225,7 +10170,7 @@ snapshots: statuses@2.0.2: {} - stdin-discarder@0.2.2: {} + std-env@4.3.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -10238,11 +10183,12 @@ snapshots: get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string.prototype.includes@2.0.1: + string-width@8.3.0: dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + string.prototype.codepointat@0.2.1: {} string.prototype.matchall@4.1.0: dependencies: @@ -10294,28 +10240,14 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - stringify-object@5.0.0: - dependencies: - get-own-enumerable-keys: 1.0.0 - is-obj: 3.0.0 - is-regexp: 3.1.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.4.0 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} - strip-final-newline@4.0.0: {} - strip-json-comments@3.1.1: {} stubborn-fs@2.0.0: @@ -10332,12 +10264,14 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.3.0): + styled-jsx@5.1.6(react@19.3.0): dependencies: client-only: 0.0.1 react: 19.3.0 - optionalDependencies: - '@babel/core': 7.29.7 + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 supports-color@7.2.0: dependencies: @@ -10345,7 +10279,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - systeminformation@5.33.15: {} + svgo@4.1.0: + dependencies: + commander: 11.1.0 + css-select: 6.0.0 + css-tree: 3.2.1 + css-what: 7.0.0 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.1 + + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 tagged-tag@1.0.0: {} @@ -10353,7 +10299,17 @@ snapshots: tapable@2.3.3: {} - tiny-invariant@1.3.3: {} + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + tiny-inflate@1.0.3: {} + + tinyclip@1.0.3: {} tinyexec@1.3.1: {} @@ -10362,14 +10318,14 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinyqueue@3.0.0: {} + tinyps@0.5.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + tinyqueue@3.0.0: {} toidentifier@1.0.1: {} + tr46@0.0.3: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -10378,18 +10334,6 @@ snapshots: dependencies: typescript: 6.0.3 - ts-morph@26.0.0: - dependencies: - '@ts-morph/common': 0.27.0 - code-block-writer: 13.0.3 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -10419,18 +10363,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@4.41.0: {} - type-fest@5.10.0: dependencies: tagged-tag: 1.0.0 - type-is@2.1.0: - dependencies: - content-type: 2.1.0 - media-typer: 1.1.1 - mime-types: 3.0.2 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -10463,6 +10399,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.8.5 + typescript-eslint@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.71.1(@typescript-eslint/parser@8.71.1(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3))(eslint@9.39.5(jiti@2.7.0))(typescript@6.0.3) @@ -10476,8 +10418,12 @@ snapshots: typescript@6.0.3: {} + ufo@1.6.4: {} + uint8array-extras@1.6.0: {} + ultrahtml@1.7.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -10485,13 +10431,16 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@8.9.0: {} + uncrypto@0.1.3: {} - undici@7.30.0: {} + undici-types@8.9.0: {} - unicode-emoji-modifier-base@1.0.0: {} + undici@8.12.3: {} - unicorn-magic@0.3.0: {} + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 unified@11.0.5: dependencies: @@ -10503,6 +10452,13 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unifont@1.0.3: + dependencies: + css-tree: 3.2.1 + fnv1a-64: 0.1.2 + std-env: 4.3.0 + undici: 8.12.3 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -10512,6 +10468,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.3 @@ -10529,6 +10490,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 @@ -10540,36 +10505,18 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - unrs-resolver@1.12.2: + unstorage@1.17.6(@vercel/functions@3.10.1(ws@8.21.3)): dependencies: - napi-postinstall: 0.3.4 + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.3 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.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 + '@vercel/functions': 3.10.1(ws@8.21.3) update-browserslist-db@1.3.3(browserslist@4.29.3): dependencies: @@ -10581,16 +10528,12 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.7.0(react@19.3.0): - dependencies: - react: 19.3.0 - util-deprecate@1.0.2: {} - validate-npm-package-name@7.0.2: {} - vary@1.1.2: {} + verkit@0.5.0: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -10606,8 +10549,140 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vite@8.3.4(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.29 + rolldown: 1.2.14 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.6.4 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.15 + yaml: 2.9.1 + + vitefu@1.1.3(vite@8.3.4(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + optionalDependencies: + vite: 8.3.4(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + + volar-service-css@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-emmet@0.0.71(@volar/language-service@2.4.28): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-html@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.15 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-prettier@0.0.71(@volar/language-service@2.4.28)(prettier@3.9.9): + dependencies: + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + prettier: 3.9.9 + + volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-typescript@0.0.71(@volar/language-service@2.4.28): + dependencies: + path-browserify: 1.0.1 + semver: 7.8.5 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.15 + vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-yaml@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.2.0 + yaml-language-server: 1.23.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + vscode-css-languageservice@6.3.10: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.2.0 + + vscode-html-languageservice@5.6.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-jsonrpc@9.0.3: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-protocol@3.18.4: + dependencies: + vscode-jsonrpc: 9.0.3 + vscode-languageserver-types: 3.18.4 + + vscode-languageserver-textdocument@1.0.15: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver-types@3.18.4: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.2.0: {} + web-namespaces@2.0.1: {} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + when-exit@2.1.5: {} which-boxed-primitive@1.1.1: @@ -10655,41 +10730,79 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: - dependencies: - isexe: 3.1.5 - word-wrap@1.2.5: {} - wrappy@1.0.2: {} + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 ws@8.21.3: {} - wsl-utils@1.0.1: + xdg-app-paths@5.5.1: + dependencies: + os-paths: 4.4.0 + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: dependencies: - is-wsl: 3.1.1 - powershell-utils: 0.2.1 + os-paths: 4.4.0 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} yallist@3.1.1: {} - yocto-queue@0.1.0: {} + yallist@5.0.0: {} - yocto-spinner@1.2.2: + yaml-language-server@1.23.0: dependencies: - yoctocolors: 2.2.0 + '@vscode/l10n': 0.0.18 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-i18n: 4.2.0(ajv@8.20.0) + prettier: 3.9.9 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.15 + vscode-languageserver-types: 3.18.4 + vscode-uri: 3.2.0 + yaml: 2.8.3 - yoctocolors@2.2.0: {} + yaml@2.8.3: {} + + yaml@2.9.1: {} + + yargs-parser@22.0.0: {} - zod-to-json-schema@3.25.2(zod@3.25.76): + yargs@18.2.0: dependencies: - zod: 3.25.76 + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.3.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.2: {} + + yoctocolors@2.2.0: {} + + yoga-layout@3.2.1: {} zod-validation-error@4.0.2(zod@4.6.5): dependencies: zod: 4.6.5 - zod@3.25.76: {} + zod@4.1.11: {} zod@4.6.5: {} + zod@4.6.7: {} + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ba5fd7..bf0062c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,23 +4,17 @@ packages: - tooling/* catalog: - '@base-ui/react': '^1.8.0' - 'shadcn': '^4.21.4' - '@next/env': '^16.4.0' '@tailwindcss/postcss': '^4.3.3' '@types/node': '^26.6.4' '@types/react': '^19.3.0' '@types/react-dom': '^19.3.0' 'drizzle-orm': '^0.45.3' 'eslint': '^9.39.0' - 'eslint-config-next': '^16.4.0' - 'next': '^16.4.0' 'postcss': '^8.4.14' - 'prettier': '^2.8.3' - 'prettier-plugin-tailwindcss': '^0.2.1' + 'prettier': '^3.9.9' + 'prettier-plugin-tailwindcss': '^0.7.4' 'react': '^19.3.0' 'react-dom': '^19.3.0' - 'server-only': '^0.0.1' 'tailwindcss': '^4.0.0' 'typescript': '~6.0.0' 'zod': '^4.6.5' diff --git a/scripts/prepare-vercel.mjs b/scripts/prepare-vercel.mjs new file mode 100644 index 0000000..3a1e00a --- /dev/null +++ b/scripts/prepare-vercel.mjs @@ -0,0 +1,54 @@ +import { cp, mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises'; + +// Vercel reads Build Output API artifacts from the project root. The Astro +// adapter writes inside its workspace, so promote its complete output here. +const source = new URL('../apps/astro/.vercel/output/', import.meta.url); +const destination = new URL('../.vercel/output/', import.meta.url); +const config = JSON.parse( + await readFile(new URL('config.json', source), 'utf8'), +); +const rootConfig = JSON.parse( + await readFile(new URL('../vercel.json', import.meta.url), 'utf8'), +); +const imageHeaders = { 'Content-Type': 'image/png' }; +config.overrides ??= {}; +config.overrides['opengraph-image'] = { contentType: 'image/png' }; +for (const id of await readdir(new URL('static/blog/', source), { + withFileTypes: true, +})) { + if (id.isDirectory()) + config.overrides[`blog/${id.name}/opengraph-image`] = { + contentType: 'image/png', + }; +} +config.routes.unshift( + { src: '^/.*$', headers: { 'X-DNS-Prefetch-Control': 'on' }, continue: true }, + { + src: '^/(?:blog/[^/]+/)?opengraph-image$', + headers: imageHeaders, + continue: true, + }, + ...rootConfig.redirects.map(({ source: path, destination: location }) => ({ + src: `^${path}$`, + headers: { Location: location }, + status: 307, + })), +); +await rm(destination, { recursive: true, force: true }); +await mkdir(destination, { recursive: true }); +// Preserve pnpm's relative links so Node resolves transitive dependencies +// from their original .pnpm package directories inside each function. +await cp(source, destination, { recursive: true, verbatimSymlinks: true }); +// Show the authored offline fallback on an initial upstream failure while +// retaining Vercel's normal stale-page behavior on regeneration failures. +const isrPath = new URL('functions/_isr.prerender-config.json', destination); +const isr = JSON.parse(await readFile(isrPath, 'utf8')); +isr.exposeErrBody = true; +await writeFile(isrPath, JSON.stringify(isr, null, 2)); +await writeFile( + new URL('config.json', destination), + JSON.stringify(config, null, 2), +); +console.log( + 'Prepared root .vercel/output with Astro static assets, SSR, and ISR.', +); diff --git a/scripts/verify-vercel.mjs b/scripts/verify-vercel.mjs new file mode 100644 index 0000000..99557be --- /dev/null +++ b/scripts/verify-vercel.mjs @@ -0,0 +1,59 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; + +const output = new URL('../.vercel/output/', import.meta.url); +const config = JSON.parse( + await readFile(new URL('config.json', output), 'utf8'), +); +const isr = JSON.parse( + await readFile( + new URL('functions/_isr.prerender-config.json', output), + 'utf8', + ), +); +assert.equal(isr.expiration, 3600); +assert.equal(isr.exposeErrBody, true); +assert.equal(config.overrides['opengraph-image'].contentType, 'image/png'); +const functionDir = new URL('functions/_isr.func/', output); +const { handler } = JSON.parse( + await readFile(new URL('.vc-config.json', functionDir), 'utf8'), +); +const originalFetch = globalThis.fetch; +const originalWarn = console.warn; +try { + // Exercise the packaged dependency graph without live GitHub credentials or + // network access. Offline pages must remain renderable and must not be cached. + globalThis.fetch = async (input, init) => { + const url = new URL( + typeof input === 'string' || input instanceof URL ? input : input.url, + ); + if (url.hostname === 'api.github.com') + return new Response(null, { status: 403 }); + return originalFetch(input, init); + }; + console.warn = () => {}; + const { default: app } = await import(new URL(handler, functionDir).href); + for (const path of ['/', '/team']) { + const response = await app.fetch( + new Request(`https://manipalosf.org${path}`), + ); + assert.equal( + response.status, + 503, + `${path}: packaged function failed to render offline`, + ); + assert.match(response.headers.get('cache-control'), /no-store/); + const html = await response.text(); + assert.ok( + html.includes( + path === '/' ? 'statistics are unavailable' : 'Established since', + ), + ); + } +} finally { + globalThis.fetch = originalFetch; + console.warn = originalWarn; +} +console.log( + 'Verified packaged Vercel functions, offline responses, hourly ISR, and PNG content types.', +); diff --git a/tooling/eslint/astro.mjs b/tooling/eslint/astro.mjs new file mode 100644 index 0000000..405193c --- /dev/null +++ b/tooling/eslint/astro.mjs @@ -0,0 +1,4 @@ +import { defineConfig } from 'eslint/config'; +import astro from 'eslint-plugin-astro'; +import base from './base.mjs'; +export default defineConfig([...base, ...astro.configs.recommended]); diff --git a/tooling/eslint/base.mjs b/tooling/eslint/base.mjs index 0c62df1..cfc7f83 100644 --- a/tooling/eslint/base.mjs +++ b/tooling/eslint/base.mjs @@ -1,14 +1,28 @@ import { defineConfig, globalIgnores } from 'eslint/config'; -import nextTypescript from 'eslint-config-next/typescript'; - +import js from '@eslint/js'; +import ts from 'typescript-eslint'; +import globals from 'globals'; export default defineConfig([ - ...nextTypescript, globalIgnores([ '**/node_modules/**', + '**/.astro/**', '**/.next/**', + '**/next-env.d.ts', '**/.turbo/**', '**/.react-email/**', '**/dist/**', - '**/next-env.d.ts', + '**/.vercel/**', ]), + js.configs.recommended, + ...ts.configs.recommended, + { + languageOptions: { globals: { ...globals.node, ...globals.browser } }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + '@typescript-eslint/no-empty-object-type': 'off', + }, + }, ]); diff --git a/tooling/eslint/nextjs.mjs b/tooling/eslint/nextjs.mjs deleted file mode 100644 index 9bb5023..0000000 --- a/tooling/eslint/nextjs.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from 'eslint/config'; -import nextVitals from 'eslint-config-next/core-web-vitals'; -import base from './base.mjs'; - -export default defineConfig([...nextVitals, ...base]); diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index c7ca331..d546d97 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -4,13 +4,17 @@ "type": "module", "exports": { "./base": "./base.mjs", - "./nextjs": "./nextjs.mjs", - "./react": "./react.mjs" + "./react": "./react.mjs", + "./astro": "./astro.mjs" }, "dependencies": { "eslint": "catalog:", - "eslint-config-next": "catalog:", - "next": "catalog:" + "@eslint/js": "^9.39.0", + "typescript-eslint": "^8.0.0", + "globals": "^16.0.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-astro": "^2.0.0" }, "scripts": { "lint": "eslint ." diff --git a/tooling/eslint/react.mjs b/tooling/eslint/react.mjs index 5e6abfc..5e21e0b 100644 --- a/tooling/eslint/react.mjs +++ b/tooling/eslint/react.mjs @@ -1,22 +1,22 @@ import { defineConfig } from 'eslint/config'; -import next from 'eslint-config-next'; +import react from 'eslint-plugin-react'; +import hooks from 'eslint-plugin-react-hooks'; import base from './base.mjs'; - -// Reuse the installed React and Hooks rules without Next.js application rules. -const react = next.find((config) => config.name === 'next'); - export default defineConfig([ + ...base, { - ...react, - name: 'shared/react', - plugins: Object.fromEntries( - Object.entries(react.plugins).filter(([name]) => name !== '@next/next') - ), - rules: Object.fromEntries( - Object.entries(react.rules).filter( - ([name]) => !name.startsWith('@next/next/') - ) - ), + files: ['**/*.tsx'], + ...react.configs.flat.recommended, + settings: { react: { version: 'detect' } }, + rules: { + ...react.configs.flat.recommended.rules, + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + }, + }, + { + files: ['**/*.tsx'], + plugins: { 'react-hooks': hooks }, + rules: hooks.configs.recommended.rules, }, - ...base, ]); diff --git a/tooling/prettier/index.cjs b/tooling/prettier/index.cjs index 0c64122..7f7fda0 100644 --- a/tooling/prettier/index.cjs +++ b/tooling/prettier/index.cjs @@ -1,4 +1,9 @@ module.exports = { + plugins: [ + require.resolve('prettier-plugin-astro'), + require.resolve('prettier-plugin-tailwindcss'), + ], + overrides: [{ files: '*.astro', options: { parser: 'astro' } }], tabWidth: 2, useTabs: false, semi: true, diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index 9ca22af..6aa2085 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -5,7 +5,8 @@ "exports": "./index.cjs", "dependencies": { "prettier": "catalog:", - "prettier-plugin-tailwindcss": "catalog:" + "prettier-plugin-tailwindcss": "catalog:", + "prettier-plugin-astro": "^0.14.0" }, "scripts": { "lint": "eslint ." diff --git a/tooling/tailwind/package.json b/tooling/tailwind/package.json index 9e8b3a6..8086afb 100644 --- a/tooling/tailwind/package.json +++ b/tooling/tailwind/package.json @@ -10,8 +10,7 @@ "tailwindcss": "catalog:", "@tailwindcss/postcss": "catalog:", "postcss": "catalog:", - "tw-animate-css": "^1.4.0", - "shadcn": "catalog:" + "tw-animate-css": "^1.4.0" }, "scripts": { "lint": "eslint ." diff --git a/tooling/tailwind/styles.css b/tooling/tailwind/styles.css index 3d1a19c..dfd73ca 100644 --- a/tooling/tailwind/styles.css +++ b/tooling/tailwind/styles.css @@ -1,6 +1,5 @@ @import 'tailwindcss' source(none); @import 'tw-animate-css'; -@import 'shadcn/tailwind.css'; @source '../../packages/ui/src'; diff --git a/tooling/typescript/nextjs.json b/tooling/typescript/nextjs.json deleted file mode 100644 index ee20079..0000000 --- a/tooling/typescript/nextjs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./react.json", - "compilerOptions": { - "allowJs": true, - "incremental": true, - "plugins": [ - { - "name": "next" - } - ] - } -} diff --git a/tooling/typescript/package.json b/tooling/typescript/package.json index 4914606..933c04b 100644 --- a/tooling/typescript/package.json +++ b/tooling/typescript/package.json @@ -3,7 +3,6 @@ "private": true, "exports": { "./base": "./base.json", - "./nextjs": "./nextjs.json", "./react": "./react.json" }, "devDependencies": { diff --git a/turbo.json b/turbo.json index dfbfaef..d49b619 100644 --- a/turbo.json +++ b/turbo.json @@ -9,7 +9,7 @@ "RESEND_FROM_EMAIL", "GITHUB_TOKEN" ], - "globalPassThroughEnv": ["CI", "VERCEL", "VERCEL_*", "NEXT_PRIVATE_*"], + "globalPassThroughEnv": ["CI", "VERCEL", "VERCEL_*", "ASTRO_TARGET"], "tasks": { "topo": { "dependsOn": ["^topo"] @@ -20,7 +20,7 @@ }, "build": { "dependsOn": ["^build"], - "outputs": [".next/**", "!.next/cache/**"] + "outputs": ["dist/**", ".vercel/output/**", ".astro/**"] }, "lint": { "dependsOn": ["^topo"], diff --git a/vercel.json b/vercel.json index cb0f2c1..27b48a0 100644 --- a/vercel.json +++ b/vercel.json @@ -1,8 +1,48 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "framework": "nextjs", + "framework": "astro", "installCommand": "pnpm install --frozen-lockfile", - "buildCommand": "pnpm build --filter=@apps/nextjs...", - "devCommand": "pnpm --filter @apps/nextjs dev --port $PORT", - "outputDirectory": "apps/nextjs/.next" + "buildCommand": "pnpm build --filter=@apps/astro... && node scripts/prepare-vercel.mjs", + "devCommand": "pnpm --filter @apps/astro dev --port $PORT", + "redirects": [ + { + "source": "/services", + "destination": "/", + "permanent": false + }, + { + "source": "/events", + "destination": "/", + "permanent": false + } + ], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "X-DNS-Prefetch-Control", + "value": "on" + } + ] + }, + { + "source": "/opengraph-image", + "headers": [ + { + "key": "Content-Type", + "value": "image/png" + } + ] + }, + { + "source": "/blog/:uid/opengraph-image", + "headers": [ + { + "key": "Content-Type", + "value": "image/png" + } + ] + } + ] }

    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 diff --git a/apps/astro/src/components/authors/AuthorCard.astro b/apps/astro/src/components/authors/AuthorCard.astro new file mode 100644 index 0000000..649699d --- /dev/null +++ b/apps/astro/src/components/authors/AuthorCard.astro @@ -0,0 +1,82 @@ +--- +import type { Author } from '@/types/blog'; +import AuthorAvatar from './AuthorAvatar.astro'; +import BrandIcon from '@/components/common/BrandIcon.astro'; +import Globe from '@/components/icons/Globe.astro'; +import Mail from '@/components/icons/Mail.astro'; +import { iconButton } from '@/components/layout/styles'; +interface Props { + author: Author; + linkToProfile?: boolean; +} +const { author, linkToProfile = true } = Astro.props; +const Profile = linkToProfile ? 'a' : 'span'; +--- + +