commit 640e47a30549916cad3021a4f38948b861bc66bb Author: open-fox Date: Sun Aug 9 23:23:29 2026 +0800 feat: open source Mkdirs diff --git a/.cursor/rules/01-project-overview.mdc b/.cursor/rules/01-project-overview.mdc new file mode 100644 index 0000000..4577cf4 --- /dev/null +++ b/.cursor/rules/01-project-overview.mdc @@ -0,0 +1,33 @@ +# Project Overview + +Mkdirs is a directory website template that allows users to launch AI-powered directory websites in minutes. It comes packed with features like AI integration, listings, payment processing, submission forms, CMS, blog, authentication, newsletter, SEO optimization, and theming support. + +## Key Information + +- **Project Name**: Mkdirs Template +- **Website**: https://mkdirs.com +- **Documentation**: Available at https://docs.mkdirs.com +- **Tech Stack**: Next.js, Sanity CMS, TypeScript, Tailwind CSS + +## Main Features + +- AI-powered directory functionality +- Listing management +- Payment processing +- User authentication +- Content management system (Sanity) +- Blog functionality +- Newsletter integration +- SEO optimization +- Theming support + +## Project Structure + +The project follows a standard Next.js application structure with additional Sanity CMS integration: + +- `src/app`: Contains the application routes and pages +- `src/components`: Reusable React components +- `src/lib`: Utility functions and libraries +- `src/sanity`: Sanity CMS related configuration and schemas +- `src/actions`: Server actions (Next.js) +- `scripts`: Utility scripts for various operations diff --git a/.cursor/rules/02-tech-stack.mdc b/.cursor/rules/02-tech-stack.mdc new file mode 100644 index 0000000..2cab11d --- /dev/null +++ b/.cursor/rules/02-tech-stack.mdc @@ -0,0 +1,43 @@ +# Tech Stack and Architecture + +This document outlines the key technologies used in the Mkdirs template and how they work together. + +## Core Technologies + +- **Next.js**: The React framework used for building the application with server-side rendering, API routes, and server components +- **TypeScript**: Used for type-safe code across the entire codebase +- **Sanity CMS**: Headless CMS for managing content +- **Tailwind CSS**: Utility-first CSS framework for styling +- **Radix UI**: Unstyled, accessible UI components +- **NextAuth**: Authentication solution for Next.js applications +- **Stripe**: Payment processing +- **React Email**: For creating and sending emails +- **React Hook Form**: Form handling +- **Zod**: Data validation + +## File Structure + +- **package.json**: Contains all dependencies and scripts +- **next.config.mjs**: Next.js configuration +- **tailwind.config.ts**: Tailwind CSS configuration +- **sanity.config.ts**: Sanity CMS configuration +- **src/app**: Next.js app router pages and layouts +- **src/components**: Reusable UI components +- **src/lib**: Utility functions and shared code +- **src/sanity**: Sanity schema definitions and utilities + +## Key Architectural Patterns + +- **App Router**: Uses Next.js App Router for routing +- **Server Components**: Leverages React Server Components for better performance +- **Server Actions**: Uses Next.js Server Actions for server-side data mutations +- **Content Management**: Sanity CMS for structured content +- **Authentication**: Secure authentication with NextAuth +- **API Routes**: Backend functionality exposed through API routes +- **Responsive Design**: Mobile-first approach with Tailwind CSS + +## Build and Deployment + +- **Development**: `pnpm dev` for local development +- **Build**: `pnpm build` for production builds +- **Docker Support**: Includes Dockerfile for containerization diff --git a/.cursor/rules/03-app-structure.mdc b/.cursor/rules/03-app-structure.mdc new file mode 100644 index 0000000..059a9f2 --- /dev/null +++ b/.cursor/rules/03-app-structure.mdc @@ -0,0 +1,50 @@ +# Application Structure + +This document outlines the structure of the Next.js application and key entry points. + +## App Router Structure + +The application uses Next.js App Router with a split between website and Sanity Studio routes: + +- **src/app/(website)**: Public-facing website routes +- **src/app/(sanity)**: Sanity Studio admin routes +- **src/app/api**: API routes for various functionalities + +## Key Routes + +- **/**: Main landing page +- **/auth**: Authentication-related pages (sign-in, sign-up) +- **/[item|category|tag|collection]**: Directory listings pages +- **/blog**: Blog section +- **/dashboard**: User dashboard +- **/studio**: Sanity Studio CMS interface + +## Authentication + +Authentication is handled through NextAuth with various providers and credentials authentication: + +- **src/auth.ts**: Main authentication configuration +- **src/auth.config.ts**: Auth providers and callbacks + +## Components Organization + +Components are organized into several categories: + +- **UI Components**: Basic reusable UI elements +- **Layout Components**: Page layouts and structural components +- **Feature Components**: Components specific to certain features +- **Form Components**: Input and form-related components + +## Data Flow + +The application follows these data flow patterns: + +1. **Server Components**: Fetch data directly from the database/CMS +2. **Server Actions**: Handle data mutations and form submissions +3. **API Routes**: Provide data endpoints for client components +4. **Client Components**: Use hooks for client-side data fetching and state management + +## Middleware + +- **src/middleware.ts**: Handles authentication, redirects, and other middleware functionality +- **src/routes.ts**: Defines route configurations and access control diff --git a/.cursor/rules/04-sanity-integration.mdc b/.cursor/rules/04-sanity-integration.mdc new file mode 100644 index 0000000..8759d34 --- /dev/null +++ b/.cursor/rules/04-sanity-integration.mdc @@ -0,0 +1,63 @@ +# Sanity CMS Integration + +This document outlines how Sanity CMS is integrated into the Mkdirs template. + +## Configuration Files + +- **sanity.config.ts**: Main Sanity configuration file +- **sanity.cli.ts**: CLI configuration for Sanity +- **sanity-typegen.json**: Configuration for type generation +- **schema.json**: Generated Sanity schemas in JSON format +- **sanity.types.ts**: Generated TypeScript types for Sanity schemas + +## Schema Structure + +The Sanity schema is organized in the `src/sanity` directory: + +- **src/sanity/schemas**: Contains all content type definitions +- **src/sanity/lib**: Utility functions for working with Sanity +- **src/sanity/plugins**: Additional plugins for Sanity Studio +- **src/sanity/components**: Custom components in Sanity Studio + +## Content Types + +Key content types defined in the schema include: + +- **Item**: Directory listing entries +- **Category**: Listing categories +- **Tag**: Listing tags +- **Collection**: Listing collections +- **Group**: Listing category groups +- **Blog Posts**: Blog content +- **Authors**: Content creators +- **Pages**: Static page content +- **Settings**: Global site settings + +## Data Fetching + +Sanity data is fetched using GROQ queries through the following methods: + +1. **Client API**: Using the Sanity client to fetch data +2. **Next.js Data Fetching**: Server components that directly fetch Sanity data +3. **API Routes**: API endpoints that serve Sanity data + +## Preview Functionality + +The template includes a preview mode for content editing: + +- **Draft Preview**: See draft content before publishing + +## Studio Customization + +The Sanity Studio interface is customized for the Mkdirs use case: + +- **Custom Desk Structure**: Organized content editing interface +- **Custom Input Components**: Specialized input fields for directories +- **Sanity Plugins**: Additional functionality through Sanity plugins + +## Type Generation + +Types are automatically generated from Sanity schemas: + +- Run `pnpm typegen` to update TypeScript types after schema changes +- Generated types ensure type safety when working with Sanity content diff --git a/.cursor/rules/05-ai-integration.mdc b/.cursor/rules/05-ai-integration.mdc new file mode 100644 index 0000000..aca3d58 --- /dev/null +++ b/.cursor/rules/05-ai-integration.mdc @@ -0,0 +1,33 @@ +# AI Integration + +This document outlines the AI capabilities integrated into the Mkdirs template. + +## AI Providers + +The template supports multiple AI providers through AI SDK: + +- **OpenAI**: Via `@ai-sdk/openai` +- **Google AI**: Via `@ai-sdk/google` +- **DeepSeek**: Via `@ai-sdk/deepseek` + +## AI Features + +AI is integrated into various parts of the application: + +- **Content Generation**: Assist in creating listings information + +## AI Configuration + +AI providers can be configured in the application settings: + +- **API Keys**: Securely stored provider API keys +- **Model Selection**: Choose which models to use + +## Privacy and Ethics + +The AI implementation follows best practices: + +- **User Consent**: Clear disclosure of AI usage +- **Data Privacy**: No unnecessary data sharing with AI providers +- **Human Review**: Critical AI-generated content requires human approval +- **Transparency**: Clear indication of AI-generated content diff --git a/.cursor/rules/06-development-guide.mdc b/.cursor/rules/06-development-guide.mdc new file mode 100644 index 0000000..c61daac --- /dev/null +++ b/.cursor/rules/06-development-guide.mdc @@ -0,0 +1,53 @@ +# Development Guide + +This document provides guidelines for developing and contributing to the Mkdirs template. + +## Development Setup + +1. Clone the repository +2. Install dependencies with `pnpm install` +3. Set up environment variables (copy `.env.example` to `.env`) +4. Run the development server with `pnpm dev` + +## Environment Variables + +Key environment variables needed for development: + +- **NEXT_PUBLIC_SITE_URL**: Base URL of the site +- **NEXT_PUBLIC_SANITY_PROJECT_ID**: Sanity project ID +- **NEXT_PUBLIC_SANITY_DATASET**: Sanity dataset name +- **SANITY_API_TOKEN**: Sanity API token +- **NEXTAUTH_SECRET**: Secret for NextAuth +- **STRIPE_SECRET_KEY**: Stripe API secret key + +## Code Style and Linting + +The project uses Biome for code formatting and linting: + +- **biome.json**: Biome configuration +- Run `pnpm lint` to check for code style issues +- Run `pnpm format` to format the codebase + +## Scripts + +Utility scripts for common tasks: + +- **scripts**: Directory containing utility scripts +- **Batch Operations**: Scripts for batch operations on items +- **Email Export**: Tools for exporting user emails +- **Microlink Integration**: Scripts for working with microlink + +## Build and Deployment + +Steps for building and deploying the application: + +1. Run `pnpm build` to create a production build +2. Verify the build with `pnpm start` +3. Deploy to your hosting platform of choice + +### Docker Deployment + +For Docker-based deployment: + +- **Dockerfile**: Docker configuration +- **next.config.docker.mjs**: Next.js configuration for Docker diff --git a/.cursor/rules/07-best-practices.mdc b/.cursor/rules/07-best-practices.mdc new file mode 100644 index 0000000..bf9a49b --- /dev/null +++ b/.cursor/rules/07-best-practices.mdc @@ -0,0 +1,73 @@ +# Best Practices + +This document outlines best practices for working with the Mkdirs codebase. + +## Code Organization + +Follow these guidelines for code organization: + +- **Component Isolation**: Keep components focused on a single responsibility +- **Server vs. Client**: Clearly separate server and client components +- **Type Definitions**: Place shared types in the `src/types` directory +- **Utility Functions**: Extract reusable logic to the `src/lib` directory +- **Page Structure**: Maintain consistent page component structure + +## Performance Optimization + +Ensure optimal performance: + +- **Server Components**: Use React Server Components for data-fetching operations +- **Image Optimization**: Use Next.js Image component with proper sizing +- **Bundle Size**: Monitor and optimize bundle size +- **Lazy Loading**: Implement lazy loading for below-the-fold content +- **Caching Strategy**: Leverage Next.js caching capabilities + +## State Management + +Guidelines for state management: + +- **Local State**: Use React's useState for component-specific state +- **Form State**: Use React Hook Form for form state management +- **Server State**: Prefer server components over client-side data fetching +- **URL State**: Use URL parameters for shareable state +- **Context API**: Use sparingly for deeply nested shared state + +## Error Handling + +Implement robust error handling: + +- **Error Boundaries**: Use React Error Boundaries for client components +- **Form Validation**: Implement Zod validation for all forms +- **API Errors**: Handle API errors gracefully with fallbacks +- **Logging**: Log errors for debugging and monitoring +- **User Feedback**: Provide clear error messages to users + +## Accessibility + +Ensure accessibility compliance: + +- **Semantic HTML**: Use appropriate HTML elements +- **ARIA Attributes**: Add ARIA attributes where necessary +- **Keyboard Navigation**: Ensure all interactions work with keyboard +- **Color Contrast**: Maintain sufficient contrast ratios +- **Screen Readers**: Test with screen readers + +## Security Best Practices + +Follow these security guidelines: + +- **Input Validation**: Validate all user inputs server-side +- **Authentication**: Use NextAuth for secure authentication +- **Authorization**: Implement proper authorization checks +- **CSRF Protection**: Use proper CSRF tokens +- **XSS Prevention**: Sanitize user-generated content + +## Testing Strategy + +Approach to testing: + +- **Component Testing**: Test UI components in isolation +- **Integration Testing**: Test feature workflows +- **Mocking**: Mock external services in tests +- **Test Coverage**: Aim for good coverage of critical paths +- **E2E Testing**: Implement end-to-end tests for critical flows diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..73b4211 --- /dev/null +++ b/.env.example @@ -0,0 +1,114 @@ +# "http://localhost:3000" or "https://mkdirs.com" +NEXT_PUBLIC_APP_URL= + +# ----------------------------------------------------------------------------- +# Dataset & Storage (Sanity) +# ----------------------------------------------------------------------------- +# https://www.sanity.io/manage +NEXT_PUBLIC_SANITY_DATASET= +NEXT_PUBLIC_SANITY_PROJECT_ID= +SANITY_API_TOKEN= + +# ----------------------------------------------------------------------------- +# Email (Resend) +# ----------------------------------------------------------------------------- +# https://resend.com/api-keys +RESEND_API_KEY= +RESEND_EMAIL_FROM= +RESEND_EMAIL_ADMIN= +RESEND_AUDIENCE_ID= + +# ----------------------------------------------------------------------------- +# Payment (Stripe) +# ----------------------------------------------------------------------------- +STRIPE_API_KEY= +STRIPE_WEBHOOK_SECRET= +NEXT_PUBLIC_STRIPE_PRO_PRICE_ID= +NEXT_PUBLIC_STRIPE_SPONSOR_PRICE_ID= + +# ----------------------------------------------------------------------------- +# Authentication (NextAuth) +# ----------------------------------------------------------------------------- +# https://authjs.dev/getting-started/deployment#auth_secret +# Secret can be generated with `openssl rand -base64 32` +AUTH_SECRET= + +# https://authjs.dev/getting-started/authentication/oauth +# https://console.cloud.google.com/apis/credentials +AUTH_GOOGLE_ID= +AUTH_GOOGLE_SECRET= + +# https://authjs.dev/getting-started/authentication/oauth +# https://github.com/settings/developers +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= + +# https://authjs.dev/getting-started/deployment#auth_trust_host +# In a Docker environment, make sure to set either trustHost: true in your Auth.js configuration +# or the AUTH_TRUST_HOST environment variable to true. +# AUTH_TRUST_HOST=true + +# https://authjs.dev/getting-started/deployment#auth_url +# This environment variable is mostly unnecessary with v5 as the host is inferred from the request headers. +# However, if you are using a different base path, you can set this environment variable as well. +# AUTH_URL=https://demo.mkdirs.com/api/auth + +# ----------------------------------------------------------------------------- +# Analytics (OpenPanel & Google) +# ----------------------------------------------------------------------------- +# OpenPanel Analytics (https://openpanel.dev) +NEXT_PUBLIC_OPENPANEL_CLIENT_ID= + +# Google Analytics (https://analytics.google.com) +NEXT_PUBLIC_GOOGLE_ANALYTICS_ID= + +# Umami Analytics (https://umami.is) +NEXT_PUBLIC_UMAMI_WEBSITE_ID="" +NEXT_PUBLIC_UMAMI_SCRIPT="https://cloud.umami.is/script.js" + +# Plausible Analytics (https://plausible.io) +NEXT_PUBLIC_PLAUSIBLE_DOMAIN="" +NEXT_PUBLIC_PLAUSIBLE_SCRIPT="https://plausible.io/js/script.js" + +# ----------------------------------------------------------------------------- +# Notifications (discord) +# ----------------------------------------------------------------------------- +DISCORD_WEBHOOK_URL="" + +# ----------------------------------------------------------------------------- +# AI SDK (https://sdk.vercel.ai) +# default ai provider: ``, available values: `google`, `deepseek`, `openai`, `xai`, `openrouter` +# google/deepseek/xai/openrouter are tested, openai is not tested yet +# ----------------------------------------------------------------------------- +DEFAULT_AI_PROVIDER= + +# ----------------------------------------------------------------------------- +# Google Generative AI (https://aistudio.google.com/apikey) +# NOTE: if you set `DEFAULT_AI_PROVIDER=google`, you should set this API_KEY +# ----------------------------------------------------------------------------- +GOOGLE_GENERATIVE_AI_API_KEY= + +# ----------------------------------------------------------------------------- +# DeepSeek (https://platform.deepseek.com/api_keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=deepseek`, you should set this API_KEY +# ----------------------------------------------------------------------------- +DEEPSEEK_API_KEY= + +# ----------------------------------------------------------------------------- +# OpenAI (https://platform.openai.com/settings/organization/api-keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=openai`, you should set this API_KEY +# ----------------------------------------------------------------------------- +OPENAI_API_KEY= + +# ----------------------------------------------------------------------------- +# XAI (https://console.x.ai/) +# NOTE: if you set `DEFAULT_AI_PROVIDER=xai`, you should set this API_KEY +# ----------------------------------------------------------------------------- +XAI_API_KEY= + +# ----------------------------------------------------------------------------- +# OpenRouter (https://openrouter.ai/settings/keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=openrouter`, you should set this API_KEY +# ----------------------------------------------------------------------------- +OPENROUTER_API_KEY= +OPENROUTER_MODEL= diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..bc81750 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: javayhu + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..9f85240 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Mkdirs Community Support + url: https://github.com/MkdirsHQ/mkdirs/discussions + about: Please ask and answer questions here. + - name: Mkdirs Documentation + url: https://docs.mkdirs.com + about: Please check out the documentation here. + - name: Mkdirs Video Tutorials + url: https://www.youtube.com/@MkdirsHQ + about: Please check out the video tutorials here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..1feb04f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[feat]" +labels: enhancement +assignees: javayhu + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1aa3a62 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem +/.docs/ + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# idea +/.idea/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..bf8f0fe --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "biomejs.biome", + "bradlc.vscode-tailwindcss", + "eamodio.gitlens" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1361a29 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "editor.defaultFormatter": "biomejs.biome", + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "quickfix.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "search.exclude": { + "**/node_modules": true, + ".next": true, + ".content-collections": true + } +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..b1098a2 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,79 @@ +# AGENTS.md + +This file provides guidance to Code Agents (Codex, Cursor, etc.) when working with code in this repository. + +## Project Overview + +Mkdirs is a Next.js 14 directory website template with Sanity CMS, enabling AI-powered directory sites with listings, payments, authentication, blog, and newsletter features. + +## Commands + +- **Dev server**: `pnpm dev` +- **Build**: `pnpm build` +- **Start production**: `pnpm start` +- **Lint**: `pnpm lint` (Biome - checks and auto-fixes) +- **Lint with unsafe fixes**: `pnpm lint:fix` +- **Format**: `pnpm format` (Biome) +- **Generate Sanity types**: `pnpm typegen` (run after schema changes) +- **Email preview**: `pnpm email` (starts email dev server on port 3333) +- **Batch item operations**: `pnpm item:import`, `pnpm item:fetch`, `pnpm item:update`, `pnpm item:remove` +- **Batch all**: `pnpm batch` (or `pnpm batch:import`, `pnpm batch:update`, `pnpm batch:remove`) + +## Architecture + +### Route Structure (Next.js App Router) + +The app uses two top-level route groups: + +- `src/app/(website)/` - Main website with nested groups: + - `(public)/` - Public pages: home, search, item, category, tag, collection, blog, pricing + - `(protected)/` - Auth-required pages: dashboard, settings, submit, edit + - `(newsletter)/` - Newsletter unsubscribe + - `auth/` - Login, register, reset password, email verification +- `src/app/(sanity)/` - Sanity Studio admin interface (accessible at `/studio`) +- `src/app/api/` - API routes: auth, webhook (Stripe), og images, draft mode, send-email, upload-image + +### Route Protection + +`src/routes.ts` defines public routes, auth routes, and API auth prefix. `src/middleware.ts` enforces access control. Authenticated users on auth routes redirect to `/dashboard`. + +### Data Layer + +- **Sanity CMS** is the primary content store. Schemas live in `src/sanity/schemas/documents/` organized by domain: `directory/` (item, category, tag, collection, group), `blog/` (post, author), `page/`, `order/`, `auth/`, and `settings.ts`. +- **`src/data/`** contains data access functions (item.ts, blog.ts, collection.ts, user.ts, account.ts, order.ts, submission.ts, etc.) used by server components and actions. +- **`src/sanity/lib/`** has Sanity client utilities and GROQ query helpers. +- **`sanity.types.ts`** contains auto-generated TypeScript types from Sanity schemas (regenerate with `pnpm typegen`). + +### Server Actions + +`src/actions/` contains all server actions for mutations: authentication (login, register, reset), item operations (submit, edit, publish, unpublish), payment (checkout sessions, customer portal), settings, newsletter subscription, and admin operations. + +### Key Integrations + +- **Auth**: NextAuth v5 (beta.18) configured in `src/auth.ts` and `src/auth.config.ts`. Supports credentials + OAuth providers. +- **Payments**: Stripe via `src/lib/stripe.ts`, with checkout session creation in actions and webhook handling in `src/app/api/webhook/route.ts`. +- **AI**: Vercel AI SDK with multiple providers (OpenAI, Google, DeepSeek, xAI, OpenRouter) for content generation assistance. +- **Email**: React Email templates in `emails/` sent via Resend (`src/lib/mail.ts`). +- **Analytics**: OpenPanel integration (`@openpanel/nextjs`). +- **Image metadata**: Microlink (`@microlink/mql`) for fetching website screenshots/metadata. + +### Components Organization + +`src/components/` is organized by feature domain: `auth/`, `blog/`, `item/`, `category/`, `collection/`, `tag/`, `dashboard/`, `payment/`, `pricing/`, `search/`, `submit/`, `edit/`, `publish/`, `newsletter/`, `settings/`, `home/` (+ `home2/`, `home3/` variants), `layout/`, `shared/`, `icons/`, and `ui/` (shadcn/ui primitives). + +### Configuration + +- `src/config/site.ts` - Site-wide settings (name, URL, description) +- `src/config/price.ts` - Pricing plans configuration +- `src/config/dashboard.ts` - Dashboard navigation +- `src/config/hero.ts`, `footer.ts`, `faq.ts`, `marketing.ts` - Landing page sections +- `src/lib/constants.ts` - Shared constants +- `src/lib/schemas.ts` - Zod validation schemas used across forms and actions + +### Styling + +Tailwind CSS with `tailwind.config.ts`. UI primitives are Radix UI-based shadcn/ui components in `src/components/ui/`. Biome ignores `src/components/ui/*.tsx` (generated code). + +### Environment + +Copy `.env.example` to `.env`. Key variables: `NEXT_PUBLIC_SITE_URL`, `NEXT_PUBLIC_SANITY_PROJECT_ID`, `NEXT_PUBLIC_SANITY_DATASET`, `SANITY_API_TOKEN`, `NEXTAUTH_SECRET`, `STRIPE_SECRET_KEY`, Resend API key, and AI provider keys. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..109a8b8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,79 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Mkdirs is a Next.js 14 directory website template with Sanity CMS, enabling AI-powered directory sites with listings, payments, authentication, blog, and newsletter features. + +## Commands + +- **Dev server**: `pnpm dev` +- **Build**: `pnpm build` +- **Start production**: `pnpm start` +- **Lint**: `pnpm lint` (Biome - checks and auto-fixes) +- **Lint with unsafe fixes**: `pnpm lint:fix` +- **Format**: `pnpm format` (Biome) +- **Generate Sanity types**: `pnpm typegen` (run after schema changes) +- **Email preview**: `pnpm email` (starts email dev server on port 3333) +- **Batch item operations**: `pnpm item:import`, `pnpm item:fetch`, `pnpm item:update`, `pnpm item:remove` +- **Batch all**: `pnpm batch` (or `pnpm batch:import`, `pnpm batch:update`, `pnpm batch:remove`) + +## Architecture + +### Route Structure (Next.js App Router) + +The app uses two top-level route groups: + +- `src/app/(website)/` - Main website with nested groups: + - `(public)/` - Public pages: home, search, item, category, tag, collection, blog, pricing + - `(protected)/` - Auth-required pages: dashboard, settings, submit, edit + - `(newsletter)/` - Newsletter unsubscribe + - `auth/` - Login, register, reset password, email verification +- `src/app/(sanity)/` - Sanity Studio admin interface (accessible at `/studio`) +- `src/app/api/` - API routes: auth, webhook (Stripe), og images, draft mode, send-email, upload-image + +### Route Protection + +`src/routes.ts` defines public routes, auth routes, and API auth prefix. `src/middleware.ts` enforces access control. Authenticated users on auth routes redirect to `/dashboard`. + +### Data Layer + +- **Sanity CMS** is the primary content store. Schemas live in `src/sanity/schemas/documents/` organized by domain: `directory/` (item, category, tag, collection, group), `blog/` (post, author), `page/`, `order/`, `auth/`, and `settings.ts`. +- **`src/data/`** contains data access functions (item.ts, blog.ts, collection.ts, user.ts, account.ts, order.ts, submission.ts, etc.) used by server components and actions. +- **`src/sanity/lib/`** has Sanity client utilities and GROQ query helpers. +- **`sanity.types.ts`** contains auto-generated TypeScript types from Sanity schemas (regenerate with `pnpm typegen`). + +### Server Actions + +`src/actions/` contains all server actions for mutations: authentication (login, register, reset), item operations (submit, edit, publish, unpublish), payment (checkout sessions, customer portal), settings, newsletter subscription, and admin operations. + +### Key Integrations + +- **Auth**: NextAuth v5 (beta.18) configured in `src/auth.ts` and `src/auth.config.ts`. Supports credentials + OAuth providers. +- **Payments**: Stripe via `src/lib/stripe.ts`, with checkout session creation in actions and webhook handling in `src/app/api/webhook/route.ts`. +- **AI**: Vercel AI SDK with multiple providers (OpenAI, Google, DeepSeek, xAI, OpenRouter) for content generation assistance. +- **Email**: React Email templates in `emails/` sent via Resend (`src/lib/mail.ts`). +- **Analytics**: OpenPanel integration (`@openpanel/nextjs`). +- **Image metadata**: Microlink (`@microlink/mql`) for fetching website screenshots/metadata. + +### Components Organization + +`src/components/` is organized by feature domain: `auth/`, `blog/`, `item/`, `category/`, `collection/`, `tag/`, `dashboard/`, `payment/`, `pricing/`, `search/`, `submit/`, `edit/`, `publish/`, `newsletter/`, `settings/`, `home/` (+ `home2/`, `home3/` variants), `layout/`, `shared/`, `icons/`, and `ui/` (shadcn/ui primitives). + +### Configuration + +- `src/config/site.ts` - Site-wide settings (name, URL, description) +- `src/config/price.ts` - Pricing plans configuration +- `src/config/dashboard.ts` - Dashboard navigation +- `src/config/hero.ts`, `footer.ts`, `faq.ts`, `marketing.ts` - Landing page sections +- `src/lib/constants.ts` - Shared constants +- `src/lib/schemas.ts` - Zod validation schemas used across forms and actions + +### Styling + +Tailwind CSS with `tailwind.config.ts`. UI primitives are Radix UI-based shadcn/ui components in `src/components/ui/`. Biome ignores `src/components/ui/*.tsx` (generated code). + +### Environment + +Copy `.env.example` to `.env`. Key variables: `NEXT_PUBLIC_SITE_URL`, `NEXT_PUBLIC_SANITY_PROJECT_ID`, `NEXT_PUBLIC_SANITY_DATASET`, `SANITY_API_TOKEN`, `NEXTAUTH_SECRET`, `STRIPE_SECRET_KEY`, Resend API key, and AI provider keys. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e3f70e9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,61 @@ +# https://github.com/nextauthjs/next-auth-example/blob/main/Dockerfile +# syntax=docker/dockerfile:1 +FROM node:20-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies +COPY package.json pnpm-lock.yaml* ./ +RUN npm install -g pnpm && pnpm i --frozen-lockfile + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN npm install -g pnpm \ + && mv next.config.docker.mjs next.config.mjs \ + && pnpm build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 +ENV HOSTNAME "0.0.0.0" + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD ["node", "server.js"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ab143ce --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# Mkdirs + +Launch AI-powered directory websites in minutes + +[![GitHub stars](https://img.shields.io/github/stars/MkdirsHQ/mkdirs)](https://github.com/MkdirsHQ/mkdirs/stargazers) +[![License](https://img.shields.io/github/license/MkdirsHQ/mkdirs)](LICENSE) + +Mkdirs helps you launch a directory website with listings, AI-assisted +submissions, payments, authentication, CMS, blog, newsletter, SEO, themes, +and more. + +[Live Demo](https://demo.mkdirs.com) · [Documentation](https://docs.mkdirs.com) · [Installation Guide](https://docs.mkdirs.com/installation) · [Video Tutorials](https://www.youtube.com/@MkdirsHQ) · [Showcase](https://mkdirs.com/showcase) + +![Mkdirs directory website template](public/og.png) + +## Features + +- Directory listings, categories, collections, tags, and search +- AI-assisted website submission and content generation +- User authentication and dashboard +- Free, paid, and sponsored submissions with Stripe +- Sanity CMS and blog +- Email and newsletter integration with Resend +- SEO, analytics, themes, and responsive layouts +- Vercel and Docker deployment + +## Tech Stack + +Next.js, React, TypeScript, Tailwind CSS, Sanity, Auth.js, Stripe, and Resend. + +For installation, configuration, customization, deployment, and video +tutorials, visit the [Mkdirs documentation](https://docs.mkdirs.com). + +## Links + +- [Website](https://mkdirs.com) +- [Demo](https://demo.mkdirs.com) +- [Documentation](https://docs.mkdirs.com) +- [YouTube](https://www.youtube.com/@MkdirsHQ) +- [Discord](https://mksaas.link/discord) + +## License + +Licensed under the [Apache License 2.0](LICENSE). You may use, modify, and +distribute the code, including for commercial purposes, subject to the terms +of the license. + +The license does not grant permission to use the Mkdirs name, logo, or other +trademarks to identify or promote derived products. Reasonable use to describe +the origin of the software, such as “Built with Mkdirs,” is permitted. + +Copyright © Mkdirs. diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..6fdc08c --- /dev/null +++ b/biome.json @@ -0,0 +1,36 @@ +{ + "files": { + "ignore": [ + "src/components/ui/*.tsx" + ] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "ignore": [], + "attributePosition": "auto", + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 80, + "lineEnding": "lf" + }, + "javascript": { + "formatter": { + "arrowParentheses":"always", + "bracketSameLine": false, + "bracketSpacing": true, + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "semicolons": "always", + "trailingCommas": "all" + } + }, + "json": { + "formatter": { + "trailingCommas": "none" + } + }, + "organizeImports": { + "enabled": true + } +} \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..15f2b02 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/emails/approval-email.tsx b/emails/approval-email.tsx new file mode 100644 index 0000000..cb48c0f --- /dev/null +++ b/emails/approval-email.tsx @@ -0,0 +1,119 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface ApprovalEmailProps { + userName?: string; + itemLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const ApprovalEmail = ({ + userName, + itemLink, +}: ApprovalEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Your submission has been approved + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're so excited to include your product in our directory! + + + Your product has been successfully added to our directory. You can + view your listing by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +ApprovalEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as ApprovalEmailProps; + +export default ApprovalEmail; diff --git a/emails/email-formats.ts b/emails/email-formats.ts new file mode 100644 index 0000000..0f64e54 --- /dev/null +++ b/emails/email-formats.ts @@ -0,0 +1,62 @@ +export const main = { + // backgroundColor: "#f6f9fc", + // padding: "40px", + fontFamily: '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,sans-serif', +}; + +export const container = { + // backgroundColor: "#ffffff", + // padding: "20px 0 20px", +}; + +export const box = { + padding: "8px", +}; + +export const hr = { + borderColor: "#e6ebf1", + margin: "20px 0", +}; + +export const paragraph = { + color: "#525f7f", + fontSize: "16px", + lineHeight: "24px", + textAlign: "left" as const, +}; + +export const anchor = { + color: "#556cd6", +}; + +export const button = { + backgroundColor: "#656ee8", + borderRadius: "5px", + color: "#fff", + fontSize: "16px", + fontWeight: "bold", + textDecoration: "none", + textAlign: "center" as const, + display: "block", + width: "100%", + padding: "10px", +}; + +export const footer = { + width: "100%", + color: "#8898aa", + fontSize: "12px", + lineHeight: "16px", + display: "table", + tableLayout: "fixed" as const, +}; + +export const footerLeft = { + display: "table-cell", + textAlign: "left" as const, +}; + +export const footerRight = { + display: "table-cell", + textAlign: "right" as const, +}; \ No newline at end of file diff --git a/emails/newsletter-welcome.tsx b/emails/newsletter-welcome.tsx new file mode 100644 index 0000000..a27de5a --- /dev/null +++ b/emails/newsletter-welcome.tsx @@ -0,0 +1,98 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +export const NewsletterWelcomeEmail = ({ email }: { email: string }) => { + const baseUrl = getBaseUrl(); + const unsubscribeUrl = `${baseUrl}/unsubscribe?email=${encodeURIComponent(email)}`; + + return ( + + + Welcome to Mkdirs! + + +
+ Logo +
+ + Welcome to our community! We're thrilled to have you join us on + this journey of exploring cutting-edge websites and tools. + + + We value your participation and feedback. Please don't hesitate to + reach out to us if you have any questions or suggestions. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +   All Rights Reserved. + + + + + Twitter + +      + + GitHub + + + + + + If you wish to unsubscribe,{" "} + + click here + + . + + +
+
+ + + ); +}; + +export default NewsletterWelcomeEmail; + +NewsletterWelcomeEmail.PreviewProps = { + email: "support@mkdirs.com", +}; diff --git a/emails/notify-submission-to-admin.tsx b/emails/notify-submission-to-admin.tsx new file mode 100644 index 0000000..f4f2d91 --- /dev/null +++ b/emails/notify-submission-to-admin.tsx @@ -0,0 +1,99 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface NotifySubmissionEmailProps { + itemName?: string; + reviewLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const NotifySubmissionEmail = ({ + itemName, + reviewLink, +}: NotifySubmissionEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + New submission + + +
+ Logo +
+ New submission + + A new submission named {itemName} is ready to be reviewed. + + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +NotifySubmissionEmail.PreviewProps = { + itemName: "Mkdirs", + reviewLink: "https://demo.mkdirs.com", +} as NotifySubmissionEmailProps; + +export default NotifySubmissionEmail; diff --git a/emails/notify-submission-to-user.tsx b/emails/notify-submission-to-user.tsx new file mode 100644 index 0000000..a1d78ca --- /dev/null +++ b/emails/notify-submission-to-user.tsx @@ -0,0 +1,119 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface NotifySubmissionToUserEmailProps { + userName?: string; + itemName?: string; + statusLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const NotifySubmissionToUserEmail = ({ + userName, + itemName, + statusLink, +}: NotifySubmissionToUserEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Thank you for your submission + + +
+ Logo +
+ Hi {userName}, + Thank you for your submission. + + Your product named {itemName} will be reviewed in the next + 48 hours before listing on our directory. + + + You can view your submission status by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +NotifySubmissionToUserEmail.PreviewProps = { + userName: "Javayhu", + itemName: "Mkdirs", + statusLink: "https://demo.mkdirs.com", +} as NotifySubmissionToUserEmailProps; + +export default NotifySubmissionToUserEmail; diff --git a/emails/payment-success.tsx b/emails/payment-success.tsx new file mode 100644 index 0000000..52cbc08 --- /dev/null +++ b/emails/payment-success.tsx @@ -0,0 +1,123 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface PaymentSuccessEmailProps { + userName?: string; + itemLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const PaymentSuccessEmail = ({ + userName, + itemLink, +}: PaymentSuccessEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Thanks for your submission + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're so excited to include your product in our directory! + + + If you have purchased the sponsor plan, please reply to this email + to schedule when your product will be displayed. + + + Your product has been successfully added to our directory. You can + view your listing by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +PaymentSuccessEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as PaymentSuccessEmailProps; + +export default PaymentSuccessEmail; diff --git a/emails/rejection-email.tsx b/emails/rejection-email.tsx new file mode 100644 index 0000000..3496049 --- /dev/null +++ b/emails/rejection-email.tsx @@ -0,0 +1,107 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface RejectionEmailProps { + userName?: string; + dashboardLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const RejectionEmail = ({ + userName, + dashboardLink, +}: RejectionEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Your submission has been rejected + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're sorry to inform you that your product has been rejected. + + + Please check your submission and make the necessary changes. + + +
+ + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +RejectionEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as RejectionEmailProps; + +export default RejectionEmail; diff --git a/emails/reset-password.tsx b/emails/reset-password.tsx new file mode 100644 index 0000000..9672db9 --- /dev/null +++ b/emails/reset-password.tsx @@ -0,0 +1,109 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface ResetPasswordEmailProps { + userName?: string; + resetLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const ResetPasswordEmail = ({ + userName, + resetLink, +}: ResetPasswordEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Reset your password + + +
+ Logo +
+ Hi {userName}, + + Someone recently requested a password change for your account. If + this was you, you can set a new password here: + + +
+ + If you don't want to change your password or didn't + request this, just ignore and delete this message. + + + To keep your account secure, please don't forward this email + to anyone. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +ResetPasswordEmail.PreviewProps = { + userName: "Javayhu", + resetLink: "https://demo.mkdirs.com", +} as ResetPasswordEmailProps; + +export default ResetPasswordEmail; diff --git a/emails/verify-email.tsx b/emails/verify-email.tsx new file mode 100644 index 0000000..acc93c3 --- /dev/null +++ b/emails/verify-email.tsx @@ -0,0 +1,101 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface VerifyEmailProps { + confirmLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const VerifyEmail = ({ confirmLink }: VerifyEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Confirm your email address + + +
+ Logo +
+ Confirm your email address + + Thanks for starting the new account creation process. We want to + make sure it's really you. Please click the confirmation link to + continue. + + +
+ + If you don't want to create an account, you can ignore this + message. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +VerifyEmail.PreviewProps = { + confirmLink: "https://demo.mkdirs.com", +} as VerifyEmailProps; + +export default VerifyEmail; diff --git a/next.config.docker.mjs b/next.config.docker.mjs new file mode 100644 index 0000000..9305238 --- /dev/null +++ b/next.config.docker.mjs @@ -0,0 +1,52 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: "standalone", + // Configure `pageExtensions` to include markdown and MDX files + // https://nextjs.org/docs/pages/building-your-application/configuring/mdx + // pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], + + // https://nextjs.org/docs/pages/api-reference/next-config-js/reactStrictMode + // if enabled, new-verification-form will trigger twice and seems buggy in dev mode, + // but it's not a problem in production, so you can try to comment it out and let it go. + // reactStrictMode: false, + + // https://nextjs.org/docs/architecture/nextjs-compiler#remove-console + // Remove all console.* calls in production only + compiler: { + removeConsole: process.env.NODE_ENV === "production", + }, + + images: { + // https://vercel.com/docs/image-optimization/managing-image-optimization-costs#minimizing-image-optimization-costs + // vercel has limits on image optimization, 1000 images per month + unoptimized: true, + // https://medium.com/@niniroula/nextjs-upgrade-next-image-and-dangerouslyallowsvg-c934060d79f8 + // The requested resource "https://cdn.sanity.io/images/58a2mkbj/preview/xxx.svg?fit=max&auto=format" has type "image/svg+xml" + // but dangerouslyAllowSVG is disabled + dangerouslyAllowSVG: true, + remotePatterns: [ + { + protocol: "https", + hostname: "avatars.githubusercontent.com", + }, + { + protocol: "https", + hostname: "lh3.googleusercontent.com", + }, + { + protocol: "https", + hostname: "randomuser.me", + }, + { + protocol: "https", + hostname: "cdn.sanity.io", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + { + protocol: "https", + hostname: "via.placeholder.com", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + ], + }, +}; + +export default nextConfig; diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..9b5de68 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,51 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Configure `pageExtensions` to include markdown and MDX files + // https://nextjs.org/docs/pages/building-your-application/configuring/mdx + // pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], + + // https://nextjs.org/docs/pages/api-reference/next-config-js/reactStrictMode + // if enabled, new-verification-form will trigger twice and seems buggy in dev mode, + // but it's not a problem in production, so you can try to comment it out and let it go. + // reactStrictMode: false, + + // https://nextjs.org/docs/architecture/nextjs-compiler#remove-console + // Remove all console.* calls in production only + compiler: { + removeConsole: process.env.NODE_ENV === "production", + }, + + images: { + // https://vercel.com/docs/image-optimization/managing-image-optimization-costs#minimizing-image-optimization-costs + // vercel has limits on image optimization, 1000 images per month + unoptimized: true, + // https://medium.com/@niniroula/nextjs-upgrade-next-image-and-dangerouslyallowsvg-c934060d79f8 + // The requested resource "https://cdn.sanity.io/images/58a2mkbj/preview/xxx.svg?fit=max&auto=format" has type "image/svg+xml" + // but dangerouslyAllowSVG is disabled + dangerouslyAllowSVG: true, + remotePatterns: [ + { + protocol: "https", + hostname: "avatars.githubusercontent.com", + }, + { + protocol: "https", + hostname: "lh3.googleusercontent.com", + }, + { + protocol: "https", + hostname: "randomuser.me", + }, + { + protocol: "https", + hostname: "cdn.sanity.io", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + { + protocol: "https", + hostname: "via.placeholder.com", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + ], + }, +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..5e15dac --- /dev/null +++ b/package.json @@ -0,0 +1,159 @@ +{ + "name": "mkdirs", + "version": "1.0.0", + "private": true, + "description": "An open-source, AI-powered directory website template built with Next.js", + "license": "Apache-2.0", + "homepage": "https://mkdirs.com", + "repository": { + "type": "git", + "url": "https://github.com/MkdirsHQ/mkdirs.git" + }, + "author": { + "name": "Mkdirs", + "url": "https://github.com/MkdirsHQ" + }, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "biome check --write .", + "lint:fix": "biome check --fix --unsafe .", + "format": "biome format --write .", + "typegen": "sanity schema extract && sanity typegen generate", + "email": "email dev --dir emails --port 3333", + "export-user-emails": "tsx scripts/export-user-emails.ts", + "microlink:fetch": "tsx scripts/explore-microlink.ts fetch", + "microlink:insights": "tsx scripts/explore-microlink.ts insights", + "microlink:screenshot": "tsx scripts/explore-microlink.ts screenshot", + "microlink:fullpage": "tsx scripts/explore-microlink.ts fullpage", + "aisdk:fetch": "tsx scripts/explore-aisdk.ts fetch", + "aisdk:structure": "tsx scripts/explore-aisdk.ts structure", + "item:remove": "tsx scripts/batch-item.ts remove", + "item:import": "tsx scripts/batch-item.ts import", + "item:update": "tsx scripts/batch-item.ts update", + "item:fetch": "tsx scripts/batch-item.ts fetch", + "batch": "tsx scripts/batch-all.ts", + "batch:remove": "tsx scripts/batch-all.ts remove", + "batch:import": "tsx scripts/batch-all.ts import", + "batch:update": "tsx scripts/batch-all.ts update" + }, + "dependencies": { + "@ai-sdk/deepseek": "^0.1.0", + "@ai-sdk/google": "^1.0.15", + "@ai-sdk/openai": "^1.0.18", + "@ai-sdk/xai": "^1.2.16", + "@auth/core": "^0.34.2", + "@hookform/resolvers": "^3.9.0", + "@microlink/mql": "^0.13.12", + "@next/third-parties": "^15.0.3", + "@openpanel/nextjs": "^1.0.5", + "@openrouter/ai-sdk-provider": "^0.4.6", + "@opentelemetry/api": "1.8.0", + "@radix-ui/react-accessible-icon": "^1.1.0", + "@radix-ui/react-accordion": "^1.2.1", + "@radix-ui/react-alert-dialog": "^1.1.2", + "@radix-ui/react-aspect-ratio": "^1.1.0", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.1", + "@radix-ui/react-context-menu": "^2.2.2", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-hover-card": "^1.1.2", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-menubar": "^1.1.2", + "@radix-ui/react-navigation-menu": "^1.2.1", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-progress": "^1.1.0", + "@radix-ui/react-radio-group": "^1.2.1", + "@radix-ui/react-scroll-area": "^1.2.0", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-toggle-group": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.3", + "@react-email/components": "0.0.25", + "@sanity/block-content-to-markdown": "^0.0.5", + "@sanity/client": "^6.21.3", + "@sanity/code-input": "^4.1.4", + "@sanity/dashboard": "^4.0.0", + "@sanity/icons": "^3.4.0", + "@sanity/image-url": "^1.0.2", + "@sanity/preview-url-secret": "^1.6.20", + "@sanity/uuid": "^3.0.2", + "@sanity/vision": "^3.57.2", + "@sanity/visual-editing": "^2.1.9", + "@tailwindcss/typography": "^0.5.15", + "ai": "^4.0.33", + "bcryptjs": "^2.4.3", + "canvas-confetti": "^1.9.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "1.0.0", + "date-fns": "^3.6.0", + "easymde": "^2.18.0", + "glob": "^11.0.0", + "groq": "^3.55.0", + "lucide-react": "^0.414.0", + "mdast-util-toc": "^7.1.0", + "next": "14.2.35", + "next-auth": "5.0.0-beta.18", + "next-mdx-remote-client": "^1.0.3", + "next-sanity": "^9.4.5", + "next-themes": "^0.3.0", + "node-fetch": "^3.3.2", + "react": "^18.3.1", + "react-day-picker": "^9.0.8", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.3", + "react-hook-form": "^7.53.0", + "react-iframe": "^1.8.5", + "react-simplemde-editor": "^5.2.0", + "resend": "^3.5.0", + "rimraf": "^6.0.1", + "sanity": "^3.57.2", + "sanity-plugin-asset-source-unsplash": "^3.0.1", + "sanity-plugin-iframe-pane": "^3.1.6", + "sanity-plugin-internationalized-array": "^2.1.0", + "sanity-plugin-markdown": "^5.0.0", + "sanity-plugin-media": "^2.3.2", + "sonner": "^1.5.0", + "stripe": "^15.12.0", + "styled-components": "^6", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "transliteration": "^2.3.5", + "use-debounce": "^10.0.3", + "vaul": "^0.9.9", + "zod": "^3.23.8" + }, + "devDependencies": { + "@biomejs/biome": "1.9.3", + "@types/bcryptjs": "^2.4.6", + "@types/node": "^22.9.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "dotenv": "^16.4.7", + "html-loader": "^5.1.0", + "postcss": "^8.4.41", + "react-email": "3.0.1", + "rehype": "^13.0.1", + "rehype-autolink-headings": "^7.1.0", + "rehype-pretty-code": "^0.13.2", + "rehype-slug": "^6.0.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.0", + "tailwindcss": "^3.4.10", + "tsx": "^4.19.2", + "typescript": "^5.6.3", + "unist-util-visit": "^5.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1dc21bb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,16791 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ai-sdk/deepseek': + specifier: ^0.1.0 + version: 0.1.0(zod@3.23.8) + '@ai-sdk/google': + specifier: ^1.0.15 + version: 1.0.15(zod@3.23.8) + '@ai-sdk/openai': + specifier: ^1.0.18 + version: 1.0.18(zod@3.23.8) + '@ai-sdk/xai': + specifier: ^1.2.16 + version: 1.2.16(zod@3.23.8) + '@auth/core': + specifier: ^0.34.2 + version: 0.34.2 + '@hookform/resolvers': + specifier: ^3.9.0 + version: 3.9.1(react-hook-form@7.53.1(react@18.3.1)) + '@microlink/mql': + specifier: ^0.13.12 + version: 0.13.12 + '@next/third-parties': + specifier: ^15.0.3 + version: 15.0.3(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@openpanel/nextjs': + specifier: ^1.0.5 + version: 1.0.5(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@openrouter/ai-sdk-provider': + specifier: ^0.4.6 + version: 0.4.6(zod@3.23.8) + '@opentelemetry/api': + specifier: 1.8.0 + version: 1.8.0 + '@radix-ui/react-accessible-icon': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-accordion': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-aspect-ratio': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-avatar': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-context-menu': + specifier: ^2.2.2 + version: 2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.1(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.0 + version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menubar': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-navigation-menu': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.0 + version: 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.0 + version: 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toast': + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/components': + specifier: 0.0.25 + version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/block-content-to-markdown': + specifier: ^0.0.5 + version: 0.0.5 + '@sanity/client': + specifier: ^6.21.3 + version: 6.22.3(debug@4.3.7) + '@sanity/code-input': + specifier: ^4.1.4 + version: 4.1.4(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/dashboard': + specifier: ^4.0.0 + version: 4.1.0(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/icons': + specifier: ^3.4.0 + version: 3.4.0(react@18.3.1) + '@sanity/image-url': + specifier: ^1.0.2 + version: 1.1.0 + '@sanity/preview-url-secret': + specifier: ^1.6.20 + version: 1.6.21(@sanity/client@6.22.3) + '@sanity/uuid': + specifier: ^3.0.2 + version: 3.0.2 + '@sanity/vision': + specifier: ^3.57.2 + version: 3.63.0(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/visual-editing': + specifier: ^2.1.9 + version: 2.4.4(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.14) + ai: + specifier: ^4.0.33 + version: 4.0.33(react@18.3.1)(zod@3.23.8) + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + canvas-confetti: + specifier: ^1.9.3 + version: 1.9.3 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: 1.0.0 + version: 1.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + easymde: + specifier: ^2.18.0 + version: 2.18.0 + glob: + specifier: ^11.0.0 + version: 11.0.0 + groq: + specifier: ^3.55.0 + version: 3.63.0 + lucide-react: + specifier: ^0.414.0 + version: 0.414.0(react@18.3.1) + mdast-util-toc: + specifier: ^7.1.0 + version: 7.1.0 + next: + specifier: 14.2.35 + version: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: 5.0.0-beta.18 + version: 5.0.0-beta.18(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + next-mdx-remote-client: + specifier: ^1.0.3 + version: 1.0.3(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-sanity: + specifier: ^9.4.5 + version: 9.8.8(@sanity/client@6.22.3)(@sanity/icons@3.4.0(react@18.3.1))(@sanity/types@3.63.0)(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next-themes: + specifier: ^0.3.0 + version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-day-picker: + specifier: ^9.0.8 + version: 9.3.0(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-dropzone: + specifier: ^14.2.3 + version: 14.3.5(react@18.3.1) + react-hook-form: + specifier: ^7.53.0 + version: 7.53.1(react@18.3.1) + react-iframe: + specifier: ^1.8.5 + version: 1.8.5(react@18.3.1) + react-simplemde-editor: + specifier: ^5.2.0 + version: 5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resend: + specifier: ^3.5.0 + version: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + sanity: + specifier: ^3.57.2 + version: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + sanity-plugin-asset-source-unsplash: + specifier: ^3.0.1 + version: 3.0.1(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-iframe-pane: + specifier: ^3.1.6 + version: 3.1.6(@sanity/client@6.22.3)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-internationalized-array: + specifier: ^2.1.0 + version: 2.1.0(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-markdown: + specifier: ^5.0.0 + version: 5.0.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-media: + specifier: ^2.3.2 + version: 2.3.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sonner: + specifier: ^1.5.0 + version: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + stripe: + specifier: ^15.12.0 + version: 15.12.0 + styled-components: + specifier: ^6 + version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.4 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.14) + transliteration: + specifier: ^2.3.5 + version: 2.3.5 + use-debounce: + specifier: ^10.0.3 + version: 10.0.4(react@18.3.1) + vaul: + specifier: ^0.9.9 + version: 0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@biomejs/biome': + specifier: 1.9.3 + version: 1.9.3 + '@types/bcryptjs': + specifier: ^2.4.6 + version: 2.4.6 + '@types/node': + specifier: ^22.9.0 + version: 22.9.0 + '@types/react': + specifier: ^18.3.3 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.1 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + html-loader: + specifier: ^5.1.0 + version: 5.1.0(webpack@5.96.1(esbuild@0.21.5)) + postcss: + specifier: ^8.4.41 + version: 8.4.47 + react-email: + specifier: 3.0.1 + version: 3.0.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype: + specifier: ^13.0.1 + version: 13.0.2 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-pretty-code: + specifier: ^0.13.2 + version: 0.13.2(shiki@1.22.2) + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.14 + tsx: + specifier: ^4.19.2 + version: 4.19.2 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +packages: + + '@ai-sdk/deepseek@0.1.0': + resolution: {integrity: sha512-8ldXbIZOtBPNefL60Frcynr98FOrtI749/ipkAsUWfPUQ2OA4ujuGeu90wnONebkRLlxaveZS5+NFR/p3n6Tyg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/google@1.0.15': + resolution: {integrity: sha512-RiyxvjZ3h9WDj0V5OcmKU/aenP5tVtxut061tNb11KIzGANZKzryfOvp2TMx1T3bSfnjt15bsJAB8y8H6Tas3w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai-compatible@0.1.0': + resolution: {integrity: sha512-sgk8oPdnTwImR77HT+esnjoZ7Uu4V5ptXJY+w06GGRCeM3PMJowAqC7gAdYhD5DBYUo+4Gs+wvKenaPBNV0WVg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai-compatible@0.2.14': + resolution: {integrity: sha512-icjObfMCHKSIbywijaoLdZ1nSnuRnWgMEMLgwoxPJgxsUHMx0aVORnsLUid4SPtdhHI3X2masrt6iaEQLvOSFw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.0.18': + resolution: {integrity: sha512-bienqSVHbUqUcskm2FTIf2X+c481e85EASFfa78YogLqctZQtqPFKJuG5E7i59664Y5G91+LkzIh+1agS13BlA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.0.7': + resolution: {integrity: sha512-4sfPlKEALHPXLmMFcPlYksst3sWBJXmCDZpIBJisRrmwGG6Nn3mq0N1Zu/nZaGcrWZoOY+HT2Wbxla1oTElYHQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.1.0': + resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.1.10': + resolution: {integrity: sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.0.4': + resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} + engines: {node: '>=18'} + + '@ai-sdk/provider@1.0.9': + resolution: {integrity: sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==} + engines: {node: '>=18'} + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.0.9': + resolution: {integrity: sha512-7mtkgVCSzp8J4x3qk5Vtlk1FiZTH7vWIZvIrA6ISbFDy+7mwm45rIDIymzCiofzr3c/Wioy41H2Ki3Nth55bgg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + '@ai-sdk/ui-utils@1.0.8': + resolution: {integrity: sha512-7ya/t28oMaFauHxSj4WGQCEV/iicZj9qP+O+tCakMIDq7oDCZMUNBLCQomoWs16CcYY4l0wo1S9hA4PAdFcOvA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/xai@1.2.16': + resolution: {integrity: sha512-UOZT8td9PWwMi2dF9a0U44t/Oltmf6QmIJdSvrOcLG4mvpRc1UJn6YJaR0HtXs3YnW6SvY1zRdIDrW4GFpv4NA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@asamuzakjp/dom-selector@2.0.2': + resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + + '@auth/core@0.31.0': + resolution: {integrity: sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + '@auth/core@0.34.2': + resolution: {integrity: sha512-KywHKRgLiF3l7PLyL73fjLSIBe1YNcA6sMeew4yMP6cfCWGXZrkkXd32AjRi1hlJ9nvovUBGZHvbn+LijO6ZeQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.25.9': + resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.25.9': + resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.9.3': + resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.3': + resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.3': + resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@1.9.3': + resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@1.9.3': + resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@1.9.3': + resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.3': + resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@codemirror/autocomplete@6.18.2': + resolution: {integrity: sha512-wJGylKtMFR/Ds6Gh01+OovXE/pncPiKZNNBKuC39pKnH+XK5d9+WsNqcrdxPjFPFTigRBqse0rfxw9UxrfyhPg==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + + '@codemirror/commands@6.7.1': + resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==} + + '@codemirror/lang-css@6.3.0': + resolution: {integrity: sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA==} + + '@codemirror/lang-html@6.4.9': + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + + '@codemirror/lang-java@6.0.1': + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + + '@codemirror/lang-javascript@6.2.2': + resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} + + '@codemirror/lang-json@6.0.1': + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + + '@codemirror/lang-markdown@6.3.1': + resolution: {integrity: sha512-y3sSPuQjBKZQbQwe3ZJKrSW6Silyl9PnrU/Mf0m2OQgIlPoSYTtOvEL7xs94SVMkb8f4x+SQFnzXPdX4Wk2lsg==} + + '@codemirror/lang-php@6.0.1': + resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} + + '@codemirror/lang-sql@6.8.0': + resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} + + '@codemirror/language@6.10.3': + resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==} + + '@codemirror/legacy-modes@6.4.2': + resolution: {integrity: sha512-HsvWu08gOIIk303eZQCal4H4t65O/qp1V4ul4zVa3MHK5FJ0gz3qz3O55FIkm+aQUcshUOjBx38t2hPiJwW5/g==} + + '@codemirror/lint@6.8.2': + resolution: {integrity: sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g==} + + '@codemirror/search@6.5.7': + resolution: {integrity: sha512-6+iLsXvITWKHYlkgHPCs/qiX4dNzn8N78YfhOFvPtPYCkuXqZq10rAfsUMhOq7O/1VjJqdXRflyExlfVcu/9VQ==} + + '@codemirror/state@6.4.1': + resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} + + '@codemirror/theme-one-dark@6.1.2': + resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} + + '@codemirror/view@6.34.2': + resolution: {integrity: sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==} + + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/modifiers@6.0.1': + resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} + peerDependencies: + '@dnd-kit/core': ^6.0.6 + react: '>=16.8.0' + + '@dnd-kit/sortable@7.0.2': + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + peerDependencies: + '@dnd-kit/core': ^6.0.7 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/react-dom@2.0.0': + resolution: {integrity: sha512-Ke0oU3SeuABC2C4OFu2mSAwHIP5WUiV98O9YWoHV4Q5aT6E9k06DV0Khi5uYspR8xmmBk08t8ZDcz3TR3ARkEg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@hookform/resolvers@3.9.1': + resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/css@1.1.9': + resolution: {integrity: sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.4.19': + resolution: {integrity: sha512-j44kbR1QL26l6dMunZ1uhKBFteVGLVCBGNUD2sUaMnic+rbTviVuoK0CD1l9FTW31EueWvFFswCKMH7Z+M3JRA==} + + '@lezer/json@1.0.2': + resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/markdown@1.3.2': + resolution: {integrity: sha512-Wu7B6VnrKTbBEohqa63h5vxXjiC4pO5ZQJ/TDbhJxPQaaIoRD/6UVDhSDtVsCwVZV12vvN9KxuLL3ATMnlG0oQ==} + + '@lezer/php@1.0.2': + resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@microlink/mql@0.13.12': + resolution: {integrity: sha512-wPfxWngWE4Zvu6AiKjgkwToXR8xovVUmAKceAKZ8/9vFd2/pIm0Eq9BhZfKrWbLWcBFbe2rr9BoUS1SplkrPUg==} + engines: {node: '>= 18'} + + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + + '@next/env@14.2.35': + resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==} + + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-arm64@14.2.33': + resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.33': + resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-gnu@14.2.33': + resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-arm64-musl@14.2.33': + resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-gnu@14.2.33': + resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-musl@14.2.33': + resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-arm64-msvc@14.2.33': + resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.33': + resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.33': + resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/third-parties@15.0.3': + resolution: {integrity: sha512-T2NkBXLcgRY0cmE7jb/dSMXNK9D+yv1k+n0uBxwMBS9SEtOhuMvxiUPQRj5x4cFnsei6JECloJg88koMprKw0A==} + peerDependencies: + next: ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 + + '@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'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@openpanel/nextjs@1.0.5': + resolution: {integrity: sha512-+Zdrl5fC8Iczub/pVvX8Xp9q6mQvApNXGenCEkdiAZk9nT7xpaLfzkdHnwx7XHxp5H50zdwgqWDGiwLMqRWjKA==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@openpanel/sdk@1.0.0': + resolution: {integrity: sha512-FNmmfjdXoC/VHEjA+WkrQ4lyM5lxEmV7xDd57uj4E+lIS0sU3DLG2mV/dpS8AscnZbUvuMn3kPhiLCqYzuv/gg==} + + '@openpanel/web@1.0.1': + resolution: {integrity: sha512-cVZ7Kr9SicczJ/RDIfEtZs8+1iGDzwkabVA/j3NqSl8VSucsC8m1+LVbjmCDzCJNnK4yVn6tEcc9PJRi2rtllw==} + + '@openrouter/ai-sdk-provider@0.4.6': + resolution: {integrity: sha512-oUa8xtssyUhiKEU/aW662lsZ0HUvIUTRk8vVIF3Ha3KI/DnqX54zmVIuzYnaDpermqhy18CHqblAY4dDt1JW3g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@portabletext/editor@1.5.4': + resolution: {integrity: sha512-9RChHb7pAZI/iZuVrn8PW2eqRlVyJ4Wgioj/lODl6QWsrQsfJGxkDQsAd7iaHmRPnjjVaode9J3RG5y17CdW3w==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/block-tools': ^3.62.3 + '@sanity/schema': ^3.62.3 + '@sanity/types': ^3.62.3 + '@sanity/util': ^3.62.3 + react: ^16.9 || ^17 || ^18 + rxjs: ^7.8.1 + styled-components: ^6.1.13 + + '@portabletext/patches@1.1.0': + resolution: {integrity: sha512-2qn4WaRc23m5qRwclT3sAyuHwTyjxCb4Lg0BQyhp7CABd83HtnPPYoP6hycREs6HRdWA48H3sU5gqUVPoxJxdg==} + + '@portabletext/react@3.1.0': + resolution: {integrity: sha512-ZGHlvS+NvId9RSqnflN8xF2KVZgAgD399dK1GaycurnGNZGZYTd5nZmc8by1yL76Ar8n/dbVtouUDJIkO4Tupw==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + react: ^17 || ^18 || >=19.0.0-rc + + '@portabletext/toolkit@2.0.16': + resolution: {integrity: sha512-aBvnD8MscoAlEIuZBn0Aksd+oCuoMGFOT3CtHIgRBaac0Vu4YnnMUF45xo/B/T5vmwWcnDXoJEJdn+SKDg1m+A==} + engines: {node: ^14.13.1 || >=16.0.0} + + '@portabletext/types@2.0.13': + resolution: {integrity: sha512-5xk5MSyQU9CrDho3Rsguj38jhijhD36Mk8S6mZo3huv6PM+t4M/5kJN2KFIxgvt4ONpvOEs1pVIZAV0cL0Vi+Q==} + engines: {node: ^14.13.1 || >=16.0.0 || >=18.0.0} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.0.1': + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-accessible-icon@1.1.0': + resolution: {integrity: sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-accordion@1.2.1': + resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.2': + resolution: {integrity: sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.0': + resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.1': + resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.2': + resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.1': + resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.2': + resolution: {integrity: sha512-99EatSTpW+hRYHt7m8wdDlLtkmTovEe8Z/hnxUPV+SKuuNL5HWNhQI4QSdjZqNSgXHay2z4M3Dym73j9p2Gx5Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.0.5': + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dialog@1.1.2': + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.0.5': + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.2': + resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.0.1': + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.0.4': + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.2': + resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.1': + resolution: {integrity: sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.x + + '@radix-ui/react-id@1.0.1': + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.0': + resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.2': + resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.2': + resolution: {integrity: sha512-cKmj5Gte7LVyuz+8gXinxZAZECQU+N7aq5pw7kUPpx3xjnDXDbsdzHtCCD2W72bwzy74AvrqdYnKYS42ueskUQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.1': + resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.2': + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.0.4': + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.0.1': + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@1.0.3': + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.0': + resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.1': + resolution: {integrity: sha512-kdbv54g4vfRjja9DNWPMxKvXblzqbpEC8kspEkZ6dVP7kQksGCn+iZHkcCz2nb00+lPdRvxrqy4WrvvV1cNqrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.0': + resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.2': + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.0': + resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.2.1': + resolution: {integrity: sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.1': + resolution: {integrity: sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.1': + resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.2': + resolution: {integrity: sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.0': + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.0': + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.1.3': + resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-email/body@0.0.10': + resolution: {integrity: sha512-dMJyL9aU25ieatdPtVjCyQ/WHZYHwNc+Hy/XpF8Cc18gu21cUynVEeYQzFSeigDRMeBQ3PGAyjVDPIob7YlGwA==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/button@0.0.17': + resolution: {integrity: sha512-ioHdsk+BpGS/PqjU6JS7tUrVy9yvbUx92Z+Cem2+MbYp55oEwQ9VHf7u4f5NoM0gdhfKSehBwRdYlHt/frEMcg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-block@0.0.9': + resolution: {integrity: sha512-Zrhc71VYrSC1fVXJuaViKoB/dBjxLw6nbE53Bm/eUuZPdnnZ1+ZUIh8jfaRKC5MzMjgnLGQTweGXVnfIrhyxtQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-inline@0.0.4': + resolution: {integrity: sha512-zj3oMQiiUCZbddSNt3k0zNfIBFK0ZNDIzzDyBaJKy6ZASTtWfB+1WFX0cpTX8q0gUiYK+A94rk5Qp68L6YXjXQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/column@0.0.12': + resolution: {integrity: sha512-Rsl7iSdDaeHZO938xb+0wR5ud0Z3MVfdtPbNKJNojZi2hApwLAQXmDrnn/AcPDM5Lpl331ZljJS8vHTWxxkvKw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/components@0.0.25': + resolution: {integrity: sha512-lnfVVrThEcET5NPoeaXvrz9UxtWpGRcut2a07dLbyKgNbP7vj/cXTI5TuHtanCvhCddFpMDnElNRghDOfPzwUg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/container@0.0.14': + resolution: {integrity: sha512-NgoaJJd9tTtsrveL86Ocr/AYLkGyN3prdXKd/zm5fQpfDhy/NXezyT3iF6VlwAOEUIu64ErHpAJd+P6ygR+vjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/font@0.0.8': + resolution: {integrity: sha512-fSBEqYyVPAyyACBBHcs3wEYzNknpHMuwcSAAKE8fOoDfGqURr/vSxKPdh4tOa9z7G4hlcEfgGrCYEa2iPT22cw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/head@0.0.11': + resolution: {integrity: sha512-skw5FUgyamIMK+LN+fZQ5WIKQYf0dPiRAvsUAUR2eYoZp9oRsfkIpFHr0GWPkKAYjFEj+uJjaxQ/0VzQH7svVg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/heading@0.0.14': + resolution: {integrity: sha512-jZM7IVuZOXa0G110ES8OkxajPTypIKlzlO1K1RIe1auk76ukQRiCg1IRV4HZlWk1GGUbec5hNxsvZa2kU8cb9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/hr@0.0.10': + resolution: {integrity: sha512-3AA4Yjgl3zEid/KVx6uf6TuLJHVZvUc2cG9Wm9ZpWeAX4ODA+8g9HyuC0tfnjbRsVMhMcCGiECuWWXINi+60vA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/html@0.0.10': + resolution: {integrity: sha512-06uiuSKJBWQJfhCKv4MPupELei4Lepyz9Sth7Yq7Fq29CAeB1ejLgKkGqn1I+FZ72hQxPLdYF4iq4yloKv3JCg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/img@0.0.10': + resolution: {integrity: sha512-pJ8glJjDNaJ53qoM95pvX9SK05yh0bNQY/oyBKmxlBDdUII6ixuMc3SCwYXPMl+tgkQUyDgwEBpSTrLAnjL3hA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/link@0.0.10': + resolution: {integrity: sha512-tva3wvAWSR10lMJa9fVA09yRn7pbEki0ZZpHE6GD1jKbFhmzt38VgLO9B797/prqoDZdAr4rVK7LJFcdPx3GwA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/markdown@0.0.12': + resolution: {integrity: sha512-wsuvj1XAb6O63aizCLNEeqVgKR3oFjAwt9vjfg2y2oh4G1dZeo8zonZM2x1fmkEkBZhzwSHraNi70jSXhA3A9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview@0.0.11': + resolution: {integrity: sha512-7O/CT4b16YlSGrj18htTPx3Vbhu2suCGv/cSe5c+fuSrIM/nMiBSZ3Js16Vj0XJbAmmmlVmYFZw9L20wXJ+LjQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/render@0.0.16': + resolution: {integrity: sha512-wDaMy27xAq1cJHtSFptp0DTKPuV2GYhloqia95ub/DH9Dea1aWYsbdM918MOc/b/HvVS3w1z8DWzfAk13bGStQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@react-email/render@1.0.1': + resolution: {integrity: sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/row@0.0.10': + resolution: {integrity: sha512-jPyEhG3gsLX+Eb9U+A30fh0gK6hXJwF4ghJ+ZtFQtlKAKqHX+eCpWlqB3Xschd/ARJLod8WAswg0FB+JD9d0/A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/section@0.0.14': + resolution: {integrity: sha512-+fYWLb4tPU1A/+GE5J1+SEMA7/wR3V30lQ+OR9t2kAJqNrARDbMx0bLnYnR1QL5TiFRz0pCF05SQUobk6gHEDQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/tailwind@0.1.0': + resolution: {integrity: sha512-qysVUEY+M3SKUvu35XDpzn7yokhqFOT3tPU6Mj/pgc62TL5tQFj6msEbBtwoKs2qO3WZvai0DIHdLhaOxBQSow==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/text@0.0.10': + resolution: {integrity: sha512-wNAnxeEAiFs6N+SxS0y6wTJWfewEzUETuyS2aZmT00xk50VijwyFRuhm4sYSjusMyshevomFwz5jNISCxRsGWw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@reduxjs/toolkit@1.9.7': + resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@rexxars/react-json-inspector@8.0.1': + resolution: {integrity: sha512-XAsgQwqG8fbDGpWnsvOesRMgPfvwuU7Cx3/cUf/fNIRmGP8lj2YYIf5La/4ayvZLWlSw4tTb4BPCKdmK9D8RuQ==} + peerDependencies: + react: ^15 || ^16 || ^17 || ^18 + + '@rexxars/react-split-pane@0.1.93': + resolution: {integrity: sha512-Pok8zATwd5ZpWnccJeSA/JM2MPmi3D04duYtrbMNRgzeAU2ANtq3r4w7ldbjpGyfJqggqn0wDNjRqaevXqSxQg==} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@sanity/asset-utils@2.1.0': + resolution: {integrity: sha512-++d7UEnu72eKpBBozXAFwBgsGs/AEB4uc3a3BDin9l/aomdTtI2vJQJhcriQQvUeqJnTTF3Cxa5zl/V1vau/PA==} + engines: {node: '>=18'} + + '@sanity/bifur-client@0.4.1': + resolution: {integrity: sha512-mHM8WR7pujbIw2qxuV0lzinS1izOoyLza/ejWV6quITTLpBhUoPIQGPER3Ar0SON5JV0VEEqkJGa1kjiYYgx2w==} + + '@sanity/block-content-to-hyperscript@2.0.10': + resolution: {integrity: sha512-xT3iEmZkK0fvO5PDFpn9GMWGfvOopvbrRCBU48XxpFoTxRrfsHhxbRy8J0eND1HGXHUENkIKv5jbohtGd1MiVg==} + + '@sanity/block-content-to-markdown@0.0.5': + resolution: {integrity: sha512-wnBfusG67TU2+MXcDSNDtEdE5MMYXQ9t5hHtU+0dQ2MUHPbF6FfX0nfX0IvjfNWGpMEniCOtmJR0k71maO9zYA==} + + '@sanity/block-tools@3.63.0': + resolution: {integrity: sha512-aKi2KYMKeHTDcgeifIrnLfQmp/h2k4XKG+rLwp7hLy5inaUU5U/DCPrp5o7fQaRrrIUSXoRnE6E0KNPU2CD+RQ==} + + '@sanity/cli@3.63.0': + resolution: {integrity: sha512-Q2iuJl0xVEup49sSJsbFst0NNGG7nGYE9Cw592NZSotmzoPVppYfgYEuih04TT7WMl0IlYs7pWL2DHtDJnsX5A==} + engines: {node: '>=18'} + hasBin: true + + '@sanity/client@6.22.3': + resolution: {integrity: sha512-CJDUXPdw4q6VtdUmKbkH8D4iRqYIfIPNQ4U2Y1jzjez7NORnflX1vfgfMLSkNMc9xoK0xji4qhQgvcQHUNh4Lw==} + engines: {node: '>=14.18'} + + '@sanity/code-input@4.1.4': + resolution: {integrity: sha512-MQfZ6r0SdEtYiuhfMtFe54D+4pVIQzDa67nFQhM1D4hQJVt7yL+OBukGbcOK9Kx1PjKkb4Gog//AMoN7a90b9g==} + engines: {node: '>=14'} + peerDependencies: + react: ^18 + react-dom: ^18 + sanity: ^3 + styled-components: ^5.2 || ^6 + + '@sanity/codegen@3.63.0': + resolution: {integrity: sha512-Cf+S+uIcDmcoisgOANzjT4er1NvBnk0gD1FjPKewkixCNX4kp4Pciea4zMGCXMj/BPvviuclL83thNIYnMZqlw==} + engines: {node: '>=18'} + + '@sanity/color@2.2.5': + resolution: {integrity: sha512-tTi22KoKuER3sldXYl4c1Dq2zU7tMLDkljFiaUKVkBbu4PBvRGCFw75kXZnD2b4Bsp6vin+7sI+AKdCKRhfRuw==} + + '@sanity/color@3.0.6': + resolution: {integrity: sha512-2TjYEvOftD0v7ukx3Csdh9QIu44P2z7NDJtlC3qITJRYV36J7R6Vfd3trVhFnN77/7CZrGjqngrtohv8VqO5nw==} + engines: {node: '>=18.0.0'} + + '@sanity/comlink@1.1.1': + resolution: {integrity: sha512-hmjL8X9/muInbO4Fko6rn9WOZhZWMPKz5n3FHttb/KurKaHbkhcon/jIkZ8DowxW75wkUDp8m/nkBZznJ58HIA==} + engines: {node: '>=18'} + + '@sanity/dashboard@4.1.0': + resolution: {integrity: sha512-0II6Ay/RB31Uneg12PvER2wdq20laxjBpZxQ3wRFwjGC98F8zBfPLUTl/Z8CzanZX7i+IaiepzVPRvSwflPzHg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + sanity: ^3 + styled-components: ^6.1 + + '@sanity/diff-match-patch@3.1.1': + resolution: {integrity: sha512-dSZqGeYjHKGIkqAzGqLcG92LZyJGX+nYbs/FWawhBbTBDWi21kvQ0hsL3DJThuFVWtZMWTQijN3z6Cnd44Pf2g==} + engines: {node: '>=14.18'} + + '@sanity/diff@3.63.0': + resolution: {integrity: sha512-C2l6D1fvle6YaxuJLjGBLq3K9U8dQPu9zVjJcoMZ/QeIDu6Wv+ZNfwuilCZeY5H4yv4UbG4YE2wNo/JAWvflaw==} + engines: {node: '>=18'} + + '@sanity/eventsource@5.0.2': + resolution: {integrity: sha512-/B9PMkUvAlUrpRq0y+NzXgRv5lYCLxZNsBJD2WXVnqZYOfByL9oQBV7KiTaARuObp5hcQYuPfOAVjgXe3hrixA==} + + '@sanity/export@3.41.0': + resolution: {integrity: sha512-mqb6HvzjNGh3J4zjT4hOPh4ZTPOVwYsS5DJ3v24S5uETlIodMmDlY/DBmudlZmQxqoWqqX/hsVxKC0WskuPsYg==} + engines: {node: '>=18'} + + '@sanity/generate-help-url@0.140.0': + resolution: {integrity: sha512-H/G/WA9S22TXcXST52CIiTsHx3S2hH0gvK7LnI5w76vfKS0obnDPh8jrPg4xeNRYGPuV9MHYRlyERGpRGoo4Qw==} + + '@sanity/generate-help-url@3.0.0': + resolution: {integrity: sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA==} + + '@sanity/icons@1.3.10': + resolution: {integrity: sha512-5wVG/vIiGuGrSmq+Bl3PY7XDgQrGv0fyHdJI64FSulnr2wH3NMqZ6C59UFxnrZ93sr7kOt0zQFoNv2lkPBi0Cg==} + peerDependencies: + react: ^16.9 || ^17 || ^18 + + '@sanity/icons@2.11.8': + resolution: {integrity: sha512-C4ViXtk6eyiNTQ5OmxpfmcK6Jw+LLTi9zg9XBUD15DzC4xTHaGW9SVfUa43YtPGs3WC3M0t0K59r0GDjh52HIg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 + + '@sanity/icons@3.4.0': + resolution: {integrity: sha512-X8BMM68w3y5cuCLpPwV7jGhVNGgAL/FA3UI6JaRCsyVOahA6aBOeKdjFs5MHtKi8cmrKwq1a98h/HbrK56kszA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18.3 || >=19.0.0-rc + + '@sanity/image-url@0.140.22': + resolution: {integrity: sha512-CAmQZnj+KM7FSEYiWlIGDit072syicYuAw0w7R2ctMzHiZ4p9mE/g6dBnYqrqFUrw2J+GpJgPt+RVspKP8vdqA==} + engines: {node: '>=10.0.0'} + + '@sanity/image-url@1.1.0': + resolution: {integrity: sha512-JHumVRxzzaZAJyOimntdukA9TjjzsJiaiq/uUBdTknMLCNvtM6KQ5OCp6W5fIdY78uyFxtQjz+MPXwK8WBIxWg==} + engines: {node: '>=10.0.0'} + + '@sanity/import@3.37.8': + resolution: {integrity: sha512-YsVhGaHNXJWv2L3ukRjJ9r5kM4VPG0cYtAvu0eellFPOZ5BeeuUFWOjFI1tPhG9nhTUVHWuL0nc6EHgt7k/LbQ==} + engines: {node: '>=18'} + hasBin: true + + '@sanity/incompatible-plugin@1.0.4': + resolution: {integrity: sha512-2z39G9PTM8MXOF4fJNx3TG4tH0RrTjtH6dVLW93DSjCPbIS7FgCY5yWjZfQ+HVkwhLsF7ATDAGLA/jp65pFjAg==} + peerDependencies: + react: ^16.9 || ^17 || ^18 + react-dom: ^16.9 || ^17 || ^18 + + '@sanity/insert-menu@1.0.10': + resolution: {integrity: sha512-tFfjP7IA9QjD5flSwILUNjQKh4Vrq+E1Z5e0gBtPCRFHTde0VRrfiiX/qTr0IPYREo3MOhIBZbriJScBeGuMfg==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@sanity/types': ^3.62.2 + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + react-is: ^18.3 || >=19.0.0-rc + + '@sanity/language-filter@4.0.2': + resolution: {integrity: sha512-guL7vZv/QwDdbzVbCA8YqY8G0tH6KW2obyp5UCbFvFy9NqlmfuaHtle/VIO+UwqbCXck2Xpz0WihFeQHHjhCcw==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^2.1.0 + '@sanity/util': ^3.36.4 + react: ^18 + react-dom: ^18 + sanity: ^3.36.4 + styled-components: ^6.1 + + '@sanity/logos@2.1.13': + resolution: {integrity: sha512-PKAbPbM4zn+6wHYjCVwuhmlZnFqyZ9lT/O7OT3BVd2SGAqXoZTimfBOHrVPifytuazdoQ1T2M5eYJTtW/VXLyA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@sanity/color': ^2.0 || ^3.0 || ^3.0.0-beta + react: ^18.3 || >=19.0.0-rc + + '@sanity/migrate@3.63.0': + resolution: {integrity: sha512-my20wlhw89LX1fkAgwvF/+XyoqnbMX/31NFCWVmqlHfkO/oU3XwGWLsLgJBXL6FMvGUoDJUiXFV9/sjsGLiaHg==} + engines: {node: '>=18'} + + '@sanity/mutate@0.10.1': + resolution: {integrity: sha512-yjRBoscacw4hl4c3UF/BhOCTUOjGDRP2u7biF/ALsgAOnMhUDlLA1OtDz3op7oyz4Yp30QydnlrtR3ha/Una5g==} + engines: {node: '>=18'} + + '@sanity/mutate@0.10.1-canary.5': + resolution: {integrity: sha512-ce5xQJhqvbFnYejUEUlpR8VNq9RqMYYnasVdtZPBoD2gJpHpwSMXhpvWHcZM3gtNDcQEkHT/ttPDluMghbF8aw==} + engines: {node: '>=18'} + peerDependencies: + xstate: ^5.18.2 + peerDependenciesMeta: + xstate: + optional: true + + '@sanity/mutator@3.63.0': + resolution: {integrity: sha512-eF9JBlqWuXEXJAsC/7AvhAINgNrMHld1I1JCAaOtLoL7jAJSyWqB5ObtBjLADEkvE+z6KPJUDiaC0JKx6YjO3A==} + + '@sanity/next-loader@1.1.0': + resolution: {integrity: sha512-3Mx0shumgM+oS0o4xmEk7JEv72rskefkhDHQtwhpvsklWVDPy95fNKMo5PC/ndSGQ5SctlZGpPPvnDOm511P0A==} + engines: {node: '>=18.18'} + peerDependencies: + '@sanity/client': ^6.22.2 + next: ^14.1 || ^15.0.0-0 + react: ^18.3 || ^19.0.0-0 + + '@sanity/presentation@1.17.8': + resolution: {integrity: sha512-vMwXSLa7W4rvXMPNq47yBsEdszuH1Jyhd0pRUTvAd+BnpsO72ThYfSsv+qwieB2IePSooXn0Fkbb8mWunv39Sg==} + engines: {node: '>=16.14'} + peerDependencies: + '@sanity/client': ^6.22.2 + + '@sanity/preview-kit-compat@1.5.14': + resolution: {integrity: sha512-6Fzi/Srp5fgW9C1/ifbATIm0o8kOX2irPoftcrvNy5UP1J6kXdePFwpXoo+wCjyOFMPTzPzykWuoaymnXp2dKA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + react: ^18.3 || >=19.0.0-rc + + '@sanity/preview-kit@5.1.10': + resolution: {integrity: sha512-tFl9K5LnCo9RWBR7nz2vac6wacOg4jckMUcm32gDa486hN65I0jTWT6sWvwhtAYL/ny82sHsLKjHfx7ct4qxHw==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + react: ^18.0.0 || >=19.0.0-rc + peerDependenciesMeta: + react: + optional: true + + '@sanity/preview-url-secret@1.6.21': + resolution: {integrity: sha512-ZAIT4I5Nrsax+RBQVhSBY4PnnHgaI+eybSd5aHhjZi97+ziMTtTLnL1Hsg+ViLtPqJWwX0GiB0l8nSfGAt7+QA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.21.3 + + '@sanity/preview-url-secret@2.0.0': + resolution: {integrity: sha512-JfStdSb8KT0RzePtGbUIZewNNHNNbvYHwsW4WzYEmgPTfgZnPAIMFYUFSHAKKFyKQ3tqzARRQm3uURpoSTyIkA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + + '@sanity/schema@3.63.0': + resolution: {integrity: sha512-Hvnk3NQWuEoms3xBUXQkiL5GSRWtCetZO7t0pKyoPMyKNkAhEfR8KuwISxEM1sLwlwR24ogYVPh4xJymBn7aaw==} + + '@sanity/telemetry@0.7.9': + resolution: {integrity: sha512-TBBRK2SUwiNND+ZJPwdWSu8tbEjdIz7UjagmCCBBWcfXtDKXXlWawC/DOEWuI4Q+WcA5OWLDjboxZT4ApWjVbw==} + engines: {node: '>=16.0.0'} + peerDependencies: + react: ^18.2 || >=19.0.0-rc + + '@sanity/types@3.37.2': + resolution: {integrity: sha512-1EfKkNlJ86wIDtc7oFHb79JI8lKDOxKDYrkmwhvuHgJY83GpSABc1kFdbwAtWZfrWVWyqVXUv/KlNwA3b99y/g==} + + '@sanity/types@3.63.0': + resolution: {integrity: sha512-d7Qbd07mzbvI6bEfb4j7LnDH5dAf5nwEyYPj+e8tHjlPYzyoutKQ5wmTU8rNqTmg4PiuvNYyDo6zWcEVrUW8Vw==} + + '@sanity/ui@1.9.3': + resolution: {integrity: sha512-AdWEVFaK0Snk6xxP0lGPVP3QQYKwzkfGFpFZnL9d6UtWt8yeuS8BMLVAzmXzg14hrqH50ex9nvNl3eq6a0MWiw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 + react-dom: ^18 + react-is: ^18 + styled-components: ^5.2 || ^6 + + '@sanity/ui@2.8.19': + resolution: {integrity: sha512-3o5yQJXzTtXSRCptinYqPP8ME2+vatN7q42bSB96T45viX1tVHETGR3s2KCQCLFskdCHSwC3gsPLl8RbTZQmDw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 || >=19.0.0-0 + react-dom: ^18 || >=19.0.0-0 + react-is: ^18 || >=19.0.0-0 + styled-components: ^5.2 || ^6 + + '@sanity/util@3.37.2': + resolution: {integrity: sha512-hq0eLjyV2iaOm9ivtPw12YTQ4QsE3jnV/Ui0zhclEhu8Go5JiaEhFt2+WM2lLGRH6qcSA414QbsCNCcyhJL6rA==} + engines: {node: '>=18'} + + '@sanity/util@3.63.0': + resolution: {integrity: sha512-AZLrGMMhNUFRKohEjTWkWFgUVHcokBC+NXxGsJl2NKU9iabwb1OFrnaOskjskLpF8SQ4cs34YoH3ydB+k4zZ2g==} + engines: {node: '>=18'} + + '@sanity/uuid@3.0.2': + resolution: {integrity: sha512-vzdhqOrX7JGbMyK40KuIwwyXHm7GMLOGuYgn3xlC09e4ZVNofUO5mgezQqnRv0JAMthIRhofqs9f6ufUjMKOvw==} + + '@sanity/vision@3.63.0': + resolution: {integrity: sha512-mDd3HcgYlP9g9dmTHLkc/kwHhLJ2yGksVTYne3f9mse7cE2Dp6ImAIANmkNVI6LR+X08PRjGtAeVL+ua465yEA==} + peerDependencies: + react: ^18 + styled-components: ^6.1 + + '@sanity/visual-editing@2.4.2': + resolution: {integrity: sha512-HyvDmc33U27jMm/b7AUxShtdbJaXtE2FzSh3DAC4bbWq59iGoSbHTHRWq7xIZpWVH76xgkLh+RgVsyr8lI/+8g==} + engines: {node: '>=18'} + peerDependencies: + '@remix-run/react': '>= 2' + '@sanity/client': ^6.22.2 + '@sveltejs/kit': '>= 2' + next: '>= 13 || >=14.3.0-canary.0 <14.3.0 || >=15.0.0-rc' + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + svelte: '>= 4' + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sanity/client': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + svelte: + optional: true + + '@sanity/visual-editing@2.4.4': + resolution: {integrity: sha512-pNR63Q7Zc7eaASr3zocfZUYRErmmE129t1V6ybKpxiqIcMIkSUIgYA66mEcYTRJuiAtv+bPJ8Izg3Cni7I80rQ==} + engines: {node: '>=18'} + peerDependencies: + '@remix-run/react': '>= 2' + '@sanity/client': ^6.22.2 + '@sveltejs/kit': '>= 2' + next: '>= 13 || >=14.3.0-canary.0 <14.3.0 || >=15.0.0-rc' + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + svelte: '>= 4' + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sanity/client': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + svelte: + optional: true + + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + + '@sentry-internal/browser-utils@8.37.1': + resolution: {integrity: sha512-OSR/V5GCsSCG7iapWtXCT/y22uo3HlawdEgfM1NIKk1mkP15UyGQtGEzZDdih2H+SNuX1mp9jQLTjr5FFp1A5w==} + engines: {node: '>=14.18'} + + '@sentry-internal/feedback@8.37.1': + resolution: {integrity: sha512-Se25NXbSapgS2S+JssR5YZ48b3OY4UGmAuBOafgnMW91LXMxRNWRbehZuNUmjjHwuywABMxjgu+Yp5uJDATX+g==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay-canvas@8.37.1': + resolution: {integrity: sha512-1JLAaPtn1VL5vblB0BMELFV0D+KUm/iMGsrl4/JpRm0Ws5ESzQl33DhXVv1IX/ZAbx9i14EjR7MG9+Hj70tieQ==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay@8.37.1': + resolution: {integrity: sha512-E/Plhisk/pXJjOdOU12sg8m/APTXTA21iEniidP6jW3/+O0tD/H/UovEqa4odNTqxPMa798xHQSQNt5loYiaLA==} + engines: {node: '>=14.18'} + + '@sentry/browser@8.37.1': + resolution: {integrity: sha512-5ym+iGiIpjIKKpMWi9S3/tXh9xneS+jqxwRTJqed3cb8i4ydfMAAP8sM3U8xMCWWABpWyIUW+fpewC0tkhE1aQ==} + engines: {node: '>=14.18'} + + '@sentry/core@8.37.1': + resolution: {integrity: sha512-82csXby589iDupM3VgCHJeWZagUyEEaDnbFcoZ/Z91QX2Sjq8FcF5OsforoXjw09i0XTFqlkFAnQVpDBmMXcpQ==} + engines: {node: '>=14.18'} + + '@sentry/react@8.37.1': + resolution: {integrity: sha512-HanDqBFTgIUhUsYztAHhSti+sEhQ8YopAymXgnpqkJ7j1PLHXZgQAre6M4Uvixu28WS5MDHC1onnAIBDgYRDYw==} + engines: {node: '>=14.18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/types@8.37.1': + resolution: {integrity: sha512-ryMOTROLSLINKFEbHWvi7GigNrsQhsaScw2NddybJGztJQ5UhxIGESnxGxWCufBmWFDwd7+5u0jDPCVUJybp7w==} + engines: {node: '>=14.18'} + + '@sentry/utils@8.37.1': + resolution: {integrity: sha512-Qtn2IfpII12K17txG/ZtTci35XYjYi4CxbQ3j7nXY7toGv/+MqPXwV5q2i9g94XaSXlE5Wy9/hoCZoZpZs/djA==} + engines: {node: '>=14.18'} + + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + + '@tanem/react-nprogress@5.0.52': + resolution: {integrity: sha512-ncDcnDS/vm79sqPmBmeslA5TeA3+7VMmLgo6SPkjmRivHmImV/5DqzcbCltopkpadZ5/mSyCCPoQEi1bvU/VMQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/react-table@8.20.5': + resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/react-virtual@3.0.0-beta.54': + resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + engines: {node: '>=12'} + + '@tanstack/virtual-core@3.0.0-beta.54': + resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/codemirror@5.60.15': + resolution: {integrity: sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/event-source-polyfill@1.0.5': + resolution: {integrity: sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==} + + '@types/eventsource@1.1.15': + resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==} + + '@types/follow-redirects@1.14.4': + resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash.isequal@4.5.8': + resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} + + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + + '@types/marked@4.3.2': + resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/progress-stream@2.0.5': + resolution: {integrity: sha512-5YNriuEZkHlFHHepLIaxzq3atGeav1qCTGzB74HKWpo66qjfostF+rHc785YYYHeBytve8ZG3ejg42jEIfXNiQ==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-copy-to-clipboard@5.0.7': + resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} + + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + + '@types/react-is@18.3.0': + resolution: {integrity: sha512-KZJpHUkAdzyKj/kUHJDc6N7KyidftICufJfOFpiG6haL/BDQNQt5i4n1XDUL/nDZAtGLHDSWRYpLzKTAKSvX6w==} + + '@types/react-redux@7.1.34': + resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/shallow-equals@1.0.3': + resolution: {integrity: sha512-xZx/hZsf1p9J5lGN/nGTsuW/chJCdlyGxilwg1TS78rygBCU5bpY50zZiFcIimlnl0p41kAyaASsy0bqU7WyBA==} + + '@types/speakingurl@13.0.6': + resolution: {integrity: sha512-ywkRHNHBwq0mFs/2HRgW6TEBAzH66G8f2Txzh1aGR0UC9ZoAUHfHxLZGDhwMpck4BpSnB61eNFIFmlV+TJ+KUA==} + + '@types/stylis@4.2.5': + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + + '@types/tar-stream@3.1.3': + resolution: {integrity: sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==} + + '@types/tern@0.23.9': + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + + '@types/ungap__structured-clone@1.2.0': + resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@uiw/codemirror-extensions-basic-setup@4.23.6': + resolution: {integrity: sha512-bvtq8IOvdkLJMhoJBRGPEzU51fMpPDwEhcAHp9xCR05MtbIokQgsnLXrmD1aZm6e7s/3q47H+qdSfAAkR5MkLA==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/codemirror-themes@4.23.6': + resolution: {integrity: sha512-0dpuLQW+V6zrKvfvor/eo71V3tpr2L2Hsu8QZAdtSzksjWABxTOzH3ShaBRxCEsrz6sU9sa9o7ShwBMMDz59bQ==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/react-codemirror@4.23.6': + resolution: {integrity: sha512-caYKGV6TfGLRV1HHD3p0G3FiVzKL1go7wes5XT2nWjB0+dTdyzyb81MKRSacptgZcotujfNO6QXn65uhETRAMw==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/stega@0.1.2': + resolution: {integrity: sha512-P7mafQXjkrsoyTRppnt0N21udKS9wUmLXHRyP9saLXLHw32j/FgUJ3FscSWgvSqRs4cj7wKZtwqJEvWJ2jbGmA==} + + '@vitejs/plugin-react@4.3.3': + resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xstate/react@4.1.3': + resolution: {integrity: sha512-zhE+ZfrcCR87bu71Rkh5Z5ruZBivR/7uD/dkelzJqjQdI45IZc9DqTI8lL4Cg5+VN2p5k86KxDsusqW1kW11Tg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + xstate: ^5.18.2 + peerDependenciesMeta: + xstate: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ai@4.0.33: + resolution: {integrity: sha512-mOvhPyVchGZvZuPn8Zj4J+93fZOlaBH1BtunvGmQ/8yFc5hGmid3c0XIdw5UNt3++0sXawKE3j7JUL5ZmiQdKg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-mutex@0.4.1: + resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + attr-accept@2.2.4: + resolution: {integrity: sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==} + engines: {node: '>=4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-split@0.0.0: + resolution: {integrity: sha512-CNXO3AXAS1H/kOGQkPjucm1161/XoF3aVkMfujqwk85XN/D/MkQMvoB81lXyX/2rerZS+hPAYYRR3mAW05awjQ==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001677: + resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + + canvas-confetti@1.9.3: + resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + class-list@0.1.1: + resolution: {integrity: sha512-zqR0uW+VsLtyQhixBhkdQ+z6B8+Y8HTh28kdSVjJ4zTTKM7Xz2asAQSya9VI6m/34F6N6Ktm0mrchKB+E5a8Xw==} + + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.0.0: + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + codemirror-spell-checker@1.1.2: + resolution: {integrity: sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + codemirror@6.0.1: + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color2k@2.0.3: + resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + + console-table-printer@2.12.1: + resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-react-class@15.7.0: + resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cyclist@1.0.2: + resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + + data-uri-to-buffer@1.2.0: + resolution: {integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + date-now@1.0.1: + resolution: {integrity: sha512-yiizelQCqYLUEVT4zqYihOW6Ird7Qyc6fD3Pv5xGxk4+Jz0rsB1dMN2KyNV6jgOHYh5K+sPGCSOknQN4Upa3pg==} + + debounce@1.0.0: + resolution: {integrity: sha512-4FCfBL8uZFIh3BShn4AlxH4O9F5v+CVriJfiwW8Me/MhO7NqBE5JO5WO48NasbsY9Lww/KYflB79MejA3eKhxw==} + + debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + decompress-response@7.0.0: + resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==} + engines: {node: '>=10'} + + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + + deeks@3.1.0: + resolution: {integrity: sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A==} + engines: {node: '>= 16'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + 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-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doc-path@4.1.1: + resolution: {integrity: sha512-h1ErTglQAVv2gCnOpD3sFS6uolDbOKHDU1BZq+Kl3npPqroU3dYL42lUgMfd5UimlwtRgp7C9dLGwqQ5D2HYgQ==} + engines: {node: '>=16'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easymde@2.18.0: + resolution: {integrity: sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.52: + resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.5: + resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-source-polyfill@1.0.31: + resolution: {integrity: sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource-parser@3.0.0: + resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} + engines: {node: '>=18.0.0'} + + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + + execa@2.1.0: + resolution: {integrity: sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==} + engines: {node: ^8.12.0 || >=9.7.0} + + exif-component@1.0.1: + resolution: {integrity: sha512-FXnmK9yJYTa3V3G7DE9BRjUJ0pwXMICAxfbsAuKPTuSlFzMZhQbcvvwx0I8ofNJHxz3tfjze+whxcGpfklAWOQ==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-selector@0.4.0: + resolution: {integrity: sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==} + engines: {node: '>= 10'} + + file-selector@2.1.0: + resolution: {integrity: sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q==} + engines: {node: '>= 12'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + file-url@2.0.2: + resolution: {integrity: sha512-x3989K8a1jM6vulMigE8VngH7C5nci0Ks5d9kVjUXmNF28gmiZUNujk5HjwaS8dAzN2QmUfX56riJKgN00dNRw==} + engines: {node: '>=4'} + + filesize@9.0.11: + resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + flush-write-stream@2.0.0: + resolution: {integrity: sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==} + + focus-lock@1.3.5: + resolution: {integrity: sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==} + engines: {node: '>=10'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@10.18.0: + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + framer-motion@11.0.8: + resolution: {integrity: sha512-1KSGNuqe1qZkS/SWQlDnqK2VCVzRVEoval379j0FiUBJAZoqgwyvqFkfvJbgW2IPFo4wX16K+M0k5jO23lCIjA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + ftp@0.3.10: + resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} + engines: {node: '>=0.8.0'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + 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-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-it@8.6.5: + resolution: {integrity: sha512-o1hjPwrb/icm3WJbCweTSq8mKuDfJlqwbFauI+Pdgid99at/BFaBXFBJZE+uqvHyOVARE4z680S44vrDm8SsCw==} + engines: {node: '>=14.0.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-random-values-esm@1.0.2: + resolution: {integrity: sha512-HMSDTgj1HPFAuZG0FqxzHbYt5JeEGDUeT9r1RLXhS6RZQS8rLRjokgjZ0Pd28CN0lhXlRwfH6eviZqZEJ2kIoA==} + + get-random-values@1.2.2: + resolution: {integrity: sha512-lMyPjQyl0cNNdDf2oR+IQ/fM3itDvpoHy45Ymo2r0L1EjazeSl13SfbKZs7KtZ/3MDCeueiaJiuOEfKqRTsSgA==} + engines: {node: 10 || 12 || >=14} + + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + get-uri@2.0.4: + resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + groq-js@1.14.0: + resolution: {integrity: sha512-nrrEswAovzFcG2nXWHCwbXq0ciavKSq8ZvuqT93zxIHWGX3FYCN+MkvHyYRTVuM4SuQAjU7FXkcN3DBt4BHTxA==} + engines: {node: '>= 14'} + + groq@3.63.0: + resolution: {integrity: sha512-9YzXsNTXqRFput/5HoRS7HJKl5J6of21qpc89ZnzDC/LcQPI1UzpRSuJ6AHYPzj1Re9nGRYtr88uwJsBjS4aLw==} + engines: {node: '>=18'} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hotscript@1.0.13: + resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} + + html-element@2.3.1: + resolution: {integrity: sha512-xnFt2ZkbFcjc+JoAtg3Hl89VeEZDjododu4VCPkRvFmBTHHA9U1Nt6hLUWfW2O+6Sl/rT1hHK/PivleX3PdBJQ==} + engines: {node: '>=4.2'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-loader@5.1.0: + resolution: {integrity: sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + humanize-list@1.0.1: + resolution: {integrity: sha512-4+p3fCRF21oUqxhK0yZ6yaSP/H5/wZumc7q1fH99RkW7Q13aAxDeP78BKjoR+6y+kaHqKF/JWuQhsNuuI2NKtA==} + + hyperscript@2.0.2: + resolution: {integrity: sha512-uggBAYfHFC5WyZQXlJ61BNZbPmJbschcvfYNhYdZWCp+0J8KYb5Du8nQuk8Ru+ThoCNb01B0tPtnTRqnrFBkVg==} + + i18next@23.16.4: + resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-hotkey-esm@1.0.0: + resolution: {integrity: sha512-eTXNmLCPXpKEZUERK6rmFsqmL66+5iNB998JMO+/61fSxBZFuUR1qHyFyx7ocBl5Vs8qjFzRAJLACpYfhS5g5w==} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + 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-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-tar@1.0.0: + resolution: {integrity: sha512-8sR603bS6APKxcdkQ1e5rAC9JDCxM3OlbGJDWv5ajhHqIh6cTaqcpeOTch1iIeHYY4nHEFTgmCiGSLfvmODH4w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsdom-global@3.0.2: + resolution: {integrity: sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==} + peerDependencies: + jsdom: '>=10.0.0' + + jsdom@23.2.0: + resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-2-csv@5.5.6: + resolution: {integrity: sha512-N673XbJgHwUq9JreKpk530jSywPF/rEAQ08dV99QQpkluP/4HTwshpoP9hmDz26iSFqu7eNAPgyJfu/77HvPGA==} + engines: {node: '>= 16'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-lexer@1.2.0: + resolution: {integrity: sha512-7otpx5UPFeSELoF8nkZPHCfywg86wOsJV0WNOaysuO7mfWj1QFp2vlqESRRCeJKBXr+tqDgHh4HgqUFKTLcifQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-reduce@3.0.0: + resolution: {integrity: sha512-zvnhEvwhqTOxBIcXnxvHvhqtubdwFRp+FascmCaL56BT9jdttRU8IFc+Ilh2HPJ0AtioF8mFPxmReuJKLW0Iyw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + 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'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lucide-react@0.414.0: + resolution: {integrity: sha512-Krr/MHg9AWoJc52qx8hyJ64X9++JNfS1wjaJviLM1EP/68VNB7Tv0VMldLCB1aUe6Ka9QxURPhQm/eB6cqOM3A==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + + md-to-react-email@5.0.2: + resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} + peerDependencies: + react: 18.x + + md5-o-matic@0.1.1: + resolution: {integrity: sha512-QBJSFpsedXUl/Lgs4ySdB2XCzUEcJ3ujpbagdZCkRaYIaC0kFnID8jhc84KEiVv6dNFtIrmW7bqow0lDxgJi6A==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdast-util-toc@7.1.0: + resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + mendoza@3.0.7: + resolution: {integrity: sha512-KtLgsCl5dFjRPUVSVV9KxpUr2BfZgLv8uqxg/hCsI7JIWsesHABSbl0MQwxNHAg24KtzSQ6vrPsgeNnoq4UImg==} + engines: {node: '>=14.18'} + + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + + 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.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + 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'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mississippi@4.0.0: + resolution: {integrity: sha512-7PujJ3Te6GGg9lG1nfw5jYCPV6/BsoAT0nCQwb6w+ROuromXYxI6jc/CQSlD82Z/OUMSBX1SoaqhTE+vXiLQzQ==} + engines: {node: '>=4.0.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.39.8: + resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} + + module-alias@2.2.3: + resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nano-pubsub@3.0.0: + resolution: {integrity: sha512-zoTNyBafxG0+F5PP3T3j1PKMr7gedriSdYRhLFLRFCz0OnQfQ6BkVk9peXVF30hz633Bw0Zh5McleOrXPjWYCQ==} + engines: {node: '>=18'} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.8: + resolution: {integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-auth@5.0.0-beta.18: + resolution: {integrity: sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + next: ^14 + nodemailer: ^6.6.5 + react: ^18.2.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + next-mdx-remote-client@1.0.3: + resolution: {integrity: sha512-svPnAFB4VIEZEJabcJUU8uRDCCo1aUQOR71C0yWKeIqn08KnqWdKCDVtpu4Lazy0ORZsFn/xuZWxXanryLLvmw==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + next-sanity@9.8.8: + resolution: {integrity: sha512-37exA0W6VDHp66m72B934Sd7rwcVvch9VI/x4mgpHzbHUrReDknrGdWzTaKBe5iTQUHvZr8TE+GhyONO8MK5lQ==} + engines: {node: '>=18.18'} + peerDependencies: + '@sanity/client': ^6.22.2 + '@sanity/icons': ^3.4.0 + '@sanity/types': ^3.62.0 + '@sanity/ui': ^2.8.10 + next: ^14.2 || ^15.0.0-0 + react: ^18.3 || ^19.0.0-0 + react-dom: ^18.3 || ^19.0.0-0 + sanity: ^3.62.0 + styled-components: ^6.1 + + next-themes@0.3.0: + resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} + peerDependencies: + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 + + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + next@14.2.35: + resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@3.1.0: + resolution: {integrity: sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + oauth4webapi@2.17.0: + resolution: {integrity: sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + observable-callback@1.0.3: + resolution: {integrity: sha512-VlS275UyPnwdMtzxDgr/lCiOUyq9uXNll3vdwzDcJ6PB/LuO7gLmxAQopcCA3JoFwwujBwyA7/tP5TXZwWSXew==} + engines: {node: '>=16'} + peerDependencies: + rxjs: ^6.5 || ^7 + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oneline@1.0.3: + resolution: {integrity: sha512-KWLrLloG/ShWvvWuvmOL2jw17++ufGdbkKC2buI2Aa6AaM4AkjCtpeJZg60EK34NQVo2qu1mlPrC2uhvQgCrhQ==} + engines: {node: '>=6.0.0'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + deprecated: use oniguruma-to-es instead + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + 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-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@1.2.0: + resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} + engines: {node: '>=4'} + + p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + + p-queue@2.4.2: + resolution: {integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + 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'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pluralize-esm@9.0.5: + resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} + engines: {node: '>=14.0.0'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + preact-render-to-string@5.2.3: + resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} + peerDependencies: + preact: '>=10' + + preact@10.11.3: + resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress-stream@2.0.0: + resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-clientside-effect@1.2.6: + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-compiler-runtime@19.0.0-beta-9ee70a1-20241017: + resolution: {integrity: sha512-hVrlYbVacwEdZi08RUxSwIzZR2/+WxUsWRa7mjViRhqcqUYK+7u8UEVZoJrF5/gsCHMU9PhJRvolygSCaaE0nA==} + peerDependencies: + react: ^18.2.0 || ^19.0.0 + + react-copy-to-clipboard@5.1.0: + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-day-picker@9.3.0: + resolution: {integrity: sha512-xXgZISTXlwQ1Igt4cBttXF+aK1Xvd00azcGVY74PNCAe8PxtULFVWGT1UfdavFiVScF04dyV8QcybKZAw570QQ==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8.0' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-dropzone@11.7.1: + resolution: {integrity: sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8' + + react-dropzone@14.3.5: + resolution: {integrity: sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-email@3.0.1: + resolution: {integrity: sha512-G4Bkx2ULIScy/0Z8nnWywHt0W1iTkaYCdh9rWNuQ3eVZ6B3ttTUDE9uUy3VNQ8dtQbmG0cpt8+XmImw7mMBW6Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-file-icon@1.5.0: + resolution: {integrity: sha512-6K2/nAI69CS838HOS+4S95MLXwf1neWywek1FgqcTFPTYjnM8XT7aBLz4gkjoqQKY9qPhu3A2tu+lvxhmZYY9w==} + peerDependencies: + react: ^18.0.0 || ^17.0.0 || ^16.2.0 + react-dom: ^18.0.0 || ^17.0.0 || ^16.2.0 + + react-focus-lock@2.13.2: + resolution: {integrity: sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-hook-form@7.53.1: + resolution: {integrity: sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-i18next@14.0.2: + resolution: {integrity: sha512-YOB/H1IgXveEWeTsCHez18QjDXImzVZOcF9/JroSbjYoN1LOfCoARFJUQQ8VNow0TnGOtHq9SwTmismm78CTTA==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-iframe@1.8.5: + resolution: {integrity: sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA==} + peerDependencies: + react: '>=16.x.x' + + react-infinite-scroll-component@6.1.0: + resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==} + peerDependencies: + react: '>=16.0.0' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-photo-album@2.3.1: + resolution: {integrity: sha512-c7ofDx2DAbQa9AW9wUWOBX9zUKf/QjvdQK+fPNKEiKprks/n8t4c2viyBZ6EWpQLFLU0ad3yVBTgFvxEZ46/Iw==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8.0' + + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + + react-redux@7.2.9: + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-refractor@2.2.0: + resolution: {integrity: sha512-UvWkBVqH/2b9nkkkt4UNFtU3aY1orQfd4plPjx5rxbefy6vGajNHU9n+tv8CbykFyVirr3vEBfN2JTxyK0d36g==} + peerDependencies: + react: '>=15.0.0' + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-rx@4.1.3: + resolution: {integrity: sha512-v0PTUnxpKJgA4j2DYLoENm4c9N/ivNI8yGZlix7BWa2/EL0JhR7HXkJxK0LiePobnq1Uhq9kItGKS91Q1PWuHw==} + peerDependencies: + react: ^18.3 || >=19.0.0-0 + rxjs: ^7 + + react-select@5.8.2: + resolution: {integrity: sha512-a/LkOckoI62710gGPQSQqUp7A10fGbH/ya3/IR49qaq3XoBvwymgD5mJgtiHxBDsutyEQfdKNycWVh8Cg8UCjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-simplemde-editor@5.2.0: + resolution: {integrity: sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==} + peerDependencies: + easymde: '>= 2.0.0 < 3.0.0' + react: '>=16.8.2' + react-dom: '>=16.8.2' + + react-style-proptype@3.2.2: + resolution: {integrity: sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==} + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-virtuoso@4.12.0: + resolution: {integrity: sha512-oHrKlU7xHsrnBQ89ecZoMPAK0tHnI9s1hsFW3KKg5ZGeZ5SWvbGhg/QFJFY4XETAzoCUeu+Xaxn1OUb/PGtPlA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16 || >=17 || >= 18' + react-dom: '>=16 || >=17 || >= 18' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux-observable@2.0.0: + resolution: {integrity: sha512-FJz4rLXX+VmDDwZS/LpvQsKnSanDOe8UVjiLryx1g3seZiS69iLpMrcvXD5oFO7rtkPyRdo/FmTqldnT3X3m+w==} + peerDependencies: + redux: '>=4 <5' + + redux-thunk@2.4.2: + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.11.2: + resolution: {integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==} + hasBin: true + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.13.2: + resolution: {integrity: sha512-F+PaFMscfJOcSHcR2b//+hk/0jT56hmGDqXcVD6VC9j0CUSGiqv8YxaWUyhR7qEIRRSbzAVxx+0uxzk+akXs+w==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.3.0 + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx-remove-esm@1.1.0: + resolution: {integrity: sha512-oN3F9QRuPKSdzZi+wvEodBVjKwya63sl403pWzJvm0+c503iUjCDR+JAnP3Ho/4205IWbQ2NujPQi/B9kU6ZrA==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + + resend@3.5.0: + resolution: {integrity: sha512-bKu4LhXSecP6krvhfDzyDESApYdNfjirD5kykkT1xO0Cj9TKSiGh5Void4pGTs3Am+inSnp4dg0B5XzdwHBJOQ==} + engines: {node: '>=18'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + 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==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs-exhaustmap-with-trailing@2.1.1: + resolution: {integrity: sha512-gK7nsKyPFsbjDeJ0NYTcZYGW5TbTFjT3iACa28Pwp3fIf9wT/JUR8vdlKYCjUOZKXYnXEk8eRZ4zcQyEURosIA==} + peerDependencies: + rxjs: 7.x + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanity-diff-patch@4.0.0: + resolution: {integrity: sha512-1OOTx/Uw0J3rwNkI4J/4XJfTGb2Rze/gl5jJGRw+M2hRGkp1QEu2wFHiC9adj83ABYthOczBCBpTHHeZluctdw==} + engines: {node: '>=18.2'} + + sanity-plugin-asset-source-unsplash@3.0.1: + resolution: {integrity: sha512-xlwmtoZPbfbXcoEkeH67AnWoUvUWBICNvShFgkB1TlZAWZ2hKRFUm968aHa1kkjsbHnrBBkSqkhKcYFM/giC5Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + sanity: ^3 + styled-components: ^6.1 + + sanity-plugin-iframe-pane@3.1.6: + resolution: {integrity: sha512-D+aEs+rIuVprcPSuqNNRiEr7OHZoc+zqhWU5cdaxUDe5XNtM4mJXwdofVLMibbp2g6rrAAWGSE9zY7l+R9swhA==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.2.0 + sanity: ^3.20.0 + styled-components: ^5.2 || ^6.0.0 + + sanity-plugin-internationalized-array@2.1.0: + resolution: {integrity: sha512-YpG8O3wdNbewsPNhSHZ13MYTPDqsf0Iz8eC6fB5hhDwttxcM6ftD40R1qXT73Ccl68X4DrbHi3bQzXC60E7D7g==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^2.1.0 + react: ^18 + react-dom: ^18 + sanity: ^3.36.4 + styled-components: ^6.1 + + sanity-plugin-markdown@5.0.0: + resolution: {integrity: sha512-EzyJ6f/TcQevIZushOG5HKGIu9aUggktbH5th16EwTlHtGWjxO1aEuarMv362FmVaVYPh7YOHe9JuBkkGBE0KQ==} + engines: {node: '>=18'} + peerDependencies: + easymde: ^2.18 + react: ^18.3 + sanity: ^3.23 + styled-components: ^6.1 + + sanity-plugin-media@2.3.2: + resolution: {integrity: sha512-5RZJyKuN2SuatWjUEr9x+DOZOPg6+ga/6RD+pc8RK3PgviP+945M+E8k93XwnIzSGNFtix8jf0mUbdbCO7HpjA==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^1.0 || ^2.0 + react: ^18 + react-dom: ^18 + sanity: ^3.0.0 + styled-components: ^5.0 || ^6.0 + + sanity@3.63.0: + resolution: {integrity: sha512-JKIJPbtL88YoQgVzKtoVei18zlJFnbw7MBDQYMCvp+WteLrHyISGmKAr6QQFdsaCZvIdJbOFMuhZw+GACt3xhA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + react: ^18 + react-dom: ^18 + styled-components: ^6.1 + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallow-equals@1.0.0: + resolution: {integrity: sha512-xd/FKcdmfmMbyYCca3QTVEJtqUOGuajNzvAX6nt8dXILwjAIEkfHc4hI8/JMGApAmb7VeULO0Q30NTxnbH/15g==} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + 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'} + + silver-fleece@1.1.0: + resolution: {integrity: sha512-V3vShUiLRVPMu9aSWpU5kLDoU/HO7muJKE236EO663po3YxivAkMLbRg+amV/FhbIfF5bWXX5TVX+VYmRaOBFA==} + + simple-wcswidth@1.0.1: + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slate-dom@0.111.0: + resolution: {integrity: sha512-VjeBh2xIRvP6ToEhrO1TPahc5fPezxbeSUhsRTppBPtHfidEdyp/MTI9TjUrZnlznJiVZ7QKrORXilFq8hsbtQ==} + peerDependencies: + slate: '>=0.99.0' + + slate-react@0.111.0: + resolution: {integrity: sha512-DiiVSYn+dilx0j40FjaaHiG2KbaX4lZfTdEnYvUJMnpc+d9evcuO2nV6KCDQOtS6xr4w0sBzQMxrpGlA5alKww==} + peerDependencies: + react: '>=18.2.0' + react-dom: '>=18.2.0' + slate: '>=0.99.0' + slate-dom: '>=0.110.2' + + slate@0.110.2: + resolution: {integrity: sha512-4xGULnyMCiEQ0Ml7JAC1A6HVE6MNpPJU7Eq4cXh1LxlrR0dFXC3XC+rNfQtUJ7chHoPkws57x7DDiWiZAt+PBA==} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + + sonner@1.7.0: + resolution: {integrity: sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + speedometer@1.0.0: + resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + stripe@15.12.0: + resolution: {integrity: sha512-slTbYS1WhRJXVB8YXU8fgHizkUrM9KJyrw4Dd8pLEwzKHYyQTIE46EePC2MVbSDZdE24o1GdNtzmJV4PrPpmJA==} + engines: {node: '>=12.*'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + styled-components@6.1.13: + resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + suspend-react@0.1.3: + resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} + peerDependencies: + react: '>=17.0' + + swr@2.3.0: + resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwind-merge@2.5.4: + resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.1: + resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + third-party-capital@1.0.20: + resolution: {integrity: sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==} + + throttle-debounce@2.3.0: + resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} + engines: {node: '>=8'} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + transliteration@2.3.5: + resolution: {integrity: sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==} + engines: {node: '>=6.0.0'} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.1.0: + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typeid-js@0.3.0: + resolution: {integrity: sha512-A1EmvIWG6xwYRfHuYUjPltHqteZ1EiDG+HOmbIYXeHUVztmnGrPIfU9KIK1QC30x59ko0r4JsMlwzsALCyiB3Q==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + typo-js@1.2.4: + resolution: {integrity: sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-util-filter@2.0.3: + resolution: {integrity: sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-debounce@10.0.4: + resolution: {integrity: sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '*' + + use-device-pixel-ratio@1.1.2: + resolution: {integrity: sha512-nFxV0HwLdRUt20kvIgqHYZe6PK/v4mU1X8/eLsT1ti5ck0l2ob0HDRziaJPx+YWzBo6dMm4cTac3mcyk68Gh+A==} + peerDependencies: + react: '>=16.8.0' + + use-effect-event@1.0.2: + resolution: {integrity: sha512-9c8AAmtQja4LwJXI0EQPhQCip6dmrcSe0FMcTUZBeGh/XTCOLgw3Qbt0JdUT8Rcrm/ZH+Web7MIcMdqgQKdXJg==} + peerDependencies: + react: ^18.3 || ^19.0.0-0 + + use-hot-module-reload@2.0.0: + resolution: {integrity: sha512-RbL/OY1HjHNf5BYSFV3yDtQhIGKjCx9ntEjnUBYsOGc9fTo94nyFTcjtD42/twJkPgMljWpszUIpTGD3LuwHSg==} + peerDependencies: + react: '>=17.0.0' + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + usehooks-ts@3.0.1: + resolution: {integrity: sha512-bgJ8S9w/SnQyACd3RvWp3CGncROxEENGqQLCsdaoyTb0zTENIna7MIV3OW6ywCfPaYYD2OPokw7oLPmSLLWP4w==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuidv7@0.4.4: + resolution: {integrity: sha512-jjRGChg03uGp9f6wQYSO8qXkweJwRbA5WRuEQE8xLIiehIzIIi23qZSzsyvZPCPoFqkeLtZuz7Plt1LGukAInA==} + hasBin: true + + valibot@0.31.1: + resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vaul@0.9.9: + resolution: {integrity: sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-matter@5.0.0: + resolution: {integrity: sha512-jhPSqlj8hTSkTXOqyxbUeZAFFVq/iwu/jukcApEqc/7DOidaAth6rDc0Zgg0vWpzUnWkwFP7aK28l6nBmxMqdQ==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@4.5.5: + resolution: {integrity: sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + whoops@4.1.7: + resolution: {integrity: sha512-weRPO7XE2Oko2/KQkddqvj6uAjLDOoiJdrXiE2ymgiV5Ugefi0/GJZPkeNr6OUUMfcqGAwUUPIZrG6UdSuBk2g==} + engines: {node: '>= 8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xregexp@2.0.0: + resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} + + xstate@5.18.2: + resolution: {integrity: sha512-hab5VOe29D0agy8/7dH1lGw+7kilRQyXwpaChoMu4fe6rDP+nsHYhDYKfS2O4iXE7myA98TW6qMEudj/8NXEkA==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ai-sdk/deepseek@0.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/openai-compatible': 0.1.0(zod@3.23.8) + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/google@1.0.15(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai-compatible@0.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai-compatible@0.2.14(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai@1.0.18(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.0.7(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.1.10(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.9 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.2.8(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + zod: 3.23.8 + + '@ai-sdk/provider@1.0.4': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@1.0.9': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.0.9(react@18.3.1)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 1.0.8(zod@3.23.8) + swr: 2.3.0(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + react: 18.3.1 + zod: 3.23.8 + + '@ai-sdk/ui-utils@1.0.8(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/xai@1.2.16(zod@3.23.8)': + dependencies: + '@ai-sdk/openai-compatible': 0.2.14(zod@3.23.8) + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.23.8) + zod: 3.23.8 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@asamuzakjp/dom-selector@2.0.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 2.3.1 + is-potential-custom-element-name: 1.0.1 + + '@auth/core@0.31.0': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.9.6 + oauth4webapi: 2.17.0 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + + '@auth/core@0.34.2': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.9.6 + oauth4webapi: 2.17.0 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.5) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.24.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + + '@babel/preset-react@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@biomejs/biome@1.9.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.3 + '@biomejs/cli-darwin-x64': 1.9.3 + '@biomejs/cli-linux-arm64': 1.9.3 + '@biomejs/cli-linux-arm64-musl': 1.9.3 + '@biomejs/cli-linux-x64': 1.9.3 + '@biomejs/cli-linux-x64-musl': 1.9.3 + '@biomejs/cli-win32-arm64': 1.9.3 + '@biomejs/cli-win32-x64': 1.9.3 + + '@biomejs/cli-darwin-arm64@1.9.3': + optional: true + + '@biomejs/cli-darwin-x64@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64@1.9.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-x64@1.9.3': + optional: true + + '@biomejs/cli-win32-arm64@1.9.3': + optional: true + + '@biomejs/cli-win32-x64@1.9.3': + optional: true + + '@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3)': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.7.1': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/lang-css@6.3.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-html@6.4.9': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + '@lezer/html': 1.3.10 + + '@codemirror/lang-java@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.2': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.4.19 + + '@codemirror/lang-json@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/json': 1.0.2 + + '@codemirror/lang-markdown@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/markdown': 1.3.2 + + '@codemirror/lang-php@6.0.1': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/php': 1.0.2 + + '@codemirror/lang-sql@6.8.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/language@6.10.3': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/legacy-modes@6.4.2': + dependencies: + '@codemirror/language': 6.10.3 + + '@codemirror/lint@6.8.2': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/search@6.5.7': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/state@6.4.1': {} + + '@codemirror/theme-one-dark@6.1.2': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/highlight': 1.2.1 + + '@codemirror/view@6.34.2': + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@date-fns/tz@1.2.0': {} + + '@dnd-kit/accessibility@3.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.7.4': + optional: true + + '@emotion/memoize@0.8.1': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.1': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.19.11': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.11': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.11': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.11': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.11': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.11': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.11': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.11': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.11': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.11': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.11': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.11': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.11': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.11': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.11': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.11': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.11': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.11': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.11': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.11': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.11': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.11': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.11': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.8': {} + + '@hookform/resolvers@3.9.1(react-hook-form@7.53.1(react@18.3.1))': + dependencies: + react-hook-form: 7.53.1(react@18.3.1) + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@juggle/resize-observer@3.4.0': {} + + '@lezer/common@1.2.3': {} + + '@lezer/css@1.1.9': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.4.19': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/markdown@1.3.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + + '@lezer/php@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.2 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.12 + react: 18.3.1 + + '@microlink/mql@0.13.12': + dependencies: + flattie: 1.1.1 + got: 11.8.6 + whoops: 4.1.7 + + '@next/env@14.2.3': {} + + '@next/env@14.2.35': {} + + '@next/swc-darwin-arm64@14.2.3': + optional: true + + '@next/swc-darwin-arm64@14.2.33': + optional: true + + '@next/swc-darwin-x64@14.2.3': + optional: true + + '@next/swc-darwin-x64@14.2.33': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.3': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.33': + optional: true + + '@next/swc-linux-arm64-musl@14.2.3': + optional: true + + '@next/swc-linux-arm64-musl@14.2.33': + optional: true + + '@next/swc-linux-x64-gnu@14.2.3': + optional: true + + '@next/swc-linux-x64-gnu@14.2.33': + optional: true + + '@next/swc-linux-x64-musl@14.2.3': + optional: true + + '@next/swc-linux-x64-musl@14.2.33': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.3': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.33': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.3': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.33': + optional: true + + '@next/swc-win32-x64-msvc@14.2.3': + optional: true + + '@next/swc-win32-x64-msvc@14.2.33': + optional: true + + '@next/third-parties@15.0.3(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + third-party-capital: 1.0.20 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@one-ini/wasm@0.1.1': {} + + '@openpanel/nextjs@1.0.5(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@openpanel/web': 1.0.1 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@openpanel/sdk@1.0.0': {} + + '@openpanel/web@1.0.1': + dependencies: + '@openpanel/sdk': 1.0.0 + + '@openrouter/ai-sdk-provider@0.4.6(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.23.8) + zod: 3.23.8 + + '@opentelemetry/api@1.8.0': {} + + '@opentelemetry/api@1.9.0': {} + + '@panva/hkdf@1.2.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@portabletext/editor@1.5.4(@sanity/block-tools@3.63.0(debug@4.3.7))(@sanity/schema@3.63.0(debug@4.3.7))(@sanity/types@3.63.0)(@sanity/util@3.63.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@portabletext/patches': 1.1.0 + '@sanity/block-tools': 3.63.0(debug@4.3.7) + '@sanity/schema': 3.63.0(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/util': 3.63.0(debug@4.3.7) + '@xstate/react': 4.1.3(@types/react@18.3.12)(react@18.3.1)(xstate@5.18.2) + debug: 4.3.7 + is-hotkey-esm: 1.0.0 + lodash: 4.17.21 + lodash.startcase: 4.4.0 + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + rxjs: 7.8.1 + slate: 0.110.2 + slate-dom: 0.111.0(slate@0.110.2) + slate-react: 0.111.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-dom@0.111.0(slate@0.110.2))(slate@0.110.2) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + xstate: 5.18.2 + transitivePeerDependencies: + - '@types/react' + - react-dom + - supports-color + + '@portabletext/patches@1.1.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + lodash: 4.17.21 + + '@portabletext/react@3.1.0(react@18.3.1)': + dependencies: + '@portabletext/toolkit': 2.0.16 + '@portabletext/types': 2.0.13 + react: 18.3.1 + + '@portabletext/toolkit@2.0.16': + dependencies: + '@portabletext/types': 2.0.13 + + '@portabletext/types@2.0.13': {} + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.0.1': + dependencies: + '@babel/runtime': 7.26.0 + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-accessible-icon@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-alert-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context-menu@2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-context@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-icons@1.3.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@radix-ui/react-id@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-menubar@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-radio-group@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-slider@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-slot@1.0.2(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toast@1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/rect@1.1.0': {} + + '@react-email/body@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/button@0.0.17(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/code-block@0.0.9(react@18.3.1)': + dependencies: + prismjs: 1.29.0 + react: 18.3.1 + + '@react-email/code-inline@0.0.4(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/column@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-email/body': 0.0.10(react@18.3.1) + '@react-email/button': 0.0.17(react@18.3.1) + '@react-email/code-block': 0.0.9(react@18.3.1) + '@react-email/code-inline': 0.0.4(react@18.3.1) + '@react-email/column': 0.0.12(react@18.3.1) + '@react-email/container': 0.0.14(react@18.3.1) + '@react-email/font': 0.0.8(react@18.3.1) + '@react-email/head': 0.0.11(react@18.3.1) + '@react-email/heading': 0.0.14(react@18.3.1) + '@react-email/hr': 0.0.10(react@18.3.1) + '@react-email/html': 0.0.10(react@18.3.1) + '@react-email/img': 0.0.10(react@18.3.1) + '@react-email/link': 0.0.10(react@18.3.1) + '@react-email/markdown': 0.0.12(react@18.3.1) + '@react-email/preview': 0.0.11(react@18.3.1) + '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/row': 0.0.10(react@18.3.1) + '@react-email/section': 0.0.14(react@18.3.1) + '@react-email/tailwind': 0.1.0(react@18.3.1) + '@react-email/text': 0.0.10(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - react-dom + + '@react-email/container@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/font@0.0.8(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/head@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/heading@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/hr@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/html@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/img@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/link@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/markdown@0.0.12(react@18.3.1)': + dependencies: + md-to-react-email: 5.0.2(react@18.3.1) + react: 18.3.1 + + '@react-email/preview@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/render@0.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/row@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/section@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/tailwind@0.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/text@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@reduxjs/toolkit@1.9.7(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + immer: 9.0.21 + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + optionalDependencies: + react: 18.3.1 + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@rexxars/react-json-inspector@8.0.1(react@18.3.1)': + dependencies: + create-react-class: 15.7.0 + debounce: 1.0.0 + md5-o-matic: 0.1.1 + react: 18.3.1 + + '@rexxars/react-split-pane@0.1.93(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + react-style-proptype: 3.2.2 + + '@sanity/asset-utils@2.1.0': {} + + '@sanity/bifur-client@0.4.1': + dependencies: + nanoid: 3.3.8 + rxjs: 7.8.1 + + '@sanity/block-content-to-hyperscript@2.0.10': + dependencies: + '@sanity/generate-help-url': 0.140.0 + '@sanity/image-url': 0.140.22 + hyperscript: 2.0.2 + object-assign: 4.1.1 + + '@sanity/block-content-to-markdown@0.0.5': + dependencies: + '@sanity/block-content-to-hyperscript': 2.0.10 + + '@sanity/block-tools@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/types': 3.63.0(debug@4.3.7) + '@types/react': 18.3.12 + get-random-values-esm: 1.0.2 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + + '@sanity/cli@3.63.0(react@18.3.1)': + dependencies: + '@babel/traverse': 7.25.9 + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/codegen': 3.63.0 + '@sanity/telemetry': 0.7.9(react@18.3.1) + '@sanity/util': 3.63.0(debug@4.3.7) + chalk: 4.1.2 + debug: 4.3.7 + decompress: 4.2.1 + esbuild: 0.21.5 + esbuild-register: 3.6.0(esbuild@0.21.5) + get-it: 8.6.5(debug@4.3.7) + groq-js: 1.14.0 + pkg-dir: 5.0.0 + prettier: 3.3.3 + semver: 7.6.3 + silver-fleece: 1.1.0 + validate-npm-package-name: 3.0.0 + transitivePeerDependencies: + - react + - supports-color + + '@sanity/client@6.22.3(debug@4.3.7)': + dependencies: + '@sanity/eventsource': 5.0.2 + get-it: 8.6.5(debug@4.3.7) + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/code-input@4.1.4(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-markdown': 6.3.1 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-sql': 6.8.0(@codemirror/view@6.34.2) + '@codemirror/language': 6.10.3 + '@codemirror/legacy-modes': 6.4.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@juggle/resize-observer': 3.4.0 + '@lezer/highlight': 1.2.1 + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 1.9.3(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@uiw/codemirror-themes': 4.23.6(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2) + '@uiw/react-codemirror': 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@babel/runtime' + - '@codemirror/lint' + - '@codemirror/theme-one-dark' + - '@lezer/common' + - codemirror + - react-is + + '@sanity/codegen@3.63.0': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-react': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/register': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globby: 10.0.2 + groq: 3.63.0 + groq-js: 1.14.0 + json5: 2.2.3 + tsconfig-paths: 4.2.0 + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + + '@sanity/color@2.2.5': {} + + '@sanity/color@3.0.6': {} + + '@sanity/comlink@1.1.1': + dependencies: + rxjs: 7.8.1 + uuid: 10.0.0 + xstate: 5.18.2 + + '@sanity/dashboard@4.1.0(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/image-url': 1.1.0 + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + lodash: 4.17.21 + react: 18.3.1 + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + '@sanity/diff-match-patch@3.1.1': {} + + '@sanity/diff@3.63.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + + '@sanity/eventsource@5.0.2': + dependencies: + '@types/event-source-polyfill': 1.0.5 + '@types/eventsource': 1.1.15 + event-source-polyfill: 1.0.31 + eventsource: 2.0.2 + + '@sanity/export@3.41.0': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/util': 3.37.2(debug@4.3.7) + archiver: 7.0.1 + debug: 4.3.7 + get-it: 8.6.5(debug@4.3.7) + lodash: 4.17.21 + mississippi: 4.0.0 + p-queue: 2.4.2 + rimraf: 3.0.2 + split2: 4.2.0 + tar: 7.4.3 + yaml: 2.6.0 + transitivePeerDependencies: + - supports-color + + '@sanity/generate-help-url@0.140.0': {} + + '@sanity/generate-help-url@3.0.0': {} + + '@sanity/icons@1.3.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/icons@2.11.8(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/icons@3.4.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/image-url@0.140.22': {} + + '@sanity/image-url@1.1.0': {} + + '@sanity/import@3.37.8': + dependencies: + '@sanity/asset-utils': 2.1.0 + '@sanity/generate-help-url': 3.0.0 + '@sanity/mutator': 3.63.0 + '@sanity/uuid': 3.0.2 + debug: 4.3.7 + file-url: 2.0.2 + get-it: 8.6.5(debug@4.3.7) + get-uri: 2.0.4 + gunzip-maybe: 1.4.2 + is-tar: 1.0.0 + lodash: 4.17.21 + meow: 9.0.0 + mississippi: 4.0.0 + ora: 5.4.1 + p-map: 1.2.0 + peek-stream: 1.1.3 + pretty-ms: 7.0.1 + rimraf: 3.0.2 + split2: 4.2.0 + tar-fs: 2.1.1 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - supports-color + + '@sanity/incompatible-plugin@1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/icons': 1.3.10(react@18.3.1) + react: 18.3.1 + react-copy-to-clipboard: 5.1.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + + '@sanity/insert-menu@1.0.10(@sanity/types@3.63.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + lodash.startcase: 4.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + transitivePeerDependencies: + - styled-components + + '@sanity/language-filter@4.0.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/util': 3.63.0(debug@4.3.7) + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@sanity/logos@2.1.13(@sanity/color@3.0.6)(react@18.3.1)': + dependencies: + '@sanity/color': 3.0.6 + react: 18.3.1 + + '@sanity/migrate@3.63.0': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/mutate': 0.10.1(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/util': 3.63.0(debug@4.3.7) + arrify: 2.0.1 + debug: 4.3.7 + fast-fifo: 1.3.2 + groq-js: 1.14.0 + p-map: 7.0.2 + transitivePeerDependencies: + - supports-color + + '@sanity/mutate@0.10.1(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/diff-match-patch': 3.1.1 + hotscript: 1.0.13 + lodash: 4.17.21 + mendoza: 3.0.7 + nanoid: 5.0.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/mutate@0.10.1-canary.5(xstate@5.18.2)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/diff-match-patch': 3.1.1 + hotscript: 1.0.13 + mendoza: 3.0.7 + nanoid: 5.0.8 + rxjs: 7.8.1 + optionalDependencies: + xstate: 5.18.2 + transitivePeerDependencies: + - debug + + '@sanity/mutator@3.63.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/uuid': 3.0.2 + debug: 4.3.7 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + '@sanity/next-loader@1.1.0(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + use-effect-event: 1.0.2(react@18.3.1) + + '@sanity/presentation@1.17.8(@sanity/client@6.22.3)(@sanity/color@3.0.6)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/logos': 2.1.13(@sanity/color@3.0.6)(react@18.3.1) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/uuid': 3.0.2 + '@types/lodash.isequal': 4.5.8 + fast-deep-equal: 3.1.3 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + mendoza: 3.0.7 + mnemonist: 0.39.8 + path-to-regexp: 6.3.0 + rxjs: 7.8.1 + suspend-react: 0.1.3(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + transitivePeerDependencies: + - '@sanity/color' + - react + - react-dom + - react-is + - styled-components + + '@sanity/preview-kit-compat@1.5.14(@sanity/client@6.22.3)(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + react: 18.3.1 + + '@sanity/preview-kit@5.1.10(@sanity/client@6.22.3)(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/preview-kit-compat': 1.5.14(@sanity/client@6.22.3)(react@18.3.1) + mendoza: 3.0.7 + optionalDependencies: + react: 18.3.1 + + '@sanity/preview-url-secret@1.6.21(@sanity/client@6.22.3)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/uuid': 3.0.2 + + '@sanity/preview-url-secret@2.0.0(@sanity/client@6.22.3)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/uuid': 3.0.2 + + '@sanity/schema@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/generate-help-url': 3.0.0 + '@sanity/types': 3.63.0(debug@4.3.7) + arrify: 1.0.1 + groq-js: 1.14.0 + humanize-list: 1.0.1 + leven: 3.1.0 + lodash: 4.17.21 + object-inspect: 1.13.2 + transitivePeerDependencies: + - debug + - supports-color + + '@sanity/telemetry@0.7.9(react@18.3.1)': + dependencies: + lodash: 4.17.21 + react: 18.3.1 + rxjs: 7.8.1 + typeid-js: 0.3.0 + + '@sanity/types@3.37.2(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@types/react': 18.3.12 + transitivePeerDependencies: + - debug + + '@sanity/types@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@types/react': 18.3.12 + transitivePeerDependencies: + - debug + + '@sanity/ui@1.9.3(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@floating-ui/react-dom': 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 2.2.5 + '@sanity/icons': 2.11.8(react@18.3.1) + csstype: 3.1.3 + framer-motion: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 3.0.6 + '@sanity/icons': 3.4.0(react@18.3.1) + csstype: 3.1.3 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + + '@sanity/util@3.37.2(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/types': 3.37.2(debug@4.3.7) + get-random-values-esm: 1.0.2 + moment: 2.30.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/util@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + get-random-values-esm: 1.0.2 + moment: 2.30.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/uuid@3.0.2': + dependencies: + '@types/uuid': 8.3.4 + uuid: 8.3.2 + + '@sanity/vision@3.63.0(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@juggle/resize-observer': 3.4.0 + '@lezer/highlight': 1.2.1 + '@rexxars/react-json-inspector': 8.0.1(react@18.3.1) + '@rexxars/react-split-pane': 0.1.93(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 3.0.6 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@uiw/react-codemirror': 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-hotkey-esm: 1.0.0 + json-2-csv: 5.5.6 + json5: 2.2.3 + lodash: 4.17.21 + quick-lru: 5.1.1 + react: 18.3.1 + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@babel/runtime' + - '@codemirror/lint' + - '@codemirror/theme-one-dark' + - '@lezer/common' + - codemirror + - react-dom + - react-is + + '@sanity/visual-editing@2.4.2(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/comlink': 1.1.1 + '@sanity/mutate': 0.10.1-canary.5(xstate@5.18.2) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@vercel/stega': 0.1.2 + get-random-values-esm: 1.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.1 + scroll-into-view-if-needed: 3.1.0 + use-effect-event: 1.0.2(react@18.3.1) + valibot: 0.31.1 + xstate: 5.18.2 + optionalDependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - debug + + '@sanity/visual-editing@2.4.4(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/comlink': 1.1.1 + '@sanity/mutate': 0.10.1-canary.5(xstate@5.18.2) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@vercel/stega': 0.1.2 + get-random-values-esm: 1.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.1 + scroll-into-view-if-needed: 3.1.0 + use-effect-event: 1.0.2(react@18.3.1) + valibot: 0.31.1 + xstate: 5.18.2 + optionalDependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - debug + + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + + '@sentry-internal/browser-utils@8.37.1': + dependencies: + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/feedback@8.37.1': + dependencies: + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/replay-canvas@8.37.1': + dependencies: + '@sentry-internal/replay': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/replay@8.37.1': + dependencies: + '@sentry-internal/browser-utils': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/browser@8.37.1': + dependencies: + '@sentry-internal/browser-utils': 8.37.1 + '@sentry-internal/feedback': 8.37.1 + '@sentry-internal/replay': 8.37.1 + '@sentry-internal/replay-canvas': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/core@8.37.1': + dependencies: + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/react@8.37.1(react@18.3.1)': + dependencies: + '@sentry/browser': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + + '@sentry/types@8.37.1': {} + + '@sentry/utils@8.37.1': + dependencies: + '@sentry/types': 8.37.1 + + '@shikijs/core@1.22.2': + dependencies: + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 + + '@shikijs/engine-oniguruma@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/types@1.22.2': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + + '@sindresorhus/is@4.6.0': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.8.1 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.14 + + '@tanem/react-nprogress@5.0.52(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/table-core': 8.20.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/react-virtual@3.0.0-beta.54(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.0.0-beta.54 + react: 18.3.1 + + '@tanstack/table-core@8.20.5': {} + + '@tanstack/virtual-core@3.0.0-beta.54': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.0 + + '@types/bcryptjs@2.4.6': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.9.0 + '@types/responselike': 1.0.3 + + '@types/codemirror@5.60.15': + dependencies: + '@types/tern': 0.23.9 + + '@types/cookie@0.4.1': {} + + '@types/cookie@0.6.0': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.9.0 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/diff-match-patch@1.0.36': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/event-source-polyfill@1.0.5': {} + + '@types/eventsource@1.1.15': {} + + '@types/follow-redirects@1.14.4': + dependencies: + '@types/node': 22.9.0 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.9.0 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.12 + hoist-non-react-statics: 3.3.2 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.9.0 + + '@types/lodash.isequal@4.5.8': + dependencies: + '@types/lodash': 4.17.13 + + '@types/lodash@4.17.13': {} + + '@types/marked@4.3.2': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/minimatch@5.1.2': {} + + '@types/minimist@1.2.5': {} + + '@types/ms@0.7.34': {} + + '@types/node@22.9.0': + dependencies: + undici-types: 6.19.8 + + '@types/normalize-package-data@2.4.4': {} + + '@types/parse-json@4.0.2': {} + + '@types/progress-stream@2.0.5': + dependencies: + '@types/node': 22.9.0 + + '@types/prop-types@15.7.13': {} + + '@types/react-copy-to-clipboard@5.0.7': + dependencies: + '@types/react': 18.3.12 + + '@types/react-dom@18.3.1': + dependencies: + '@types/react': 18.3.12 + + '@types/react-is@18.3.0': + dependencies: + '@types/react': 18.3.12 + + '@types/react-redux@7.1.34': + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.3.12 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': 18.3.12 + + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.9.0 + + '@types/shallow-equals@1.0.3': {} + + '@types/speakingurl@13.0.6': {} + + '@types/stylis@4.2.5': {} + + '@types/tar-stream@3.1.3': + dependencies: + '@types/node': 22.9.0 + + '@types/tern@0.23.9': + dependencies: + '@types/estree': 1.0.6 + + '@types/ungap__structured-clone@1.2.0': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/use-sync-external-store@0.0.6': {} + + '@types/uuid@8.3.4': {} + + '@uiw/codemirror-extensions-basic-setup@4.23.6(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + + '@uiw/codemirror-themes@4.23.6(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + + '@uiw/react-codemirror@4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@codemirror/commands': 6.7.1 + '@codemirror/state': 6.4.1 + '@codemirror/theme-one-dark': 6.1.2 + '@codemirror/view': 6.34.2 + '@uiw/codemirror-extensions-basic-setup': 4.23.6(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2) + codemirror: 6.0.1(@lezer/common@1.2.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + + '@ungap/structured-clone@1.2.0': {} + + '@vercel/stega@0.1.2': {} + + '@vitejs/plugin-react@4.3.3(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 4.5.5(@types/node@22.9.0)(terser@5.36.0) + transitivePeerDependencies: + - supports-color + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xstate/react@4.1.3(@types/react@18.3.12)(react@18.3.1)(xstate@5.18.2)': + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + xstate: 5.18.2 + transitivePeerDependencies: + - '@types/react' + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + ai@4.0.33(react@18.3.1)(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + '@ai-sdk/react': 1.0.9(react@18.3.1)(zod@3.23.8) + '@ai-sdk/ui-utils': 1.0.8(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod-to-json-schema: 3.24.1(zod@3.23.8) + optionalDependencies: + react: 18.3.1 + zod: 3.23.8 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + arg@5.0.2: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + arrify@2.0.1: {} + + astring@1.9.0: {} + + async-mutex@0.4.1: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + attr-accept@2.2.4: {} + + autoprefixer@10.4.20(postcss@8.4.47): + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001677 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + b4a@1.6.7: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.0: + optional: true + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + bcryptjs@2.4.3: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + binary-extensions@2.3.0: {} + + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-split@0.0.0: {} + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001677 + electron-to-chromium: 1.5.52 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + buffer-fill@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtins@1.0.3: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase-css@2.0.1: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001677: {} + + canvas-confetti@1.9.3: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@3.0.0: {} + + chrome-trace-event@1.0.4: {} + + class-list@0.1.1: + dependencies: + indexof: 0.0.1 + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + classnames@2.5.1: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + client-only@0.0.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + cmdk@1.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + codemirror-spell-checker@1.1.2: + dependencies: + typo-js: 1.2.4 + + codemirror@5.65.18: {} + + codemirror@6.0.1(@lezer/common@1.2.3): + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + transitivePeerDependencies: + - '@lezer/common' + + collapse-white-space@2.1.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color2k@2.0.3: {} + + colord@2.9.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commondir@1.0.1: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + compute-scroll-into-view@3.1.0: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + connect-history-api-fallback@1.6.0: {} + + console-table-printer@2.12.1: + dependencies: + simple-wcswidth: 1.0.1 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.4.2: {} + + cookie@0.6.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.2 + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + + create-react-class@15.7.0: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + crelt@1.0.6: {} + + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + css-color-keywords@1.0.0: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + 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.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssstyle@4.1.0: + dependencies: + rrweb-cssom: 0.7.1 + + csstype@3.1.3: {} + + cyclist@1.0.2: {} + + data-uri-to-buffer@1.2.0: {} + + data-uri-to-buffer@4.0.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dataloader@2.2.2: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.26.0 + + date-fns@3.6.0: {} + + date-fns@4.1.0: {} + + date-now@1.0.1: {} + + debounce@1.0.0: + dependencies: + date-now: 1.0.1 + + debounce@2.0.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.4.3: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + decompress-response@7.0.0: + dependencies: + mimic-response: 3.1.0 + + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + + deeks@3.1.0: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff-match-patch@1.0.5: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@1.0.4: {} + + dlv@1.1.3: {} + + doc-path@4.1.1: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.0 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + dom-walk@0.1.2: {} + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotenv@16.4.7: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + easymde@2.18.0: + dependencies: + '@types/codemirror': 5.60.15 + '@types/marked': 4.3.2 + codemirror: 5.65.18 + codemirror-spell-checker: 1.1.2 + marked: 4.3.0 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + + electron-to-chromium@1.5.52: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-parser@5.2.3: {} + + engine.io@6.5.5: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.9.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild-register@3.6.0(esbuild@0.21.5): + dependencies: + debug: 4.3.7 + esbuild: 0.21.5 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + event-source-polyfill@1.0.31: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + eventsource-parser@3.0.0: {} + + eventsource@2.0.2: {} + + execa@2.1.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 3.1.0 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exif-component@1.0.1: {} + + extend@3.0.2: {} + + fast-deep-equal@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.2: + 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: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-selector@0.4.0: + dependencies: + tslib: 2.8.1 + + file-selector@2.1.0: + dependencies: + tslib: 2.8.1 + + file-type@3.9.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + + file-uri-to-path@1.0.0: {} + + file-url@2.0.2: {} + + filesize@9.0.11: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-root@1.1.0: {} + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + flush-write-stream@2.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + focus-lock@1.3.5: + dependencies: + tslib: 2.8.1 + + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + framer-motion@11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + ftp@0.3.10: + dependencies: + readable-stream: 1.1.14 + xregexp: 2.0.0 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-it@8.6.5(debug@4.3.7): + dependencies: + '@types/follow-redirects': 1.14.4 + '@types/progress-stream': 2.0.5 + decompress-response: 7.0.0 + follow-redirects: 1.15.9(debug@4.3.7) + is-retry-allowed: 2.2.0 + progress-stream: 2.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - debug + + get-nonce@1.0.1: {} + + get-random-values-esm@1.0.2: + dependencies: + get-random-values: 1.2.2 + + get-random-values@1.2.2: + dependencies: + global: 4.4.0 + + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@2.0.4: + dependencies: + data-uri-to-buffer: 1.2.0 + debug: 2.6.9 + extend: 3.0.2 + file-uri-to-path: 1.0.0 + ftp: 0.3.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.3.4: + dependencies: + foreground-child: 3.3.0 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + + globals@11.12.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + groq-js@1.14.0: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + groq@3.63.0: {} + + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + hard-rejection@2.1.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@2.2.5: {} + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + history@5.3.0: + dependencies: + '@babel/runtime': 7.26.0 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + hotscript@1.0.13: {} + + html-element@2.3.1: + dependencies: + class-list: 0.1.1 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-loader@5.1.0(webpack@5.96.1(esbuild@0.21.5)): + dependencies: + html-minifier-terser: 7.2.0 + parse5: 7.2.1 + webpack: 5.96.1(esbuild@0.21.5) + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.36.0 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + + html-void-elements@3.0.0: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + humanize-list@1.0.1: {} + + hyperscript@2.0.2: + dependencies: + browser-split: 0.0.0 + class-list: 0.1.1 + html-element: 2.3.1 + + i18next@23.16.4: + dependencies: + '@babel/runtime': 7.26.0 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immer@10.1.1: {} + + immer@9.0.21: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indexof@0.0.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-deflate@1.0.0: {} + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-gzip@1.0.0: {} + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-hotkey-esm@1.0.0: {} + + is-hotkey@0.2.0: {} + + is-interactive@1.0.0: {} + + is-natural-number@4.0.1: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-retry-allowed@2.2.0: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-tar@1.0.0: {} + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.9.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.6: {} + + jose@5.9.6: {} + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + jsdom-global@3.0.2(jsdom@23.2.0): + dependencies: + jsdom: 23.2.0 + + jsdom@23.2.0: + dependencies: + '@asamuzakjp/dom-selector': 2.0.2 + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + parse5: 7.2.1 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.0.2: {} + + json-2-csv@5.5.6: + dependencies: + deeks: 3.1.0 + doc-path: 4.1.1 + + json-buffer@3.0.1: {} + + json-lexer@1.2.0: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-reduce@3.0.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + leac@0.6.0: {} + + leven@3.1.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + loader-runner@4.3.0: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.debounce@4.0.8: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.0.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lucide-react@0.414.0(react@18.3.1): + dependencies: + react: 18.3.1 + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + marked@4.3.0: {} + + marked@7.0.4: {} + + md-to-react-email@5.0.2(react@18.3.1): + dependencies: + marked: 7.0.4 + react: 18.3.1 + + md5-o-matic@0.1.1: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdast-util-toc@7.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/ungap__structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.0 + github-slugger: 2.0.0 + mdast-util-to-string: 4.0.0 + unist-util-is: 6.0.0 + unist-util-visit: 5.0.0 + + mdn-data@2.0.30: {} + + memoize-one@6.0.0: {} + + memorystream@0.3.1: {} + + mendoza@3.0.7: {} + + meow@9.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + + min-indent@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + + mississippi@4.0.0: + dependencies: + concat-stream: 2.0.0 + duplexify: 4.1.3 + end-of-stream: 1.4.4 + flush-write-stream: 2.0.0 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.2 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 3.0.2 + + mkdirp-classic@0.5.3: {} + + mkdirp@3.0.1: {} + + mnemonist@0.39.8: + dependencies: + obliterator: 2.0.4 + + module-alias@2.2.3: {} + + moment@2.30.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nano-pubsub@3.0.0: {} + + nanoid@3.3.7: {} + + nanoid@3.3.8: {} + + nanoid@5.0.8: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + next-auth@5.0.0-beta.18(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@auth/core': 0.31.0 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + next-mdx-remote-client@1.0.3(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/code-frame': 7.26.2 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1) + '@types/mdx': 2.0.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + remark-mdx-remove-esm: 1.1.0 + serialize-error: 11.0.3 + vfile: 6.0.3 + vfile-matter: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + + next-sanity@9.8.8(@sanity/client@6.22.3)(@sanity/icons@3.4.0(react@18.3.1))(@sanity/types@3.63.0)(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@portabletext/react': 3.1.0(react@18.3.1) + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/next-loader': 1.1.0(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@sanity/preview-kit': 5.1.10(@sanity/client@6.22.3)(react@18.3.1) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/visual-editing': 2.4.2(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + groq: 3.63.0 + history: 5.3.0 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@remix-run/react' + - '@sveltejs/kit' + - debug + - svelte + + next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001677 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + '@opentelemetry/api': 1.8.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.35 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001677 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.33 + '@next/swc-darwin-x64': 14.2.33 + '@next/swc-linux-arm64-gnu': 14.2.33 + '@next/swc-linux-arm64-musl': 14.2.33 + '@next/swc-linux-x64-gnu': 14.2.33 + '@next/swc-linux-x64-musl': 14.2.33 + '@next/swc-win32-arm64-msvc': 14.2.33 + '@next/swc-win32-ia32-msvc': 14.2.33 + '@next/swc-win32-x64-msvc': 14.2.33 + '@opentelemetry/api': 1.8.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nice-try@1.0.5: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + + node-releases@2.0.18: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.15.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@6.1.0: {} + + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + + npm-run-path@3.1.0: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + oauth4webapi@2.17.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.2: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + obliterator@2.0.4: {} + + observable-callback@1.0.3(rxjs@7.8.1): + dependencies: + rxjs: 7.8.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oneline@1.0.3: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.4.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + p-cancelable@2.1.1: {} + + p-finally@2.0.1: {} + + 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: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@1.2.0: {} + + p-map@7.0.2: {} + + p-queue@2.4.2: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + pako@0.2.9: {} + + parallel-transform@1.2.0: + dependencies: + cyclist: 1.0.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.11 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@2.1.0: {} + + parse-numeric-range@1.3.0: {} + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + path-type@4.0.0: {} + + peberminta@0.9.0: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + pend@1.2.0: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.3.1: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pluralize-esm@9.0.5: {} + + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.26.0 + + possible-typed-array-names@1.0.0: {} + + postcss-import@15.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.47): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@4.0.2(postcss@8.4.47): + dependencies: + lilconfig: 3.1.2 + yaml: 2.6.0 + optionalDependencies: + postcss: 8.4.47 + + postcss-nested@6.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact-render-to-string@5.2.3(preact@10.11.3): + dependencies: + preact: 10.11.3 + pretty-format: 3.8.0 + + preact@10.11.3: {} + + prettier@3.3.3: {} + + pretty-format@3.8.0: {} + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + prismjs@1.27.0: {} + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + progress-stream@2.0.0: + dependencies: + speedometer: 1.0.0 + through2: 2.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.5.0: {} + + proto-list@1.2.4: {} + + psl@1.9.0: {} + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + quick-lru@4.0.1: {} + + quick-lru@5.1.1: {} + + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-clientside-effect@1.2.6(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + + react-compiler-runtime@19.0.0-beta-9ee70a1-20241017(react@18.3.1): + dependencies: + react: 18.3.1 + + react-copy-to-clipboard@5.1.0(react@18.3.1): + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.3.1 + + react-day-picker@9.3.0(react@18.3.1): + dependencies: + '@date-fns/tz': 1.2.0 + date-fns: 4.1.0 + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dropzone@11.7.1(react@18.3.1): + dependencies: + attr-accept: 2.2.4 + file-selector: 0.4.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-dropzone@14.3.5(react@18.3.1): + dependencies: + attr-accept: 2.2.4 + file-selector: 2.1.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-email@3.0.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.19.11 + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + normalize-path: 3.0.0 + ora: 5.4.1 + socket.io: 4.7.5 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - bufferutil + - react + - react-dom + - sass + - supports-color + - utf-8-validate + + react-fast-compare@3.2.2: {} + + react-file-icon@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + colord: 2.9.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-focus-lock@2.13.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + focus-lock: 1.3.5 + prop-types: 15.8.1 + react: 18.3.1 + react-clientside-effect: 1.2.6(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-hook-form@7.53.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-i18next@14.0.2(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + html-parse-stringify: 3.0.1 + i18next: 23.16.4 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-iframe@1.8.5(react@18.3.1): + dependencies: + object-assign: 4.1.1 + react: 18.3.1 + + react-infinite-scroll-component@6.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + throttle-debounce: 2.3.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-lifecycles-compat@3.0.4: {} + + react-photo-album@2.3.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@types/react-redux': 7.1.34 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 17.0.2 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-refractor@2.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + refractor: 3.6.0 + unist-util-filter: 2.0.3 + unist-util-visit-parents: 3.1.1 + + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-remove-scroll@2.5.5(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-rx@4.1.3(react@18.3.1)(rxjs@7.8.1): + dependencies: + observable-callback: 1.0.3(rxjs@7.8.1) + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + rxjs: 7.8.1 + use-effect-event: 1.0.2(react@18.3.1) + + react-select@5.8.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.13.1 + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@floating-ui/dom': 1.6.12 + '@types/react-transition-group': 4.4.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-simplemde-editor@5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@types/codemirror': 5.60.15 + easymde: 2.18.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-style-proptype@3.2.2: + dependencies: + prop-types: 15.8.1 + + react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-virtuoso@4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redux-observable@2.0.0(redux@4.2.1): + dependencies: + redux: 4.2.1 + rxjs: 7.8.1 + tslib: 2.1.0 + + redux-thunk@2.4.2(redux@4.2.1): + dependencies: + redux: 4.2.1 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.26.0 + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + + regex@4.4.0: {} + + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@6.1.1: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.11.2: + dependencies: + jsesc: 3.0.2 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.13.2(shiki@1.22.2): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 1.22.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + relateurl@0.2.7: {} + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx-remove-esm@1.1.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-mdxjs-esm: 2.0.1 + unist-util-remove: 4.0.0 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + reselect@4.1.8: {} + + resend@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@react-email/render': 0.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.1 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} + + rrweb-cssom@0.7.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs-exhaustmap-with-trailing@2.1.1(rxjs@7.8.1): + dependencies: + rxjs: 7.8.1 + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + sanity-diff-patch@4.0.0: + dependencies: + '@sanity/diff-match-patch': 3.1.1 + + sanity-plugin-asset-source-unsplash@3.0.1(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + react: 18.3.1 + react-infinite-scroll-component: 6.1.0(react@18.3.1) + react-photo-album: 2.3.1(react@18.3.1) + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + sanity-plugin-iframe-pane@3.1.6(@sanity/client@6.22.3)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/preview-url-secret': 1.6.21(@sanity/client@6.22.3) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + suspend-react: 0.1.3(react@18.3.1) + usehooks-ts: 3.0.1(react@18.3.1) + transitivePeerDependencies: + - '@sanity/client' + - react-dom + - react-is + + sanity-plugin-internationalized-array@2.1.0(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/language-filter': 4.0.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + fast-deep-equal: 3.1.3 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + suspend-react: 0.1.3(react@18.3.1) + transitivePeerDependencies: + - '@sanity/util' + + sanity-plugin-markdown@5.0.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + easymde: 2.18.0 + react: 18.3.1 + react-simplemde-editor: 5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + sanity-plugin-media@2.3.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@hookform/resolvers': 3.9.1(react-hook-form@7.53.1(react@18.3.1)) + '@reduxjs/toolkit': 1.9.7(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/uuid': 3.0.2 + '@tanem/react-nprogress': 5.0.52(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + copy-to-clipboard: 3.3.3 + date-fns: 2.30.0 + filesize: 9.0.11 + groq: 3.63.0 + is-hotkey: 0.2.0 + nanoid: 3.3.7 + npm-run-all: 4.1.5 + pluralize: 8.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dropzone: 11.7.1(react@18.3.1) + react-file-icon: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-hook-form: 7.53.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-select: 5.8.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-virtuoso: 4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: 4.2.1 + redux-observable: 2.0.0(redux@4.2.1) + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - react-native + - supports-color + + sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0): + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + '@juggle/resize-observer': 3.4.0 + '@portabletext/editor': 1.5.4(@sanity/block-tools@3.63.0(debug@4.3.7))(@sanity/schema@3.63.0(debug@4.3.7))(@sanity/types@3.63.0)(@sanity/util@3.63.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@portabletext/react': 3.1.0(react@18.3.1) + '@rexxars/react-json-inspector': 8.0.1(react@18.3.1) + '@sanity/asset-utils': 2.1.0 + '@sanity/bifur-client': 0.4.1 + '@sanity/block-tools': 3.63.0(debug@4.3.7) + '@sanity/cli': 3.63.0(react@18.3.1) + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/color': 3.0.6 + '@sanity/diff': 3.63.0 + '@sanity/diff-match-patch': 3.1.1 + '@sanity/eventsource': 5.0.2 + '@sanity/export': 3.41.0 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/image-url': 1.1.0 + '@sanity/import': 3.37.8 + '@sanity/insert-menu': 1.0.10(@sanity/types@3.63.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/logos': 2.1.13(@sanity/color@3.0.6)(react@18.3.1) + '@sanity/migrate': 3.63.0 + '@sanity/mutator': 3.63.0 + '@sanity/presentation': 1.17.8(@sanity/client@6.22.3)(@sanity/color@3.0.6)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/schema': 3.63.0(debug@4.3.7) + '@sanity/telemetry': 0.7.9(react@18.3.1) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/util': 3.63.0(debug@4.3.7) + '@sanity/uuid': 3.0.2 + '@sentry/react': 8.37.1(react@18.3.1) + '@tanstack/react-table': 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.0.0-beta.54(react@18.3.1) + '@types/react-copy-to-clipboard': 5.0.7 + '@types/react-is': 18.3.0 + '@types/shallow-equals': 1.0.3 + '@types/speakingurl': 13.0.6 + '@types/tar-stream': 3.1.3 + '@types/use-sync-external-store': 0.0.6 + '@vitejs/plugin-react': 4.3.3(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)) + archiver: 7.0.1 + arrify: 1.0.1 + async-mutex: 0.4.1 + chalk: 4.1.2 + chokidar: 3.6.0 + classnames: 2.5.1 + color2k: 2.0.3 + configstore: 5.0.1 + connect-history-api-fallback: 1.6.0 + console-table-printer: 2.12.1 + dataloader: 2.2.2 + date-fns: 2.30.0 + debug: 4.3.7 + esbuild: 0.21.5 + esbuild-register: 3.6.0(esbuild@0.21.5) + execa: 2.1.0 + exif-component: 1.0.1 + form-data: 4.0.1 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + get-it: 8.6.5(debug@4.3.7) + get-random-values-esm: 1.0.2 + groq-js: 1.14.0 + history: 5.3.0 + i18next: 23.16.4 + import-fresh: 3.3.0 + is-hotkey-esm: 1.0.0 + jsdom: 23.2.0 + jsdom-global: 3.0.2(jsdom@23.2.0) + json-lexer: 1.2.0 + json-reduce: 3.0.0 + json5: 2.2.3 + lodash: 4.17.21 + log-symbols: 2.2.0 + mendoza: 3.0.7 + module-alias: 2.2.3 + nano-pubsub: 3.0.0 + nanoid: 3.3.7 + node-html-parser: 6.1.13 + observable-callback: 1.0.3(rxjs@7.8.1) + oneline: 1.0.3 + open: 8.4.2 + p-map: 7.0.2 + pirates: 4.0.6 + pluralize-esm: 9.0.5 + polished: 4.3.1 + pretty-ms: 7.0.1 + quick-lru: 5.1.1 + raf: 3.4.1 + react: 18.3.1 + react-copy-to-clipboard: 5.1.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + react-focus-lock: 2.13.2(@types/react@18.3.12)(react@18.3.1) + react-i18next: 14.0.2(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + react-rx: 4.1.3(react@18.3.1)(rxjs@7.8.1) + read-pkg-up: 7.0.1 + refractor: 3.6.0 + resolve-from: 5.0.0 + resolve.exports: 2.0.2 + rimraf: 3.0.2 + rxjs: 7.8.1 + rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.1) + sanity-diff-patch: 4.0.0 + scroll-into-view-if-needed: 3.1.0 + semver: 7.6.3 + shallow-equals: 1.0.0 + speakingurl: 14.0.1 + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tar-fs: 2.1.1 + tar-stream: 3.1.7 + use-device-pixel-ratio: 1.1.2(react@18.3.1) + use-hot-module-reload: 2.0.0(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + vite: 4.5.5(@types/node@22.9.0)(terser@5.36.0) + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - bufferutil + - canvas + - less + - lightningcss + - react-native + - sass + - stylus + - sugarss + - supports-color + - terser + - utf-8-validate + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.0 + + secure-json-parse@2.7.0: {} + + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-error@11.0.3: + dependencies: + type-fest: 2.19.0 + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallow-equals@1.0.0: {} + + shallowequal@1.1.0: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + shiki@1.22.2: + dependencies: + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + silver-fleece@1.1.0: {} + + simple-wcswidth@1.0.1: {} + + slash@3.0.0: {} + + slate-dom@0.111.0(slate@0.110.2): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.17.21 + scroll-into-view-if-needed: 3.1.0 + slate: 0.110.2 + tiny-invariant: 1.3.1 + + slate-react@0.111.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-dom@0.111.0(slate@0.110.2))(slate@0.110.2): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + slate: 0.110.2 + slate-dom: 0.111.0(slate@0.110.2) + tiny-invariant: 1.3.1 + + slate@0.110.2: + dependencies: + immer: 10.1.1 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.7.5: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.5.5 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + sonner@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + speakingurl@14.0.1: {} + + speedometer@1.0.0: {} + + split2@4.2.0: {} + + stream-each@1.2.3: + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.3 + + stream-shift@1.0.3: {} + + streamsearch@1.1.0: {} + + streamx@2.20.1: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + stripe@15.12.0: + dependencies: + '@types/node': 22.9.0 + qs: 6.13.0 + + style-mod@4.1.2: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 + css-to-react-native: 3.2.0 + csstype: 3.1.3 + postcss: 8.4.38 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + + styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 + + styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.0 + + stylis@4.2.0: {} + + stylis@4.3.2: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + suspend-react@0.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + swr@2.3.0(react@18.3.1): + dependencies: + dequal: 2.0.3 + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + + symbol-tree@3.2.4: {} + + tailwind-merge@2.5.4: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.14): + dependencies: + tailwindcss: 3.4.14 + + tailwindcss@3.4.14: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.20.1 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser-webpack-plugin@5.3.10(esbuild@0.21.5)(webpack@5.96.1(esbuild@0.21.5)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.36.0 + webpack: 5.96.1(esbuild@0.21.5) + optionalDependencies: + esbuild: 0.21.5 + + terser@5.36.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.1: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + third-party-capital@1.0.20: {} + + throttle-debounce@2.3.0: {} + + throttleit@2.1.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + through@2.3.8: {} + + tiny-invariant@1.3.1: {} + + tiny-warning@1.0.3: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + to-buffer@1.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + transliteration@2.3.5: + dependencies: + yargs: 17.7.2 + + trim-lines@3.0.1: {} + + trim-newlines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.1.0: {} + + tslib@2.6.2: {} + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-fest@0.18.1: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@2.19.0: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typedarray@0.0.6: {} + + typeid-js@0.3.0: + dependencies: + uuidv7: 0.4.4 + + typescript@5.6.3: {} + + typo-js@1.2.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + undici-types@6.19.8: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + unist-util-filter@2.0.3: + dependencies: + unist-util-is: 4.1.0 + + unist-util-is@4.1.0: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.2.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-debounce@10.0.4(react@18.3.1): + dependencies: + react: 18.3.1 + + use-device-pixel-ratio@1.1.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-effect-event@1.0.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-hot-module-reload@2.0.0(react@18.3.1): + dependencies: + react: 18.3.1 + + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-sync-external-store@1.4.0(react@18.3.1): + dependencies: + react: 18.3.1 + + usehooks-ts@3.0.1(react@18.3.1): + dependencies: + lodash.debounce: 4.0.8 + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@10.0.0: {} + + uuid@8.3.2: {} + + uuidv7@0.4.4: {} + + valibot@0.31.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@3.0.0: + dependencies: + builtins: 1.0.3 + + vary@1.1.2: {} + + vaul@0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-matter@5.0.0: + dependencies: + vfile: 6.0.3 + yaml: 2.6.0 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite@4.5.5(@types/node@22.9.0)(terser@5.36.0): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.47 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 22.9.0 + fsevents: 2.3.3 + terser: 5.36.0 + + void-elements@3.1.0: {} + + w3c-keyname@2.2.8: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-namespaces@2.0.1: {} + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@7.0.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.96.1(esbuild@0.21.5): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.14.0 + browserslist: 4.24.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.21.5)(webpack@5.96.1(esbuild@0.21.5)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + whoops@4.1.7: + dependencies: + clean-stack: 3.0.1 + mimic-fn: 3.1.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@8.17.1: {} + + ws@8.18.0: {} + + xdg-basedir@4.0.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xregexp@2.0.0: {} + + xstate@5.18.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@1.10.2: {} + + yaml@2.6.0: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 + + zod-to-json-schema@3.24.1(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod@3.23.8: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..47f1ecf Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..4931226 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..46df4ae Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..3e1ce30 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..d18905c Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..0693b05 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/logo-dark.png b/public/logo-dark.png new file mode 100644 index 0000000..ebee732 Binary files /dev/null and b/public/logo-dark.png differ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..ebee732 Binary files /dev/null and b/public/logo.png differ diff --git a/public/logo_mkdirs.png b/public/logo_mkdirs.png new file mode 100644 index 0000000..ebee732 Binary files /dev/null and b/public/logo_mkdirs.png differ diff --git a/public/og.png b/public/og.png new file mode 100644 index 0000000..2cd3075 Binary files /dev/null and b/public/og.png differ diff --git a/public/placeholder.svg b/public/placeholder.svg new file mode 100644 index 0000000..e763910 --- /dev/null +++ b/public/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/sanity-typegen.json b/sanity-typegen.json new file mode 100644 index 0000000..a6447b8 --- /dev/null +++ b/sanity-typegen.json @@ -0,0 +1,6 @@ +{ + "path": "src/sanity/lib/queries.ts", + "generates": "sanity.types.ts", + "schema": "schema.json", + "overloadClientMethods": true +} diff --git a/sanity.cli.ts b/sanity.cli.ts new file mode 100644 index 0000000..4485d2d --- /dev/null +++ b/sanity.cli.ts @@ -0,0 +1,14 @@ +import { dataset, projectId } from "@/sanity/lib/api"; +import { defineCliConfig } from "sanity/cli"; + +/** + * https://www.sanity.io/docs/cli + * Build, deploy, init plugin boilerplate, run scripts, + * and wrangle datasets and webhooks, all from the command line + */ +export default defineCliConfig({ + api: { + projectId, + dataset + } +}); diff --git a/sanity.config.ts b/sanity.config.ts new file mode 100644 index 0000000..ff6bc0b --- /dev/null +++ b/sanity.config.ts @@ -0,0 +1,96 @@ +import { CustomMarkdownInput } from '@/sanity/components/custom-markdown-input'; +import documentNode from '@/sanity/document-node'; +import { apiVersion, dataset, projectId, studioUrl } from '@/sanity/lib/api'; +import { singletonPlugin } from '@/sanity/plugins/singleton'; +import { schemaTypes } from '@/sanity/schemas'; +import settings from '@/sanity/schemas/documents/settings'; +import { structure } from '@/sanity/structure'; +import { codeInput } from '@sanity/code-input'; +import { + dashboardTool, + projectInfoWidget, + projectUsersWidget, + sanityTutorialsWidget +} from "@sanity/dashboard"; +import { visionTool } from '@sanity/vision'; +import { defineConfig } from 'sanity'; +import { unsplashImageAsset } from "sanity-plugin-asset-source-unsplash"; +import { markdownSchema } from "sanity-plugin-markdown"; +import { media } from 'sanity-plugin-media'; +import { presentationTool } from 'sanity/presentation'; +import { structureTool } from 'sanity/structure'; +import { customDocumentActionsPlugin } from '@/sanity/plugins/customDocumentActions'; + +export default defineConfig({ + name: 'Studio', + basePath: studioUrl, + projectId, + dataset, + + schema: { + types: schemaTypes, + }, + + plugins: [ + // https://www.sanity.io/docs/structure-tool-api + // The Structure Tool is a top-level view within Sanity Studio + // where editors can drill down to specific documents to edit them. + structureTool({ + defaultDocumentNode: documentNode, + structure: structure(), + }), + + // https://www.sanity.io/docs/the-vision-plugin + // Vision is a plugin that lets you quickly test your GROQ queries right from the Studio. + visionTool({ + title: 'Query', + defaultApiVersion: apiVersion, + defaultDataset: dataset, + }), + + // https://www.sanity.io/docs/configuring-the-presentation-tool + // https://www.sanity.io/docs/draft-mode + // The Presentation tool enables Visual Editing for interactive live previews. + // demo: https://github.com/javayhu/sanity-press/blob/main/sanity/src/presentation.ts#L4 + // demo: https://github.com/javayhu/sanity-press/blob/main/sanity/sanity.config.ts#L32 + presentationTool({ + previewUrl: { previewMode: { enable: "/api/draft" } }, + }), + + // https://www.sanity.io/plugins/sanity-plugin-media + // A convenient way to browse, manage and select all your Sanity assets. + media(), + + // https://www.sanity.io/plugins/sanity-plugin-markdown + markdownSchema({ input: CustomMarkdownInput }), + + // https://www.sanity.io/docs/dashboard + // Dashboard is a Sanity Studio tool that allows you to add widgets that display information + // about your content, project details, or anything else you'd want to put there. + dashboardTool({ + widgets: [ + projectInfoWidget(), + projectUsersWidget( + { layout: { width: 'large' } } + ), + sanityTutorialsWidget() + ], + }), + + // Configures the global "new document" button, and document actions, + // hide the "duplicate" action on the Singletons (such as Settings) + singletonPlugin([settings.name]), + + // https://www.sanity.io/plugins/code-input + // Syntax highlighted editor for code. + // if you need codeInput, you need to install @sanity/code-input + codeInput(), + + // https://www.sanity.io/plugins/sanity-plugin-asset-source-unsplash + // Search photos on Unsplash and insert them directly inside of your Sanity Studio. + unsplashImageAsset(), + + // https://www.sanity.io/docs/document-actions + customDocumentActionsPlugin() + ], +}) diff --git a/sanity.types.ts b/sanity.types.ts new file mode 100644 index 0000000..0ec3cd1 --- /dev/null +++ b/sanity.types.ts @@ -0,0 +1,2461 @@ +/** + * --------------------------------------------------------------------------------- + * This file has been generated by Sanity TypeGen. + * Command: `sanity typegen generate` + * + * Any modifications made directly to this file will be overwritten the next time + * the TypeScript definitions are generated. Please make changes to the Sanity + * schema definitions and/or GROQ queries if you need to update these types. + * + * For more information on how to use Sanity TypeGen, visit the official documentation: + * https://www.sanity.io/docs/sanity-typegen + * --------------------------------------------------------------------------------- + */ + +// Source: schema.json +export type SanityImagePaletteSwatch = { + _type: "sanity.imagePaletteSwatch"; + background?: string; + foreground?: string; + population?: number; + title?: string; +}; + +export type SanityImagePalette = { + _type: "sanity.imagePalette"; + darkMuted?: SanityImagePaletteSwatch; + lightVibrant?: SanityImagePaletteSwatch; + darkVibrant?: SanityImagePaletteSwatch; + vibrant?: SanityImagePaletteSwatch; + dominant?: SanityImagePaletteSwatch; + lightMuted?: SanityImagePaletteSwatch; + muted?: SanityImagePaletteSwatch; +}; + +export type SanityImageDimensions = { + _type: "sanity.imageDimensions"; + height?: number; + width?: number; + aspectRatio?: number; +}; + +export type SanityFileAsset = { + _id: string; + _type: "sanity.fileAsset"; + _createdAt: string; + _updatedAt: string; + _rev: string; + originalFilename?: string; + label?: string; + title?: string; + description?: string; + altText?: string; + sha1hash?: string; + extension?: string; + mimeType?: string; + size?: number; + assetId?: string; + uploadId?: string; + path?: string; + url?: string; + source?: SanityAssetSourceData; +}; + +export type Geopoint = { + _type: "geopoint"; + lat?: number; + lng?: number; + alt?: number; +}; + +export type BlockContent = Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "normal" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "blockquote"; + listItem?: "bullet" | "number"; + markDefs?: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + } | { + href?: string; + _type: "link"; + _key: string; + }>; + level?: number; + _type: "block"; + _key: string; +} | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; +} | { + _key: string; +} & Code>; + +export type Settings = { + _id: string; + _type: "settings"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; +}; + +export type PasswordResetToken = { + _id: string; + _type: "passwordResetToken"; + _createdAt: string; + _updatedAt: string; + _rev: string; + identifier?: string; + token?: string; + expires?: string; +}; + +export type VerificationToken = { + _id: string; + _type: "verificationToken"; + _createdAt: string; + _updatedAt: string; + _rev: string; + identifier?: string; + token?: string; + expires?: string; +}; + +export type Page = { + _id: string; + _type: "page"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + body?: BlockContent; + publishDate?: string; +}; + +export type BlogCategory = { + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; +}; + +export type BlogPost = { + _id: string; + _type: "blogPost"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + featured?: boolean; + categories?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "blogCategory"; + }>; + author?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + body?: BlockContent; + image?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + relatedPosts?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "blogPost"; + }>; + publishDate?: string; +}; + +export type Collection = { + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; +}; + +export type Category = { + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +}; + +export type Group = { + _id: string; + _type: "group"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; +}; + +export type Tag = { + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +}; + +export type Item = { + _id: string; + _type: "item"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + featured?: boolean; + link?: string; + affiliateLink?: string; + description?: string; + collections?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "collection"; + }>; + categories?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "category"; + }>; + tags?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "tag"; + }>; + submitter?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + introduction?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + image?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + publishDate?: string; + pricePlan?: "free" | "pro" | "sponsor"; + freePlanStatus?: "submitting" | "pending" | "approved" | "rejected"; + proPlanStatus?: "submitting" | "pending" | "success" | "failed"; + rejectionReason?: "The item is not good fit for our directory" | "The image of the item is not in good quality" | "The icon of the item is not in good quality" | "The information of the item is not clear" | "The backlink to our site is not provided" | "Other reasons"; + sponsorPlanStatus?: "submitting" | "pending" | "success" | "failed"; + paid?: boolean; + order?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + }; + forceHidden?: boolean; + sponsor?: boolean; + sponsorStartDate?: string; + sponsorEndDate?: string; + note?: string; +}; + +export type Order = { + _id: string; + _type: "order"; + _createdAt: string; + _updatedAt: string; + _rev: string; + user?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + item?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "item"; + }; + status?: "success" | "failed"; + date?: string; +}; + +export type SanityImageCrop = { + _type: "sanity.imageCrop"; + top?: number; + bottom?: number; + left?: number; + right?: number; +}; + +export type SanityImageHotspot = { + _type: "sanity.imageHotspot"; + x?: number; + y?: number; + height?: number; + width?: number; +}; + +export type SanityImageAsset = { + _id: string; + _type: "sanity.imageAsset"; + _createdAt: string; + _updatedAt: string; + _rev: string; + originalFilename?: string; + label?: string; + title?: string; + description?: string; + altText?: string; + sha1hash?: string; + extension?: string; + mimeType?: string; + size?: number; + assetId?: string; + uploadId?: string; + path?: string; + url?: string; + metadata?: SanityImageMetadata; + source?: SanityAssetSourceData; +}; + +export type SanityAssetSourceData = { + _type: "sanity.assetSourceData"; + name?: string; + id?: string; + url?: string; +}; + +export type SanityImageMetadata = { + _type: "sanity.imageMetadata"; + location?: Geopoint; + dimensions?: SanityImageDimensions; + palette?: SanityImagePalette; + lqip?: string; + blurHash?: string; + hasAlpha?: boolean; + isOpaque?: boolean; +}; + +export type User = { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; +}; + +export type Account = { + _id: string; + _type: "account"; + _createdAt: string; + _updatedAt: string; + _rev: string; + userId?: string; + type?: string; + provider?: string; + providerAccountId?: string; + refreshToken?: string; + accessToken?: string; + expiresAt?: number; + tokenType?: string; + scope?: string; + idToken?: string; + sessionState?: string; + user?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; +}; + +export type Code = { + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; +}; + +export type Markdown = string; + +export type MediaTag = { + _id: string; + _type: "media.tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: Slug; +}; + +export type Slug = { + _type: "slug"; + current?: string; + source?: string; +}; + +export type AllSanitySchemaTypes = SanityImagePaletteSwatch | SanityImagePalette | SanityImageDimensions | SanityFileAsset | Geopoint | BlockContent | Settings | PasswordResetToken | VerificationToken | Page | BlogCategory | BlogPost | Collection | Category | Group | Tag | Item | Order | SanityImageCrop | SanityImageHotspot | SanityImageAsset | SanityAssetSourceData | SanityImageMetadata | User | Account | Code | Markdown | MediaTag | Slug; +export declare const internalGroqTypeReferenceTo: unique symbol; +// Source: src/sanity/lib/queries.ts +// Variable: itemByIdQuery +// Query: *[_type == "item" && _id == $id][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemByIdQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemInfoBySlugQuery +// Query: *[_type == "item" && slug.current == $slug][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemInfoBySlugQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemFullInfoByIdQuery +// Query: *[_type == "item" && _id == $id][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->, introduction,} +export type ItemFullInfoByIdQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; + introduction: string | null; +} | null; +// Variable: itemFullInfoBySlugQuery +// Query: *[_type == "item" && slug.current == $slug && forceHidden != true] [0] { introduction, "related": *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true && count(categories[@._ref in ^.^.categories[]._ref]) > 0 && _id != ^._id] | order(publishedDate desc, _createdAt desc) [0...3] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->, }, _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemFullInfoBySlugQueryResult = { + introduction: string | null; + related: Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; + }>; + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemListQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true] | order(coalesce(featured, false) desc, publishDate desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: sponsorItemListQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor == true && sponsorStartDate <= now() && sponsorEndDate >= now()] | order(coalesce(featured, false) desc, publishDate desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type SponsorItemListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: itemListOfFeaturedQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true && featured == true] | order(coalesce(featured, false) desc, publishDate desc) [0...$count] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListOfFeaturedQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: itemListOfLatestQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true] | order(coalesce(featured, false) desc, publishDate desc) [0...$count] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListOfLatestQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: collectionListQuery +// Query: *[_type == "collection" && defined(slug.current)] | order(priority desc) { ..., icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, },} +export type CollectionListQueryResult = Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + priority?: number; +}>; +// Variable: collectionQuery +// Query: *[_type == "collection" && slug.current == $slug][0] { ..., icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, },} +export type CollectionQueryResult = { + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + priority?: number; +} | null; +// Variable: groupListQuery +// Query: *[_type=="group"] | order(priority desc, _createdAt asc) { ..., "categories": *[_type=='category' && references(^._id)] | order(priority desc, _createdAt asc) { ..., }} +export type GroupListQueryResult = Array<{ + _id: string; + _type: "group"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }>; +}>; +// Variable: categoryListQuery +// Query: *[_type == "category" && defined(slug.current)] | order(priority desc) { ...,} +export type CategoryListQueryResult = Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +}>; +// Variable: categoryQuery +// Query: *[_type == "category" && slug.current == $slug][0] { ...,} +export type CategoryQueryResult = { + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +} | null; +// Variable: tagListQuery +// Query: *[_type == "tag" && defined(slug.current)] | order(slug.current asc) { ...,} +export type TagListQueryResult = Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +}>; +// Variable: tagQuery +// Query: *[_type == "tag" && slug.current == $slug][0] { ...,} +export type TagQueryResult = { + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +} | null; +// Variable: submissionListQuery +// Query: *[_type == "item" && defined(slug.current) && submitter._ref == $userId] | order(_createdAt desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type SubmissionListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: pageQuery +// Query: *[_type == "page" && slug.current == $slug][0] { ..., body[]{ ..., markDefs[]{ ..., _type == "internalLink" => { "slug": @.reference->slug } } }, } +export type PageQueryResult = { + _id: string; + _type: "page"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + body: Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal"; + listItem?: "bullet" | "number"; + markDefs: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + slug: null; + } | { + href?: string; + _type: "link"; + _key: string; + }> | null; + level?: number; + _type: "block"; + _key: string; + } | { + _key: string; + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; + markDefs: null; + } | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; + markDefs: null; + }> | null; + publishDate?: string; +} | null; +// Variable: blogCategoryListQuery +// Query: *[_type == "blogCategory" && defined(slug.current)] | order(priority desc) { name, slug, description, priority,} +export type BlogCategoryListQueryResult = Array<{ + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; +}>; +// Variable: blogCategoryMetadateQuery +// Query: *[_type == "blogCategory" && slug.current == $slug][0] { name, slug, description, priority, } +export type BlogCategoryMetadateQueryResult = { + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; +} | null; +// Variable: blogPostQuery +// Query: *[_type == "blogPost" && slug.current == $slug][0] { relatedPosts[]-> { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->, }, body[]{ ..., markDefs[]{ ..., _type == "internalLink" => { "slug": @.reference->slug } } }, _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->, // "estReadingTime": round(length(pt::text(body)) / 5 / 180 ), // "related": *[_type == "blogPost" && count(categories[@._ref in ^.^.categories[]._ref]) > 0 ] | order(publishedDate desc, _createdAt desc) [0...2] { // slug, // title, // excerpt, // publishDate, // "date": coalesce(publishedDate, _createdAt), // "image": image // },} +export type BlogPostQueryResult = { + relatedPosts: Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; + }> | null; + body: Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal"; + listItem?: "bullet" | "number"; + markDefs: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + slug: null; + } | { + href?: string; + _type: "link"; + _key: string; + }> | null; + level?: number; + _type: "block"; + _key: string; + } | { + _key: string; + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; + markDefs: null; + } | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; + markDefs: null; + }> | null; + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +} | null; +// Variable: blogPostMetadataQuery +// Query: *[_type == "blogPost" && slug.current == $slug][0] { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostMetadataQueryResult = { + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +} | null; +// Variable: blogPostListQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc) { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostListQueryResult = Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +}>; +// Variable: blogPostListOfLatestQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc) [0...$count] { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostListOfLatestQueryResult = Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +}>; +// Variable: searchBlogQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate) && _score > 0] | score(title match $query || excerpt match $query || pt::text(body) match $query) | order(_score desc) { _score, _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type SearchBlogQueryResult = Array; +// Variable: blogCategoryWithCountQuery +// Query: *[_type == "blogCategory"] { name, slug, description, priority, "count": count(*[_type == "blogPost" && references(^._id)])} | order(count desc) [0...5] +export type BlogCategoryWithCountQueryResult = Array<{ + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; + count: number; +}>; +// Variable: userWithAccountsQuery +// Query: *[_type == "user" && _id == $id][0] { ..., accounts[]->, } +export type UserWithAccountsQueryResult = { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts: null; + stripeCustomerId?: string; +} | null; +// Variable: itemListQueryForSitemap +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type ItemListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; +// Variable: categoryListQueryForSitemap +// Query: *[_type == "category" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type CategoryListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: tagListQueryForSitemap +// Query: *[_type == "tag" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type TagListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: collectionListQueryForSitemap +// Query: *[_type == "collection" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type CollectionListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: blogListQueryForSitemap +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc, _createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type BlogListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; +// Variable: blogCategoryListQueryForSitemap +// Query: *[_type == "blogCategory" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "blogPost" && defined(publishDate) && references(^._id)])} +export type BlogCategoryListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: pageListQueryForSitemap +// Query: *[_type == "page" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type PageListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; + +// Query TypeMap +import "@sanity/client"; +declare module "@sanity/client" { + interface SanityQueries { + "*[_type == \"item\" && _id == $id][0] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemByIdQueryResult; + "*[_type == \"item\" && slug.current == $slug][0] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemInfoBySlugQueryResult; + "*[_type == \"item\" && _id == $id][0] {\n \n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n introduction,\n\n}": ItemFullInfoByIdQueryResult; + "*[_type == \"item\" && slug.current == $slug \n&& forceHidden != true] [0] {\n \n introduction,\n \"related\": *[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true\n && sponsor != true\n && count(categories[@._ref in ^.^.categories[]._ref]) > 0 && _id != ^._id] \n | order(publishedDate desc, _createdAt desc) [0...3] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n },\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n\n}": ItemFullInfoBySlugQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate)\n && forceHidden != true\n && sponsor != true]\n | order(coalesce(featured, false) desc, publishDate desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate)\n && forceHidden != true\n && sponsor == true\n && sponsorStartDate <= now()\n && sponsorEndDate >= now()] \n | order(coalesce(featured, false) desc, publishDate desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": SponsorItemListQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true \n && sponsor != true\n && featured == true] \n | order(coalesce(featured, false) desc, publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListOfFeaturedQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true\n && sponsor != true] \n | order(coalesce(featured, false) desc, publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListOfLatestQueryResult; + "*[_type == \"collection\" && defined(slug.current)] \n | order(priority desc) {\n \n ...,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n\n}": CollectionListQueryResult; + "*[_type == \"collection\" && slug.current == $slug][0] {\n \n ...,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n\n}": CollectionQueryResult; + "*[_type==\"group\"] | order(priority desc, _createdAt asc) {\n \n ...,\n \"categories\": *[_type=='category' && references(^._id)] | order(priority desc, _createdAt asc)\n { \n ..., \n }\n\n}": GroupListQueryResult; + "*[_type == \"category\" && defined(slug.current)] \n | order(priority desc) {\n \n ...,\n\n}": CategoryListQueryResult; + "*[_type == \"category\" && slug.current == $slug][0] {\n \n ...,\n\n}": CategoryQueryResult; + "*[_type == \"tag\" && defined(slug.current)] \n | order(slug.current asc) {\n \n ...,\n\n}": TagListQueryResult; + "*[_type == \"tag\" && slug.current == $slug][0] {\n \n ...,\n\n}": TagQueryResult; + "*[_type == \"item\" && defined(slug.current)\n && submitter._ref == $userId] \n | order(_createdAt desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": SubmissionListQueryResult; + "\n *[_type == \"page\" && slug.current == $slug][0] {\n ...,\n body[]{\n ...,\n markDefs[]{\n ...,\n _type == \"internalLink\" => {\n \"slug\": @.reference->slug\n }\n }\n },\n }\n": PageQueryResult; + "\n *[_type == \"blogCategory\" && defined(slug.current)] \n | order(priority desc) {\n \n name,\n slug,\n description,\n priority,\n\n}": BlogCategoryListQueryResult; + "\n *[_type == \"blogCategory\" && slug.current == $slug][0] {\n \n name,\n slug,\n description,\n priority,\n\n }\n": BlogCategoryMetadateQueryResult; + "\n *[_type == \"blogPost\" && slug.current == $slug][0] {\n \n relatedPosts[]-> {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n },\n body[]{\n ...,\n markDefs[]{\n ...,\n _type == \"internalLink\" => {\n \"slug\": @.reference->slug\n }\n }\n },\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n \n // \"estReadingTime\": round(length(pt::text(body)) / 5 / 180 ),\n // \"related\": *[_type == \"blogPost\" && count(categories[@._ref in ^.^.categories[]._ref]) > 0 ] | order(publishedDate desc, _createdAt desc) [0...2] {\n // slug,\n // title,\n // excerpt,\n // publishDate,\n // \"date\": coalesce(publishedDate, _createdAt),\n // \"image\": image\n // },\n\n}": BlogPostQueryResult; + "\n *[_type == \"blogPost\" && slug.current == $slug][0] {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostMetadataQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] \n | order(publishDate desc) {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostListQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] \n | order(publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostListOfLatestQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate) && _score > 0]\n | score(title match $query || excerpt match $query || pt::text(body) match $query)\n | order(_score desc) {\n _score,\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": SearchBlogQueryResult; + "\n *[_type == \"blogCategory\"] {\n \n name,\n slug,\n description,\n priority,\n\n \"count\": count(*[_type == \"blogPost\" && references(^._id)])\n} | order(count desc) [0...5]": BlogCategoryWithCountQueryResult; + "\n *[_type == \"user\" && _id == $id][0] {\n ...,\n accounts[]->,\n }\n": UserWithAccountsQueryResult; + "*[_type == \"item\" && defined(slug.current) && defined(publishDate)] | order(_createdAt asc) {\n _id,\n _updatedAt,\n \"slug\": slug.current,\n}": ItemListQueryForSitemapResult; + "*[_type == \"category\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": CategoryListQueryForSitemapResult; + "*[_type == \"tag\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": TagListQueryForSitemapResult; + "*[_type == \"collection\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": CollectionListQueryForSitemapResult; + "*[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] | order(publishDate desc, _createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n}": BlogListQueryForSitemapResult; + "*[_type == \"blogCategory\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"blogPost\" && defined(publishDate) && references(^._id)])\n}": BlogCategoryListQueryForSitemapResult; + "*[_type == \"page\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n}": PageListQueryForSitemapResult; + } +} diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..b2cbc07 --- /dev/null +++ b/schema.json @@ -0,0 +1,3022 @@ +[ + { + "name": "sanity.imagePaletteSwatch", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imagePaletteSwatch" + } + }, + "background": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "foreground": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "population": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imagePalette", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imagePalette" + } + }, + "darkMuted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "lightVibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "darkVibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "vibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "dominant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "lightMuted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "muted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageDimensions", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageDimensions" + } + }, + "height": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "width": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "aspectRatio": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.fileAsset", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.fileAsset" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "originalFilename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "label": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "altText": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sha1hash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "extension": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "mimeType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "size": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "assetId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "uploadId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "path": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.assetSourceData" + }, + "optional": true + } + } + }, + { + "name": "geopoint", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "geopoint" + } + }, + "lat": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "lng": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "blockContent", + "type": "type", + "value": { + "type": "array", + "of": { + "type": "union", + "of": [ + { + "type": "object", + "attributes": { + "children": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "marks": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "string" + } + }, + "optional": true + }, + "text": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "span" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "style": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "normal" + }, + { + "type": "string", + "value": "h1" + }, + { + "type": "string", + "value": "h2" + }, + { + "type": "string", + "value": "h3" + }, + { + "type": "string", + "value": "h4" + }, + { + "type": "string", + "value": "h5" + }, + { + "type": "string", + "value": "h6" + }, + { + "type": "string", + "value": "blockquote" + } + ] + }, + "optional": true + }, + "listItem": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "bullet" + }, + { + "type": "string", + "value": "number" + } + ] + }, + "optional": true + }, + "markDefs": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "union", + "of": [ + { + "type": "object", + "attributes": { + "reference": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [] + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "internalLink" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "href": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "link" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + ] + } + }, + "optional": true + }, + "level": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "block" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + }, + "rest": { + "type": "inline", + "name": "code" + } + } + ] + } + } + }, + { + "name": "settings", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "settings" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "passwordResetToken", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "passwordResetToken" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "identifier": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "token": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expires": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "verificationToken", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "verificationToken" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "identifier": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "token": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expires": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "page", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "page" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "excerpt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "body": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "blockContent" + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "blogCategory", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "blogCategory" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "blogPost", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "blogPost" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "excerpt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "featured": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "categories": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "blogCategory", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "author": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "body": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "blockContent" + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "relatedPosts": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "blogPost", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "collection", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "collection" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "icon": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "category", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "category" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "group": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "group" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "group", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "group" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "tag", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "tag" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "item", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "item" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "featured": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "link": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "affiliateLink": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "collections": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "collection", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "categories": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "category", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "tags": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "tag", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "submitter": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "introduction": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "icon": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "pricePlan": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "free" + }, + { + "type": "string", + "value": "pro" + }, + { + "type": "string", + "value": "sponsor" + } + ] + }, + "optional": true + }, + "freePlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "approved" + }, + { + "type": "string", + "value": "rejected" + } + ] + }, + "optional": true + }, + "proPlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "rejectionReason": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "The item is not good fit for our directory" + }, + { + "type": "string", + "value": "The image of the item is not in good quality" + }, + { + "type": "string", + "value": "The icon of the item is not in good quality" + }, + { + "type": "string", + "value": "The information of the item is not clear" + }, + { + "type": "string", + "value": "The backlink to our site is not provided" + }, + { + "type": "string", + "value": "Other reasons" + } + ] + }, + "optional": true + }, + "sponsorPlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "paid": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "order": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "order" + }, + "optional": true + }, + "forceHidden": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "sponsor": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "sponsorStartDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sponsorEndDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "note": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "order", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "order" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "user": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "item": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "item" + }, + "optional": true + }, + "status": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "date": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "sanity.imageCrop", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageCrop" + } + }, + "top": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "bottom": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "left": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "right": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageHotspot", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageHotspot" + } + }, + "x": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "y": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "height": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "width": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageAsset", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageAsset" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "originalFilename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "label": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "altText": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sha1hash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "extension": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "mimeType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "size": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "assetId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "uploadId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "path": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "metadata": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageMetadata" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.assetSourceData" + }, + "optional": true + } + } + }, + { + "name": "sanity.assetSourceData", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.assetSourceData" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "id": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageMetadata", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageMetadata" + } + }, + "location": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "geopoint" + }, + "optional": true + }, + "dimensions": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageDimensions" + }, + "optional": true + }, + "palette": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePalette" + }, + "optional": true + }, + "lqip": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "blurHash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "hasAlpha": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "isOpaque": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + } + } + }, + { + "name": "user", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "user" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "email": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "emailVerified": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "link": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "password": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "role": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "ADMIN" + }, + { + "type": "string", + "value": "USER" + } + ] + }, + "optional": true + }, + "accounts": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "account" + }, + "optional": true + }, + "stripeCustomerId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "account", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "account" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "userId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "type": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "provider": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "providerAccountId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "refreshToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "accessToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expiresAt": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "tokenType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "scope": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "idToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sessionState": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "user": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + } + } + }, + { + "name": "code", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "code" + } + }, + "language": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "filename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "code": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "highlightedLines": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "number" + } + }, + "optional": true + } + } + } + }, + { + "name": "markdown", + "type": "type", + "value": { + "type": "string" + } + }, + { + "name": "media.tag", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "media.tag" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + } + } + }, + { + "name": "slug", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "slug" + } + }, + "current": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + } +] diff --git a/scripts/batch-all.ts b/scripts/batch-all.ts new file mode 100644 index 0000000..f625e8d --- /dev/null +++ b/scripts/batch-all.ts @@ -0,0 +1,124 @@ +import { + importCategories, + removeCategories, + updateCategories, +} from "./batch-category"; +import { importGroups, removeGroups, updateGroups } from "./batch-group"; +import { importItems, removeItems, updateItems } from "./batch-item"; +import { + importItemsMicrolink, + removeItemsMicrolink, +} from "./batch-item-microlink"; +import { importTags, removeTags, updateTags } from "./batch-tag"; + +/** + * Demo: Batch Operations Manager + * + * A centralized script to manage all batch operations across different entities + * in the Sanity database. + * + * Features: + * - Unified data cleanup + * - Coordinated imports + * - Bulk updates + * - Sequential processing + * + * Available Operations: + * 1. removeAll: Remove all data + * 2. importAll: Import all data + * 3. updateAll: Update all data + * + * Usage Examples: + * ```typescript + * // Clean everything + * await removeAll(); + * + * // Fresh import + * await importAll(); + * + * // Update everything + * await updateAll(); + * + * // Custom sequence + * await removeAll(); + * await importGroups(); + * await importCategories(); + * await importTags(); + * await importItems(); + * ``` + */ + +export const removeAll = async () => { + console.log("Removing all data..."); + + try { + // Remove in reverse order of dependencies + await removeItems(); + await removeTags(); + await removeCategories(); + await removeGroups(); + + console.log("All data removed successfully"); + } catch (error) { + console.error("Error removing data:", error); + } +}; + +export const importAll = async () => { + console.log("Importing all data..."); + + try { + // Import in order of dependencies + await importGroups(); + await importCategories(); + await importTags(); + await importItems(); + + console.log("All data imported successfully"); + } catch (error) { + console.error("Error importing data:", error); + } +}; + +export const updateAll = async () => { + console.log("Updating all data..."); + + try { + await updateGroups(); + await updateCategories(); + await updateTags(); + await updateItems(); + + console.log("All data updated successfully"); + } catch (error) { + console.error("Error updating data:", error); + } +}; + +// get operation from command line +const operation = process.argv[2]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "remove": + await removeAll(); + break; + case "import": + await importAll(); + break; + case "update": + await updateAll(); + break; + default: + console.log(` +Available commands: +- remove: Remove all data +- import: Import all data +- update: Update all data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/batch-category.ts b/scripts/batch-category.ts new file mode 100644 index 0000000..f6759a6 --- /dev/null +++ b/scripts/batch-category.ts @@ -0,0 +1,252 @@ +import { slugify } from "@/lib/utils"; +import type { Group } from "@/sanity.types"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Category Management + * + * This script manages categories in the Sanity database, including their + * relationships with category groups. + * + * Operations: + * 1. Remove all existing categories + * 2. Import predefined categories with group associations + * 3. (Optional) Update existing categories + * + * Features: + * - Hierarchical category organization + * - Priority-based ordering + * - Group relationship management + * - Automatic slug generation + * + * Data Structure: + * - name: Category display name + * - slug: URL-friendly identifier + * - description: Detailed category explanation + * - priority: The priority of the category, the higher the number, the higher the priority + * - group: The group that the category belongs to + * + * Requirements: + * 1. Each category must have a unique priority value + * 2. When using groups, group names must exist in the database + * 3. Environment variables of Sanity are required in .env file + * + * Example Usage: + * ``` + * // Remove all categories and import new ones + * removeCategories(); + * importCategories(); + * + * // Update existing categories + * updateCategories(); + * ``` + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + // fullstack + { + priority: 200, + name: "NextJS Boilerplates", + group: "Fullstack", + description: "The nextjs boilerplates", + }, + { + priority: 199, + name: "Nuxt Boilerplates", + group: "Fullstack", + description: "The nuxt boilerplates", + }, + { + priority: 198, + name: "SvelteKit Boilerplates", + group: "Fullstack", + description: "The sveltekit boilerplates", + }, + { + priority: 197, + name: "Django Boilerplates", + group: "Fullstack", + description: "The django boilerplates", + }, + { + priority: 196, + name: "Express Boilerplates", + group: "Fullstack", + description: "The express boilerplates", + }, + { + priority: 195, + name: "NodeJS Boilerplates", + group: "Fullstack", + description: "The nodejs boilerplates", + }, + { + priority: 194, + name: "PHP Boilerplates", + group: "Fullstack", + description: "The php boilerplates", + }, + { + priority: 193, + name: "Ruby on Rails Boilerplates", + group: "Fullstack", + description: "The ruby on rails boilerplates", + }, + { + priority: 192, + name: "Laravel Boilerplates", + group: "Fullstack", + description: "The laravel boilerplates", + }, + + // frontend + { + priority: 150, + name: "React Boilerplates", + group: "Frontend", + description: "The react boilerplates", + }, + { + priority: 149, + name: "Vue Boilerplates", + group: "Frontend", + description: "The vue boilerplates", + }, + { + priority: 148, + name: "Svelte Boilerplates", + group: "Frontend", + description: "The svelte boilerplates", + }, + { + priority: 147, + name: "Astro Boilerplates", + group: "Frontend", + description: "The astro boilerplates", + }, + { + priority: 146, + name: "Typescript Boilerplates", + group: "Frontend", + description: "The typescript boilerplates", + }, + + // mobile + { + priority: 100, + name: "React Native Boilerplates", + group: "Mobile", + description: "The react native boilerplates", + }, + { + priority: 99, + name: "Flutter Boilerplates", + group: "Mobile", + description: "The flutter boilerplates", + }, + { + priority: 98, + name: "Expo Boilerplates", + group: "Mobile", + description: "The expo boilerplates", + }, + { + priority: 97, + name: "Swift Boilerplates", + group: "Mobile", + description: "The swift boilerplates", + }, + { + priority: 96, + name: "Kotlin Boilerplates", + group: "Mobile", + description: "The kotlin boilerplates", + }, +]; + +export const removeCategories = async () => { + const data = await client.delete({ + query: "*[_type == 'category']", + }); + console.log("removeCategories:", data); +}; + +export const importCategories = async () => { + try { + console.log("importCategories start"); + + // get all category groups + const groups = await client.fetch(`*[_type == "group"]`); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + const group = findGroup(groups, item.group); + // accept category without group + // if (!group) { + // console.error(`Group ${item.group} not found`); + // continue; + // } + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "category", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + priority: item.priority, + group: group + ? { + _type: "reference", + _ref: group._id, + } + : undefined, + }); + } + + console.log("importCategories success"); + } catch (error) { + console.error(error); + } +}; + +const findGroup = (groups: Group[], name: string) => { + return groups.find((group: Group) => group.name === name); +}; + +export const updateCategories = async () => { + const categories = await client.fetch(`*[_type == "category"]`); + + for (const category of categories) { + const result = await client + .patch(category._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated category ${category.name}:`, result); + } + + console.log(`Updated ${categories.length} categories`); +}; diff --git a/scripts/batch-group.ts b/scripts/batch-group.ts new file mode 100644 index 0000000..88776b1 --- /dev/null +++ b/scripts/batch-group.ts @@ -0,0 +1,103 @@ +import { slugify } from "@/lib/utils"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Category Group Management + * + * This script manages category groups in the Sanity.io database. + * + * Operations: + * 1. Remove all existing category groups + * 2. Import predefined category groups + * 3. (Optional) Update existing groups + * + * Features: + * - Handles basic group metadata (name, slug, description) + * - Maintains priority ordering + * - Ensures consistent slug generation + * + * Data Structure: + * - name: Group display name + * - slug: URL-friendly identifier + * - description: Detailed group explanation + * - priority: The priority of the group, the higher the number, the higher the priority + * + * Use Cases: + * - Initial system setup + * - Category Groups restructuring + * - Batch updates to group metadata + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + { priority: 3, name: "Fullstack", description: "The fullstack boilerplates" }, + { priority: 2, name: "Frontend", description: "The frontend boilerplates" }, + { priority: 1, name: "Mobile", description: "The mobile boilerplates" }, +]; + +export const removeGroups = async () => { + const data = await client.delete({ + query: "*[_type == 'group']", + }); + console.log("removeGroups:", data); +}; + +export const importGroups = async () => { + try { + console.log("importGroups start"); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "group", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + priority: item.priority, + }); + } + + console.log("importGroups success"); + } catch (error) { + console.error(error); + } +}; + +export const updateGroups = async () => { + const groups = await client.fetch(`*[_type == "group"]`); + + for (const group of groups) { + const result = await client + .patch(group._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated group ${group.name}:`, result); + } + + console.log(`Updated ${groups.length} groups`); +}; diff --git a/scripts/batch-item-manual.ts b/scripts/batch-item-manual.ts new file mode 100644 index 0000000..4b67a8b --- /dev/null +++ b/scripts/batch-item-manual.ts @@ -0,0 +1,252 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Item Management + * + * A comprehensive script for managing items in the Sanity database + * with manual data entry approach. + * + * Operations: + * 1. Remove existing items (cleanup) + * 2. Import predefined items + * 3. (Optional) Update existing items + * + * Features: + * - Manual data curation + * - Asset management (icons, images) + * - Category and tag relationships + * - Automatic slug generation + * - Metadata handling + * + * Data Structure: + * - name: Item display name + * - slug: URL-friendly identifier + * - description: Detailed item explanation + * - link: The link of the item + * - categories: The categories that the item belongs to + * - tags: The tags that the item belongs to + * - image: The image of the item + * - icon: The icon of the item + * + * Advantages: + * 1. High data accuracy and quality control + * 2. Precise metadata management + * 3. Controlled categorization + * + * Limitations: + * 1. Time-intensive manual data entry + * 2. Requires regular maintenance + * 3. Limited scalability for large datasets + * 4. Content of the items are missing + * + * Use Cases: + * 1. Initial platform seeding + * 2. Featured content management + * 3. Quality-focused collections + * 4. Custom showcase items + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + { + name: "Mkdirs", + description: "The best directory boilerplate", + link: "https://mkdirs.com", + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: [ + "NextJS", + "Directory", + "Tailwind", + "React", + "TypeScript", + "Shadcn", + "Resend", + "Stripe", + "Auth", + "Blog", + ], + image: "https://mkdirs.com/og.png", + // icon: "https://mkdirs.com/logo.png", + icon: "https://s2.googleusercontent.com/s2/favicons?domain=mkdirs.com&sz=128", + }, + { + name: "Achromatic", + description: "An advanced Next 15 SaaS starter kit", + link: "https://achromatic.dev", + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: [ + "NextJS", + "Tailwind", + "React", + "TypeScript", + "Shadcn", + "Resend", + "Stripe", + "Auth", + "Blog", + ], + image: "https://achromatic.dev/og.jpg", + // icon: "https://achromatic.dev/favicon.ico", + icon: "https://s2.googleusercontent.com/s2/favicons?domain=achromatic.dev&sz=128", + }, +]; + +export const removeItems = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + console.log("removeItems:", data); +}; + +export const importItems = async () => { + try { + console.log("importItems start"); + + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "approved", + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; + +export const updateItems = async () => { + const items = await client.fetch(`*[_type == "item"]`); + + for (const item of items) { + const result = await client + .patch(item._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated item ${item.name}:`, result); + } + + console.log(`Updated ${items.length} items`); +}; diff --git a/scripts/batch-item-microlink.ts b/scripts/batch-item-microlink.ts new file mode 100644 index 0000000..e0a99ec --- /dev/null +++ b/scripts/batch-item-microlink.ts @@ -0,0 +1,243 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import mql from "@microlink/mql"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Automated Item Import Script (with Microlink API) + * + * A script that leverages Microlink API to automatically fetch and import + * items into Sanity database. + * + * Operations: + * 1. Remove existing items (cleanup) + * 2. Fetch metadata via Microlink API + * 3. Process and import items + * + * Features: + * - Automated metadata extraction + * - Bulk URL processing + * - Asset auto-discovery + * - Sequential processing for reliability + * + * Data Structure: + * - name: Item display name + * - slug: URL-friendly identifier + * - description: Detailed item explanation + * - link: The link of the item + * - categories: The categories that the item belongs to + * - tags: The tags that the item belongs to + * - image: The image of the item + * - icon: The icon of the item + * + * Data Fetched via Microlink: + * - title → name + * - description + * - logo → icon + * - image + * - url → link + * + * Advantages: + * 1. Automated metadata extraction + * 2. Faster data entry process + * 3. Consistent data structure + * 4. Scalable for large datasets + * + * Limitations: + * 1. Manual category/tag assignment still needed + * 2. Variable asset quality (logos/images) + * 3. Dependent on Microlink API availability + * 4. Content of the items are missing + * + * Use Cases: + * 1. Bulk item imports + * 2. Quick prototyping + * 3. Initial database population + * 4. Regular content updates + * + * Note: This script requires proper environment variables in .env + */ +const links = [ + "https://mkdirs.com", + "https://achromatic.dev", + // Add more links here... +]; + +const fetchItem = async (url: string) => { + try { + const { data } = await mql(url, { + data: { + title: { selector: "title" }, + description: { selector: 'meta[name="description"]' }, + logo: { selector: 'link[rel="icon"]' }, + image: { selector: 'meta[property="og:image"]' }, + url: { selector: 'link[rel="canonical"]' }, + }, + }); + + return { + name: data.title || new URL(url).hostname, + description: data.description || `A great boilerplate from ${url}`, + link: url, + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: ["NextJS", "Tailwind", "React", "TypeScript", "Shadcn"], + image: + data.image?.url || + `https://image.thum.io/get/width/1200/crop/800/${url}`, + icon: + data.logo?.url || + `https://s2.googleusercontent.com/s2/favicons?domain=${new URL(url).hostname}&sz=128`, + }; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +export const removeItemsMicrolink = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + // console.log("removeItems:", data); + console.log("removeItems success, length:", data.length); +}; + +export const importItemsMicrolink = async () => { + try { + // get all categories and tags first (only need to fetch once) + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + console.log("Processing links one by one..."); + for (const link of links) { + try { + console.log(`Processing link: ${link}`); + const item = await fetchItem(link); + + if (!item) { + console.log(`Skipping ${link} due to fetch error`); + continue; + } + + console.log(`Creating item for: ${item.name}`); + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "submitting", + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } catch (error) { + console.error(`Error processing link: ${link}`, error); + } + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; diff --git a/scripts/batch-item.ts b/scripts/batch-item.ts new file mode 100644 index 0000000..c37e06c --- /dev/null +++ b/scripts/batch-item.ts @@ -0,0 +1,375 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { google } from "@ai-sdk/google"; +import mql from "@microlink/mql"; +import { createClient } from "@sanity/client"; +import { generateObject } from "ai"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +import { z } from "zod"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * AI-Powered Item Management System + * + * An automated script for managing content items in Sanity CMS using AI SDK + * and Microlink for data enrichment. + * + * Core Functions: + * 1. Content Scraping: Extract data from URLs using Microlink + * 2. AI Analysis: Process content using Google's Gemini AI + * 3. Asset Management: Handle images and icons + * 4. Database Operations: CRUD operations in Sanity + * + * Data Processing Flow: + * 1. URL → Microlink (metadata) + AI SDK (content analysis) + * 2. Data Enrichment → Categories & Tags mapping + * 3. Asset Processing → Icon & Image handling + * 4. Sanity Import → Structured content creation + * + * Content Structure: + * - name: Title of the item + * - slug: Auto-generated URL-friendly identifier + * - description: AI-generated short description (160 chars) + * - introduction: AI-generated detailed markdown content + * - link: Source URL + * - categories: Auto-mapped category references + * - tags: Auto-mapped tag references + * - image: Screenshot or main image + * - icon: Favicon or logo + * + * Key Features: + * - AI-powered content analysis + * - Automated metadata extraction + * - Smart category/tag mapping + * - Automated asset management + * - Bulk processing support + * + * Requirements: + * - Sanity CMS credentials + * - Google AI SDK access + * - Microlink API access + * - Environment variables configured + * + * Usage: + * 1. pnpm run item remove + * remove all items + * 2. pnpm run item import + * import all items defined in links array + * 3. pnpm run item update + * update all items + * 4. pnpm run item fetch + * fetch item info for the specified url + */ +const links = [ + "https://mkdirs.com", + "https://achromatic.dev", +]; + +export const removeItems = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + console.log("removeItems:", data); +}; + +/** + * fetch item info for the specified url with Microlink and AI SDK + */ +export const fetchItem = async (url: string) => { + // step 1: fetch item info with Microlink + const microlinkData = await fetchItemWithMicrolink(url); + console.log("fetchItem, url:", url, "microlinkData:", microlinkData); + + // step 2: fetch item info with AI SDK + const aisdkData = await fetchItemWithAISdk(url); + console.log("fetchItem, url:", url, "aisdkData:", aisdkData); + + // step 3: merge the data + const mergedData = { + link: url, + name: aisdkData.object.title, + description: aisdkData.object.description, + introduction: aisdkData.object.introduction, + categories: aisdkData.object.categories, + tags: aisdkData.object.tags, + image: microlinkData?.image?.url, // or get a new screenshot + icon: `https://s2.googleusercontent.com/s2/favicons?domain=${url}&sz=128`, // or microlinkData?.logo?.url + }; + console.log("fetchItem, url:", url, "mergedData:", mergedData); + return mergedData; +}; + +/** + * fetch item info for the specified url with Microlink + */ +export const fetchItemWithMicrolink = async (url: string) => { + try { + const { data } = await mql(url, { + // information included: + // - title: page title + // - description: page description + // - lang: page language + // - author: author information + // - publisher: publisher information + // - image: main image + // - logo: website logo + // - url: normalized URL + }); + // console.log("fetchItemWithMicrolink, url:", url, "data:", data); + return data; + } catch (error) { + console.error( + `fetchItemWithMicrolink, Error processing url for ${url}:`, + error, + ); + return null; + } +}; + +/** + * fetch item info for the specified url with AI SDK + */ +export const fetchItemWithAISdk = async (url: string) => { + try { + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + const availableCategories = categories.map((cat) => cat.name); + const availableTags = tags.map((tag) => tag.name); + + const schema = z.object({ + title: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z + .string() + .describe("Detailed introduction in markdown format"), + categories: z + .array(z.string()) + .describe("Array of category names that best match the content"), + tags: z + .array(z.string()) + .describe("Array of tag names that best match the content") + }); + + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + const result = await generateObject({ + model: google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }), + schema, + prompt: `Analyze the following webpage content and provide structured information: + + Content to analyze: + ${htmlContent} + + Available Categories: + ${availableCategories.join(", ")} + + Available Tags: + ${availableTags.join(", ")} + + Please analyze the content and provide: + 1. A concise title (just the name, no description) + 2. A brief description (one sentence, max 160 characters) + 3. A detailed introduction in markdown format (include key features and use cases) + 4. Select appropriate categories from the available categories list (return array of names) + 5. Select relevant tags from the available tags list (return array of names) + + Focus on technical aspects and practical applications. If the content is a tool or service, + emphasize its main features, target users, and unique selling points.`, + }); + + // console.log("fetchItemWithAISdk, url:", url, "result:", result); + return result; + } catch (error) { + console.error( + `fetchItemWithAISdk, Error processing url for ${url}:`, + error, + ); + return null; + } +}; + +export const importItems = async () => { + try { + console.log("importItems start"); + + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + for (let i = 0; i < links.length; i++) { + const item = await fetchItem(links[i]); + console.log("index: ", i, ", url: ", links[i], ", item:", item.name); + + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "approved", + + introduction: item.introduction, + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; + +export const updateItems = async () => { + const items = await client.fetch(`*[_type == "item"]`); + + for (const item of items) { + const result = await client + .patch(item._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated item ${item.name}:`, result); + } + + console.log(`Updated ${items.length} items`); +}; + +// get operation from command line +const operation = process.argv[2]; +// get url from command line +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "remove": + await removeItems(); + break; + case "import": + await importItems(); + break; + case "update": + await updateItems(); + break; + case "fetch": + await fetchItem(url); + break; + default: + console.log(` +Available commands: +- remove: Remove all items +- import: Import all items +- update: Update all items +- fetch: Fetch item info for the specified url with AI SDK and Microlink and return structured data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/batch-tag.ts b/scripts/batch-tag.ts new file mode 100644 index 0000000..7ee9832 --- /dev/null +++ b/scripts/batch-tag.ts @@ -0,0 +1,345 @@ +import { slugify } from "@/lib/utils"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Tag Management + * + * This script manages the tag system in Sanity database. + * + * Operations: + * 1. Remove all existing tags + * 2. Import predefined tags + * 3. (Optional) Update existing tags + * + * Features: + * - Automatic slug generation from tag names + * - Descriptive metadata for each tag + * - Batch processing capabilities + * + * Data Structure: + * - name: Tag display name + * - slug: URL-friendly identifier + * - description: Detailed tag explanation + * + * Example Usage: + * ``` + * // Clean and import + * removeTags(); + * importTags(); + * + * // Update existing tags + * updateTags(); + * ``` + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + // You can use Cursor to help you generate the data + { + name: "Open Source", + description: "The boilerplates which are open source", + }, + { + name: "Auth", + description: "The boilerplates with authentication functionality", + }, + { name: "AI", description: "The boilerplates with AI integration" }, + { + name: "Admin Panel", + description: "The boilerplates with admin panel functionality", + }, + { + name: "Stripe", + description: "The boilerplates with Stripe payment integration", + }, + { + name: "Database", + description: "The boilerplates with database integration", + }, + { + name: "Directory", + description: "The boilerplates with directory structure", + }, + { name: "Blog", description: "The boilerplates with blogging functionality" }, + { + name: "Analytics", + description: "The boilerplates with analytics integration", + }, + { + name: "CMS", + description: "The boilerplates with content management system", + }, + { + name: "Billing", + description: "The boilerplates with billing functionality", + }, + { name: "Themes", description: "The boilerplates with theming support" }, + { + name: "Subscription", + description: "The boilerplates with subscription functionality", + }, + { + name: "Microservices", + description: "The boilerplates with microservices architecture", + }, + { name: "Payments", description: "The boilerplates with payment processing" }, + { name: "Email", description: "The boilerplates with email functionality" }, + { + name: "Deployment", + description: "The boilerplates with deployment configurations", + }, + { + name: "Animations", + description: "The boilerplates with animation features", + }, + { + name: "Checkout", + description: "The boilerplates with checkout functionality", + }, + { name: "Ads", description: "The boilerplates with advertising integration" }, + { + name: "Components", + description: "The boilerplates with reusable components", + }, + { name: "SEO", description: "The boilerplates with SEO optimization" }, + { name: "Storage", description: "The boilerplates with storage solutions" }, + { + name: "Onboarding", + description: "The boilerplates with user onboarding flow", + }, + { + name: "Dashboard", + description: "The boilerplates with dashboard interface", + }, + { name: "Login", description: "The boilerplates with login functionality" }, + { + name: "Documentation", + description: "The boilerplates with documentation setup", + }, + { + name: "Lemon Squeezy", + description: "The boilerplates with Lemon Squeezy integration", + }, + { + name: "Landing Page", + description: "The boilerplates with landing page templates", + }, + { name: "CI/CD", description: "The boilerplates with CI/CD pipeline setup" }, + { + name: "Navigation", + description: "The boilerplates with navigation components", + }, + { name: "UI/UX", description: "The boilerplates with UI/UX design system" }, + { + name: "Multi-tenancy", + description: "The boilerplates with multi-tenant architecture", + }, + { name: "Tables", description: "The boilerplates with table components" }, + { name: "Support", description: "The boilerplates with support system" }, + { + name: "Paywalls", + description: "The boilerplates with paywall functionality", + }, + { + name: "Customizable", + description: "The boilerplates with customization options", + }, + { + name: "Referral Tracking", + description: "The boilerplates with referral tracking system", + }, + { + name: "Responsive", + description: "The boilerplates with responsive design", + }, + { name: "Plugins", description: "The boilerplates with plugin system" }, + { name: "Style", description: "The boilerplates with styling system" }, + { + name: "Notifications", + description: "The boilerplates with notification system", + }, + { + name: "Paddle", + description: "The boilerplates with Paddle payment integration", + }, + { + name: "Waitlist", + description: "The boilerplates with waitlist functionality", + }, + { + name: "Community", + description: "The boilerplates with community features", + }, + { name: "Updates", description: "The boilerplates with update system" }, + { name: "Dark Mode", description: "The boilerplates with dark mode support" }, + { + name: "Lambda Architecture", + description: "The boilerplates with Lambda architecture", + }, + { + name: "Integrations", + description: "The boilerplates with third-party integrations", + }, + { name: "Resend", description: "The boilerplates with Resend email service" }, + { + name: "Settings", + description: "The boilerplates with settings management", + }, + { + name: "2FA", + description: "The boilerplates with two-factor authentication", + }, + { + name: "Revenue Cat", + description: "The boilerplates with Revenue Cat integration", + }, + { + name: "In-app purchases", + description: "The boilerplates with in-app purchase functionality", + }, + { + name: "NextJS", + description: "The boilerplates built with Next.js framework", + }, + { name: "React", description: "The boilerplates built with React library" }, + { + name: "Tailwind", + description: "The boilerplates using Tailwind CSS framework", + }, + { + name: "Django", + description: "The boilerplates built with Django framework", + }, + { + name: "Laravel", + description: "The boilerplates built with Laravel framework", + }, + { + name: "Supabase", + description: "The boilerplates integrated with Supabase", + }, + { name: "TypeScript", description: "The boilerplates using TypeScript" }, + { + name: "Shadcn", + description: "The boilerplates using Shadcn UI components", + }, + { name: "NodeJS", description: "The boilerplates built with Node.js" }, + { name: "PHP", description: "The boilerplates using PHP" }, + { + name: "React Native", + description: "The boilerplates built with React Native", + }, + { name: "Python", description: "The boilerplates using Python" }, + { name: "HTMX", description: "The boilerplates using HTMX" }, + { name: "Flutter", description: "The boilerplates built with Flutter" }, + { name: "Vue", description: "The boilerplates built with Vue.js" }, + { + name: "Ruby on Rails", + description: "The boilerplates built with Ruby on Rails", + }, + { name: "Astro", description: "The boilerplates built with Astro framework" }, + { + name: "Nuxt", + description: "The boilerplates built with Nuxt.js framework", + }, + { name: "Kotlin", description: "The boilerplates using Kotlin" }, + { name: "Figma", description: "The boilerplates with Figma design assets" }, + { name: "Express", description: "The boilerplates built with Express.js" }, + { + name: "PostgreSQL", + description: "The boilerplates using PostgreSQL database", + }, + { name: "Mailgun", description: "The boilerplates integrated with Mailgun" }, + { name: "Remix", description: "The boilerplates built with Remix framework" }, + { name: "Expo", description: "The boilerplates built with Expo" }, + { name: "SwiftUI", description: "The boilerplates built with SwiftUI" }, + { name: "SvelteKit", description: "The boilerplates built with SvelteKit" }, + { name: "CSS", description: "The boilerplates with CSS styling" }, + { name: "HTML", description: "The boilerplates using HTML" }, + { name: "DaisyUI", description: "The boilerplates using DaisyUI components" }, + { + name: "Strapi", + description: "The boilerplates integrated with Strapi CMS", + }, + { name: "Svelte", description: "The boilerplates built with Svelte" }, + { name: "Javascript", description: "The boilerplates using JavaScript" }, + { name: "Chakra", description: "The boilerplates using Chakra UI" }, + { + name: "Firebase", + description: "The boilerplates integrated with Firebase", + }, + { name: "Livewire", description: "The boilerplates using Laravel Livewire" }, + { name: "Prisma", description: "The boilerplates using Prisma ORM" }, + { + name: "Pocketbase", + description: "The boilerplates integrated with Pocketbase", + }, + { name: "MongoDB", description: "The boilerplates using MongoDB database" }, + { name: "Fly.io", description: "The boilerplates deployed on Fly.io" }, +]; + +export const removeTags = async () => { + const data = await client.delete({ + query: "*[_type == 'tag']", + }); + console.log("removeTags:", data); +}; + +export const importTags = async () => { + try { + console.log("importTags start"); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "tag", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + }); + } + + console.log("importTags success"); + } catch (error) { + console.error(error); + } +}; + +export const updateTags = async () => { + const tags = await client.fetch(`*[_type == "tag"]`); + + for (const tag of tags) { + const result = await client + .patch(tag._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated tag ${tag.name}:`, result); + } + + console.log(`Updated ${tags.length} tags`); +}; diff --git a/scripts/explore-aisdk.ts b/scripts/explore-aisdk.ts new file mode 100644 index 0000000..a8180e7 --- /dev/null +++ b/scripts/explore-aisdk.ts @@ -0,0 +1,162 @@ +import type { Category, Tag } from "@/sanity.types"; +import { google } from "@ai-sdk/google"; +import { createClient } from "@sanity/client"; +import { generateObject, generateText } from "ai"; +import dotenv from "dotenv"; +import { z } from "zod"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * AI SDK API Integration (using Google Gemini) + * + * This module provides functions to interact with the AI SDK, + * allowing you to fetch metadata from a given URL. + * + * Available functions: + * - aisdkFetch: Fetch data from AI SDK for the specified message + */ + +// https://sdk.vercel.ai/docs/foundations/overview +// https://sdk.vercel.ai/docs/getting-started/nodejs +// test successfully: pnpm run aisdk:fetch "https://mkdirs.com" +export const aisdkFetch = async (url: string) => { + try { + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + + const prompt = `Analyze the following webpage content and URL: ${url} + + Webpage content: + ${htmlContent} + + Based on the above content, provide the following information in a structured format: + 1. Title of the page (extract from content if possible, just return the short name, no description) + 2. Brief description (1 sentence summarizing the main content, no more than 160 characters) + 3. Detailed introduction (in markdown format, include the key features and prices of the product) + + Format your response as follows: + { + "title": "...", + "description": "...", + "introduction": "... (in markdown)" + }`; + + const { text } = await generateText({ + model: google("gemini-2.0-flash-exp"), + prompt: prompt, + }); + + console.log("aisdkFetch, url:", url, "response:", text); + return text; + } catch (error) { + console.error(`Error fetching data for URL ${url}:`, error); + return null; + } +}; + +// https://sdk.vercel.ai/providers/ai-sdk-providers/google-generative-ai#schema-limitations +// test successfully: pnpm run aisdk:structure "https://mkdirs.com" +export const aisdkStructure = async (url: string) => { + try { + // 获取实际的分类和标签数据 + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + const schema = z.object({ + title: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z + .string() + .describe("Detailed introduction in markdown format"), + }); + + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + + const result = await generateObject({ + model: google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }), + schema, + prompt: `Analyze the following content and provide structured information: + + Content to analyze: + ${htmlContent} + + Please provide a concise title, brief description, and detailed introduction. + The introduction should be in markdown format, include the key features and prices of the product.`, + }); + + console.log( + "aisdkStructure, url:", + url, + "structured response:", + result, + ); + return result; + } catch (error) { + console.error(`Error processing url for ${url}:`, error); + return null; + } +}; + +// get operation from command line +const operation = process.argv[2]; +// get message from command line (new) +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "fetch": { + if (!url) { + console.error("Please provide a url as the second argument"); + return; + } + const result = await aisdkFetch(url); + console.log("aisdkFetch, url:", url, "result:", result); + break; + } + + case "structure": { + if (!url) { + console.error("Please provide a url as the second argument"); + return; + } + const result = await aisdkStructure(url); + console.log("aisdkStructure, url:", url, "result:", result); + break; + } + + default: + console.log(` +Available commands: +- fetch : Fetch data for the specified url +- structure : Fetch data for the specified url and return structured data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/explore-microlink.ts b/scripts/explore-microlink.ts new file mode 100644 index 0000000..d12d2ef --- /dev/null +++ b/scripts/explore-microlink.ts @@ -0,0 +1,138 @@ +import mql from "@microlink/mql"; +import dotenv from "dotenv"; +dotenv.config(); + +/** + * Microlink API Integration + * + * This module provides functions to interact with the Microlink API, + * allowing you to fetch metadata and screenshots from a given URL. + * + * Available functions: + * - microlinkFetch: Fetches metadata such as title, description, logo, etc. + * - microlinkInsights: Fetches insights such as technologies, languages, etc. + * - microlinkScreenshot: Captures a screenshot of the webpage. + * - microlinkFullpage: Captures a fullpage screenshot of the webpage. + */ + +// https://microlink.io/docs/api/getting-started/overview +// test successfully: pnpm run microlink:fetch https://mkdirs.com +export const microlinkFetch = async (url: string) => { + try { + const { data } = await mql(url, { + // information included: + // - title: page title + // - description: page description + // - lang: page language + // - author: author information + // - publisher: publisher information + // - image: main image + // - logo: website logo + // - url: normalized URL + }); + console.log("microlinkFetch, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/insights/technologies +// test successfully: pnpm run microlink:insights https://mkdirs.com +export const microlinkInsights = async (url: string) => { + try { + const { data } = await mql(url, { + insights: { + technologies: true, + }, + }); + console.log("microlinkInsights, url:", url, "data:", JSON.stringify(data, null, 2)); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/screenshot +// test successfully: pnpm run microlink:screenshot https://mkdirs.com +export const microlinkScreenshot = async (url: string) => { + try { + const { data } = await mql(url, { + screenshot: true, + }); + console.log("microlinkScreenshot, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/screenshot +// test failed: pnpm run microlink:fullpage https://mkdirs.com +export const microlinkFullpage = async (url: string) => { + try { + const { data } = await mql(url, { + screenshot: { + fullPage: true, + }, + }); + console.log("microlinkFullpage, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// get operation from command line +const operation = process.argv[2]; +// get url from command line (new) +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "fetch": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkFetch(url); + break; + case "insights": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkInsights(url); + break; + case "screenshot": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkScreenshot(url); + break; + case "fullpage": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkFullpage(url); + break; + default: + console.log(` +Available commands: +- fetch : Fetch data from Microlink API for the specified URL +- insights : Fetch insights from Microlink API for the specified URL +- screenshot : Fetch screenshot from Microlink API for the specified URL +- fullpage : Fetch fullpage screenshot from Microlink API for the specified URL + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/export-user-emails.ts b/scripts/export-user-emails.ts new file mode 100644 index 0000000..59ca21e --- /dev/null +++ b/scripts/export-user-emails.ts @@ -0,0 +1,29 @@ +import { createClient } from '@sanity/client'; +import dotenv from 'dotenv'; +dotenv.config(); + +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: '2024-08-01', + useCdn: false, + perspective: 'published', + token: process.env.SANITY_API_TOKEN, +}); + +async function exportUserEmails() { + try { + const query = `*[_type == "user" && defined(email)].email`; + const emails: string[] = await client.fetch(query); + const emailString = emails.filter(Boolean).join(', '); + console.log('User emails:'); + console.log(emailString); + console.log(`\nTotal: ${emails.length} email addresses`); + } catch (error) { + console.error('Error fetching emails:', error); + } +} + +exportUserEmails(); diff --git a/src/actions/admin.ts b/src/actions/admin.ts new file mode 100644 index 0000000..10e06ab --- /dev/null +++ b/src/actions/admin.ts @@ -0,0 +1,23 @@ +"use server"; + +import { currentRole } from "@/lib/auth"; +import { UserRole } from "@/types/user-role"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +/** + * demostrate how to use currentRole to check user's role, + * and return different responses according to different roles. + */ +export async function admin(): Promise { + const role = await currentRole(); + + if (role === UserRole.ADMIN) { + return { status: "success", message: "Allowed Server Action!" }; + } + + return { status: "error", message: "Forbidden Server Action!" }; +} diff --git a/src/actions/create-checkout-session.ts b/src/actions/create-checkout-session.ts new file mode 100644 index 0000000..b27b045 --- /dev/null +++ b/src/actions/create-checkout-session.ts @@ -0,0 +1,140 @@ +"use server"; + +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { stripe } from "@/lib/stripe"; +import { absoluteUrl } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import { redirect } from "next/navigation"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + stripeUrl?: string; +}; + +/** + * https://github.com/javayhu/lms-studio-antonio/blob/main/app/api/courses/%5BcourseId%5D/checkout/route.ts + */ +export async function createCheckoutSession( + itemId: string, + priceId: string, + pricePlan: string, +): Promise { + let redirectUrl = ""; + + try { + const user = await currentUser(); + if (!user || !user.email || !user.id) { + return { status: "error", message: "Unauthorized" }; + } + + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: itemId }, + }); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + + // 1. get user's stripeCustomerId + const sanityUser = await getUserById(user.id); + if (item.submitter._id !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + let stripeCustomerId = sanityUser?.stripeCustomerId; + // console.log('stripeCustomerId:', stripeCustomerId); + + // 2. if the item is paid and the submitter is the user, then redirect to the billing portal + if (stripeCustomerId && item.paid) { + console.log("item is paid, redirect to billing portal"); + const billingUrl = absoluteUrl("/dashboard"); + const stripeSession = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: billingUrl, + }); + redirectUrl = stripeSession.url as string; + // console.log('stripe billing portal session created, url:', redirectUrl); + } else { + // 3. make sure the user has a stripeCustomerId + console.log("item is not paid, redirect to stripe checkout session"); + if (!stripeCustomerId) { + console.log("creating customer in Stripe and Sanity"); + const customer = await stripe.customers.create({ + email: user.email, + }); + if (!customer) { + return { + status: "error", + message: "Failed to create customer in Stripe", + }; + } + + const result = await sanityClient + .patch(user.id) + .set({ + stripeCustomerId: customer.id, + }) + .commit(); + if (!result) { + return { + status: "error", + message: "Failed to save customer in Sanity", + }; + } + stripeCustomerId = customer.id; + } + + // 4. create stripe checkout session + console.log( + "Creating Stripe checkout session:", + { + customerId: stripeCustomerId, + priceId, + userId: user.id, + itemId, + } + ); + // TODO: optimize the success and cancel urls with sessionId!!! + const successUrl = absoluteUrl(`/publish/${itemId}?pay=success`); + const cancelUrl = absoluteUrl(`/payment/${itemId}?pay=failed`); + const stripeSession = await stripe.checkout.sessions.create({ + customer: stripeCustomerId, + mode: "payment", + line_items: [ + { + price: priceId, + quantity: 1, + }, + ], + metadata: { + userId: user.id, + itemId: itemId, + priceId: priceId, + pricePlan: pricePlan, + }, + success_url: successUrl, + cancel_url: cancelUrl, + // do not limit to card, allow other payment methods + // payment_method_types: ["card"], + billing_address_collection: "auto", + // allow promotion codes if you need + allow_promotion_codes: true, + }); + + redirectUrl = stripeSession.url as string; + console.log("stripe checkout session created, url:", redirectUrl); + } + } catch (error) { + return { + status: "error", + message: "Failed to generate stripe checkout session", + }; + } + + // 5. redirect to new url, no revalidatePath because redirect + redirect(redirectUrl); +} diff --git a/src/actions/edit.ts b/src/actions/edit.ts new file mode 100644 index 0000000..e747515 --- /dev/null +++ b/src/actions/edit.ts @@ -0,0 +1,184 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import type { SUPPORT_ITEM_ICON } from "@/lib/constants"; +import { sendNotifySubmissionEmail } from "@/lib/mail"; +import { EditSchema } from "@/lib/schemas"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { + getItemLinkInStudio, + getItemStatusLinkInWebsite, + slugify, +} from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +// biome-ignore format: conditional type +// biome-ignore lint/complexity/noBannedTypes: support item icon +// type IconField = typeof SUPPORT_ITEM_ICON extends true ? { iconId: string } : {}; + +// export type EditFormData = { +// id: string; +// name: string; +// link: string; +// description: string; +// introduction: string; +// tags: string[]; +// categories: string[]; +// imageId: string; +// pricePlan: string; +// planStatus: string; +// } & IconField; + +type BaseEditFormData = { + id: string; + name: string; + link: string; + description: string; + introduction: string; + tags: string[]; + categories: string[]; + imageId: string; + pricePlan: string; + planStatus: string; +}; + +export type EditFormData = typeof SUPPORT_ITEM_ICON extends true + ? BaseEditFormData & { iconId: string } + : BaseEditFormData; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +/** + * https://nextjs.org/learn/dashboard-app/mutating-data + */ +export async function edit( + formData: EditFormData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + console.log("edit, user:", user); + + // console.log("edit, data:", formData); + const { + id, + name, + link, + description, + introduction, + imageId, + tags, + categories, + pricePlan, + planStatus, + ...rest + } = EditSchema.parse(formData); + const iconId = "iconId" in rest ? rest.iconId : undefined; + console.log("edit, name:", name, "link:", link); + + // check if the user is the submitter of the item + const item = await getItemById(id); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const slug = slugify(name); + const data = { + _id: id, + _type: "item", + name, + slug: { + _type: "slug", + current: slug, + }, + link, + description, + introduction, + + // Free plan: update item leads to be unpublished and reviewed again + // remain submitted if the plan status is submitted, otherwise set to pending + ...(pricePlan === PricePlans.FREE && { + publishDate: null, + freePlanStatus: + planStatus === FreePlanStatus.SUBMITTING + ? FreePlanStatus.SUBMITTING + : FreePlanStatus.PENDING, + }), + + // The _key only needs to be unique within the array itself, use index as the _key + tags: tags.map((tag, index) => ({ + _type: "reference", + _ref: tag, + _key: index.toString(), + })), + categories: categories.map((category, index) => ({ + _type: "reference", + _ref: category, + _key: index.toString(), + })), + image: { + _type: "image", + alt: `image of ${name}`, + asset: { + _type: "reference", + _ref: imageId, + }, + }, + icon: iconId + ? { + _type: "image", + alt: `icon of ${name}`, + asset: { + _type: "reference", + _ref: iconId, + }, + } + : undefined, + }; + + // console.log("edit, data:", data); + const res = await sanityClient.patch(id).set(data).commit(); + if (!res) { + console.log("edit, fail"); + return { status: "error", message: "Failed to update item" }; + } + // console.log("edit, success, res:", res); + + // send notify email to admin and user + if (pricePlan === PricePlans.FREE) { + const statusLink = getItemStatusLinkInWebsite(id); + const reviewLink = getItemLinkInStudio(id); + sendNotifySubmissionEmail( + user.name, + user.email, + name, + statusLink, + reviewLink, + ); + } + + // Next.js has a Client-side Router Cache that stores the route segments in the user's browser for a time. + // Along with prefetching, this cache ensures that users can quickly navigate between routes + // while reducing the number of requests made to the server. + // Since you're updating the data displayed in the invoices route, you want to clear this cache and trigger a new request to the server. + // You can do this with the revalidatePath function from Next.js. + + // redirect to the updated item, but not working, still showing the old item + revalidatePath(`/edit/${id}`); + revalidatePath(`/item/${slug}`); + return { status: "success", message: "Successfully updated item" }; + } catch (error) { + console.log("edit, error", error); + return { status: "error", message: "Failed to update item" }; + } +} diff --git a/src/actions/fetch-website.ts b/src/actions/fetch-website.ts new file mode 100644 index 0000000..f9c29f7 --- /dev/null +++ b/src/actions/fetch-website.ts @@ -0,0 +1,270 @@ +"use server"; + +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { sanityClient } from "@/sanity/lib/client"; +import { deepseek } from "@ai-sdk/deepseek"; +import { google } from "@ai-sdk/google"; +import { openai } from "@ai-sdk/openai"; +import { xai } from "@ai-sdk/xai"; +import { createOpenRouter } from "@openrouter/ai-sdk-provider"; +import { generateObject } from "ai"; +import { z } from "zod"; + +/** + * Website info schema + * + * 1. when AI generates the image and icon, it will return the image URL and icon URL + * 2. when the image and icon are uploaded to Sanity, the image reference Id and icon reference Id will be set to the image and icon + * 3. when this server action is called, it will return the image url and icon url, and the image reference Id and icon reference Id + */ +const WebsiteInfoSchema = z.object({ + name: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z.string().describe("Detailed introduction in markdown format"), + categories: z + .array(z.string()) + .describe("Array of category names that best match the content"), + tags: z + .array(z.string()) + .describe("Array of tag names that best match the content"), + image: z.string().describe("Website screenshot image URL"), + icon: z.string().describe("Website logo image URL"), + imageId: z + .string() + .optional() + .describe("Website screenshot image reference Id"), + iconId: z.string().optional().describe("Website logo image reference Id"), +}); + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + data?: z.infer; +}; + +/** + * fetch info for the specified url + */ +export async function fetchWebsite(url: string): Promise { + try { + if (!process.env.DEFAULT_AI_PROVIDER) { + return { + status: "error", + message: "AI submit is not supported", + }; + } + + const data = await fetchWebsiteInfo(url); + if (data === null) { + return { + status: "error", + message: "Failed to fetch website info", + }; + } + return { + status: "success", + message: "Successfully fetched website info", + data, + }; + } catch (error) { + console.error("fetchWebsite, fetch website:", url, "error:", error); + return { + status: "error", + message: "Failed to fetch website info", + }; + } +} + +/** + * fetch website info for the specified url with Microlink and AI SDK + */ +export const fetchWebsiteInfo = async (url: string) => { + const fetchedData = await fetchWebsiteInfoWithAI(url); + if (fetchedData === null) { + console.error("fetchWebsiteInfo, url:", url, "fetchedData is null"); + return null; + } + console.log("fetchWebsiteInfo, url:", url, "fetchedData:", fetchedData); + + const websiteInfo = WebsiteInfoSchema.parse({ + name: fetchedData.object.name, + description: fetchedData.object.description, + introduction: fetchedData.object.introduction, + categories: fetchedData.object.categories, + tags: fetchedData.object.tags, + // image: microlinkData?.image?.url, // maybe we can use Microlink to get the screenshot as fallback + image: fetchedData.object.image, + // icon: microlinkData?.logo?.url, // maybe we can use Microlink to get the logo as fallback + // TODO: we don't use favicon URL, instead, we use Google API to get the logo + icon: `https://s2.googleusercontent.com/s2/favicons?domain=${url}&sz=128`, + }); + console.log("fetchWebsiteInfo, url:", url, "websiteInfo:", websiteInfo); + + if (websiteInfo.image && websiteInfo.icon) { + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(websiteInfo.icon), + fetch(websiteInfo.image), + ]); + + console.log("fetchWebsiteInfo, start fetching icon and image"); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + console.log("fetchWebsiteInfo, start uploading icon and image to sanity"); + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + sanityClient.assets.upload("image", iconBuffer, { + filename: `${slugify(websiteInfo.name)}_logo.png`, + }), + sanityClient.assets.upload("image", imageBuffer, { + filename: `${slugify(websiteInfo.name)}_image.png`, + }), + ]); + + console.log("fetchWebsiteInfo, url:", url, "iconAsset:", iconAsset); + console.log("fetchWebsiteInfo, url:", url, "imageAsset:", imageAsset); + + websiteInfo.icon = iconAsset.url; + websiteInfo.image = imageAsset.url; + websiteInfo.iconId = iconAsset._id; + websiteInfo.imageId = imageAsset._id; + console.log("fetchWebsiteInfo, url:", url, "websiteInfo:", websiteInfo); + } + + return websiteInfo; +}; + +/** + * fetch website info for the specified url with AI SDK + */ +export const fetchWebsiteInfoWithAI = async (url: string) => { + try { + // get all categories and tags + const categories = await sanityClient.fetch( + `*[_type == "category"]`, + ); + const tags = await sanityClient.fetch(`*[_type == "tag"]`); + const availableCategories = categories.map((cat) => cat.name); + const availableTags = tags.map((tag) => tag.name); + + const response = await fetch(url); + // TODO: we need to convert htmlContent to simple content for AI to analyze (save time and cost) + // TODO: if the content is too long, error will be thrown, so sometimes AI submit will fail + // Google Gemini model support more tokens than DeepSeek model, so we prefer Google Gemini model + // Thanks to Justin3go for the original implementation. + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, "") + .replace(/]*>.*?<\/svg>/g, "") + .replace(/)<[^<]*)*<\/script>/gi, ""); + + let aiModel = null; + if ( + process.env.DEFAULT_AI_PROVIDER === "google" && + process.env.GOOGLE_GENERATIVE_AI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/google-generative-ai + aiModel = google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "deepseek" && + process.env.DEEPSEEK_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/deepseek + aiModel = deepseek("deepseek-chat", { + // structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "openai" && + process.env.OPENAI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/openai + aiModel = openai("gpt-4o-mini", { + structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "xai" && + process.env.XAI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/xai + aiModel = xai("grok-3", { + // structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "openrouter" && + process.env.OPENROUTER_API_KEY !== undefined && + process.env.OPENROUTER_MODEL !== undefined + ) { + // https://ai-sdk.dev/providers/community-providers/openrouter + const openrouter = createOpenRouter({ + apiKey: process.env.OPENROUTER_API_KEY, + }); + aiModel = openrouter(process.env.OPENROUTER_MODEL); + } + + if (aiModel === null) { + return null; + } + console.log("fetchWebsiteInfoWithAI, aiModel:", aiModel); + + const result = await generateObject({ + model: aiModel, + schema: WebsiteInfoSchema, + prompt: `Analyze the following webpage content and provide structured information: + + Content to analyze: + ${htmlContent} + + Available Categories: + ${availableCategories.join(", ")} + + Available Tags: + ${availableTags.join(", ")} + + Please analyze the content and provide: + 1. A concise title (just the name, no description) + 2. A brief description (one sentence, max 160 characters) + 3. A detailed introduction in markdown format (include key features and use cases) + 4. Select appropriate categories from the available categories list (return array of names) + 5. Select relevant tags from the available tags list (return array of names) + 6. Provide a screenshot image full URL, choose open graph image URL if possible + 7. Provide a website logo full URL, choose website favicon URL if possible + + Focus on technical aspects and practical applications. If the content is a tool or service, + emphasize its main features, target users, and unique selling points.`, + }); + + // console.log("fetchWebsiteInfoWithAI, url:", url, "result:", result); + + // filter AI generated categories and tags to make sure they are in the available categories and tags + const filteredCategories = result.object.categories.filter((category) => + availableCategories.includes(category), + ); + const filteredTags = result.object.tags.filter((tag) => + availableTags.includes(tag), + ); + result.object.categories = filteredCategories; + result.object.tags = filteredTags; + + return result; + } catch (error) { + console.error( + `fetchWebsiteInfoWithAI, error processing url for ${url}:`, + error, + ); + return null; + } +}; diff --git a/src/actions/get-banner-ad.ts b/src/actions/get-banner-ad.ts new file mode 100644 index 0000000..7bf39d0 --- /dev/null +++ b/src/actions/get-banner-ad.ts @@ -0,0 +1,52 @@ +"use server"; + +import { getItemTargetLinkInWebsite } from "@/lib/utils"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export type BannerAdData = { + content: string; + url: string; +}; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + data?: BannerAdData; +}; + +export async function getBannerAd(): Promise { + try { + const result = await sanityFetch({ + query: sponsorItemListQuery, + }); + + // console.log("getBannerAd, result", result); + + // we only show the first sponsor item as banner ad + if (result && result.length > 0) { + return { + status: "success", + message: "Banner ad fetched successfully!", + data: { + content: `🎉 ${result[0].name}: ${result[0].description}`, + url: getItemTargetLinkInWebsite(result[0]), + }, + }; + } + + return { + status: "error", + message: "no banner ad!", + data: null, + }; + } catch (error) { + console.log("getBannerAd, error", error); + return { + status: "error", + message: "Failed to fetch banner ad!", + data: null, + }; + } +} diff --git a/src/actions/login.ts b/src/actions/login.ts new file mode 100644 index 0000000..1581b95 --- /dev/null +++ b/src/actions/login.ts @@ -0,0 +1,74 @@ +"use server"; + +import { signIn } from "@/auth"; +import { getUserByEmail } from "@/data/user"; +import { sendVerificationEmail } from "@/lib/mail"; +import { LoginSchema } from "@/lib/schemas"; +import { generateVerificationToken } from "@/lib/tokens"; +import { DEFAULT_LOGIN_REDIRECT } from "@/routes"; +import { AuthError } from "next-auth"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + redirectUrl?: string; +}; + +export async function login( + values: z.infer, + callbackUrl?: string | null, +): Promise { + const validatedFields = LoginSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid fields!" }; + } + + const { email, password } = validatedFields.data; + const existingUser = await getUserByEmail(email); + if (!existingUser || !existingUser.email || !existingUser.password) { + return { status: "error", message: "User does not exist!" }; + } + + if (!existingUser.emailVerified) { + const verificationToken = await generateVerificationToken( + existingUser.email, + ); + await sendVerificationEmail( + verificationToken.identifier, + verificationToken.token, + ); + return { + status: "success", + message: "Please check your email for verification", + }; + } + + try { + console.log("login, start signIn"); + // https://youtu.be/1MTyCvS05V4?t=9828 + await signIn("credentials", { + email, + password, + redirect: false, + redirectTo: callbackUrl || DEFAULT_LOGIN_REDIRECT, + }); + + return { + status: "success", + message: "Login success", + redirectUrl: callbackUrl || DEFAULT_LOGIN_REDIRECT, + }; + } catch (error) { + // console.error("login, error:", error); + if (error instanceof AuthError) { + switch (error.type) { + case "CredentialsSignin": + return { status: "error", message: "Invalid credentials!" }; + default: + return { status: "error", message: "Something went wrong!" }; + } + } + return { status: "error", message: "Something went wrong!" }; + } +} diff --git a/src/actions/logout.ts b/src/actions/logout.ts new file mode 100644 index 0000000..291c72f --- /dev/null +++ b/src/actions/logout.ts @@ -0,0 +1,7 @@ +"use server"; + +import { signOut } from "@/auth"; + +export const logout = async () => { + await signOut(); +}; diff --git a/src/actions/new-password.ts b/src/actions/new-password.ts new file mode 100644 index 0000000..799834c --- /dev/null +++ b/src/actions/new-password.ts @@ -0,0 +1,56 @@ +"use server"; + +import { getPasswordResetTokenByToken } from "@/data/password-reset-token"; +import { getUserByEmail } from "@/data/user"; +import { NewPasswordSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function newPassword( + values: z.infer, + token?: string | null, +): Promise { + // console.log('newPassword, token:', token); + if (!token) { + return { status: "error", message: "Missing token!" }; + } + + const validatedFields = NewPasswordSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid fields!" }; + } + + const { password } = validatedFields.data; + + const existingToken = await getPasswordResetTokenByToken(token); + if (!existingToken) { + return { status: "error", message: "Invalid token!" }; + } + + const hasExpired = new Date(existingToken.expires) < new Date(); + if (hasExpired) { + return { status: "error", message: "Token has expired!" }; + } + + const existingUser = await getUserByEmail(existingToken.identifier); + if (!existingUser) { + return { status: "error", message: "Email does not exist!" }; + } + + const hashedPassword = await bcrypt.hash(password, 10); + await sanityClient + .patch(existingUser._id) + .set({ + password: hashedPassword, + }) + .commit(); + + await sanityClient.delete(existingToken._id); + return { status: "success", message: "Password updated!" }; +} diff --git a/src/actions/new-verification.ts b/src/actions/new-verification.ts new file mode 100644 index 0000000..cabb0c4 --- /dev/null +++ b/src/actions/new-verification.ts @@ -0,0 +1,41 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { getVerificationTokenByToken } from "@/data/verification-token"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function newVerification( + token: string, +): Promise { + const existingToken = await getVerificationTokenByToken(token); + if (!existingToken) { + return { status: "error", message: "Token does not exist!" }; + } + + const hasExpired = new Date(existingToken.expires) < new Date(); + if (hasExpired) { + return { status: "error", message: "Token has expired!" }; + } + + const existingUser = await getUserByEmail(existingToken.identifier); + if (!existingUser) { + return { status: "error", message: "Email does not exist!" }; + } + + await sanityClient + .patch(existingUser._id) + .set({ + emailVerified: new Date().toISOString(), + email: existingToken.identifier, + }) + .commit(); + console.log("Email verified:", existingUser.email); + + await sanityClient.delete(existingToken._id); + return { status: "success", message: "Email verified!" }; +} diff --git a/src/actions/open-customer-portal.ts b/src/actions/open-customer-portal.ts new file mode 100644 index 0000000..bd533c5 --- /dev/null +++ b/src/actions/open-customer-portal.ts @@ -0,0 +1,44 @@ +"use server"; + +import { currentUser } from "@/lib/auth"; +import { stripe } from "@/lib/stripe"; +import { absoluteUrl } from "@/lib/utils"; +import { redirect } from "next/navigation"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + stripeUrl?: string; +}; + +const billingUrl = absoluteUrl("/dashboard"); + +/** + * NOTICE: not used in the app yet + */ +export async function openCustomerPortal( + stripeCustomerId: string, +): Promise { + let redirectUrl = ""; + + try { + const user = await currentUser(); + if (!user || !user.email) { + return { status: "error", message: "Unauthorized" }; + } + + if (stripeCustomerId) { + const stripeSession = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: billingUrl, + }); + + redirectUrl = stripeSession.url as string; + } + } catch (error) { + return { status: "error", message: "Failed to open customer portal" }; + } + + redirect(redirectUrl); + // return { status: "success", stripeUrl: redirectUrl }; +} diff --git a/src/actions/publish.ts b/src/actions/publish.ts new file mode 100644 index 0000000..387237a --- /dev/null +++ b/src/actions/publish.ts @@ -0,0 +1,45 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function publish(itemId: string): Promise { + console.log("publish, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("publish, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + publishDate: new Date().toISOString(), + }) + .commit(); + // console.log('publish, result:', result); + + if (!result) { + return { status: "error", message: "Failed to publish item!" }; + } + return { status: "success", message: "Successfully published!" }; + } catch (error) { + console.log("publish, error", error); + return { status: "error", message: "Failed to publish item!" }; + } +} diff --git a/src/actions/register.ts b/src/actions/register.ts new file mode 100644 index 0000000..8928e87 --- /dev/null +++ b/src/actions/register.ts @@ -0,0 +1,53 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { sendVerificationEmail } from "@/lib/mail"; +import { RegisterSchema } from "@/lib/schemas"; +import { generateVerificationToken } from "@/lib/tokens"; +import { sanityClient } from "@/sanity/lib/client"; +import { UserRole } from "@/types/user-role"; +import { uuid } from "@sanity/uuid"; +import bcrypt from "bcryptjs"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function register( + values: z.infer, +): Promise { + const validatedFields = RegisterSchema.safeParse(values); + + if (!validatedFields.success) { + return { status: "error", message: "Invalid Fields!" }; + } + + const { email, password, name } = validatedFields.data; + const hashedPassword = await bcrypt.hash(password, 10); + + const existingUser = await getUserByEmail(email); + if (existingUser) { + return { status: "error", message: "Email already being used" }; + } + + await sanityClient.create({ + _type: "user", + _id: `user.${uuid()}`, + name, + email, + role: UserRole.USER, + password: hashedPassword, + }); + + const verificationToken = await generateVerificationToken(email); + await sendVerificationEmail( + verificationToken.identifier, + verificationToken.token, + ); + return { + status: "success", + message: "Please check your email for verification", + }; +} diff --git a/src/actions/reset.ts b/src/actions/reset.ts new file mode 100644 index 0000000..580759c --- /dev/null +++ b/src/actions/reset.ts @@ -0,0 +1,37 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { sendPasswordResetEmail } from "@/lib/mail"; +import { ResetSchema } from "@/lib/schemas"; +import { generatePasswordResetToken } from "@/lib/tokens"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function reset( + values: z.infer, +): Promise { + const validatedFields = ResetSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid email!" }; + } + + const { email } = validatedFields.data; + + const existingUser = await getUserByEmail(email); + if (!existingUser) { + return { status: "error", message: "Email not found!" }; + } + + const passwordResetToken = await generatePasswordResetToken(email); + await sendPasswordResetEmail( + existingUser.name, + passwordResetToken.identifier, + passwordResetToken.token, + ); + + return { status: "success", message: "Password reset email sent" }; +} diff --git a/src/actions/settings.ts b/src/actions/settings.ts new file mode 100644 index 0000000..e3e5aa8 --- /dev/null +++ b/src/actions/settings.ts @@ -0,0 +1,78 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import type { SettingsSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import { revalidatePath } from "next/cache"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function settings( + values: z.infer, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('settings, values:', values); + if (user.isOAuth) { + values.password = undefined; + values.newPassword = undefined; + } + + // password change needs verification + if (values.password && values.newPassword && dbUser.password) { + const passwordsMatch = await bcrypt.compare( + values.password, + dbUser.password, + ); + + if (!passwordsMatch) { + return { status: "error", message: "Incorrect password!" }; + } + + const hashedPassword = await bcrypt.hash(values.newPassword, 10); + values.password = hashedPassword; + values.newPassword = undefined; + } + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + ...values, + }) + .commit(); + console.log("settings, updatedUser:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + name: updatedUser.name, + link: updatedUser.link, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "Account information updated!" }; + } catch (error) { + console.log("settings, error", error); + return { + status: "error", + message: "Failed to update account information!", + }; + } +} diff --git a/src/actions/submit-to-review.ts b/src/actions/submit-to-review.ts new file mode 100644 index 0000000..8b34174 --- /dev/null +++ b/src/actions/submit-to-review.ts @@ -0,0 +1,67 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sendNotifySubmissionEmail } from "@/lib/mail"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { getItemLinkInStudio, getItemStatusLinkInWebsite } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export const submitToReview = async ( + itemId: string, +): Promise => { + console.log("submitToReview, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("submitToReview, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + if ( + item.pricePlan !== PricePlans.FREE || + item.freePlanStatus !== FreePlanStatus.SUBMITTING + ) { + return { status: "error", message: "Item is not in right plan status!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + pricePlan: PricePlans.FREE, + freePlanStatus: FreePlanStatus.PENDING, + }) + .commit(); + // console.log('submitToReview, result:', result); + if (!result) { + return { status: "error", message: "Failed to submit item to review!" }; + } + + const statusLink = getItemStatusLinkInWebsite(itemId); + const reviewLink = getItemLinkInStudio(itemId); + sendNotifySubmissionEmail( + user.name, + user.email, + result.name, + statusLink, + reviewLink, + ); + + return { status: "success", message: "Item submitted to review!" }; + } catch (error) { + console.log("submitToReview, error", error); + return { status: "error", message: "Failed to submit item to review!" }; + } +}; diff --git a/src/actions/submit.ts b/src/actions/submit.ts new file mode 100644 index 0000000..5a45646 --- /dev/null +++ b/src/actions/submit.ts @@ -0,0 +1,141 @@ +"use server"; + +import { currentUser } from "@/lib/auth"; +import type { SUPPORT_ITEM_ICON } from "@/lib/constants"; +import { SubmitSchema } from "@/lib/schemas"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { slugify } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +type BaseSubmitFormData = { + name: string; + link: string; + description: string; + introduction: string; + imageId: string; + tags: string[]; + categories: string[]; +}; + +export type SubmitFormData = typeof SUPPORT_ITEM_ICON extends true + ? BaseSubmitFormData & { iconId: string } + : BaseSubmitFormData; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + id?: string; +}; + +/** + * https://nextjs.org/learn/dashboard-app/mutating-data + */ +export async function submit( + formData: SubmitFormData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + // console.log("submit, data:", formData); + const { + name, + link, + description, + introduction, + imageId, + tags, + categories, + ...rest + } = SubmitSchema.parse(formData); + const iconId = "iconId" in rest ? rest.iconId : undefined; + console.log("submit, name:", name, "link:", link); + + let slug = slugify(name); + // check if the slug already exists + const existingItem = await sanityClient.fetch( + `*[_type == "item" && slug.current == $slug][0]`, + { slug }, + ); + if (existingItem) { + const slugLink = slugify(link.replace(/^https?:\/\//, "")); + slug = `${slug}-${slugLink}`; + } + + const data = { + _type: "item", + name, + slug: { + _type: "slug", + current: slug, + }, + link, + description, + introduction, + publishDate: null, + + paid: false, + pricePlan: PricePlans.FREE, + freePlanStatus: FreePlanStatus.SUBMITTING, + submitter: { + _type: "reference", + _ref: user.id, + }, + + // The _key only needs to be unique within the array itself + tags: tags.map((tag, index) => ({ + _type: "reference", + _ref: tag, + _key: index.toString(), + })), + categories: categories.map((category, index) => ({ + _type: "reference", + _ref: category, + _key: index.toString(), + })), + image: { + _type: "image", + alt: `image of ${name}`, + asset: { + _type: "reference", + _ref: imageId, + }, + }, + icon: iconId + ? { + _type: "image", + alt: `icon of ${name}`, + asset: { + _type: "reference", + _ref: iconId, + }, + } + : undefined, + }; + + // console.log("submit, data:", data); + + const res = await sanityClient.create(data); + if (!res) { + console.log("submit, fail"); + return { status: "error", message: "Failed to submit" }; + } + + // console.log("submit, success, res:", res); + + // Next.js has a Client-side Router Cache that stores the route segments in the user's browser for a time. + // Along with prefetching, this cache ensures that users can quickly navigate between routes + // while reducing the number of requests made to the server. + // Since you're updating the data displayed in the invoices route, you want to clear this cache and trigger a new request to the server. + // You can do this with the revalidatePath function from Next.js. + revalidatePath("/submit"); + + return { status: "success", message: "Successfully created", id: res._id }; + } catch (error) { + console.log("submit, error", error); + return { status: "error", message: "Failed to submit" }; + } +} diff --git a/src/actions/subscribe-to-newsletter.ts b/src/actions/subscribe-to-newsletter.ts new file mode 100644 index 0000000..84d210d --- /dev/null +++ b/src/actions/subscribe-to-newsletter.ts @@ -0,0 +1,54 @@ +"use server"; + +import { NewsletterWelcomeEmail } from "@/emails/newsletter-welcome"; +import { resend } from "@/lib/mail"; +import { type NewsletterFormData, NewsletterFormSchema } from "@/lib/schemas"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function subscribeToNewsletter( + formdata: NewsletterFormData, +): Promise { + try { + const validatedInput = NewsletterFormSchema.safeParse(formdata); + if (!validatedInput.success) { + return { status: "error", message: "Invalid input" }; + } + + const subscribedResult = await resend.contacts.create({ + email: validatedInput.data.email, + unsubscribed: false, + audienceId: process.env.RESEND_AUDIENCE_ID, + }); + console.log("subscribeToNewsletter, subscribedResult", subscribedResult); + const subscribed = !subscribedResult.error; + + if (subscribed) { + const emailSentResult = await resend.emails.send({ + from: process.env.RESEND_EMAIL_FROM, + to: validatedInput.data.email, + subject: "Welcome to our newsletter!", + react: NewsletterWelcomeEmail({ email: validatedInput.data.email }), + }); + console.log("subscribeToNewsletter, emailSentResult", emailSentResult); + const emailSent = !emailSentResult.error; + if (emailSent) { + return { status: "success", message: "Subscribed to the newsletter" }; + } + } + + return { + status: "error", + message: "Failed to subscribe to the newsletter", + }; + } catch (error) { + console.error("subscribeToNewsletter, error:", error); + return { + status: "error", + message: "Failed to subscribe to the newsletter", + }; + } +} diff --git a/src/actions/unpublish.ts b/src/actions/unpublish.ts new file mode 100644 index 0000000..565c0d9 --- /dev/null +++ b/src/actions/unpublish.ts @@ -0,0 +1,46 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function unpublish(itemId: string): Promise { + console.log("unpublish, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("publish, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + publishDate: null, + }) + .commit(); + // console.log('unpublish, result:', result); + + if (!result) { + return { status: "error", message: "Failed to unpublish item!" }; + } + + return { status: "success", message: "Item unpublished!" }; + } catch (error) { + console.log("unpublish, error", error); + return { status: "error", message: "Failed to unpublish item!" }; + } +} diff --git a/src/actions/unsubscribe-to-newsletter.ts b/src/actions/unsubscribe-to-newsletter.ts new file mode 100644 index 0000000..23a622a --- /dev/null +++ b/src/actions/unsubscribe-to-newsletter.ts @@ -0,0 +1,47 @@ +"use server"; + +import { resend } from "@/lib/mail"; +import { type NewsletterFormData, NewsletterFormSchema } from "@/lib/schemas"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function unsubscribeToNewsletter( + formdata: NewsletterFormData, +): Promise { + try { + const validatedInput = NewsletterFormSchema.safeParse(formdata); + if (!validatedInput.success) { + return { status: "error", message: "Invalid input" }; + } + + const unsubscribedResult = await resend.contacts.remove({ + email: validatedInput.data.email, + audienceId: process.env.RESEND_AUDIENCE_ID, + }); + console.log( + "unsubscribeToNewsletter, unsubscribedResult", + unsubscribedResult, + ); + const unsubscribed = !unsubscribedResult.error; + if (unsubscribed) { + return { + status: "success", + message: "You have been unsubscribed from the newsletter", + }; + } + + return { + status: "error", + message: "Failed to unsubscribe to the newsletter", + }; + } catch (error) { + console.error("unsubscribeToNewsletter, error", error); + return { + status: "error", + message: "Failed to unsubscribe to the newsletter", + }; + } +} diff --git a/src/actions/update-link.ts b/src/actions/update-link.ts new file mode 100644 index 0000000..807c1ce --- /dev/null +++ b/src/actions/update-link.ts @@ -0,0 +1,56 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { type UserLinkData, UserLinkSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserLink( + values: UserLinkData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('updateUserLink, values:', values); + const { link } = UserLinkSchema.parse(values); + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + link: link, + }) + .commit(); + // console.log("updateUserLink, user:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + link: updatedUser.link, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "User link updated!" }; + } catch (error) { + console.log("updateUserLink, error", error); + return { + status: "error", + message: "Failed to update user link!", + }; + } +} diff --git a/src/actions/update-name.ts b/src/actions/update-name.ts new file mode 100644 index 0000000..828ccf9 --- /dev/null +++ b/src/actions/update-name.ts @@ -0,0 +1,56 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { type UserNameData, UserNameSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserName( + values: UserNameData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('updateUserName, values:', values); + const { name } = UserNameSchema.parse(values); + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + name: name, + }) + .commit(); + // console.log("updateUserName, user:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + name: updatedUser.name, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "User name updated!" }; + } catch (error) { + console.log("updateUserName, error", error); + return { + status: "error", + message: "Failed to update user name!", + }; + } +} diff --git a/src/actions/update-password.ts b/src/actions/update-password.ts new file mode 100644 index 0000000..8d8541b --- /dev/null +++ b/src/actions/update-password.ts @@ -0,0 +1,60 @@ +"use server"; + +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import type { UserPasswordData } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserPassword( + values: UserPasswordData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // password change needs verification + if (values.password && values.newPassword && dbUser.password) { + const passwordsMatch = await bcrypt.compare( + values.password, + dbUser.password, + ); + + if (!passwordsMatch) { + return { status: "error", message: "Incorrect password!" }; + } + + const hashedPassword = await bcrypt.hash(values.newPassword, 10); + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + password: hashedPassword, + }) + .commit(); + console.log("updateUserPassword, user:", updatedUser); + + revalidatePath("/settings"); + return { status: "success", message: "User password updated!" }; + } + return { status: "error", message: "No password provided" }; + } catch (error) { + console.log("updateUserPassword, error", error); + return { + status: "error", + message: "Failed to update user password!", + }; + } +} diff --git a/src/app/(sanity)/layout.tsx b/src/app/(sanity)/layout.tsx new file mode 100644 index 0000000..5c572d2 --- /dev/null +++ b/src/app/(sanity)/layout.tsx @@ -0,0 +1,13 @@ +import "@/styles/globals.css"; + +export default function StudioLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/src/app/(sanity)/studio/[[...index]]/page.tsx b/src/app/(sanity)/studio/[[...index]]/page.tsx new file mode 100644 index 0000000..ca888e0 --- /dev/null +++ b/src/app/(sanity)/studio/[[...index]]/page.tsx @@ -0,0 +1,11 @@ +"use client"; + +import config from "@/sanity.config"; +import { NextStudio } from "next-sanity/studio"; + +/** + * https://www.sanity.io/plugins/next-sanity#studio-route-with-app-router + */ +export default function Studio() { + return ; +} diff --git a/src/app/(website)/(newsletter)/unsubscribe/page.tsx b/src/app/(website)/(newsletter)/unsubscribe/page.tsx new file mode 100644 index 0000000..07eab9b --- /dev/null +++ b/src/app/(website)/(newsletter)/unsubscribe/page.tsx @@ -0,0 +1,53 @@ +"use client"; + +import { unsubscribeToNewsletter } from "@/actions/unsubscribe-to-newsletter"; +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; +import { useSearchParams } from "next/navigation"; +import { useEffect, useState } from "react"; + +export default function UnsubscribePage() { + const searchParams = useSearchParams(); + const [message, setMessage] = useState("Processing your request..."); + + useEffect(() => { + const email = searchParams.get("email"); + if (email) { + unsubscribeToNewsletter({ email }) + .then((response) => { + console.log("unsubscribePage, response", response); + if (response.status === "success") { + setMessage(response.message || "You have been unsubscribed."); + } else { + setMessage( + response.message || "An error occurred. Please try again later.", + ); + } + }) + .catch(() => { + console.log("unsubscribePage, error"); + setMessage("An error occurred. Please try again later."); + }); + } else { + console.log("unsubscribePage, no email provided"); + setMessage("Invalid request. No email provided."); + } + }, [searchParams]); + + return ( +
+ + +

Unsubscribe from the newsletter

+ +

+ {message} +

+ + +
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx new file mode 100644 index 0000000..f03a6a0 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function PlanLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx new file mode 100644 index 0000000..c3e00ff --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx @@ -0,0 +1,20 @@ +import { PricingPlansSkeleton } from "@/components/dashboard/pricing-plans"; +import { SubmissionCardInPlanPageSkeleton } from "@/components/payment/submission-card-in-plan-page"; +import { Card } from "@/components/ui/card"; +import { Separator } from "@/components/ui/separator"; + +export default function Loading() { + return ( + +
+ +
+ + + +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx new file mode 100644 index 0000000..85aff39 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx @@ -0,0 +1,66 @@ +import { PricingPlans } from "@/components/dashboard/pricing-plans"; +import SubmissionCardInPlanPage from "@/components/payment/submission-card-in-plan-page"; +import { Card } from "@/components/ui/card"; +import { Separator } from "@/components/ui/separator"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Submit your product (2/3)", + description: "Submit your product (2/3) Choose pricing plan", + canonicalUrl: `${siteConfig.url}/payment/${params.id}`, + }); +} + +export default async function PlanPage({ params }: { params: { id: string } }) { + const user = await currentUser(); + if (!user) { + console.error("PlanPage, user not found"); + return redirect("/auth/login"); + } + + const { id } = params; + console.log("PlanPage, itemId:", id); + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: id }, + disableCache: true, + }); + + if (!item) { + console.error("PlanPage, item not found"); + return notFound(); + } + // console.log('PlanPage, item:', item); + + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("PlanPage, user not match"); + return redirect("/dashboard"); + } + + return ( + +
+ +
+ + + +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx new file mode 100644 index 0000000..2f962e5 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function PublishLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx new file mode 100644 index 0000000..a977d30 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx @@ -0,0 +1,5 @@ +import { SubmissionCardInPublishPageSkeleton } from "@/components/publish/submission-card-in-publish-page"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx new file mode 100644 index 0000000..25a3707 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx @@ -0,0 +1,82 @@ +import SubmissionCardInPublishPage from "@/components/publish/submission-card-in-publish-page"; +import ConfettiEffect from "@/components/shared/confetti-effect"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { FreePlanStatus, PricePlans, ProPlanStatus } from "@/lib/submission"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Submit your product (3/3)", + description: "Submit your product (3/3) Review and publish product", + canonicalUrl: `${siteConfig.url}/publish/${params.id}`, + }); +} + +export default async function PublishPage({ + params, + searchParams, +}: { + params: { id: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const user = await currentUser(); + if (!user) { + console.error("PublishPage, user not found"); + return redirect("/auth/login"); + } + + const { id } = params; + const { pay } = searchParams as { [key: string]: string }; + const showConfetti = pay === "success"; + // console.log('PublishPage, itemId:', id); + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: id }, + disableCache: true, + }); + + if (!item) { + console.error("PublishPage, item not found"); + return notFound(); + } + // console.log("PublishPage, item:", item); + + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("PublishPage, user not match"); + return redirect("/dashboard"); + } + + // check status, redirect to the corresponding page if the status is not right + if ( + item.pricePlan === PricePlans.FREE && + item.freePlanStatus !== FreePlanStatus.APPROVED + ) { + return redirect("/dashboard"); + } + if ( + item.pricePlan === PricePlans.PRO && + item.proPlanStatus !== ProPlanStatus.SUCCESS + ) { + return redirect("/dashboard"); + } + + return ( +
+ {/* show confetti if the payment is successful */} + {showConfetti && } + + +
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/submit/layout.tsx b/src/app/(website)/(protected)/(submit)/submit/layout.tsx new file mode 100644 index 0000000..fe3e532 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function SubmitLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/submit/loading.tsx b/src/app/(website)/(protected)/(submit)/submit/loading.tsx new file mode 100644 index 0000000..e393028 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/loading.tsx @@ -0,0 +1,5 @@ +import { SubmitFormSkeleton } from "@/components/submit/submit-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/(submit)/submit/page.tsx b/src/app/(website)/(protected)/(submit)/submit/page.tsx new file mode 100644 index 0000000..c31ea88 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/page.tsx @@ -0,0 +1,28 @@ +import { SubmitForm } from "@/components/submit/submit-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryListQueryResult, + TagListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { categoryListQuery, tagListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Submit your product (1/3)", + description: "Submit your product (1/3) – Enter product details", + canonicalUrl: `${siteConfig.url}/submit`, +}); + +export default async function SubmitPage() { + const [categoryList, tagList] = await Promise.all([ + sanityFetch({ + query: categoryListQuery, + }), + sanityFetch({ + query: tagListQuery, + }), + ]); + + return ; +} diff --git a/src/app/(website)/(protected)/dashboard/layout.tsx b/src/app/(website)/(protected)/dashboard/layout.tsx new file mode 100644 index 0000000..a87ca3c --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/layout.tsx @@ -0,0 +1,32 @@ +import { DashboardButton } from "@/components/dashboard/dashboard-button"; +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; +import { Button } from "@/components/ui/button"; +import { UploadIcon } from "lucide-react"; +import Link from "next/link"; + +export default async function DashboardLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ +
+ + + +
+
+ +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/dashboard/loading.tsx b/src/app/(website)/(protected)/dashboard/loading.tsx new file mode 100644 index 0000000..149e0cd --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/loading.tsx @@ -0,0 +1,5 @@ +import { SubmissionListSkeleton } from "@/components/dashboard/submission-list"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/dashboard/page.tsx b/src/app/(website)/(protected)/dashboard/page.tsx new file mode 100644 index 0000000..7901f22 --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/page.tsx @@ -0,0 +1,61 @@ +import EmptySubmission from "@/components/dashboard/submission-empty"; +import SubmissionList from "@/components/dashboard/submission-list"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getSubmissions } from "@/data/submission"; +import { currentUser } from "@/lib/auth"; +import { SUBMISSIONS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Dashboard", + description: "Overview of submissions", + canonicalUrl: `${siteConfig.url}/dashboard`, +}); + +export default async function DashboardPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const user = await currentUser(); + const userId = user?.id; + // console.log('DashboardPage, user:', user); + + console.log("DashboardPage, searchParams", searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { submissions, totalCount } = await getSubmissions({ + userId, + currentPage, + }); + const totalPages = Math.ceil(totalCount / SUBMISSIONS_PER_PAGE); + console.log( + "DashboardPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + // console.log('DashboardPage, submissions:', submissions); + + return ( +
+ {/* when no submissions are found */} + {submissions?.length === 0 && } + + {/* when submissions are found */} + {submissions && submissions.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(protected)/edit/[id]/layout.tsx b/src/app/(website)/(protected)/edit/[id]/layout.tsx new file mode 100644 index 0000000..5d6bd57 --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/layout.tsx @@ -0,0 +1,17 @@ +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; + +export default async function EditLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/edit/[id]/loading.tsx b/src/app/(website)/(protected)/edit/[id]/loading.tsx new file mode 100644 index 0000000..ceb897b --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/loading.tsx @@ -0,0 +1,5 @@ +import { EditFormSkeleton } from "@/components/edit/edit-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/edit/[id]/page.tsx b/src/app/(website)/(protected)/edit/[id]/page.tsx new file mode 100644 index 0000000..cb6df67 --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/page.tsx @@ -0,0 +1,66 @@ +import { EditForm } from "@/components/edit/edit-form"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryListQueryResult, + TagListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + categoryListQuery, + itemFullInfoByIdQuery, + tagListQuery, +} from "@/sanity/lib/queries"; +import type { ItemFullInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Edit product information", + description: "Edit product information", + canonicalUrl: `${siteConfig.url}/edit/${params.id}`, + }); +} + +interface EditPageProps { + params: { id: string }; +} + +export default async function EditPage({ params }: EditPageProps) { + const user = await currentUser(); + if (!user) { + console.error("EditPage, user not found"); + return redirect("/auth/login"); + } + + const [item, categoryList, tagList] = await Promise.all([ + sanityFetch({ + query: itemFullInfoByIdQuery, + params: { id: params.id }, + }), + sanityFetch({ + query: categoryListQuery, + }), + sanityFetch({ + query: tagListQuery, + }), + ]); + + if (!item) { + console.error("EditPage, item not found"); + return notFound(); + } + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("EditPage, user not match"); + return redirect("/dashboard"); + } + + return ; +} diff --git a/src/app/(website)/(protected)/layout.tsx b/src/app/(website)/(protected)/layout.tsx new file mode 100644 index 0000000..cc1739f --- /dev/null +++ b/src/app/(website)/(protected)/layout.tsx @@ -0,0 +1,32 @@ +import Container from "@/components/container"; +import { Footer } from "@/components/layout/footer"; +import { Navbar } from "@/components/layout/navbar"; +import { dashboardConfig } from "@/config/dashboard"; +import { currentUser } from "@/lib/auth"; +import { redirect } from "next/navigation"; + +interface ProtectedLayoutProps { + children: React.ReactNode; +} + +export default async function ProtectedLayout({ + children, +}: ProtectedLayoutProps) { + const user = await currentUser(); + // console.log(`ProtectedLayout, user:`, user); + if (!user) { + return redirect("/auth/login"); + } + + return ( +
+ + +
+ {children} +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/settings/layout.tsx b/src/app/(website)/(protected)/settings/layout.tsx new file mode 100644 index 0000000..2e6406a --- /dev/null +++ b/src/app/(website)/(protected)/settings/layout.tsx @@ -0,0 +1,13 @@ +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; + +export default function SettingsLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/settings/loading.tsx b/src/app/(website)/(protected)/settings/loading.tsx new file mode 100644 index 0000000..29135e6 --- /dev/null +++ b/src/app/(website)/(protected)/settings/loading.tsx @@ -0,0 +1,5 @@ +import { SettingsFormSkeleton } from "@/components/settings/settings-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/settings/page.tsx b/src/app/(website)/(protected)/settings/page.tsx new file mode 100644 index 0000000..dfd0584 --- /dev/null +++ b/src/app/(website)/(protected)/settings/page.tsx @@ -0,0 +1,34 @@ +import { UserLinkForm } from "@/components/settings/user-link-form"; +import { UserNameForm } from "@/components/settings/user-name-form"; +import { UserPasswordForm } from "@/components/settings/user-password-form"; +import { Card, CardContent } from "@/components/ui/card"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { redirect } from "next/navigation"; + +export const metadata = constructMetadata({ + title: "Settings", + description: "Manage account settings", + canonicalUrl: `${siteConfig.url}/settings`, +}); + +export default async function SettingsPage() { + const user = await currentUser(); + // console.log("SettingsPage, user:", user); + + if (!user) { + console.error("SettingsPage, user not found"); + return redirect("/auth/login"); + } + + return ( + + + + + + + + ); +} diff --git a/src/app/(website)/(public)/(home)/layout.tsx b/src/app/(website)/(public)/(home)/layout.tsx new file mode 100644 index 0000000..b0df617 --- /dev/null +++ b/src/app/(website)/(public)/(home)/layout.tsx @@ -0,0 +1,34 @@ +import Container from "@/components/container"; +import { HomeCategoryList } from "@/components/home/home-category-list"; +import HomeHero from "@/components/home/home-hero"; +import { HomeSearchFilter } from "@/components/home/home-search-filter"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + +
+ {/* left sidebar: category list */} +
+
+ +
+
+ + {/* right content: item grid */} +
+
+ + {children} +
+
+
+ + +
+ ); +} diff --git a/src/app/(website)/(public)/(home)/loading.tsx b/src/app/(website)/(public)/(home)/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/(home)/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/(home)/page.tsx b/src/app/(website)/(public)/(home)/page.tsx new file mode 100644 index 0000000..0b9b9d5 --- /dev/null +++ b/src/app/(website)/(public)/(home)/page.tsx @@ -0,0 +1,81 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function HomePage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("HomePage, searchParams", searchParams); + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("HomePage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("HomePage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home2/layout.tsx b/src/app/(website)/(public)/(test)/home2/layout.tsx new file mode 100644 index 0000000..b893469 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/layout.tsx @@ -0,0 +1,24 @@ +import Container from "@/components/container"; +import HomeHero from "@/components/home2/home2-hero"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + + {children} + + + + ); +} diff --git a/src/app/(website)/(public)/(test)/home2/loading.tsx b/src/app/(website)/(public)/(test)/home2/loading.tsx new file mode 100644 index 0000000..f4a1a99 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/loading.tsx @@ -0,0 +1,16 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ( +
+ {/* home content */} + + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home2/page.tsx b/src/app/(website)/(public)/(test)/home2/page.tsx new file mode 100644 index 0000000..aa37416 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/page.tsx @@ -0,0 +1,12 @@ +import { HomeContent } from "@/components/home2/home2-content"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function LandingPage() { + return ; +} diff --git a/src/app/(website)/(public)/(test)/home3/layout.tsx b/src/app/(website)/(public)/(test)/home3/layout.tsx new file mode 100644 index 0000000..02138c0 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/layout.tsx @@ -0,0 +1,22 @@ +import Container from "@/components/container"; +import HomeHeroSponsor from "@/components/home3/home3-hero-sponsor"; +import { HomeSearchFilter } from "@/components/home3/home3-search-filter"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + +
+ + + {children} +
+ + +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home3/loading.tsx b/src/app/(website)/(public)/(test)/home3/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/(test)/home3/page.tsx b/src/app/(website)/(public)/(test)/home3/page.tsx new file mode 100644 index 0000000..af12a54 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/page.tsx @@ -0,0 +1,85 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function HomePage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("HomePage, searchParams", searchParams); + + // Option 1: use these code if you want to show sponsor items in the item grid + // const sponsorItems = (await sanityFetch({ + // query: sponsorItemListQuery, + // })) || []; + // const showSponsor = true; + // const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + // Option 2: use these code if you want to show sponsor items in the hero section + const sponsorItems = []; + const showSponsor = false; + const hasSponsorItem = false; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("HomePage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/loading/page.tsx b/src/app/(website)/(public)/(test)/loading/page.tsx new file mode 100644 index 0000000..4bb157b --- /dev/null +++ b/src/app/(website)/(public)/(test)/loading/page.tsx @@ -0,0 +1,27 @@ +// import Loading from "../../[slug]/loading"; +// import Loading from "../../(home)/loading"; +// import Loading from "@/app/(website)/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/payment/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/publish/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/submit/loading"; +// import Loading from "@/app/(website)/(protected)/dashboard/loading"; +// import Loading from "@/app/(website)/(protected)/edit/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/settings/loading"; +// import Loading from "@/app/(website)/(public)/category/loading"; +// import Loading from "@/app/(website)/(public)/item/[slug]/loading"; +// import Loading from "@/app/(website)/(public)/blog/(blog)/loading"; +// import Loading from "@/app/(website)/(public)/blog/[slug]/loading"; +// import Loading from "@/app/(website)/(public)/collection/loading"; +import Container from "@/components/container"; +import Loading from "../home2/loading"; + +/** + * This is a loading page for testing purposes. + */ +export default function LoadingDemo() { + return ( + + + + ); +} diff --git a/src/app/(website)/(public)/[slug]/layout.tsx b/src/app/(website)/(public)/[slug]/layout.tsx new file mode 100644 index 0000000..61ef0c5 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/layout.tsx @@ -0,0 +1,11 @@ +import Container from "@/components/container"; + +export default function CustomPageLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/src/app/(website)/(public)/[slug]/loading.tsx b/src/app/(website)/(public)/[slug]/loading.tsx new file mode 100644 index 0000000..656edb2 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/loading.tsx @@ -0,0 +1,38 @@ +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ; +} + +function CustomPageSkeleton() { + return ( +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/src/app/(website)/(public)/[slug]/page.tsx b/src/app/(website)/(public)/[slug]/page.tsx new file mode 100644 index 0000000..b94f848 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/page.tsx @@ -0,0 +1,65 @@ +import { CustomMdx } from "@/components/shared/custom-mdx"; +import { siteConfig } from "@/config/site"; +import { portableTextToMarkdown } from "@/lib/mdx"; +import { constructMetadata } from "@/lib/metadata"; +import type { PageQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { pageQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const page = await sanityFetch({ + query: pageQuery, + params: { slug: params.slug }, + }); + if (!page) { + console.warn(`generateMetadata, page not found for slug: ${params.slug}`); + return; + } + + return constructMetadata({ + title: page.title, + description: page.excerpt, + canonicalUrl: `${siteConfig.url}/${params.slug}`, + }); +} + +interface CustomPageProps { + params: { slug: string }; +} + +export default async function CustomPage({ params }: CustomPageProps) { + console.log(`CustomPage, params: ${JSON.stringify(params)}`); + const page = await sanityFetch({ + query: pageQuery, + params: { slug: params.slug }, + }); + + if (!page) { + return notFound(); + } + + console.log(`CustomPage, page title: ${page.title}`); + // console.log('CustomPage, page body: ', page.body); + const markdownContent = portableTextToMarkdown(page.body); + // console.log("markdownContent", markdownContent); + + return ( +
+
+

{page.title}

+ {page.excerpt && ( +

{page.excerpt}

+ )} +
+
+
+ {markdownContent && } +
+
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx b/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx new file mode 100644 index 0000000..029f260 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx @@ -0,0 +1,5 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx b/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx new file mode 100644 index 0000000..4ac50b4 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx @@ -0,0 +1,84 @@ +import BlogGrid from "@/components/blog/blog-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getBlogs } from "@/data/blog"; +import { POSTS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { BlogCategoryMetadateQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { blogCategoryMetadateQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const category = await sanityFetch({ + query: blogCategoryMetadateQuery, + params: { slug: params.slug }, + }); + if (!category) { + console.warn( + `generateMetadata, category not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", category.name); + ogImageUrl.searchParams.append("description", category.description || ""); + ogImageUrl.searchParams.append("type", "Blog Category"); + + return constructMetadata({ + title: `${category.name}`, + description: category.description, + canonicalUrl: `${siteConfig.url}/blog/category/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function BlogCategoryPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + // console.log('BlogCategoryPage, searchParams', searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { posts, totalCount } = await getBlogs({ + category: params.slug, + currentPage, + }); + const totalPages = Math.ceil(totalCount / POSTS_PER_PAGE); + console.log( + "BlogCategoryPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no posts are found */} + {posts?.length === 0 && } + + {/* when posts are found */} + {posts && posts?.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/layout.tsx b/src/app/(website)/(public)/blog/(blog)/layout.tsx new file mode 100644 index 0000000..d80b83a --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/layout.tsx @@ -0,0 +1,29 @@ +import { BlogCategoryFilter } from "@/components/blog/blog-category-filter"; +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default async function BlogListLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+ + + +
+ + {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/loading.tsx b/src/app/(website)/(public)/blog/(blog)/loading.tsx new file mode 100644 index 0000000..029f260 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/loading.tsx @@ -0,0 +1,5 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/blog/(blog)/page.tsx b/src/app/(website)/(public)/blog/(blog)/page.tsx new file mode 100644 index 0000000..07f654c --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/page.tsx @@ -0,0 +1,49 @@ +import BlogGrid from "@/components/blog/blog-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getBlogs } from "@/data/blog"; +import { POSTS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Blog", + description: "Read our latest blog posts", + canonicalUrl: `${siteConfig.url}/blog`, +}); + +export default async function BlogIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("BlogIndexPage, searchParams", searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { posts, totalCount } = await getBlogs({ currentPage }); + const totalPages = Math.ceil(totalCount / POSTS_PER_PAGE); + console.log( + "BlogIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no posts are found */} + {posts?.length === 0 && } + + {/* when posts are found */} + {posts && posts?.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/layout.tsx b/src/app/(website)/(public)/blog/[slug]/layout.tsx new file mode 100644 index 0000000..1527603 --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/layout.tsx @@ -0,0 +1,17 @@ +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import type React from "react"; + +export default function BlogPostLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/loading.tsx b/src/app/(website)/(public)/blog/[slug]/loading.tsx new file mode 100644 index 0000000..85a335b --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/loading.tsx @@ -0,0 +1,84 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ( +
+ {/* Content section */} +
+ {/* Left column */} +
+ {/* Basic information */} +
+ {/* blog post image */} + + + {/* blog post title */} + + + {/* blog post description */} + +
+ + {/* blog post content */} +
+ +
+ +
+ {/* */} +
+
+ + {/* Right column (sidebar) */} +
+
+ {/* author info */} +
+ +
+ +
+ + +
+
+
+ + {/* categories */} +
+ +
+ {[...Array(3)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+ + {/* table of contents */} +
+ +
+ {[...Array(5)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+
+
+
+ + {/* Footer section shows related posts */} +
+
+ + +
+ + +
+
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/page.tsx b/src/app/(website)/(public)/blog/[slug]/page.tsx new file mode 100644 index 0000000..b53e6f7 --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/page.tsx @@ -0,0 +1,193 @@ +import AllPostsButton from "@/components/blog/all-posts-button"; +import BlogCustomMdx from "@/components/blog/blog-custom-mdx"; +import BlogGrid from "@/components/blog/blog-grid"; +import { BlogToc } from "@/components/blog/blog-toc"; +import { UserAvatar } from "@/components/shared/user-avatar"; +import { siteConfig } from "@/config/site"; +import { urlForImage } from "@/lib/image"; +import { portableTextToMarkdown } from "@/lib/mdx"; +import { constructMetadata } from "@/lib/metadata"; +import { getTableOfContents } from "@/lib/toc"; +import { getLocaleDate } from "@/lib/utils"; +import type { + BlogPostMetadataQueryResult, + BlogPostQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { blogPostMetadataQuery, blogPostQuery } from "@/sanity/lib/queries"; +import { FileTextIcon } from "lucide-react"; +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const post = await sanityFetch({ + query: blogPostMetadataQuery, + params: { slug: params.slug }, + }); + if (!post) { + console.warn(`generateMetadata, post not found for slug: ${params.slug}`); + return; + } + + const imageProps = post?.image ? urlForImage(post?.image) : null; + + return constructMetadata({ + title: `${post.title}`, + description: post.excerpt, + canonicalUrl: `${siteConfig.url}/blog/${params.slug}`, + image: imageProps?.src, + }); +} + +interface PostPageProps { + params: { slug: string }; +} + +export default async function PostPage({ params }: PostPageProps) { + const slug = params.slug; + const queryParams = { slug }; + const post = await sanityFetch({ + query: blogPostQuery, + params: queryParams, + }); + if (!post) { + console.error("PostPage, post not found"); + return notFound(); + } + + // console.log("PostPage, post", post); + const imageProps = post?.image ? urlForImage(post?.image) : null; + const imageBlurDataURL = post?.image?.blurDataURL || null; + const publishDate = post.publishDate || post._createdAt; + const date = getLocaleDate(publishDate); + const markdownContent = portableTextToMarkdown(post.body); + // console.log("markdownContent", markdownContent); + + const toc = await getTableOfContents(markdownContent); + + return ( +
+ {/* Content section */} +
+ {/* Left column */} +
+ {/* Basic information */} +
+ {/* blog post image */} +
+ {imageProps && ( + {post.image?.alt + )} +
+ + {/* blog post title */} +

{post.title}

+ + {/* blog post description */} +

{post.excerpt}

+
+ + {/* blog post content */} +
+ {markdownContent && } +
+ +
+ +
+
+ + {/* Right column (sidebar) */} +
+
+ {/* author info */} +
+

Publisher

+
+
+ +
+
+ {post.author?.link ? ( + + {post.author.name} + + ) : ( + {post.author.name} + )} + +

{date}

+
+
+
+ + {/* categories */} +
+

Categories

+
    + {post.categories?.map((category) => ( +
  • + + {category.name} + +
  • + ))} +
+
+ + {/* table of contents */} +
+

Table of Contents

+
+ +
+
+
+
+
+ + {/* Footer section shows related posts */} + {post.relatedPosts && post.relatedPosts.length > 0 && ( +
+
+ +

+ More Posts +

+
+ + +
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/category/[slug]/page.tsx b/src/app/(website)/(public)/category/[slug]/page.tsx new file mode 100644 index 0000000..b394c78 --- /dev/null +++ b/src/app/(website)/(public)/category/[slug]/page.tsx @@ -0,0 +1,107 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { categoryQuery, sponsorItemListQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const category = await sanityFetch({ + query: categoryQuery, + params: { slug: params.slug }, + }); + if (!category) { + console.warn( + `generateMetadata, category not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", category.name); + ogImageUrl.searchParams.append("description", category.description || ""); + ogImageUrl.searchParams.append("type", "Category"); + + return constructMetadata({ + title: `${category.name}`, + description: category.description, + canonicalUrl: `${siteConfig.url}/category/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function CategoryPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CategoryPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category: params.slug, + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CategoryPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/category/layout.tsx b/src/app/(website)/(public)/category/layout.tsx new file mode 100644 index 0000000..4cf0b15 --- /dev/null +++ b/src/app/(website)/(public)/category/layout.tsx @@ -0,0 +1,28 @@ +import { CategoryFilter } from "@/components/category/category-filter"; +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function CategoryLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/category/loading.tsx b/src/app/(website)/(public)/category/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/category/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/category/page.tsx b/src/app/(website)/(public)/category/page.tsx new file mode 100644 index 0000000..a8015ce --- /dev/null +++ b/src/app/(website)/(public)/category/page.tsx @@ -0,0 +1,73 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; +export const metadata = constructMetadata({ + title: "Category", + description: "Explore by category", + canonicalUrl: `${siteConfig.url}/category`, +}); + +export default async function CategoryIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CategoryIndexPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CategoryIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/collection/[slug]/loading.tsx b/src/app/(website)/(public)/collection/[slug]/loading.tsx new file mode 100644 index 0000000..be29973 --- /dev/null +++ b/src/app/(website)/(public)/collection/[slug]/loading.tsx @@ -0,0 +1,24 @@ +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function Loading() { + return ( +
+
+
+ +
+
+ + + + +
+ ); +} diff --git a/src/app/(website)/(public)/collection/[slug]/page.tsx b/src/app/(website)/(public)/collection/[slug]/page.tsx new file mode 100644 index 0000000..1f1f8c5 --- /dev/null +++ b/src/app/(website)/(public)/collection/[slug]/page.tsx @@ -0,0 +1,136 @@ +import Container from "@/components/container"; +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import { HeaderSection } from "@/components/shared/header-section"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CollectionQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { collectionQuery, sponsorItemListQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const collection = await sanityFetch({ + query: collectionQuery, + params: { slug: params.slug }, + }); + if (!collection) { + console.warn( + `generateMetadata, collection not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", collection.name); + ogImageUrl.searchParams.append("description", collection.description || ""); + ogImageUrl.searchParams.append("type", "Collection"); + + return constructMetadata({ + title: `${collection.name}`, + description: collection.description, + canonicalUrl: `${siteConfig.url}/collection/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function CollectionPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const collection = await sanityFetch({ + query: collectionQuery, + params: { slug: params.slug }, + }); + if (!collection) { + console.warn( + `CollectionPage, collection not found for slug: ${params.slug}`, + ); + return notFound(); + } + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CollectionPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + collection: params.slug, + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CollectionPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+
+
+ +
+
+ + +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/collection/loading.tsx b/src/app/(website)/(public)/collection/loading.tsx new file mode 100644 index 0000000..b91c9fb --- /dev/null +++ b/src/app/(website)/(public)/collection/loading.tsx @@ -0,0 +1,24 @@ +import { CollectionGridSkeleton } from "@/components/collection/collection-grid"; +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function Loading() { + return ( +
+
+
+ +
+
+ + + + +
+ ); +} diff --git a/src/app/(website)/(public)/collection/page.tsx b/src/app/(website)/(public)/collection/page.tsx new file mode 100644 index 0000000..4d78779 --- /dev/null +++ b/src/app/(website)/(public)/collection/page.tsx @@ -0,0 +1,74 @@ +import CollectionGrid from "@/components/collection/collection-grid"; +import Container from "@/components/container"; +import EmptyGrid from "@/components/shared/empty-grid"; +import { HeaderSection } from "@/components/shared/header-section"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getCollections } from "@/data/collection"; +import { COLLECTIONS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Collection", + description: "Explore by collection", + canonicalUrl: `${siteConfig.url}/collection`, +}); + +/** + * https://www.uneed.best/alternatives + * https://bestdirectories.org/collections + */ +export default async function CollectionIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { collections, totalCount } = await getCollections({ + currentPage, + }); + const totalPages = Math.ceil(totalCount / COLLECTIONS_PER_PAGE); + console.log( + "CollectionIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+
+
+ +
+
+ + +
+ {/* when no items are found */} + {collections?.length === 0 && } + + {/* when items are found */} + {collections && collections.length > 0 && ( +
+ + +
+ +
+
+ )} +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/layout.tsx b/src/app/(website)/(public)/item/[slug]/layout.tsx new file mode 100644 index 0000000..9de9ddf --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/layout.tsx @@ -0,0 +1,17 @@ +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import type React from "react"; + +export default function ItemLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/loading.tsx b/src/app/(website)/(public)/item/[slug]/loading.tsx new file mode 100644 index 0000000..f5717a5 --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/loading.tsx @@ -0,0 +1,123 @@ +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ( +
+ {/* Header section */} +
+ {/* Left column */} +
+ {/* Basic information */} + + + {/* name and description */} +
+
+ + +
+
+ + {/* action buttons */} + {/*
+ +
*/} +
+ + {/* Right column */} +
+ {/* image */} +
+ +
+
+
+ + {/* Content section */} +
+ {/* Left column */} +
+ {/* Detailed content */} +
+ {/*

+ Introduction +

*/} + +
+ +
+ {/* */} +
+
+ + {/* Right column */} +
+
+
+ {/* information */} +
+ {/*

+ Information +

*/} +
    + {[...Array(2)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: +
  • + + +
  • + ))} +
+
+ + {/* categories */} +
+ {/*

+ Categories +

*/} +
+ {[...Array(3)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+ + {/* tags */} +
+ {/*

+ Tags +

*/} +
+ {[...Array(5)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+
+
+
+
+ + {/* Footer section shows related items */} +
+
+ + + {/*

+ More Related +

*/} +
+ +
+ +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/page.tsx b/src/app/(website)/(public)/item/[slug]/page.tsx new file mode 100644 index 0000000..078677e --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/page.tsx @@ -0,0 +1,318 @@ +import ItemBreadCrumb from "@/components/item/item-bread-crumb"; +import SponsorItemCard from "@/components/item/item-card-sponsor"; +import ItemCustomMdx from "@/components/item/item-custom-mdx"; +import ItemGrid from "@/components/item/item-grid"; +import BackButton from "@/components/shared/back-button"; +import { UserAvatar } from "@/components/shared/user-avatar"; +import { Button } from "@/components/ui/button"; +import { siteConfig } from "@/config/site"; +import { urlForIcon, urlForImage } from "@/lib/image"; +import { constructMetadata } from "@/lib/metadata"; +import { cn, getItemTargetLinkInWebsite, getLocaleDate } from "@/lib/utils"; +import type { + ItemInfoBySlugQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + itemFullInfoBySlugQuery, + itemInfoBySlugQuery, + sponsorItemListQuery, +} from "@/sanity/lib/queries"; +import type { ItemFullInfo } from "@/types"; +import { GlobeIcon, HashIcon, LayoutGridIcon } from "lucide-react"; +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const item = await sanityFetch({ + query: itemInfoBySlugQuery, + params: { slug: params.slug }, + }); + if (!item) { + console.warn(`generateMetadata, item not found for slug: ${params.slug}`); + return; + } + + const imageProps = item?.image ? urlForImage(item?.image) : null; + return constructMetadata({ + title: `${item.name}`, + description: item.description, + canonicalUrl: `${siteConfig.url}/item/${params.slug}`, + image: imageProps?.src, + }); +} + +interface ItemPageProps { + params: { slug: string }; +} + +export default async function ItemPage({ params }: ItemPageProps) { + // if you do not support sponsor item, you can use this code + // const item = await sanityFetch({ + // query: itemFullInfoBySlugQuery, + // params: { slug: params.slug }, + // }); + + // if you support sponsor item, you can use this code + const [item, sponsorItems] = await Promise.all([ + sanityFetch({ + query: itemFullInfoBySlugQuery, + params: { slug: params.slug }, + }), + sanityFetch({ + query: sponsorItemListQuery, + }), + ]); + + if (!item) { + console.error("ItemPage, item not found"); + return notFound(); + } + + const imageProps = item?.image ? urlForImage(item?.image) : null; + const imageBlurDataURL = item?.image?.blurDataURL || null; + const iconProps = item?.icon ? urlForIcon(item.icon) : null; + const iconBlurDataURL = item?.icon?.blurDataURL || null; + const publishDate = item.publishDate || item._createdAt; + const date = getLocaleDate(publishDate); + const itemLink = getItemTargetLinkInWebsite(item); + const sponsorItem = sponsorItems?.length + ? sponsorItems[Math.floor(Math.random() * sponsorItems.length)] + : null; + + return ( +
+ {/* Header section */} +
+ {/* Left column */} +
+ {/* Basic information */} + + + {/* icon + name + description */} +
+
+
+ {iconProps && ( + {item.icon.alt + )} +

+ {item.name} +

+
+

+ {item.description} +

+
+
+ + {/* action buttons */} +
+ +
+
+ + {/* Right column */} +
+ {/* image */} +
+ + {imageProps && ( + {item.image?.alt + )} +
+ + Visit Website + +
+ +
+
+
+ + {/* Content section */} +
+ {/* Left column */} +
+ {/* Detailed content */} +
+

Introduction

+ +
+ +
+ +
+
+ + {/* Right column */} +
+
+
+ {/* information */} +
+

Information

+
    + {item.submitter && ( +
  • + Publisher +
    + + + {(item.submitter.link && ( + + {item.submitter.name} + + )) || {item.submitter.name}} +
    +
  • + )} + +
  • + Website + + {new URL(item.link).hostname} + +
  • + +
  • + + Published date + + {date} +
  • +
+
+ + {/* categories */} +
+

Categories

+
    + {item.categories?.map((category) => ( +
  • + + {category.name} + +
  • + ))} +
+
+ + {/* tags */} +
+

Tags

+
    + {item.tags?.map((tag) => ( +
  • + + + {tag.name} + +
  • + ))} +
+
+ + {/* sponsor */} + {sponsorItem && } +
+
+
+
+ + {/* Footer section shows related items */} + {item.related && item.related.length > 0 && ( +
+
+ +

+ More Products +

+
+ +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/layout.tsx b/src/app/(website)/(public)/layout.tsx new file mode 100644 index 0000000..fec5c73 --- /dev/null +++ b/src/app/(website)/(public)/layout.tsx @@ -0,0 +1,24 @@ +import { BannerAd } from "@/components/layout/banner-ad"; +import { Footer } from "@/components/layout/footer"; +import { Navbar } from "@/components/layout/navbar"; +import { marketingConfig } from "@/config/marketing"; + +interface MarketingLayoutProps { + children: React.ReactNode; +} + +export default async function MarketingLayout({ + children, +}: MarketingLayoutProps) { + return ( +
+ {/*
+ + +
*/} + +
{children}
+
+
+ ); +} diff --git a/src/app/(website)/(public)/pricing/page.tsx b/src/app/(website)/(public)/pricing/page.tsx new file mode 100644 index 0000000..8a5b781 --- /dev/null +++ b/src/app/(website)/(public)/pricing/page.tsx @@ -0,0 +1,57 @@ +import Container from "@/components/container"; +import { PricingPlans } from "@/components/dashboard/pricing-plans"; +import { PricingFaq } from "@/components/pricing/pricing-faq"; +import { HeaderSection } from "@/components/shared/header-section"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Pricing", + description: "Choose a pricing plan for submitting your product", + canonicalUrl: `${siteConfig.url}/pricing`, +}); + +export default async function PricingPage() { + return ( + +
+
+ + +
+ +
+ + {/* add tips only for Mkdirs demo directory website */} + {siteConfig.name === "Directory" && ( +

+ This is in TEST environment. +
+ You can use Stripe test card to simulate the paid submission + process. +
+ Stripe test card number: 4242 4242 4242 4242 +

+ )} +
+ +
+ + +
+ +
+
+
+
+ ); +} diff --git a/src/app/(website)/(public)/search/layout.tsx b/src/app/(website)/(public)/search/layout.tsx new file mode 100644 index 0000000..4e9ef2d --- /dev/null +++ b/src/app/(website)/(public)/search/layout.tsx @@ -0,0 +1,28 @@ +import Container from "@/components/container"; +import { SearchFilter } from "@/components/search/search-filter"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function SearchLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/search/loading.tsx b/src/app/(website)/(public)/search/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/search/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/search/page.tsx b/src/app/(website)/(public)/search/page.tsx new file mode 100644 index 0000000..8ce0c67 --- /dev/null +++ b/src/app/(website)/(public)/search/page.tsx @@ -0,0 +1,83 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Search", + description: "Search for your needs", + canonicalUrl: `${siteConfig.url}/search`, +}); + +export default async function SearchPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("SearchPage, searchParams", searchParams); + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("SearchPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("SearchPage, totalCount", totalCount, ", totalPages", totalPages); + // console.log('SearchPage, items', items); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/[slug]/page.tsx b/src/app/(website)/(public)/tag/[slug]/page.tsx new file mode 100644 index 0000000..43f8cbc --- /dev/null +++ b/src/app/(website)/(public)/tag/[slug]/page.tsx @@ -0,0 +1,99 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + SponsorItemListQueryResult, + TagQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery, tagQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const tag = await sanityFetch({ + query: tagQuery, + params: { slug: params.slug }, + }); + if (!tag) { + console.warn(`generateMetadata, tag not found for slug: ${params.slug}`); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", tag.name); + ogImageUrl.searchParams.append("description", tag.description || ""); + ogImageUrl.searchParams.append("type", "Tag"); + + return constructMetadata({ + title: `${tag.name}`, + description: tag.description, + canonicalUrl: `${siteConfig.url}/tag/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function TagPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("TagPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + tag: params.slug, + sortKey, + reverse, + currentPage, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("TagPage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/layout.tsx b/src/app/(website)/(public)/tag/layout.tsx new file mode 100644 index 0000000..80e1527 --- /dev/null +++ b/src/app/(website)/(public)/tag/layout.tsx @@ -0,0 +1,26 @@ +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; +import { TagFilter } from "@/components/tag/tag-filter"; + +export default function TagLayout({ children }: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/loading.tsx b/src/app/(website)/(public)/tag/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/tag/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/tag/page.tsx b/src/app/(website)/(public)/tag/page.tsx new file mode 100644 index 0000000..3c31d0a --- /dev/null +++ b/src/app/(website)/(public)/tag/page.tsx @@ -0,0 +1,74 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Tag", + description: "Explore by tags", + canonicalUrl: `${siteConfig.url}/tag`, +}); + +export default async function TagIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("TagIndexPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "TagIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/auth/error/page.tsx b/src/app/(website)/auth/error/page.tsx new file mode 100644 index 0000000..314cf9d --- /dev/null +++ b/src/app/(website)/auth/error/page.tsx @@ -0,0 +1,15 @@ +import { ErrorCard } from "@/components/auth/error-card"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Auth Error", + description: "Auth Error", + canonicalUrl: `${siteConfig.url}/auth/error`, +}); + +const AuthErrorPage = () => { + return ; +}; + +export default AuthErrorPage; diff --git a/src/app/(website)/auth/layout.tsx b/src/app/(website)/auth/layout.tsx new file mode 100644 index 0000000..7db59ab --- /dev/null +++ b/src/app/(website)/auth/layout.tsx @@ -0,0 +1,37 @@ +import BackButtonSmall from "@/components/shared/back-button-small"; +import Image from "next/image"; + +/** + * auth layout is different from other public layouts, + * so auth directory is not put in (public) directory. + * + * https://ui.shadcn.com/blocks#authentication-04 + */ +export default function AuthLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+ {/* auth form */} +
+ +
{children}
+
+ + {/* brand image */} +
+ Image +
+
+
+ ); +} diff --git a/src/app/(website)/auth/loading.tsx b/src/app/(website)/auth/loading.tsx new file mode 100644 index 0000000..d730bb7 --- /dev/null +++ b/src/app/(website)/auth/loading.tsx @@ -0,0 +1,5 @@ +import { Loader2Icon } from "lucide-react"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/auth/login/page.tsx b/src/app/(website)/auth/login/page.tsx new file mode 100644 index 0000000..183c561 --- /dev/null +++ b/src/app/(website)/auth/login/page.tsx @@ -0,0 +1,15 @@ +import { LoginForm } from "@/components/auth/login-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Login", + description: "Login to your account", + canonicalUrl: `${siteConfig.url}/auth/login`, +}); + +const LoginPage = () => { + return ; +}; + +export default LoginPage; diff --git a/src/app/(website)/auth/new-password/page.tsx b/src/app/(website)/auth/new-password/page.tsx new file mode 100644 index 0000000..20e1744 --- /dev/null +++ b/src/app/(website)/auth/new-password/page.tsx @@ -0,0 +1,15 @@ +import { NewPasswordForm } from "@/components/auth/new-password-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "New Password", + description: "Set a new password", + canonicalUrl: `${siteConfig.url}/auth/new-password`, +}); + +const NewPasswordPage = () => { + return ; +}; + +export default NewPasswordPage; diff --git a/src/app/(website)/auth/new-verification/page.tsx b/src/app/(website)/auth/new-verification/page.tsx new file mode 100644 index 0000000..92cb654 --- /dev/null +++ b/src/app/(website)/auth/new-verification/page.tsx @@ -0,0 +1,15 @@ +import { NewVerificationForm } from "@/components/auth/new-verification-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "New Verification", + description: "New Verification", + canonicalUrl: `${siteConfig.url}/auth/new-verification`, +}); + +const NewVerificationPage = () => { + return ; +}; + +export default NewVerificationPage; diff --git a/src/app/(website)/auth/register/page.tsx b/src/app/(website)/auth/register/page.tsx new file mode 100644 index 0000000..6a5388c --- /dev/null +++ b/src/app/(website)/auth/register/page.tsx @@ -0,0 +1,15 @@ +import { RegisterForm } from "@/components/auth/register-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Register", + description: "Create an account to get started", + canonicalUrl: `${siteConfig.url}/auth/register`, +}); + +const RegisterPage = () => { + return ; +}; + +export default RegisterPage; diff --git a/src/app/(website)/auth/reset/page.tsx b/src/app/(website)/auth/reset/page.tsx new file mode 100644 index 0000000..43b12a8 --- /dev/null +++ b/src/app/(website)/auth/reset/page.tsx @@ -0,0 +1,15 @@ +import { ResetForm } from "@/components/auth/reset-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Reset Password", + description: "Reset your password", + canonicalUrl: `${siteConfig.url}/auth/reset`, +}); + +const ResetPage = () => { + return ; +}; + +export default ResetPage; diff --git a/src/app/(website)/error.tsx b/src/app/(website)/error.tsx new file mode 100644 index 0000000..ae24007 --- /dev/null +++ b/src/app/(website)/error.tsx @@ -0,0 +1,54 @@ +"use client"; + +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import { Loader2Icon } from "lucide-react"; +import { useRouter } from "next/navigation"; +import { useTransition } from "react"; + +/** + * Learned how to recover from a server component error in Next.js from @asidorenko_ + * + * https://x.com/asidorenko_/status/1841547623712407994 + */ +export default function ErrorPage({ reset }: { reset: () => void }) { + const router = useRouter(); + const [isPending, startTransition] = useTransition(); + + return ( +
+ + +

Oops! Something went wrong!

+ +
+ + + +
+
+ ); +} diff --git a/src/app/(website)/layout.tsx b/src/app/(website)/layout.tsx new file mode 100644 index 0000000..4a367da --- /dev/null +++ b/src/app/(website)/layout.tsx @@ -0,0 +1,64 @@ +import "@/styles/globals.css"; + +import { + fontBricolageGrotesque as fontBricolage, + fontSourceSans, + fontSourceSerif, + fontWorkSans, +} from "@/assets/fonts"; +import { auth } from "@/auth"; +import { Analytics } from "@/components/analytics/analytics"; +import { TailwindIndicator } from "@/components/tailwind-indicator"; +import { Toaster } from "@/components/ui/sonner"; +import { constructMetadata } from "@/lib/metadata"; +import { cn } from "@/lib/utils"; +import { SessionProvider } from "next-auth/react"; +import { ThemeProvider } from "next-themes"; + +export const metadata = constructMetadata(); + +interface RootLayoutProps { + children: React.ReactNode; +} + +export default async function RootLayout({ children }: RootLayoutProps) { + // https://youtu.be/1MTyCvS05V4?t=21464 + const session = await auth(); + + return ( + + + + + + {children} + + {/* https://sonner.emilkowal.ski/toaster */} + + + + + + + + + + ); +} diff --git a/src/app/(website)/loading.tsx b/src/app/(website)/loading.tsx new file mode 100644 index 0000000..d730bb7 --- /dev/null +++ b/src/app/(website)/loading.tsx @@ -0,0 +1,5 @@ +import { Loader2Icon } from "lucide-react"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/not-found.tsx b/src/app/(website)/not-found.tsx new file mode 100644 index 0000000..8e4e8b1 --- /dev/null +++ b/src/app/(website)/not-found.tsx @@ -0,0 +1,21 @@ +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; + +export default function NotFound() { + return ( +
+ + +

404

+ +

+ Sorry, the page you are looking for does not exist. +

+ + +
+ ); +} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..5a28f48 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,28 @@ +import { handlers } from "@/auth"; +import { NextRequest } from "next/server"; + +/** + * https://authjs.dev/getting-started/installation?framework=Next.js + */ +export const { GET, POST } = handlers; + +/** + * in case you want to debug the auth process + */ +// const handler = async (request: NextRequest) => { +// console.log('Handling auth request:', request.url); +// // console.log('Request cookies:', request.headers.get('cookie')); + +// const result = await handlers.GET(request); + +// // console.log('Auth response:', result); +// // const setCookieHeader = result.headers?.get('Set-Cookie'); +// // if (setCookieHeader) { +// // console.log('Set-Cookie header:', setCookieHeader); +// // } else { +// // console.log('No Set-Cookie header found'); +// // } + +// return result; +// }; +// export { handler as GET, handler as POST }; diff --git a/src/app/api/disable-draft/route.ts b/src/app/api/disable-draft/route.ts new file mode 100644 index 0000000..1a26cc0 --- /dev/null +++ b/src/app/api/disable-draft/route.ts @@ -0,0 +1,14 @@ +import { draftMode } from "next/headers"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +/** + * Disable draft mode + * + * https://www.sanity.io/docs/preview-url-secret#nextjs-app-router + */ +export async function GET(request: NextRequest) { + draftMode().disable(); + const url = new URL(request.nextUrl); + return NextResponse.redirect(new URL("/", url.origin)); +} diff --git a/src/app/api/draft/route.tsx b/src/app/api/draft/route.tsx new file mode 100644 index 0000000..4b58466 --- /dev/null +++ b/src/app/api/draft/route.tsx @@ -0,0 +1,35 @@ +import { sanityClient } from "@/sanity/lib/client"; +import { token } from "@/sanity/lib/token"; +import { validatePreviewUrl } from "@sanity/preview-url-secret"; +import { draftMode } from "next/headers"; +import { redirect } from "next/navigation"; + +/** + * 1. Draft Mode + * https://www.sanity.io/docs/draft-mode + * During runtime, switch between an optimized production mode and + * an authorized mode to fetch draft content and render edit overlays. + * + * 2. Presentation Tool + * https://www.sanity.io/docs/configuring-the-presentation-tool + * This file is used to allow Presentation to set the app in Draft Mode, which will load Visual Editing + * and query draft content and preview the content as it will appear once everything is published + * + * 3. Preview URL Secret + * https://www.sanity.io/docs/preview-url-secret#nextjs-app-router + */ +const clientWithToken = sanityClient.withConfig({ token }); + +export async function GET(request: Request) { + const { isValid, redirectTo = "/" } = await validatePreviewUrl( + clientWithToken, + request.url, + ); + if (!isValid) { + return new Response("invalid secret", { status: 401 }); + } + + draftMode().enable(); + + redirect(redirectTo); +} diff --git a/src/app/api/og/route.tsx b/src/app/api/og/route.tsx new file mode 100644 index 0000000..77626b4 --- /dev/null +++ b/src/app/api/og/route.tsx @@ -0,0 +1,75 @@ +import { ogImageSchema } from "@/lib/schemas"; +import { ImageResponse } from "next/og"; + +// export const runtime = "edge"; + +/** + * og image route + * + * 1. official doc + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image + * + * 2. related articles + * https://dev.to/paulund/auto-generate-open-graph-images-in-nextjs-41cm + * https://stronglytyped.uk/articles/open-graph-images-nextjs-app-router + * + * 3. test url + * http://localhost:3000/api/og?title=Lifestyle&description=blog+category+of+lifestyle&type=Blog+Category + */ +export function GET(req: Request) { + try { + const url = new URL(req.url); + const parsedValues = ogImageSchema.parse( + Object.fromEntries(url.searchParams), + ); + + const { mode, title, description, type } = parsedValues; + const paint = mode === "dark" ? "#fff" : "#000"; + // console.log('og image', { title, description, type }); + + return new ImageResponse( +
+
+ {type ? ( +
+ {type} +
+ ) : null} +
+ {title} +
+ {description ? ( +
+ {description} +
+ ) : null} +
+
, + { + width: 1200, + height: 630, + }, + ); + } catch (error) { + error instanceof Error + ? console.log(`${error.message}`) + : console.log(error); + return new Response("Failed to generate the image", { + status: 500, + }); + } +} diff --git a/src/app/api/send-email/route.ts b/src/app/api/send-email/route.ts new file mode 100644 index 0000000..f8e329a --- /dev/null +++ b/src/app/api/send-email/route.ts @@ -0,0 +1,74 @@ +import { getItemInfoById } from '@/data/item'; +import { sendApprovalEmail, sendRejectionEmail } from '@/lib/mail'; +import { PricePlans } from '@/lib/submission'; +import { getDashboardLink, getItemLinkInWebsite } from '@/lib/utils'; +import { headers } from 'next/headers'; +import { NextResponse } from 'next/server'; + +function isValidOrigin(requestHeaders: Headers): boolean { + const origin = requestHeaders.get('origin'); + const referer = requestHeaders.get('referer'); + console.log('isValidOrigin, origin', origin); + console.log('isValidOrigin, referer', referer); + + const allowedDomains = [ + process.env.NEXT_PUBLIC_APP_URL, + 'http://localhost:3000' + ].filter(Boolean); + + return allowedDomains.some(domain => + origin?.includes(domain as string) || + referer?.includes(domain as string) + ); +} + +export async function POST(request: Request) { + try { + // check if the request is from a valid origin + const headersList = headers(); + if (!isValidOrigin(headersList)) { + return NextResponse.json( + { message: 'Unauthorized request origin' }, + { status: 403 } + ); + } + + const { itemId } = await request.json(); + const item = await getItemInfoById(itemId); + if (!item || !item.submitter) { + return NextResponse.json( + { message: 'Item not found' }, + { status: 404 } + ); + } + + console.log(`SendEmail, itemName: ${item.name}, + userName: ${item.submitter.name}, + userEmail: ${item.submitter.email}`); + + // only send email for items in free plan and is approved or rejected + if (item.pricePlan === PricePlans.FREE) { + if (item.freePlanStatus === "approved") { + const itemLink = getItemLinkInWebsite(item.slug.current); + await sendApprovalEmail(item.submitter.name, item.submitter.email, itemLink); + } else if (item.freePlanStatus === "rejected") { + const dashboardLink = getDashboardLink(); + await sendRejectionEmail(item.submitter.name, item.submitter.email, dashboardLink); + } else { + console.warn(`SendEmail, item ${item.name} is not approved or rejected`); + return NextResponse.json({ message: 'No email sent' }, { status: 200 }); + } + } else { + console.warn(`SendEmail, item ${item.name} is not free plan`); + return NextResponse.json({ message: 'No email sent' }, { status: 200 }); + } + + return NextResponse.json({ message: 'Email sent successfully' }, { status: 200 }); + } catch (error) { + console.error('Error sending email:', error); + return NextResponse.json( + { message: 'Failed to send email' }, + { status: 500 } + ); + } +} diff --git a/src/app/api/upload-image/route.ts b/src/app/api/upload-image/route.ts new file mode 100644 index 0000000..3c0f7e1 --- /dev/null +++ b/src/app/api/upload-image/route.ts @@ -0,0 +1,23 @@ +import { sanityClient } from "@/sanity/lib/client"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + const file = formData.get("file") as File; + + if (!file) { + return NextResponse.json({ error: "No file uploaded" }, { status: 400 }); + } + + const asset = await sanityClient.assets.upload("image", file); + return NextResponse.json({ asset }); + } catch (error) { + console.error("Error uploading image:", error); + return NextResponse.json( + { error: "Failed to upload image" }, + { status: 500 }, + ); + } +} diff --git a/src/app/api/webhook/route.ts b/src/app/api/webhook/route.ts new file mode 100644 index 0000000..ec12c77 --- /dev/null +++ b/src/app/api/webhook/route.ts @@ -0,0 +1,133 @@ +import { getOrderByUserIdAndItemId } from "@/data/order"; +import { getUserById } from "@/data/user"; +import { sendMessageToDiscord } from "@/lib/discord"; +import { sendPaymentSuccessEmail } from "@/lib/mail"; +import { stripe } from "@/lib/stripe"; +import { PricePlans, ProPlanStatus, SponsorPlanStatus } from "@/lib/submission"; +import { getItemLinkInWebsite } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { headers } from "next/headers"; +import type Stripe from "stripe"; + +/** + * Stripe webhook handler + * This file handles webhook events from Stripe. It verifies the signature + * of each request to ensure that the request is coming from Stripe. It also + * handles the checkout.session.completed event type by creating a new purchase record in the database. + * + * https://github.com/mickasmt/next-saas-stripe-starter/blob/main/app/api/webhooks/stripe/route.ts + * https://github.com/javayhu/lms-studio-antonio/blob/main/app/api/webhook/route.ts + */ +export async function POST(req: Request) { + const body = await req.text(); + const signature = headers().get("Stripe-Signature") as string; + + let event: Stripe.Event; + + try { + event = stripe.webhooks.constructEvent( + body, + signature, + process.env.STRIPE_WEBHOOK_SECRET, + ); + } catch (error) { + console.error("Stripe webhook error:", error); + return new Response(`Webhook Error: ${error.message}`, { status: 400 }); + } + + // console.log('stripe webhook event:', event); + console.log("stripe webhook event.type:", event.type); + + if (event.type === "checkout.session.completed") { + console.log("checkout.session.completed event"); + const session = event.data.object as Stripe.Checkout.Session; + const customerId = session.customer as string; + const amount = session.amount_total ? session.amount_total / 100 : 0; + + const userId = session?.metadata?.userId; + const itemId = session?.metadata?.itemId; + const priceId = session?.metadata?.priceId; + const pricePlan = session?.metadata?.pricePlan; + // console.log('session:', session); + console.log( + `checkout.session.completed, userId: ${userId}, itemId: ${itemId}, priceId: ${priceId}, pricePlan: ${pricePlan}`, + ); + + // check if order already exists, if so, return + const order = await getOrderByUserIdAndItemId(userId, itemId); + if (order) { + console.log( + `checkout.session.completed, order already exists: ${order._id}`, + ); + return new Response(null, { status: 200 }); + } + + const user = await getUserById(session?.metadata?.userId); + // console.log('user:', user); + + if (user) { + const result = await sanityClient.create({ + _type: "order", + user: { + _type: "reference", + _ref: user._id, + }, + item: { + _type: "reference", + _ref: itemId, + }, + status: "success", + date: new Date().toISOString(), + }); + + if (!result) { + console.log("checkout.session.completed, create order failed"); + return new Response(null, { status: 500 }); + } + + // update order & status of item + const res = await sanityClient + .patch(itemId) + .set({ + paid: true, + featured: true, + pricePlan: pricePlan, // pro or sponsor + sponsor: pricePlan === PricePlans.SPONSOR, + proPlanStatus: + pricePlan === PricePlans.PRO + ? ProPlanStatus.SUCCESS + : ProPlanStatus.SUBMITTING, + sponsorPlanStatus: + pricePlan === PricePlans.SPONSOR + ? SponsorPlanStatus.SUCCESS + : SponsorPlanStatus.SUBMITTING, + order: { + _type: "reference", + _ref: result._id, + }, + }) + .commit(); + + if (!res) { + console.log("checkout.session.completed, update item failed"); + return new Response(null, { status: 500 }); + } + + // send thank you email to user + console.log(`checkout.session.completed, item: ${JSON.stringify(res)}`); + const itemLink = getItemLinkInWebsite(res.slug.current); + console.log(`checkout.session.completed, userName: ${user.name}, + userEmail: ${user.email}, + itemLink: ${itemLink}`); + await sendPaymentSuccessEmail(user.name, user.email, itemLink); + + // send message to discord + await sendMessageToDiscord(session.id, customerId, user.name, amount); + } else { + console.log("checkout.session.completed, user not found"); + return new Response(null, { status: 404 }); + } + } + + return new Response(null, { status: 200 }); +} diff --git a/src/app/robots.ts b/src/app/robots.ts new file mode 100644 index 0000000..43b9bc8 --- /dev/null +++ b/src/app/robots.ts @@ -0,0 +1,15 @@ +import { siteConfig } from "@/config/site"; +import type { MetadataRoute } from "next"; + +/** + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots + */ +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: `${siteConfig.url}/sitemap.xml`, + }; +} diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts new file mode 100644 index 0000000..ee1a8c2 --- /dev/null +++ b/src/app/sitemap.ts @@ -0,0 +1,286 @@ +import { COLLECTIONS_PER_PAGE, ITEMS_PER_PAGE } from "@/lib/constants"; +import type { + BlogCategoryListQueryForSitemapResult, + BlogListQueryForSitemapResult, + CategoryListQueryForSitemapResult, + CollectionListQueryForSitemapResult, + ItemListQueryForSitemapResult, + PageListQueryForSitemapResult, + TagListQueryForSitemapResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + blogCategoryListQueryForSitemap, + blogListQueryForSitemap, + categoryListQueryForSitemap, + collectionListQueryForSitemap, + itemListQueryForSitemap, + pageListQueryForSitemap, + tagListQueryForSitemap, +} from "@/sanity/lib/queries"; +import collection from "@/sanity/schemas/documents/directory/collection"; +import type { MetadataRoute } from "next"; + +const site_url = process.env.NEXT_PUBLIC_APP_URL; + +/** + * Google's limit is 50,000 URLs per sitemap + * + * https://nextjs.org/docs/app/api-reference/functions/generate-sitemaps + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap + */ +export default async function sitemap(): Promise { + console.log("sitemap start"); + + const sitemapList: MetadataRoute.Sitemap = []; // final result + + const sitemapRoutes: MetadataRoute.Sitemap = [ + { + url: "", // home + lastModified: new Date(), + }, + { + url: "search", + lastModified: new Date(), + }, + { + url: "category", + lastModified: new Date(), + }, + { + url: "tag", + lastModified: new Date(), + }, + { + url: "collection", + lastModified: new Date(), + }, + { + url: "blog", + lastModified: new Date(), + }, + { + url: "pricing", + lastModified: new Date(), + }, + { + url: "auth/login", + lastModified: new Date(), + }, + { + url: "auth/register", + lastModified: new Date(), + }, + { + url: "about", + lastModified: new Date(), + }, + { + url: "privacy", + lastModified: new Date(), + }, + { + url: "terms", + lastModified: new Date(), + }, + ]; + + for (const route of sitemapRoutes) { + // console.log(`sitemap, url:${site_url}/${route.url}`); + sitemapList.push({ + url: `${site_url}/${route.url}`, + lastModified: new Date(route.lastModified).toISOString(), + }); + } + + const [ + itemListQueryResult, + categoryListQueryResult, + tagListQueryResult, + collectionListQueryResult, + blogListQueryResult, + blogCategoryListQueryResult, + pageListQueryResult, + ] = await Promise.all([ + sanityFetch({ + query: itemListQueryForSitemap, + }), + sanityFetch({ + query: categoryListQueryForSitemap, + }), + sanityFetch({ + query: tagListQueryForSitemap, + }), + sanityFetch({ + query: collectionListQueryForSitemap, + }), + sanityFetch({ + query: blogListQueryForSitemap, + }), + sanityFetch({ + query: blogCategoryListQueryForSitemap, + }), + sanityFetch({ + query: pageListQueryForSitemap, + }), + ]); + + console.log("sitemap, itemListQueryResult size:", itemListQueryResult.length); + console.log( + "sitemap, categoryListQueryResult size:", + categoryListQueryResult.length, + ); + console.log("sitemap, tagListQueryResult size:", tagListQueryResult.length); + console.log("sitemap, blogListQueryResult size:", blogListQueryResult.length); + console.log( + "sitemap, blogCategoryListQueryResult size:", + blogCategoryListQueryResult.length, + ); + console.log("sitemap, pageListQueryResult size:", pageListQueryResult.length); + + for (const item of itemListQueryResult) { + if (item.slug) { + const routeUrl = `/item/${item.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(item._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, item slug invalid, id:${item._id}`); + } + } + + const pageCount = Math.ceil(itemListQueryResult.length / ITEMS_PER_PAGE); + console.log(`sitemap, item count:${itemListQueryResult.length}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date().toISOString(), + }); + } + + for (const category of categoryListQueryResult) { + if (category.slug) { + const routeUrl = `/category/${category.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(category._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(category.count / ITEMS_PER_PAGE); + console.log(`sitemap, category:${category.slug}, count:${category.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/category/${category.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(category._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, category slug invalid, id:${category._id}`); + } + } + + for (const tag of tagListQueryResult) { + if (tag.slug) { + const routeUrl = `/tag/${tag.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(tag._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(tag.count / ITEMS_PER_PAGE); + console.log(`sitemap, tag:${tag.slug}, count:${tag.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/tag/${tag.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(tag._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, tag slug invalid, id:${tag._id}`); + } + } + + for (const collection of collectionListQueryResult) { + if (collection.slug) { + const routeUrl = `/collection/${collection.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(collection._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(collection.count / COLLECTIONS_PER_PAGE); + console.log(`sitemap, collection:${collection.slug}, count:${collection.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/collection/${collection.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(collection._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, collection slug invalid, id:${collection._id}`); + } + } + + for (const blog of blogListQueryResult) { + if (blog.slug) { + const routeUrl = `/blog/${blog.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blog._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, blog post slug invalid, id:${blog._id}`); + } + } + + for (const blogCategory of blogCategoryListQueryResult) { + if (blogCategory.slug) { + const routeUrl = `/blog/category/${blogCategory.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blogCategory._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(blogCategory.count / ITEMS_PER_PAGE); + console.log(`sitemap, blog category:${blogCategory.slug}, count:${blogCategory.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/blog/category/${blogCategory.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blogCategory._updatedAt).toISOString(), + }); + } + } else { + console.warn( + `sitemap, blog category slug invalid, id:${blogCategory._id}`, + ); + } + } + + for (const page of pageListQueryResult) { + if (page.slug) { + const routeUrl = `/page/${page.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(page._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, page slug invalid, id:${page._id}`); + } + } + + console.log("sitemap end, size:", sitemapList.length); + return sitemapList; +} diff --git a/src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 b/src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 new file mode 100644 index 0000000..8981203 Binary files /dev/null and b/src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 differ diff --git a/src/assets/fonts/index.ts b/src/assets/fonts/index.ts new file mode 100644 index 0000000..2e222ab --- /dev/null +++ b/src/assets/fonts/index.ts @@ -0,0 +1,45 @@ +import localFont from "next/font/local"; + +/** + * use local font + * + * 1. Get font file from https://gwfh.mranftl.com/fonts + * 2. Add font file to the assets/fonts folder + * 3. Add font variable to the font object + */ +export const fontSourceSerif = localFont({ + src: "./source-serif-4-v8-latin-regular.woff2", + variable: "--font-source-serif", +}); + +export const fontSourceSans = localFont({ + src: "./source-sans-3-v15-latin-regular.woff2", + variable: "--font-source-sans", +}); + +// https://gwfh.mranftl.com/fonts/work-sans?subsets=latin +export const fontWorkSans = localFont({ + src: "./work-sans-v19-latin-regular.woff2", + variable: "--font-work-sans", +}); + +// https://gwfh.mranftl.com/fonts/bricolage-grotesque?subsets=latin +export const fontBricolageGrotesque = localFont({ + src: "./bricolage-grotesque-v7-latin-regular.woff2", + variable: "--font-bricolage", +}); + +/** + * use google font + * + * 1. You can browser fonts at Google Fonts + * https://fonts.google.com + * + * 2. CSS and font files are downloaded at build time and self-hosted with the rest of your static assets. + * https://nextjs.org/docs/app/building-your-application/optimizing/fonts#google-fonts + */ +// export const fontSourceSerif4 = Source_Serif_4({ +// subsets: ['latin'], +// display: 'swap', +// variable: "--font-source-serif", +// }) diff --git a/src/assets/fonts/source-sans-3-v15-latin-regular.woff2 b/src/assets/fonts/source-sans-3-v15-latin-regular.woff2 new file mode 100644 index 0000000..c77d9e3 Binary files /dev/null and b/src/assets/fonts/source-sans-3-v15-latin-regular.woff2 differ diff --git a/src/assets/fonts/source-serif-4-v8-latin-regular.woff2 b/src/assets/fonts/source-serif-4-v8-latin-regular.woff2 new file mode 100644 index 0000000..bab3088 Binary files /dev/null and b/src/assets/fonts/source-serif-4-v8-latin-regular.woff2 differ diff --git a/src/assets/fonts/work-sans-v19-latin-regular.woff2 b/src/assets/fonts/work-sans-v19-latin-regular.woff2 new file mode 100644 index 0000000..a701d03 Binary files /dev/null and b/src/assets/fonts/work-sans-v19-latin-regular.woff2 differ diff --git a/src/auth.config.ts b/src/auth.config.ts new file mode 100644 index 0000000..e0eb9ee --- /dev/null +++ b/src/auth.config.ts @@ -0,0 +1,76 @@ +import { getUserByEmail } from "@/data/user"; +import { SHOW_QUERY_LOGS } from "@/lib/constants"; +import { LoginSchema } from "@/lib/schemas"; +import { AuthError, type NextAuthConfig } from "next-auth"; +import Credentials from "next-auth/providers/credentials"; +import GitHub from "next-auth/providers/github"; +import Google from "next-auth/providers/google"; +import { verifyPassword } from "./lib/password"; + +/** + * https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.config.ts + * authConfig is used in middleware.ts and support edge runtime + */ +export default { + // https://authjs.dev/getting-started/migrating-to-v5#environment-variables + // https://authjs.dev/getting-started/deployment#auth_trust_host + // The AUTH_TRUST_HOST environment variable serves the same purpose as setting trustHost: true in your Auth.js configuration. + // This is necessary when running Auth.js behind a proxy. + // When set to true we will trust the X-Forwarded-Host and X-Forwarded-Proto headers + // passed to the app by the proxy to auto-detect the host URL (AUTH_URL) + // trustHost: true, + providers: [ + // https://authjs.dev/getting-started/authentication/oauth + GitHub, + Google, + // https://authjs.dev/getting-started/authentication/credentials + // https://youtu.be/1MTyCvS05V4?t=11279 + // Credentials won't affect the edge compatibility because it won't run on the edge + Credentials({ + authorize: async (credentials) => { + // called when user attempts to sign in with credentials + if (SHOW_QUERY_LOGS) { + console.log("authorize, credentials:", credentials); + } + + const validatedFields = LoginSchema.safeParse(credentials); + if (!validatedFields.success) { + console.error("authorize error: credentials invalid"); + return null; + } + + // @sanity-typegen-ignore + if (!credentials?.email) { + console.error("authorize error: email invalid"); + return null; + } + const user = await getUserByEmail(credentials.email as string); + if (!user || !user.password) { + console.error("authorize error: user not found or password invalid"); + return null; + } + + // https://youtu.be/1MTyCvS05V4?t=9695 + // bcryptjs is not compatible with nextjs edge runtime, so we use verifyPassword instead + const passwordsMatch = await verifyPassword( + credentials?.password as string, + user.password, + ); + if (passwordsMatch) { + const userWithRole = { + ...user, + id: user._id, + role: user.role, + }; + if (SHOW_QUERY_LOGS) { + console.log("authorize, user:", userWithRole); + } + return userWithRole; + } + console.error("authorize error: passwords do not match"); + // Return `null` to indicate that the credentials are invalid + return null; + }, + }), + ], +} satisfies NextAuthConfig; diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 0000000..0df54a6 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,111 @@ +import authConfig from "@/auth.config"; +import { getAccountByUserId } from "@/data/account"; +import { getUserById } from "@/data/user"; +import { SHOW_QUERY_LOGS } from "@/lib/constants"; +import { sanityClient } from "@/sanity/lib/client"; +import { SanityAdapter } from "@/sanity/sanity-adapter"; +import type { UserRole } from "@/types/user-role"; +import NextAuth from "next-auth"; + +/** + * https://authjs.dev/getting-started/installation#configure + * providers for authorization, adapters for user data persistence + * + * https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts + */ +export const { + handlers, + auth, + signIn, + signOut, + //unstable update in Beta version + unstable_update, +} = NextAuth({ + ...authConfig, + pages: { + signIn: "/auth/login", + error: "/auth/error", + }, + // https://authjs.dev/guides/creating-a-database-adapter + adapter: SanityAdapter(sanityClient), + // https://authjs.dev/concepts/session-strategies + session: { strategy: "jwt" }, + // https://authjs.dev/concepts/callbacks + callbacks: { + // https://authjs.dev/concepts/callbacks#signin + // https://youtu.be/1MTyCvS05V4?t=10341 + signIn: async ({ user, account }) => { + // console.log('auth callbacks signIn, start, user:', user); + if (account?.provider !== "credentials") return true; + + const existingUser = await getUserById(user.id); + + // prevent signIn without email verification + if (!existingUser?.emailVerified) { + console.log("auth callbacks signIn, user not verified"); + return false; + } + + // console.log('auth callbacks signIn, end, user:', existingUser); + return true; + }, + + // https://authjs.dev/concepts/session-strategies#jwt-session + // https://authjs.dev/reference/nextjs#jwt + // This callback is called whenever a JSON Web Token is created (i.e. at sign in) + // or updated (i.e whenever a session is accessed in the client). + // Anything you return here will be saved in the JWT and forwarded to the session callback. + jwt: async ({ token }) => { + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks jwt, start, token:", token); + } + if (!token.sub) return token; + + const existingUser = await getUserById(token.sub); + + if (!existingUser) return token; + + const existingAccount = await getAccountByUserId(existingUser._id); + + token.isOAuth = !!existingAccount; + token.name = existingUser.name; + token.email = existingUser.email; + token.link = existingUser.link; + token.role = existingUser.role; + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks jwt, end, token:", token); + } + return token; + }, + + // https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts#L68 + // role and isOAuth are added to the token, so we can pass them to the session + session: async ({ session, token }) => { + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks session, start, token:", token); + } + if (token.sub && session.user) { + session.user.id = token.sub; + } + + // https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts#L59 + if (token.role && session.user) { + session.user.role = token.role as UserRole; + } + if (token.link && session.user) { + session.user.link = token.link as string; + } + + if (session.user) { + session.user.name = token.name; + session.user.email = token.email ?? ""; + session.user.isOAuth = token.isOAuth as boolean; + } + + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks session, end, session:", session); + } + return session; + }, + }, +}); diff --git a/src/components/analytics/analytics.tsx b/src/components/analytics/analytics.tsx new file mode 100644 index 0000000..ba3b77f --- /dev/null +++ b/src/components/analytics/analytics.tsx @@ -0,0 +1,26 @@ +import GoogleAnalytics from "./google-analytics"; +import OpenPanelAnalytics from "./open-panel-analytics"; +import { PlausibleAnalytics } from "./plausible-analytics"; +import { UmamiAnalytics } from "./umami-analytics"; + +export function Analytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + return ( + <> + {/* openpanel analytics */} + + + {/* google analytics */} + + + {/* umami analytics */} + + + {/* plausible analytics */} + + + ); +} diff --git a/src/components/analytics/google-analytics.tsx b/src/components/analytics/google-analytics.tsx new file mode 100644 index 0000000..941258f --- /dev/null +++ b/src/components/analytics/google-analytics.tsx @@ -0,0 +1,22 @@ +"use client"; + +import { GoogleAnalytics as NextGoogleAnalytics } from "@next/third-parties/google"; + +/** + * Google Analytics + * + * https://analytics.google.com + * https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries#google-analytics + */ +export default function GoogleAnalytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + const analyticsId = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS_ID; + if (!analyticsId) { + return null; + } + + return ; +} diff --git a/src/components/analytics/open-panel-analytics.tsx b/src/components/analytics/open-panel-analytics.tsx new file mode 100644 index 0000000..d83f9fe --- /dev/null +++ b/src/components/analytics/open-panel-analytics.tsx @@ -0,0 +1,26 @@ +import { OpenPanelComponent } from "@openpanel/nextjs"; + +/** + * OpenPanel Analytics (https://openpanel.dev) + * + * https://docs.openpanel.dev/docs/sdks/nextjs#options + */ +export default function OpenPanelAnalytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + const clientId = process.env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID; + if (!clientId) { + return null; + } + + return ( + + ); +} diff --git a/src/components/analytics/plausible-analytics.tsx b/src/components/analytics/plausible-analytics.tsx new file mode 100644 index 0000000..bb881ff --- /dev/null +++ b/src/components/analytics/plausible-analytics.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Script from 'next/script'; + +/** + * Plausible Analytics + * + * NOTICE: + * If you do not check `404 error pages` when you set up Plausible Analytics, + * you do not need to add new script to this component. + * + * https://plausible.io + */ +export function PlausibleAnalytics() { + if (process.env.NODE_ENV !== 'production') { + return null; + } + + const domain = process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN as string; + if (!domain) { + return null; + } + + const script = process.env.NEXT_PUBLIC_PLAUSIBLE_SCRIPT as string; + if (!script) { + return null; + } + + return ( +