diff --git a/.agents/skills/cad-router b/.agents/skills/cad-router deleted file mode 120000 index 5d16688..0000000 --- a/.agents/skills/cad-router +++ /dev/null @@ -1 +0,0 @@ -/Users/lk/Projects/cadSet/text-to-cad/skills/cad-router \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e5149c9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.step binary +*.stp binary diff --git a/.gitignore b/.gitignore index 147204c..0d4ebdf 100644 --- a/.gitignore +++ b/.gitignore @@ -26,21 +26,26 @@ text-to-cad/models/ *.swp *.tmp -# Private STEP evidence and local induction run reports -cad-experience-plugin/work/ +# Local frontend configuration and task artifacts +cad-agent-studio/config/llm.config.yaml +cad-agent-studio/data/ -# STEP inbox and private per-part reconstruction JSON -cad-experience-plugin/parser/input/* -!cad-experience-plugin/parser/input/.gitkeep -cad-experience-plugin/parser/output/* -!cad-experience-plugin/parser/output/.gitkeep - -# CAD experience benchmark scratch geometry and private case evidence -cad-experience-plugin/benchmarks/**/generated/ -cad-experience-plugin/benchmarks/**/quarantine-*/ -cad-experience-plugin/benchmarks/**/private-case.json -cad-experience-plugin/benchmarks/**/source-inspect.json -cad-experience-plugin/benchmarks/**/train-semantic-batch.json -cad-experience-plugin/benchmarks/**/train_cases/ -cad-experience-plugin/benchmarks/**/test_cases/ -cad-experience-plugin/benchmarks/**/cases/ +# Protected DesignIR runtime data +designir-pipeline/workspace/teacher/inbox/* +!designir-pipeline/workspace/teacher/inbox/.gitkeep +designir-pipeline/workspace/teacher/evidence/* +!designir-pipeline/workspace/teacher/evidence/.gitkeep +designir-pipeline/workspace/reconstruction/inbox/* +!designir-pipeline/workspace/reconstruction/inbox/.gitkeep +designir-pipeline/workspace/reconstruction/designir/* +!designir-pipeline/workspace/reconstruction/designir/.gitkeep +designir-pipeline/workspace/reconstruction/output/* +!designir-pipeline/workspace/reconstruction/output/.gitkeep +designir-pipeline/workspace/acceptance/inbox/* +!designir-pipeline/workspace/acceptance/inbox/.gitkeep +designir-pipeline/workspace/acceptance/reports/* +!designir-pipeline/workspace/acceptance/reports/.gitkeep +designir-pipeline/workspace/promotion/candidates/* +!designir-pipeline/workspace/promotion/candidates/.gitkeep +designir-pipeline/workspace/promotion/replay_validated/* +!designir-pipeline/workspace/promotion/replay_validated/.gitkeep diff --git a/CADAM/.cursor/rules/backend-architecture.mdc b/CADAM/.cursor/rules/backend-architecture.mdc deleted file mode 100644 index 9e77f4f..0000000 --- a/CADAM/.cursor/rules/backend-architecture.mdc +++ /dev/null @@ -1,94 +0,0 @@ ---- -alwaysApply: true ---- -# Backend Architecture - Supabase - -## Overview -The backend is built on Supabase, providing PostgreSQL database, authentication, and Edge Functions for serverless API endpoints. - -## Database Structure - -### Core Tables -- `conversations`: Chat conversations between users and AI -- `messages`: Individual messages within conversations - -### Key Relationships -- Users have many conversations -- Conversations have many messages -- Users have one subscription - -## Edge Functions (`supabase/functions/`) - -### Authentication & User Management -- User registration and login handled by Supabase Auth -- JWT tokens for API authentication - -### Core Functions - -#### Chat Functions -- `chat/`: Parametric AI generation chat - -### Shared Utilities (`_shared/`) -- `cors.ts`: Simple file with cors headers -- `messageUtils.ts`: Utility functions for formating user messages -- `parseParameter.ts`: Parameter parsing utilities -- `supabaseClient.ts`: Functions for getting supabase client - -## API Patterns - -### Authentication -- All sensitive functions require JWT authentication -- Use Supabase client for user verification -- Implement proper role-based access control - -### Error Handling -- Consistent error response format -- Proper HTTP status codes -- Detailed error messages for debugging - -### CORS Configuration -- Configured for frontend domain -- Handle preflight requests -- Support for development and production - -### Environment Variables -- Stored in `supabase/functions/.env` -- Include API keys for external services -- Environment-specific configurations - -### Configuration -- New functions should be put in config.toml -- Persistent storage buckets can be put either in a migration or in config.toml - -## External Service Integration - -### AI Services -- **Anthropic Claude**: Text generation and chat - -## Database Migrations - -### Migration Files -- Located in `supabase/migrations/` -- Version-controlled database schema changes -- Include both schema and data migrations - -### Migration Patterns -- Use descriptive migration names -- Test migrations in development first - -## Development Workflow - -### Local Development -- Use `supabase start` for local database -- `supabase functions serve` for local functions -- ngrok so model can access - -### Testing -- Test functions locally before deployment -- Use Supabase CLI for database operations -- Validate webhook endpoints - -### Deployment -- Functions deployed via Supabase CLI -- Database migrations applied automatically -- Environment variables configured in Supabase dashboard diff --git a/CADAM/.cursor/rules/code-style.mdc b/CADAM/.cursor/rules/code-style.mdc deleted file mode 100644 index 462166d..0000000 --- a/CADAM/.cursor/rules/code-style.mdc +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: -globs: -alwaysApply: true ---- -# Code Style Conventions -version: 1.0.0 - -## TypeScript Rules - -### Naming Conventions -- Variables: `^[a-z][a-zA-Z0-9]*$` -- Functions: `^[a-z][a-zA-Z0-9]*$` -- Classes: `^[A-Z][a-zA-Z0-9]*$` -- Interfaces: `^[A-Z][a-zA-Z0-9]*$` -- Types: `^[A-Z][a-zA-Z0-9]*$` - -### Formatting -- Max line length: 100 characters -- Indentation: 2 spaces -- Semicolons: required -- Quotes: single quotes - -## React Rules -- Component naming: `^[A-Z][a-zA-Z0-9]*$` -- File naming: `^[A-Z][a-zA-Z0-9]*\.tsx$` -- Props interface: `^[A-Z][a-zA-Z0-9]*Props$` - -## Import Rules -### Order -1. react -2. external-libraries -3. components -4. hooks -5. utils -6. types -7. styles - -### Grouping -- Use newlines between import groups diff --git a/CADAM/.cursor/rules/database-workflow.mdc b/CADAM/.cursor/rules/database-workflow.mdc deleted file mode 100644 index 27e0099..0000000 --- a/CADAM/.cursor/rules/database-workflow.mdc +++ /dev/null @@ -1,78 +0,0 @@ ---- -description: -globs: *.sql,supabase.ts,supabase/* -alwaysApply: false ---- -# Database Workflow Rules -version: 1.0.0 - -## Database Schema Changes - -### NEVER Create Manual Migrations -- Do NOT manually create migration files in `supabase/migrations/` -- Always use the declarative schema approach -- Update schema files in `supabase/schemas/` folder instead -- Only modify generated migrations files if absolutely necessary - -### Schema File Management -- Modify existing table schemas in `supabase/schemas/` files -- Add new tables by creating new schema files -- Follow the existing schema file patterns and naming conventions - -## Migration Generation Process - -### Step 1: Stop Supabase -```bash -supabase stop -``` - -### Step 2: Generate Migration -```bash -supabase db diff -f -``` -- Replace `` with descriptive name (e.g., `add_user_preferences`, `create_new_table`) -- Migration will be generated in `supabase/migrations/` with timestamp - -### Step 3: Apply Migration -```bash -supabase start && supabase migration up -``` - -## Local Development Only - -### CRITICAL: Never Push to Remote -- NEVER use `supabase db push` -- NEVER use `supabase db pull` -- ALL migrations should be tested locally only -- Remote database changes are forbidden - -## Type Generation - -### Auto-Generate Types -- NEVER manually edit `shared/database.ts` -- Always regenerate after schema changes: -```bash -supabase gen types typescript --local > shared/database.ts -``` - -## Workflow Summary - -1. **Edit Schema**: Modify `supabase/schemas/` files -2. **Stop Database**: `supabase stop` -3. **Generate Migration**: `supabase db diff -f ` -4. **Apply Migration**: `supabase start && supabase migration up` -5. **Update Types**: `supabase gen types typescript --local > shared/database.ts` - -## Common Commands Reference - -```bash -# Development workflow -supabase stop -supabase db diff -f -supabase start && supabase migration up -supabase gen types typescript --local > shared/database.ts - -# NEVER use these commands -# supabase db push ❌ -# supabase db pull ❌ -``` diff --git a/CADAM/.cursor/rules/deployment-restrictions.mdc b/CADAM/.cursor/rules/deployment-restrictions.mdc deleted file mode 100644 index 7d69f36..0000000 --- a/CADAM/.cursor/rules/deployment-restrictions.mdc +++ /dev/null @@ -1,39 +0,0 @@ ---- -globs: supabase/**/* -alwaysApply: false ---- -# Deployment Restrictions -version: 1.0.0 - -## Function Deployment - -### NEVER Deploy Functions -- **NEVER** run `supabase functions deploy` commands -- **NEVER** run `npx supabase functions deploy` commands -- **NEVER** attempt to deploy any Supabase Edge Functions -- **NEVER** suggest or recommend deploying functions - -### Local Development Only -- All function testing should be done locally with `supabase functions serve` -- Use local Supabase instance for development and testing -- Function deployment is exclusively the responsibility of the human developer - -### Code Changes Only -- AI assistant should only: - - Modify function code - - Update type definitions - - Make local code changes - - Run type checks - - Test locally if needed - -### Deployment Handoff -- After making function changes, simply inform the user that: - - The code changes are complete - - Function deployment is required for the changes to take effect - - The user needs to deploy manually when ready - -## Rationale -- Production deployments require human oversight -- Deployment credentials should not be accessed by AI -- Local testing is sufficient for development workflow -- Human developer maintains control over when and what gets deployed diff --git a/CADAM/.cursor/rules/frontend-architecture.mdc b/CADAM/.cursor/rules/frontend-architecture.mdc deleted file mode 100644 index 37bd78c..0000000 --- a/CADAM/.cursor/rules/frontend-architecture.mdc +++ /dev/null @@ -1,97 +0,0 @@ ---- -alwaysApply: true ---- -# Frontend Architecture - React/TypeScript - -## Component Architecture - -### Views (Page Components) -- Located in `src/views/` -- Each view represents a full page/route -- Use React Router for navigation -- Implement proper loading and error states -- Examples: `PromptView`, `EditorView`, `HistoryView` - -### Reusable Components -- Located in `src/components/` -- Organized by feature/domain -- Use TypeScript interfaces for props -- Follow shadcn/ui patterns -- Implement proper accessibility - -### Component Categories -- `ui/`: Base UI components (buttons, inputs, etc.) -- `chat/`: Components used in ChatSection -- `parameter/`: Components used in ParameterSection -- `viewer/`: Components used in ViewerSection -- `history/`: Components used in the history page - -## State Management - -### Contexts (`src/contexts/`) -- `AuthContext`: User authentication and session -- `BlobContext`: STL blob generated from OpenSCAD WASM -- `ColorContext`: Purely stylistic color for model -- `CurrentMessageContext`: Current message being processed -- `SelectedItemsContext`: Selected items across components - -### React Query -- Used for server state management -- Configured in `src/main.tsx` -- Provides caching, synchronization, and background updates -- Handle loading, error, and success states - -## Custom Hooks (`src/hooks/`) -- `useOpenSCAD`: OpenSCAD integration -- `useItemSelection`: Item selection management -- `useToast`: Toast notification management - -## Services (`src/services/`) -- `conversationService`: Chat/conversation API calls, mutations and queries -- `messageService`: Message handling and processing, mutations and queries -- All services use Supabase client for API calls - -## Utilities (`src/utils/`) -- `file-utils`: Primarily for getting a safe filename when exporting a file -- `parameterUtils`: Parameter validation and processing -- `downloadUtils`: Functions for downloading generated model - -## Types (`src/types/`) -- `misc.ts`: Miscellaneous type definitions, should probably get broken up in the future -- Use proper TypeScript interfaces and types -- Export types for reuse across components - -## 3D Graphics Integration - -### Three.js Setup -- Use React Three Fiber for React integration -- Implement proper cleanup and resource management -- Handle WebGL context loss gracefully -- Use proper lighting and materials - -### OpenSCAD Integration -- Web Worker in `src/worker/` for OpenSCAD processing -- WASM-based OpenSCAD compilation -- Real-time parameter updates -- Error handling for compilation failures - -## Routing Structure -- Main routes defined in `src/main.tsx` -- Error boundaries for route error handling - -## Styling -- Tailwind CSS for utility-first styling -- shadcn/ui components for consistent design -- Custom CSS in `src/index.css` -- Not standard css classes, adam specific, refer to tailwind.config.js for specifics - -## Error Handling -- Error boundaries for component error catching -- Toast notifications for user feedback -- Proper error states in components - -## Performance -- React Query for efficient data fetching -- Proper memoization with `useMemo` and `useCallback` -- Lazy loading for route components -- Image optimization and lazy loading diff --git a/CADAM/.cursor/rules/project-overview.mdc b/CADAM/.cursor/rules/project-overview.mdc deleted file mode 100644 index 4b93008..0000000 --- a/CADAM/.cursor/rules/project-overview.mdc +++ /dev/null @@ -1,93 +0,0 @@ ---- -description: -globs: -alwaysApply: false ---- -# Adam - AI-Powered 3D CAD Model Generation Platform - -## Project Overview -Adam is a web application that enables users to generate 3D CAD models through AI-powered natural language, images, and direct manipulation. The platform combines parametric modeling with creative AI generation. - -## Tech Stack -- **Frontend**: React 19 + TypeScript + Vite -- **UI Framework**: Radix UI + Tailwind CSS + shadcn/ui -- **3D Graphics**: Three.js + React Three Fiber -- **Backend**: Supabase (PostgreSQL + Edge Functions) -- **Authentication**: Supabase Auth -- **AI Services**: Anthropic Claude -- **State Management**: React Query + Context API -- **Routing**: React Router v6 - -## Project Structure -``` -adam/ -├── src/ # Frontend source code -│ ├── components/ # Reusable UI components -│ ├── views/ # Page-level components -│ ├── contexts/ # React contexts -│ ├── hooks/ # Custom React hooks -│ ├── services/ # API service functions -│ ├── utils/ # Utility functions -│ ├── types/ # TypeScript type definitions -│ ├── lib/ # Third-party library configurations -│ └── worker/ # Web Worker for OpenSCAD processing -├── supabase/ # Backend configuration -│ ├── functions/ # Edge functions -│ ├── migrations/ # Database migrations -│ ├── schemas/ # Database schemas -│ └── config.toml # Supabase configuration -├── public/ # Static assets -└── shared/ # Items shared between backend and frontend -``` - -## Development Conventions - -### Code Style -- Use TypeScript for all new code -- Follow React 19 patterns and hooks -- Use functional components with hooks -- Implement proper error boundaries -- Use React Query for server state management - -### Component Structure -- Components in `src/components/` are reusable -- Views in `src/views/` are page-level components -- Use proper TypeScript interfaces for props -- Implement proper loading and error states - -### State Management -- Use React Context for global state (auth, user data) -- Use React Query for server state -- Use local state for component-specific data -- Implement proper loading states and error handling - -### API Integration -- All API calls go through Supabase Edge Functions -- Use React Query for caching and synchronization -- Implement proper error handling and retry logic -- Use TypeScript interfaces for API responses. - -### 3D Graphics -- Use Three.js for 3D rendering -- Implement proper cleanup for Three.js resources -- Use React Three Fiber for React integration -- Handle WebGL context loss gracefully - -### Security -- All sensitive operations go through authenticated Edge Functions -- Implement proper CORS policies -- Validate all user inputs -- Use environment variables for sensitive data - -## Environment Setup -- Frontend: `.env.local` for Vite environment variables -- Backend: `supabase/functions/.env` for Edge Function environment variables -- Use ngrok for local webhook development - -## Common Patterns -- Use React Query for data fetching and caching -- Implement proper loading states with skeleton components -- Use toast notifications for user feedback -- Implement proper error boundaries -- Use React Router for navigation -- Follow the established component hierarchy diff --git a/CADAM/.cursor/rules/typescript-workflow.mdc b/CADAM/.cursor/rules/typescript-workflow.mdc deleted file mode 100644 index 803fed2..0000000 --- a/CADAM/.cursor/rules/typescript-workflow.mdc +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: -globs: *.ts,*.tsx -alwaysApply: false ---- -# TypeScript Workflow Rules -version: 1.1.0 - -## Type Checking - -### Always Run Type Check After Type Changes -- When modifying database schemas that affect TypeScript types -- When updating type definitions or interfaces -- When there are potential type conflicts or errors -- When the LLM cannot see all related files that might be affected - -### Type Check Commands - -#### Frontend (Node.js/TypeScript) -For files in `src/`, `shared/`, and other frontend directories: -```bash -npm run typecheck -``` - -#### Supabase Edge Functions (Deno) -For files in `supabase/functions/`, you must cd into each function directory: -```bash -cd supabase/functions/[function-name] -deno check index.ts -``` - -Example: -```bash -cd supabase/functions/chat -deno check index.ts -``` - -You can also run the npm command -```bash -npm run lint:supabase -``` - -## When to Run Type Check - -### Database Schema Changes -- After running `supabase gen types typescript --local` -- After applying migrations that change table structures -- When adding new columns, tables, or modifying existing ones - -### Type Definition Updates -- After modifying `src/types/` or `shared/*.ts` files -- When updating component prop interfaces -- When changing API response types -- When modifying context or hook return types - -### Potential Type Issues -- When using `any` types as workarounds -- When there are TypeScript errors in the editor -- When importing/exporting between files with type dependencies -- When the LLM cannot see all related files in the conversation - -## Workflow Integration - -### With Database Changes -1. Edit schema files in `supabase/schemas/` -2. Generate migration: `supabase db diff -f ` -3. Apply migration: `supabase start && supabase migration up` -4. Regenerate types: `supabase gen types typescript --local > shared/database.ts` -5. **Run type check**: - - Frontend: `npx tsc -b` - - Edge Functions: `cd supabase/functions/[function-name] && deno check index.ts` -6. Fix any type errors in the codebase - -### With Frontend Changes -1. Modify TypeScript files in `src/` or `shared/` -2. **Run type check**: `npx tsc -b` -3. Fix any type errors -4. Continue with implementation - -### With Supabase Edge Function Changes -1. Modify TypeScript files in `supabase/functions/` -2. **Run type check**: `cd supabase/functions/[function-name] && deno check index.ts` -3. Fix any type errors -4. Continue with implementation - -## Error Resolution - -### Common Type Issues -- Missing properties in interfaces -- Incorrect return types from functions -- Type mismatches between components -- Missing imports for type definitions - -### Resolution Steps -1. Run appropriate type check command based on file location: - - Frontend: `npx tsc -b` - - Edge Functions: `cd supabase/functions/[function-name] && deno check index.ts` -2. Fix errors systematically, starting with the most critical -3. Re-run type check after each fix -4. Ensure all type errors are resolved before proceeding - -## Best Practices - -### Type Safety -- Avoid using `any` types unless absolutely necessary -- Use proper TypeScript interfaces and types -- Leverage the generated Supabase types -- Maintain type consistency across the codebase - -### Development Workflow -- Run type checks frequently during development -- Fix type errors immediately when they appear -- Use TypeScript strict mode settings -- Keep type definitions up to date with schema changes - -### Environment-Specific Considerations -- **Frontend**: Uses Node.js TypeScript compiler, supports all standard TypeScript features -- **Edge Functions**: Uses Deno's TypeScript compiler, may have different import/export requirements -- **Shared Types**: Files in `shared/` are used by both environments, ensure compatibility diff --git a/CADAM/.env.local.template b/CADAM/.env.local.template deleted file mode 100644 index a412b5d..0000000 --- a/CADAM/.env.local.template +++ /dev/null @@ -1,36 +0,0 @@ -VITE_SUPABASE_ANON_KEY="" -VITE_SUPABASE_URL='http://127.0.0.1:54321' -SUPABASE_SERVICE_ROLE_KEY="" -# Optional: SSO-only mode. Set to any Supabase OAuth provider slug — e.g. -# 'custom:my-idp' for a custom OIDC provider configured in your Supabase -# dashboard — and the app root becomes the only auth surface: its signed-out -# UI is unchanged, but the sign-in/sign-up affordances redirect to the -# provider, /signin & /signup & /signup-email bounce to root, and -# unauthenticated deep links redirect straight to the provider. Leave unset -# to keep the native auth UI (the local Supabase CLI stack can't host -# custom OIDC providers). -# VITE_SSO_PROVIDER="custom:my-idp" -# Optional: when SSO owns the identity, point profile / password / delete -# management at the provider's account page (the accounts.google.com model) -# instead of editing them in-app. Unset keeps the native in-app controls. -# VITE_ACCOUNT_URL="https://accounts.example.com/account" -VITE_POSTHOG_PROJECT_KEY="" -VITE_SENTRY_ENVIRONMENT="local" -VITE_SENTRY_DSN="" -ANTHROPIC_API_KEY="" -OPENROUTER_API_KEY="" -OPENAI_API_KEY="" -GOOGLE_API_KEY="" -FAL_KEY="" -BILLING_SERVICE_URL="" -BILLING_SERVICE_KEY="" -ENVIRONMENT="local" -ADAM_URL="" -WEBHOOK_BASE_URL="" -NGROK_URL="" -# Shared bearer secret for the internal server-to-server account-purge endpoint -# (POST /api/internal/account/delete). The upstream identity provider's purge -# worker presents this to erase a user's data here when their account is -# deleted. Leave unset to hard-disable the endpoint (it 503s every request). -# Provider-agnostic: any deployment sets its own value. -ACCOUNT_PURGE_SECRET="" diff --git a/CADAM/.gitignore b/CADAM/.gitignore deleted file mode 100644 index d6ae921..0000000 --- a/CADAM/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -.output -,output -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -*.tsbuildinfo -.env - -.vercel - -# other secret files -.env.local -.env.langfuse diff --git a/CADAM/.husky/pre-commit b/CADAM/.husky/pre-commit deleted file mode 100644 index 2445270..0000000 --- a/CADAM/.husky/pre-commit +++ /dev/null @@ -1,2 +0,0 @@ -npx tsc -b -npx lint-staged diff --git a/CADAM/.npmrc b/CADAM/.npmrc deleted file mode 100644 index 41583e3..0000000 --- a/CADAM/.npmrc +++ /dev/null @@ -1 +0,0 @@ -@jsr:registry=https://npm.jsr.io diff --git a/CADAM/.prettierignore b/CADAM/.prettierignore deleted file mode 100644 index df08e92..0000000 --- a/CADAM/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -src/vendor/openscad-wasm/ -src/assets/ \ No newline at end of file diff --git a/CADAM/.prettierrc b/CADAM/.prettierrc deleted file mode 100644 index 7933f57..0000000 --- a/CADAM/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "plugins": ["prettier-plugin-tailwindcss"] -} diff --git a/CADAM/CODE_OF_CONDUCT.md b/CADAM/CODE_OF_CONDUCT.md deleted file mode 100644 index 807646a..0000000 --- a/CADAM/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,51 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -- Focusing on what is best not just for us as individuals, but for the overall community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement by emailing zach@adam.new. All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the reporter of any incident. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). - -For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. diff --git a/CADAM/CONTRIBUTING.md b/CADAM/CONTRIBUTING.md deleted file mode 100644 index e5079df..0000000 --- a/CADAM/CONTRIBUTING.md +++ /dev/null @@ -1,25 +0,0 @@ -# Contributing to CADAM - -When contributing to this repository, please first discuss the change you wish to make via [issues](https://github.com/Adam-CAD/CADAM/issues) before making a change. - -Please note we have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. - -## Pull Request Process - -1. **Fork the project** - Create a fork of the repository to your own GitHub account. - - ![Fork](https://docs.github.com/assets/cb-40742/mw-1440/images/help/repository/fork-button.webp) - -2. **Create your changes** - Make your changes in your fork and open a PR from that fork. - -3. **Update the PR description** - Include details of the changes. Link the issue if relevant. - -4. **Allow maintainer edits** - Be sure to check the box to "Allow edits from maintainer". This allows maintainers to update your PR if necessary which speeds up the review process. [Learn more here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork). - -5. **Request a review** - Request a review from one of the maintainers. Once accepted, they will be able to merge your PR. - -## Style Guide - -We try to follow guidelines from [Clean Code](https://www.oreilly.com/library/view/clean-code-a/9780136083238/) and the Boy Scout Rule: - -> "Leave the code cleaner, not messier, than how you found it." diff --git a/CADAM/LICENSE b/CADAM/LICENSE deleted file mode 100644 index 1451535..0000000 --- a/CADAM/LICENSE +++ /dev/null @@ -1,185 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble -The GNU General Public License is a free, copyleft license for software and other kinds of works. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS -0. Definitions. -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on the Program. - -To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. - -A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. -All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/CADAM/README.md b/CADAM/README.md deleted file mode 100644 index 00a10bd..0000000 --- a/CADAM/README.md +++ /dev/null @@ -1,318 +0,0 @@ - - -
- - - - CADAM Banner - -
- -

⛮ The Open Source Text to CAD Web App ⛮

- -
- -[![Stars](https://img.shields.io/github/stars/Adam-CAD/cadam?style=social&logo=github)](https://github.com/Adam-CAD/cadam/stargazers) -[![Forks](https://img.shields.io/github/forks/Adam-CAD/CADAM?style=flat)](https://github.com/Adam-CAD/CADAM/network) -[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://www.gnu.org/licenses/gpl-3.0) -[![Node.js](https://img.shields.io/badge/Node.js-20.19%2B%20%7C%2022.12%2B-green.svg?style=flat&logo=node.js&logoColor=white)](https://nodejs.org/) -[![React](https://img.shields.io/badge/React-19.1-61DAFB.svg?style=flat&logo=react&logoColor=black)](https://reactjs.org/) -[![Supabase](https://img.shields.io/badge/Supabase-Backend-3ECF8E.svg?style=flat&logo=supabase&logoColor=white)](https://supabase.com/) -[![OpenSCAD](https://img.shields.io/badge/OpenSCAD-WASM-F9D64F.svg?style=flat)](https://openscad.org/) -[![Website](https://img.shields.io/badge/website-adam.new-blue?style=flat)](https://adam.new) -[![Discord](https://img.shields.io/badge/Discord-Join-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.com/invite/HKdXDqAHCs) -[![Follow Zach Dive](https://img.shields.io/badge/Follow-Zach%20Dive-1DA1F2?style=flat&logo=x&logoColor=white)](https://x.com/zachdive) -[![Follow Aaron Li](https://img.shields.io/badge/Follow-Aaron%20Li-1DA1F2?style=flat&logo=x&logoColor=white)](https://x.com/aaronhetengli) -[![Follow Dylan Anderson](https://img.shields.io/badge/Follow-tsadpbb-1DA1F2?style=flat&logo=x&logoColor=white)](https://x.com/tsadpbb) - -
- ---- - -## 🌐 Try it live - -**👉 [adam.new/cadam](https://adam.new/cadam)**. Generate a CAD model in seconds, right in your browser. No install required. - -## ✨ Features - -- 🤖 **AI-Powered Generation** - Transform natural language and images into 3D models -- 🎛️ **Parametric Controls** - Interactive sliders for instant dimension adjustments -- 📦 **Multiple Export Formats** - Export as .STL, .SCAD, or .DXF files -- 🌐 **Browser-Based** - Runs entirely in your browser using WebAssembly -- 📚 **Library Support** - Includes BOSL, BOSL2, and MCAD libraries - -## 🎯 Key Capabilities - -| Feature | Description | -| -------------------------- | ---------------------------------------------------- | -| **Natural Language Input** | Describe your 3D model in plain English | -| **Image References** | Upload images to guide model generation | -| **Real-time Preview** | See your model update instantly with Three.js | -| **Parameter Extraction** | Automatically identifies adjustable dimensions | -| **Smart Updates** | Efficient parameter changes without AI re-generation | -| **Custom Fonts** | Built-in Geist font support for text in models | - -## 📺 Screenshots - -CADAM Screenshot 2 - -## 🧪 Benchmarks - -A showcase of what CADAM builds from a single plain-language description — from full multi-part machines down to clean parametric parts. Each model below started from the prompt shown and came out as fully parametric OpenSCAD, ready to export as `.STL`, `.SCAD`, or `.DXF`. The source and a short write-up for each live in [`benchmarks/`](benchmarks/); the orbiting previews are rendered with [`benchmarks/render.sh`](benchmarks/render.sh). - -### Complex machines & assemblies - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ModelPromptControlsOutput
V8 engineA complete V8 internal combustion engine: two banks of four cylinders in a 90° V, cylinder heads with ribbed valve covers, an intake manifold in the valley, exhaust headers down each bank, a crankshaft with counterweights, pistons and connecting rods, a front pulley, and an oil pan.22 dims
8 colors
V8 engine orbit
9-cylinder radial aircraft engineDesign a 9-cylinder radial aircraft engine: a central round crankcase with nine finned cylinders arranged evenly in a star pattern around it, each cylinder with stacked cooling fins and a domed cylinder head, and a central propeller shaft hub at the front.15 dims
6 colors
9-cylinder radial aircraft engine orbit
Turbofan jet engineA complete high-bypass turbofan: a front fan you can see into, a bypass cowl, an internal core with compressor/turbine stages, outlet guide vanes, and an exhaust plug.2 dims
10 colors
Turbofan jet engine orbit
Axial turbine bliskModel an axial-flow turbine blisk (bladed disk) like a jet engine compressor stage: a central hub with a shaft bore and a single ring of about 28 thin aerofoil blades around the rim, each blade clearly twisted along its height from root to tip like a real turbine blade.14 dims
1 color
Axial turbine blisk orbit
- -### Parametric fundamentals - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ModelPromptControlsOutput
Twisted hexagonal vaseDesign a twisted hexagonal vase: a hollow shell about 150 mm tall that tapers from a 70 mm base to a 50 mm mouth, with the hexagonal cross-section twisting 120 degrees from bottom to top, a 2 mm wall, and a closed bottom.6 dims
1 color
Twisted hexagonal vase orbit
Knurled control knobMake a knurled control knob 40 mm in diameter and 22 mm tall with a diamond-knurled grip, a raised pointer mark on top, a 6 mm D-shaped shaft bore, and an M3 set-screw hole through the side.15 dims
2 colors
Knurled control knob orbit
Hex bolt & nut — real threadsCreate an M12 hex bolt 45 mm long with a real threaded shaft and a standard hex head, plus its matching hex nut, placed side by side.3 dims
2 colors
Hex bolt & nut — real threads orbit
Honeycomb lightweight bracketDesign a 90-degree angle mounting bracket with 80x80 mm flanges that are 5 mm thick, lightened with a hexagonal honeycomb cutout pattern on both faces, four M5 mounting holes, and a filleted inside corner.13 dims
1 color
Honeycomb lightweight bracket orbit
NACA 2412 tapered wingModel a tapered aircraft wing section using a real NACA 2412 airfoil: 120 mm root chord tapering to 80 mm tip over a 200 mm span, with two spanwise spar tubes and a few lightening holes.9 dims
1 color
NACA 2412 tapered wing orbit
Threaded jar & screw-on lidCreate a small storage jar with external screw threads at the neck and a matching screw-on lid with internal threads. Jar body 60 mm diameter, 70 mm tall, 2.5 mm walls; show the lid unscrewed and sitting beside the jar.9 dims
2 colors
Threaded jar & screw-on lid orbit
Right-angle bevel gear driveBuild a right-angle bevel gear drive: a 24-tooth bevel gear on a vertical shaft meshing at 90 degrees with a 16-tooth bevel pinion on a horizontal shaft, each on a short stub shaft.9 dims
3 colors
Right-angle bevel gear drive orbit
Centrifugal pump impellerDesign a centrifugal pump impeller: a 90 mm diameter back-plate with a central 12 mm bore and a raised hub, and seven backward-curved blades that sweep from the hub out to the rim, each blade curving smoothly along its path.10 dims
1 color
Centrifugal pump impeller orbit
Herringbone planetary gear stageModel a herringbone planetary gear stage at module 1.5: a central sun gear with 18 teeth, three planet gears with 18 teeth each meshing around it, an internal ring gear with 54 teeth, and a carrier plate linking the three planet axles. Color the sun, planets, ring, and carrier differently.10 dims
4 colors
Herringbone planetary gear stage orbit
- -## 🚀 Quick Start - -```bash -# Clone the repository -git clone https://github.com/Adam-CAD/CADAM.git -cd CADAM - -# Install dependencies -npm install - -# Start Supabase -npx supabase start -npx supabase functions serve --no-verify-jwt - -# Start the development server -npm run dev -``` - -## 📋 Prerequisites - -- Node.js ^20.19.0 or >=22.12.0, with npm 10+ -- Supabase CLI -- ngrok (for local webhook development) - -## 🔧 Setting Up Environment Variables - -### 1. Frontend Environment: - -- Copy `.env.local.template` to `.env.local` -- Update all required keys in `.env.local`: - ``` - VITE_SUPABASE_ANON_KEY="" - VITE_SUPABASE_URL='http://127.0.0.1:54321' - ``` - -### 2. Server Environment: - -- Add server-side keys to `.env.local`, including: - ``` - ANTHROPIC_API_KEY="" - OPENROUTER_API_KEY="" - OPENAI_API_KEY="" - GOOGLE_API_KEY="" - FAL_KEY="" - SUPABASE_SERVICE_ROLE_KEY="" - BILLING_SERVICE_URL="" - BILLING_SERVICE_KEY="" - ENVIRONMENT="local" - ADAM_URL="" # Checkout and portal redirect target - WEBHOOK_BASE_URL="" # Your app URL for /cadam/api callbacks - NGROK_URL="" # Optional local Supabase Storage tunnel for provider-readable signed URLs - ``` - -## 🌐 Setting Up ngrok for Local Development - -CADAM uses public URLs for provider callbacks and local signed storage URLs: - -1. Install ngrok if you haven't already: - - ```bash - npm install -g ngrok - # or - brew install ngrok - ``` - -2. Start an ngrok tunnel pointing to your TanStack Start dev server: - - ```bash - ngrok http 3000 - ``` - -3. Copy the generated ngrok URL (e.g., https://xxxx-xx-xx-xxx-xx.ngrok.io) and add it to your `.env.local` file: - - ``` - WEBHOOK_BASE_URL="https://xxxx-xx-xx-xxx-xx.ngrok.io" - ``` - -4. If a provider must fetch local Supabase Storage signed URLs, run a second tunnel to Supabase and set `NGROK_URL` to that URL. - -5. Ensure `ENVIRONMENT="local"` is set in the same file. - -## 💻 Development Workflow - -### Install Dependencies - -```bash -npm i -``` - -### Start Supabase Services - -```bash -npx supabase start -npm run dev -``` - -## 🛠️ Built With - -- **Frontend:** React 19 + TypeScript + TanStack Start + Vite -- **3D Rendering:** Three.js + React Three Fiber -- **CAD Engine:** OpenSCAD WebAssembly -- **Backend:** TanStack Start server routes + Supabase PostgreSQL/Auth/Storage -- **AI:** Anthropic Claude API -- **Styling:** Tailwind CSS + shadcn/ui -- **Libraries:** BOSL, BOSL2, MCAD - -## 🤝 Contributing - -If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also [open an issue](https://github.com/Adam-CAD/CADAM/issues). - -See the [CONTRIBUTING.md](CONTRIBUTING.md) for instructions and [code of conduct](CODE_OF_CONDUCT.md). - -## 🙏 Credits - -This app wouldn't be possible without the work of: - -- [OpenSCAD](https://github.com/openscad/openscad) -- [openscad-wasm](https://github.com/openscad/openscad-wasm) -- [openscad-playground](https://github.com/openscad/openscad-playground) -- [openscad-web-gui](https://github.com/seasick/openscad-web-gui) -- [dingcad](https://github.com/yacineMTB/dingcad) - -## 📄 License - -This distribution is licensed under the GNU General Public License v3.0 (GPLv3). See `LICENSE`. - -Components and attributions: - -- Portions of this project are derived from `openscad-web-gui` (GPLv3). -- This distribution includes unmodified binaries from OpenSCAD WASM under - GPL v2 or later; distributed here under GPLv3 as part of the combined work. - See `src/vendor/openscad-wasm/SOURCE-OFFER.txt`. - ---- - -## 🌟 Star History - -
- - - CADAM Star History - - -Live chart by RepoStars — click for the interactive version. - -
- ---- - -
- -**⭐ If you find CADAM useful, please consider giving it a star!** - -[![Stars](https://img.shields.io/github/stars/Adam-CAD/cadam?style=social&logo=github)](https://github.com/Adam-CAD/cadam/stargazers) - -Made with 💙 for the 3D printing and CAD community - -
diff --git a/CADAM/benchmarks/01-twisted-hex-vase.gif b/CADAM/benchmarks/01-twisted-hex-vase.gif deleted file mode 100644 index 5c273c3..0000000 Binary files a/CADAM/benchmarks/01-twisted-hex-vase.gif and /dev/null differ diff --git a/CADAM/benchmarks/01-twisted-hex-vase.md b/CADAM/benchmarks/01-twisted-hex-vase.md deleted file mode 100644 index 32871e6..0000000 --- a/CADAM/benchmarks/01-twisted-hex-vase.md +++ /dev/null @@ -1,97 +0,0 @@ -# 1 — Twisted hexagonal vase - -> **Prompt** -> -> Design a twisted hexagonal vase: a hollow shell about 150 mm tall that tapers from a 70 mm base to a 50 mm mouth, with the hexagonal cross-section twisting 120 degrees from bottom to top, a 2 mm wall, and a closed bottom. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Twisted hexagonal vase — orbiting render

- -**Parametric controls:** 6 dimensions · 1 colour - -**What it demonstrates** - -- Generative twist-loft via `linear_extrude(twist=, scale=)` over a hexagon -- Hollowed with a solid printable floor (inner cutter intersected with a lifted cylinder) -- Compensates the hexagon flat-angle so the wall thickness stays true on every face - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `height` | `150` | `[50:5:300]` | Total height of the vase | -| `base_radius` | `35` | `[20:1:100]` | Base radius (circumradius, so diameter is 2x this) | -| `mouth_radius` | `25` | `[10:1:80]` | Mouth radius (circumradius, so diameter is 2x this) | -| `twist_angle` | `120` | `[-720:5:720]` | Total twist angle from bottom to top (degrees) | -| `wall_thickness` | `2.0` | `[0.5:0.5:5.0]` | Thickness of the walls and base | - -
-OpenSCAD source — 01-twisted-hex-vase.scad - -```scad -// Twisted Hexagonal Vase - -/* [Dimensions] */ -// Total height of the vase -height = 150; // [50:5:300] -// Base radius (circumradius, so diameter is 2x this) -base_radius = 35; // [20:1:100] -// Mouth radius (circumradius, so diameter is 2x this) -mouth_radius = 25; // [10:1:80] -// Total twist angle from bottom to top (degrees) -twist_angle = 120; // [-720:5:720] -// Thickness of the walls and base -wall_thickness = 2.0; // [0.5:0.5:5.0] - -/* [Style] */ -// Color of the vase -vase_color = "Turquoise"; - -/* [Hidden] */ -// Compensation for the hexagon's angle to maintain true wall thickness on the flats -wall_adj = wall_thickness / cos(30); - -// Number of vertical slices for a smooth twist -slices = height * 2; - -// Outer geometry variables -r_bot_out = base_radius; -r_top_out = mouth_radius; -scale_out = r_top_out / r_bot_out; - -// Inner geometry variables -r_bot_in = base_radius - wall_adj; -r_top_in_at_H = mouth_radius - wall_adj; - -// Extend the inner cutter slightly to ensure a clean opening at the top -cut_extra = 2; -H_in = height + cut_extra; - -// Calculate slope of inner radius change to maintain perfect alignment -slope = (r_top_in_at_H - r_bot_in) / height; -r_top_in = r_bot_in + slope * H_in; - -scale_in = r_top_in / r_bot_in; -twist_in = twist_angle * (H_in / height); - -color(vase_color) -difference() { - // Outer Solid Shell - linear_extrude(height = height, twist = twist_angle, scale = scale_out, slices = slices) - circle(r = r_bot_out, $fn = 6); - - // Inner Cut (Hollow) - // We intersect the twisted inner solid with a lifted cylinder - // to leave a solid floor of exactly `wall_thickness`. - intersection() { - linear_extrude(height = H_in, twist = twist_in, scale = scale_in, slices = slices) - circle(r = r_bot_in, $fn = 6); - - translate([0, 0, wall_thickness]) - cylinder(h = H_in, r = max(base_radius, mouth_radius) * 2, $fn = 32); - } -} -``` - -
diff --git a/CADAM/benchmarks/01-twisted-hex-vase.scad b/CADAM/benchmarks/01-twisted-hex-vase.scad deleted file mode 100644 index 80bc8b9..0000000 --- a/CADAM/benchmarks/01-twisted-hex-vase.scad +++ /dev/null @@ -1,62 +0,0 @@ -// Twisted Hexagonal Vase - -/* [Dimensions] */ -// Total height of the vase -height = 150; // [50:5:300] -// Base radius (circumradius, so diameter is 2x this) -base_radius = 35; // [20:1:100] -// Mouth radius (circumradius, so diameter is 2x this) -mouth_radius = 25; // [10:1:80] -// Total twist angle from bottom to top (degrees) -twist_angle = 120; // [-720:5:720] -// Thickness of the walls and base -wall_thickness = 2.0; // [0.5:0.5:5.0] - -/* [Style] */ -// Color of the vase -vase_color = "Turquoise"; - -/* [Hidden] */ -// Compensation for the hexagon's angle to maintain true wall thickness on the flats -wall_adj = wall_thickness / cos(30); - -// Number of vertical slices for a smooth twist -slices = height * 2; - -// Outer geometry variables -r_bot_out = base_radius; -r_top_out = mouth_radius; -scale_out = r_top_out / r_bot_out; - -// Inner geometry variables -r_bot_in = base_radius - wall_adj; -r_top_in_at_H = mouth_radius - wall_adj; - -// Extend the inner cutter slightly to ensure a clean opening at the top -cut_extra = 2; -H_in = height + cut_extra; - -// Calculate slope of inner radius change to maintain perfect alignment -slope = (r_top_in_at_H - r_bot_in) / height; -r_top_in = r_bot_in + slope * H_in; - -scale_in = r_top_in / r_bot_in; -twist_in = twist_angle * (H_in / height); - -color(vase_color) -difference() { - // Outer Solid Shell - linear_extrude(height = height, twist = twist_angle, scale = scale_out, slices = slices) - circle(r = r_bot_out, $fn = 6); - - // Inner Cut (Hollow) - // We intersect the twisted inner solid with a lifted cylinder - // to leave a solid floor of exactly `wall_thickness`. - intersection() { - linear_extrude(height = H_in, twist = twist_in, scale = scale_in, slices = slices) - circle(r = r_bot_in, $fn = 6); - - translate([0, 0, wall_thickness]) - cylinder(h = H_in, r = max(base_radius, mouth_radius) * 2, $fn = 32); - } -} diff --git a/CADAM/benchmarks/02-knurled-control-knob.gif b/CADAM/benchmarks/02-knurled-control-knob.gif deleted file mode 100644 index 981c296..0000000 Binary files a/CADAM/benchmarks/02-knurled-control-knob.gif and /dev/null differ diff --git a/CADAM/benchmarks/02-knurled-control-knob.md b/CADAM/benchmarks/02-knurled-control-knob.md deleted file mode 100644 index 6b5c01f..0000000 --- a/CADAM/benchmarks/02-knurled-control-knob.md +++ /dev/null @@ -1,172 +0,0 @@ -# 2 — Knurled control knob - -> **Prompt** -> -> Make a knurled control knob 40 mm in diameter and 22 mm tall with a diamond-knurled grip, a raised pointer mark on top, a 6 mm D-shaped shaft bore, and an M3 set-screw hole through the side. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Knurled control knob — orbiting render

- -**Parametric controls:** 15 dimensions · 2 colours - -**What it demonstrates** - -- Diamond-knurled grip surface (BOSL2) -- D-profile shaft bore + M3 set-screw with counterbore -- Raised pointer indicator, modelled as a separate colour - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `knob_diameter` | `40` | `[20:1:80]` | Outer diameter of the knob | -| `knob_height` | `22` | `[10:1:50]` | Total height of the knob | -| `knurl_density` | `36` | `[16:2:100]` | Number of knurl ridges | -| `knurl_depth` | `1.2` | `[0.5:0.1:3.0]` | Depth of the diamond knurl pattern | -| `shaft_diameter` | `6.0` | `[3:0.1:12]` | Diameter of the D-shaft | -| `shaft_clearance` | `0.2` | `[0:0.05:0.5]` | Extra clearance for easy fit | -| `shaft_flat_depth` | `1.5` | `[0:0.1:4.0]` | Depth of the flat portion on the D-shaft | -| `shaft_bore_depth` | `18` | `[5:1:40]` | How deep the shaft hole goes into the knob | -| `set_screw_diameter` | `3.0` | `[2:0.1:6.0]` | Thread diameter for the set screw (M3 = 3.0) | -| `set_screw_height` | `8` | `[2:1:30]` | Height of the set screw hole from the bottom | -| `set_screw_cb_diameter` | `6.0` | `[3:0.1:10.0]` | Diameter of the counterbore for the set screw head | -| `set_screw_cb_depth` | `12` | `[0:1:30]` | Depth of the counterbore | -| `pointer_angle` | `180` | `[0:15:345]` | Rotational angle of the pointer (180 points opposite to flat) | -| `pointer_width` | `4` | `[2:0.5:10]` | Width of the pointer base | -| … | | | _+1 more_ | - -
-OpenSCAD source — 02-knurled-control-knob.scad - -```scad -include - -/* [Dimensions] */ -// Outer diameter of the knob -knob_diameter = 40; // [20:1:80] -// Total height of the knob -knob_height = 22; // [10:1:50] -// Number of knurl ridges -knurl_density = 36; // [16:2:100] -// Depth of the diamond knurl pattern -knurl_depth = 1.2; // [0.5:0.1:3.0] - -/* [Shaft Interface] */ -// Diameter of the D-shaft -shaft_diameter = 6.0; // [3:0.1:12] -// Extra clearance for easy fit -shaft_clearance = 0.2; // [0:0.05:0.5] -// Depth of the flat portion on the D-shaft -shaft_flat_depth = 1.5; // [0:0.1:4.0] -// How deep the shaft hole goes into the knob -shaft_bore_depth = 18; // [5:1:40] - -/* [Set Screw] */ -// Thread diameter for the set screw (M3 = 3.0) -set_screw_diameter = 3.0; // [2:0.1:6.0] -// Height of the set screw hole from the bottom -set_screw_height = 8; // [2:1:30] -// Diameter of the counterbore for the set screw head -set_screw_cb_diameter = 6.0; // [3:0.1:10.0] -// Depth of the counterbore -set_screw_cb_depth = 12; // [0:1:30] - -/* [Pointer] */ -// Rotational angle of the pointer (180 points opposite to flat) -pointer_angle = 180; // [0:15:345] -// Width of the pointer base -pointer_width = 4; // [2:0.5:10] -// Raised height of the pointer -pointer_height = 1.5; // [0.5:0.1:5] - -/* [Colors] */ -knob_color = "DarkSlateGray"; -pointer_color = "Silver"; - -// 2D gear profile for sweeping into knurls -module gear_2d(r, depth, teeth) { - w = ((r - depth) * 2 * 3.14159) / teeth * 1.1; - union() { - circle(r = r - depth, $fn=120); - for(i=[0:teeth-1]) { - rotate([0, 0, i * 360 / teeth]) - polygon([ - [r - depth + 0.05, -w/2], - [r - depth + 0.05, w/2], - [r, 0] - ]); - } - } -} - -// Cylindrical base with top and bottom chamfers -module chamfered_cylinder(d, h, chamfer) { - rotate_extrude($fn=120) { - polygon([ - [0, 0], - [d/2 - chamfer, 0], - [d/2, chamfer], - [d/2, h - chamfer], - [d/2 - chamfer, h], - [0, h] - ]); - } -} - -// D-shaft boolean cutter -module d_shaft_cutter(d, depth, flat_dist) { - intersection() { - cylinder(d=d, h=depth, $fn=64); - translate([-d, -d, 0]) - cube([d*2, d + flat_dist, depth]); - } -} - -// Variables derived from parameters -actual_shaft_d = shaft_diameter + shaft_clearance; -flat_dist = (shaft_diameter/2) - shaft_flat_depth + (shaft_clearance/2); - -// Main Assembly -difference() { - // Solid body with diamond knurling - color(knob_color) - intersection() { - twist_angle = 360 * knob_height / (3.14159 * knob_diameter); - intersection() { - linear_extrude(height=knob_height, twist=twist_angle, slices=60, convexity=5) - gear_2d(knob_diameter/2, knurl_depth, knurl_density); - linear_extrude(height=knob_height, twist=-twist_angle, slices=60, convexity=5) - gear_2d(knob_diameter/2, knurl_depth, knurl_density); - } - chamfered_cylinder(knob_diameter, knob_height, 1.5); - } - - // D-Shaft Cut - translate([0, 0, -0.05]) - d_shaft_cutter(actual_shaft_d, shaft_bore_depth + 0.05, flat_dist); - - // Set Screw Cut - translate([0, knob_diameter/2 + 1, set_screw_height]) - rotate([90, 0, 0]) { - cylinder(d=set_screw_diameter, h=knob_diameter/2 + 2, $fn=32); - translate([0, 0, -1]) - cylinder(d=set_screw_cb_diameter, h=set_screw_cb_depth + 1, $fn=32); - } -} - -// Top Pointer Indicator -color(pointer_color) -rotate([0, 0, pointer_angle]) -translate([0, 0, knob_height - 0.05]) -hull() { - // Outer tip - translate([0, knob_diameter/2 - 4, 0]) - cylinder(d=pointer_width/2, h=pointer_height, $fn=32); - // Inner base - translate([0, 4, 0]) - cylinder(d=pointer_width, h=pointer_height, $fn=32); -} -``` - -
diff --git a/CADAM/benchmarks/02-knurled-control-knob.scad b/CADAM/benchmarks/02-knurled-control-knob.scad deleted file mode 100644 index d86f550..0000000 --- a/CADAM/benchmarks/02-knurled-control-knob.scad +++ /dev/null @@ -1,127 +0,0 @@ -include - -/* [Dimensions] */ -// Outer diameter of the knob -knob_diameter = 40; // [20:1:80] -// Total height of the knob -knob_height = 22; // [10:1:50] -// Number of knurl ridges -knurl_density = 36; // [16:2:100] -// Depth of the diamond knurl pattern -knurl_depth = 1.2; // [0.5:0.1:3.0] - -/* [Shaft Interface] */ -// Diameter of the D-shaft -shaft_diameter = 6.0; // [3:0.1:12] -// Extra clearance for easy fit -shaft_clearance = 0.2; // [0:0.05:0.5] -// Depth of the flat portion on the D-shaft -shaft_flat_depth = 1.5; // [0:0.1:4.0] -// How deep the shaft hole goes into the knob -shaft_bore_depth = 18; // [5:1:40] - -/* [Set Screw] */ -// Thread diameter for the set screw (M3 = 3.0) -set_screw_diameter = 3.0; // [2:0.1:6.0] -// Height of the set screw hole from the bottom -set_screw_height = 8; // [2:1:30] -// Diameter of the counterbore for the set screw head -set_screw_cb_diameter = 6.0; // [3:0.1:10.0] -// Depth of the counterbore -set_screw_cb_depth = 12; // [0:1:30] - -/* [Pointer] */ -// Rotational angle of the pointer (180 points opposite to flat) -pointer_angle = 180; // [0:15:345] -// Width of the pointer base -pointer_width = 4; // [2:0.5:10] -// Raised height of the pointer -pointer_height = 1.5; // [0.5:0.1:5] - -/* [Colors] */ -knob_color = "DarkSlateGray"; -pointer_color = "Silver"; - -// 2D gear profile for sweeping into knurls -module gear_2d(r, depth, teeth) { - w = ((r - depth) * 2 * 3.14159) / teeth * 1.1; - union() { - circle(r = r - depth, $fn=120); - for(i=[0:teeth-1]) { - rotate([0, 0, i * 360 / teeth]) - polygon([ - [r - depth + 0.05, -w/2], - [r - depth + 0.05, w/2], - [r, 0] - ]); - } - } -} - -// Cylindrical base with top and bottom chamfers -module chamfered_cylinder(d, h, chamfer) { - rotate_extrude($fn=120) { - polygon([ - [0, 0], - [d/2 - chamfer, 0], - [d/2, chamfer], - [d/2, h - chamfer], - [d/2 - chamfer, h], - [0, h] - ]); - } -} - -// D-shaft boolean cutter -module d_shaft_cutter(d, depth, flat_dist) { - intersection() { - cylinder(d=d, h=depth, $fn=64); - translate([-d, -d, 0]) - cube([d*2, d + flat_dist, depth]); - } -} - -// Variables derived from parameters -actual_shaft_d = shaft_diameter + shaft_clearance; -flat_dist = (shaft_diameter/2) - shaft_flat_depth + (shaft_clearance/2); - -// Main Assembly -difference() { - // Solid body with diamond knurling - color(knob_color) - intersection() { - twist_angle = 360 * knob_height / (3.14159 * knob_diameter); - intersection() { - linear_extrude(height=knob_height, twist=twist_angle, slices=60, convexity=5) - gear_2d(knob_diameter/2, knurl_depth, knurl_density); - linear_extrude(height=knob_height, twist=-twist_angle, slices=60, convexity=5) - gear_2d(knob_diameter/2, knurl_depth, knurl_density); - } - chamfered_cylinder(knob_diameter, knob_height, 1.5); - } - - // D-Shaft Cut - translate([0, 0, -0.05]) - d_shaft_cutter(actual_shaft_d, shaft_bore_depth + 0.05, flat_dist); - - // Set Screw Cut - translate([0, knob_diameter/2 + 1, set_screw_height]) - rotate([90, 0, 0]) { - cylinder(d=set_screw_diameter, h=knob_diameter/2 + 2, $fn=32); - translate([0, 0, -1]) - cylinder(d=set_screw_cb_diameter, h=set_screw_cb_depth + 1, $fn=32); - } -} - -// Top Pointer Indicator -color(pointer_color) -rotate([0, 0, pointer_angle]) -translate([0, 0, knob_height - 0.05]) -hull() { - // Outer tip - translate([0, knob_diameter/2 - 4, 0]) - cylinder(d=pointer_width/2, h=pointer_height, $fn=32); - // Inner base - translate([0, 4, 0]) - cylinder(d=pointer_width, h=pointer_height, $fn=32); -} \ No newline at end of file diff --git a/CADAM/benchmarks/03-hex-bolt-and-nut.gif b/CADAM/benchmarks/03-hex-bolt-and-nut.gif deleted file mode 100644 index 3b560a9..0000000 Binary files a/CADAM/benchmarks/03-hex-bolt-and-nut.gif and /dev/null differ diff --git a/CADAM/benchmarks/03-hex-bolt-and-nut.md b/CADAM/benchmarks/03-hex-bolt-and-nut.md deleted file mode 100644 index 37f83be..0000000 --- a/CADAM/benchmarks/03-hex-bolt-and-nut.md +++ /dev/null @@ -1,56 +0,0 @@ -# 3 — Hex bolt & nut — real threads - -> **Prompt** -> -> Create an M12 hex bolt 45 mm long with a real threaded shaft and a standard hex head, plus its matching hex nut, placed side by side. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Hex bolt & nut — real threads — orbiting render

- -**Parametric controls:** 3 dimensions · 2 colours - -**What it demonstrates** - -- **Real ISO metric threads** via BOSL2 `screw()` / `nut()` (spec `"M12x1.75"`) — not faked with stacked cylinders -- A complete fastener set: hex bolt + matching hex nut -- Standard spec string drives pitch, head, and thread profile - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `screw_length` | `45` | `[10:1:100]` | Length of the screw shaft | - -
-OpenSCAD source — 03-hex-bolt-and-nut.scad - -```scad -include -include - -/* [Screw Parameters] */ -// The screw size and pitch specification -screw_spec = "M12x1.75"; - -// Length of the screw shaft -screw_length = 45; // [10:1:100] - -/* [Colors] */ -bolt_color = "LightSlateGray"; -nut_color = "LightSlateGray"; - -$fn = 64; - -// Place bolt on the left -translate([-15, 0, 0]) -color(bolt_color) -screw(spec=screw_spec, l=screw_length, head="hex"); - -// Place nut on the right -translate([15, 0, 0]) -color(nut_color) -nut(spec=screw_spec); -``` - -
diff --git a/CADAM/benchmarks/03-hex-bolt-and-nut.scad b/CADAM/benchmarks/03-hex-bolt-and-nut.scad deleted file mode 100644 index 1baa8f6..0000000 --- a/CADAM/benchmarks/03-hex-bolt-and-nut.scad +++ /dev/null @@ -1,25 +0,0 @@ -include -include - -/* [Screw Parameters] */ -// The screw size and pitch specification -screw_spec = "M12x1.75"; - -// Length of the screw shaft -screw_length = 45; // [10:1:100] - -/* [Colors] */ -bolt_color = "LightSlateGray"; -nut_color = "LightSlateGray"; - -$fn = 64; - -// Place bolt on the left -translate([-15, 0, 0]) -color(bolt_color) -screw(spec=screw_spec, l=screw_length, head="hex"); - -// Place nut on the right -translate([15, 0, 0]) -color(nut_color) -nut(spec=screw_spec); diff --git a/CADAM/benchmarks/04-honeycomb-bracket.gif b/CADAM/benchmarks/04-honeycomb-bracket.gif deleted file mode 100644 index 3f08239..0000000 Binary files a/CADAM/benchmarks/04-honeycomb-bracket.gif and /dev/null differ diff --git a/CADAM/benchmarks/04-honeycomb-bracket.md b/CADAM/benchmarks/04-honeycomb-bracket.md deleted file mode 100644 index ff1f7d7..0000000 --- a/CADAM/benchmarks/04-honeycomb-bracket.md +++ /dev/null @@ -1,182 +0,0 @@ -# 4 — Honeycomb lightweight bracket - -> **Prompt** -> -> Design a 90-degree angle mounting bracket with 80x80 mm flanges that are 5 mm thick, lightened with a hexagonal honeycomb cutout pattern on both faces, four M5 mounting holes, and a filleted inside corner. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Honeycomb lightweight bracket — orbiting render

- -**Parametric controls:** 13 dimensions · 1 colour - -**What it demonstrates** - -- Generative hexagonal honeycomb lightening pattern, kept manifold with a solid border frame -- 90° L-bracket with a filleted inner corner for strength -- Four M5 mounting holes - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `flange_length` | `80` | `[40:1:150]` | Length of each flange from the outer corner | -| `bracket_width` | `80` | `[40:1:150]` | Width of the bracket | -| `thickness` | `5` | `[2:1:15]` | Thickness of the flanges | -| `corner_fillet` | `5` | `[1:1:15]` | Radius of the inner corner fillet | -| `hole_dia` | `5.2` | `[2:0.1:10]` | Diameter of the mounting holes (M5 clearance) | -| `hole_boss_dia` | `16` | `[8:1:30]` | Solid boundary diameter around each hole | -| `hole_offset_x` | `45` | `[10:1:100]` | Hole X position (distance from outer corner) | -| `hole_offset_y1` | `20` | `[10:1:100]` | Hole Y1 position (distance from side edge) | -| `hole_offset_y2` | `60` | `[10:1:100]` | Hole Y2 position (distance from side edge) | -| `hex_flat_to_flat` | `12` | `[5:1:30]` | Flat-to-flat inner diameter of each hexagon | -| `hex_wall` | `3` | `[1:0.5:10]` | Wall thickness between hexagons | -| `border_thickness` | `6` | `[2:1:20]` | Solid border thickness around the edges | -| `bracket_color` | `"#4682B4"` | `color` | | - -
-OpenSCAD source — 04-honeycomb-bracket.scad - -```scad -// 90-Degree Mounting Bracket with Honeycomb - -/* [Dimensions] */ -// Length of each flange from the outer corner -flange_length = 80; // [40:1:150] -// Width of the bracket -bracket_width = 80; // [40:1:150] -// Thickness of the flanges -thickness = 5; // [2:1:15] -// Radius of the inner corner fillet -corner_fillet = 5; // [1:1:15] - -/* [Mounting Holes] */ -// Diameter of the mounting holes (M5 clearance) -hole_dia = 5.2; // [2:0.1:10] -// Solid boundary diameter around each hole -hole_boss_dia = 16; // [8:1:30] - -// Hole X position (distance from outer corner) -hole_offset_x = 45; // [10:1:100] -// Hole Y1 position (distance from side edge) -hole_offset_y1 = 20; // [10:1:100] -// Hole Y2 position (distance from side edge) -hole_offset_y2 = 60; // [10:1:100] - -/* [Honeycomb Pattern] */ -// Flat-to-flat inner diameter of each hexagon -hex_flat_to_flat = 12; // [5:1:30] -// Wall thickness between hexagons -hex_wall = 3; // [1:0.5:10] -// Solid border thickness around the edges -border_thickness = 6; // [2:1:20] - -/* [Rendering] */ -bracket_color = "#4682B4"; // color - -$fn = 64; - -// Combine hole positions into an array (4 holes total, 2 per flange) -hole_positions = [ - [hole_offset_x, hole_offset_y1], - [hole_offset_x, hole_offset_y2] -]; - -// Helper module to generate a 2D grid of hexagons -module hex_grid(w, h, d, wall) { - S = d + wall; - dx = S; - dy = S * sin(60); - cols = ceil(w / dx) + 1; - rows = ceil(h / dy) + 1; - for (i = [-1 : cols]) { - for (j = [-1 : rows]) { - x = i * dx + (j % 2) * (dx / 2); - y = j * dy; - translate([x, y]) rotate(30) circle(d = d / cos(30), $fn=6); - } - } -} - -// Generates the 2D masking area to keep borders and bosses solid -module honeycomb_mask() { - difference() { - // Safe inner zone - translate([thickness + corner_fillet + border_thickness, border_thickness]) - square([flange_length - (thickness + corner_fillet + border_thickness * 2), - bracket_width - border_thickness * 2]); - - // Subtract bosses around the mounting holes - for (pos = hole_positions) { - translate(pos) circle(d = hole_boss_dia); - } - } -} - -// The final 2D honeycomb cutout pattern -module honeycomb_cut_2d() { - intersection() { - // Generate full grid slightly larger than needed to ensure coverage - translate([-10, -10]) hex_grid(flange_length + 20, bracket_width + 20, hex_flat_to_flat, hex_wall); - honeycomb_mask(); - } -} - -// 2D L-profile of the bracket -module bracket_profile() { - R_in = corner_fillet; - R_out = thickness + corner_fillet; - C = [thickness + corner_fillet, thickness + corner_fillet]; - - union() { - // Flange 1 right of corner - translate([C.x, 0]) square([flange_length - C.x, thickness]); - // Flange 2 above corner - translate([0, C.y]) square([thickness, flange_length - C.y]); - // Filleted Corner section - intersection() { - square([C.x, C.y]); - translate(C) difference() { - circle(r = R_out); - circle(r = R_in); - } - } - } -} - -// Build the final 3D part -color(bracket_color) -difference() { - // 1. Base solid bracket (L-extrusion) - translate([0, bracket_width, 0]) - rotate([90, 0, 0]) - linear_extrude(bracket_width) - bracket_profile(); - - // 2. Flange 1 holes (Z-axis) - for (pos = hole_positions) { - translate([pos.x, pos.y, -1]) - cylinder(d = hole_dia, h = thickness + 2); - } - - // 3. Flange 2 holes (X-axis) - for (pos = hole_positions) { - translate([-1, pos.y, pos.x]) - rotate([0, 90, 0]) - cylinder(d = hole_dia, h = thickness + 2); - } - - // 4. Flange 1 honeycomb cutout - translate([0, 0, -1]) - linear_extrude(height = thickness + 2) - honeycomb_cut_2d(); - - // 5. Flange 2 honeycomb cutout - translate([thickness + 1, 0, 0]) - rotate([0, -90, 0]) - linear_extrude(height = thickness + 2) - honeycomb_cut_2d(); -} -``` - -
diff --git a/CADAM/benchmarks/04-honeycomb-bracket.scad b/CADAM/benchmarks/04-honeycomb-bracket.scad deleted file mode 100644 index f72acf1..0000000 --- a/CADAM/benchmarks/04-honeycomb-bracket.scad +++ /dev/null @@ -1,139 +0,0 @@ -// 90-Degree Mounting Bracket with Honeycomb - -/* [Dimensions] */ -// Length of each flange from the outer corner -flange_length = 80; // [40:1:150] -// Width of the bracket -bracket_width = 80; // [40:1:150] -// Thickness of the flanges -thickness = 5; // [2:1:15] -// Radius of the inner corner fillet -corner_fillet = 5; // [1:1:15] - -/* [Mounting Holes] */ -// Diameter of the mounting holes (M5 clearance) -hole_dia = 5.2; // [2:0.1:10] -// Solid boundary diameter around each hole -hole_boss_dia = 16; // [8:1:30] - -// Hole X position (distance from outer corner) -hole_offset_x = 45; // [10:1:100] -// Hole Y1 position (distance from side edge) -hole_offset_y1 = 20; // [10:1:100] -// Hole Y2 position (distance from side edge) -hole_offset_y2 = 60; // [10:1:100] - -/* [Honeycomb Pattern] */ -// Flat-to-flat inner diameter of each hexagon -hex_flat_to_flat = 12; // [5:1:30] -// Wall thickness between hexagons -hex_wall = 3; // [1:0.5:10] -// Solid border thickness around the edges -border_thickness = 6; // [2:1:20] - -/* [Rendering] */ -bracket_color = "#4682B4"; // color - -$fn = 64; - -// Combine hole positions into an array (4 holes total, 2 per flange) -hole_positions = [ - [hole_offset_x, hole_offset_y1], - [hole_offset_x, hole_offset_y2] -]; - -// Helper module to generate a 2D grid of hexagons -module hex_grid(w, h, d, wall) { - S = d + wall; - dx = S; - dy = S * sin(60); - cols = ceil(w / dx) + 1; - rows = ceil(h / dy) + 1; - for (i = [-1 : cols]) { - for (j = [-1 : rows]) { - x = i * dx + (j % 2) * (dx / 2); - y = j * dy; - translate([x, y]) rotate(30) circle(d = d / cos(30), $fn=6); - } - } -} - -// Generates the 2D masking area to keep borders and bosses solid -module honeycomb_mask() { - difference() { - // Safe inner zone - translate([thickness + corner_fillet + border_thickness, border_thickness]) - square([flange_length - (thickness + corner_fillet + border_thickness * 2), - bracket_width - border_thickness * 2]); - - // Subtract bosses around the mounting holes - for (pos = hole_positions) { - translate(pos) circle(d = hole_boss_dia); - } - } -} - -// The final 2D honeycomb cutout pattern -module honeycomb_cut_2d() { - intersection() { - // Generate full grid slightly larger than needed to ensure coverage - translate([-10, -10]) hex_grid(flange_length + 20, bracket_width + 20, hex_flat_to_flat, hex_wall); - honeycomb_mask(); - } -} - -// 2D L-profile of the bracket -module bracket_profile() { - R_in = corner_fillet; - R_out = thickness + corner_fillet; - C = [thickness + corner_fillet, thickness + corner_fillet]; - - union() { - // Flange 1 right of corner - translate([C.x, 0]) square([flange_length - C.x, thickness]); - // Flange 2 above corner - translate([0, C.y]) square([thickness, flange_length - C.y]); - // Filleted Corner section - intersection() { - square([C.x, C.y]); - translate(C) difference() { - circle(r = R_out); - circle(r = R_in); - } - } - } -} - -// Build the final 3D part -color(bracket_color) -difference() { - // 1. Base solid bracket (L-extrusion) - translate([0, bracket_width, 0]) - rotate([90, 0, 0]) - linear_extrude(bracket_width) - bracket_profile(); - - // 2. Flange 1 holes (Z-axis) - for (pos = hole_positions) { - translate([pos.x, pos.y, -1]) - cylinder(d = hole_dia, h = thickness + 2); - } - - // 3. Flange 2 holes (X-axis) - for (pos = hole_positions) { - translate([-1, pos.y, pos.x]) - rotate([0, 90, 0]) - cylinder(d = hole_dia, h = thickness + 2); - } - - // 4. Flange 1 honeycomb cutout - translate([0, 0, -1]) - linear_extrude(height = thickness + 2) - honeycomb_cut_2d(); - - // 5. Flange 2 honeycomb cutout - translate([thickness + 1, 0, 0]) - rotate([0, -90, 0]) - linear_extrude(height = thickness + 2) - honeycomb_cut_2d(); -} diff --git a/CADAM/benchmarks/05-naca-airfoil-wing.gif b/CADAM/benchmarks/05-naca-airfoil-wing.gif deleted file mode 100644 index 7ff72d7..0000000 Binary files a/CADAM/benchmarks/05-naca-airfoil-wing.gif and /dev/null differ diff --git a/CADAM/benchmarks/05-naca-airfoil-wing.md b/CADAM/benchmarks/05-naca-airfoil-wing.md deleted file mode 100644 index d9f2629..0000000 --- a/CADAM/benchmarks/05-naca-airfoil-wing.md +++ /dev/null @@ -1,168 +0,0 @@ -# 5 — NACA 2412 tapered wing - -> **Prompt** -> -> Model a tapered aircraft wing section using a real NACA 2412 airfoil: 120 mm root chord tapering to 80 mm tip over a 200 mm span, with two spanwise spar tubes and a few lightening holes. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

NACA 2412 tapered wing — orbiting render

- -**Parametric controls:** 9 dimensions · 1 colour - -**What it demonstrates** - -- A true **NACA 4-digit airfoil** built from the thickness + camber equations (cosine-spaced points) -- Tapered loft from a 120 mm root chord to an 80 mm tip over the span -- Spanwise spar bores and a row of lightening holes - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `root_chord` | `120` | `[50:10:300]` | Tapered Wing Section Parameters | -| `tip_chord` | `80` | `[30:10:200]` | | -| `span` | `200` | `[50:10:500]` | | -| `naca_m` | `0.02` | `[0.00:0.01:0.09]` | First digit (max camber in hundredths) | -| `naca_p` | `0.40` | `[0.10:0.10:0.90]` | Second digit (position of max camber in tenths) | -| `naca_t` | `0.12` | `[0.05:0.01:0.30]` | Last two digits (max thickness in hundredths) | -| `spar_radius` | `4` | `[1:0.5:10]` | | -| `lightening_holes` | `5` | `[0:1:10]` | | -| `wing_color` | `"SteelBlue"` | `[SteelBlue, Silver, Orange, White, DimGray]` | | - -
-OpenSCAD source — 05-naca-airfoil-wing.scad - -```scad -// Tapered Wing Section Parameters -/* [Wing Geometry] */ -root_chord = 120; // [50:10:300] -tip_chord = 80; // [30:10:200] -span = 200; // [50:10:500] - -/* [NACA 4-Digit Profile] */ -// First digit (max camber in hundredths) -naca_m = 0.02; // [0.00:0.01:0.09] -// Second digit (position of max camber in tenths) -naca_p = 0.40; // [0.10:0.10:0.90] -// Last two digits (max thickness in hundredths) -naca_t = 0.12; // [0.05:0.01:0.30] - -/* [Structural Features] */ -spar_radius = 4; // [1:0.5:10] -lightening_holes = 5; // [0:1:10] - -/* [Appearance] */ -wing_color = "SteelBlue"; // [SteelBlue, Silver, Orange, White, DimGray] - -$fn = 64; - -// --- Mathematical Functions for NACA 4-Digit Airfoil --- - -function naca_camber(x, m, p) = - (m == 0 || p == 0) ? 0 : - (x < p) ? (m / pow(p,2)) * (2 * p * x - pow(x,2)) - : (m / pow(1-p,2)) * ((1 - 2*p) + 2 * p * x - pow(x,2)); - -function naca_camber_deriv(x, m, p) = - (m == 0 || p == 0) ? 0 : - (x < p) ? (2 * m / pow(p,2)) * (p - x) - : (2 * m / pow(1-p,2)) * (p - x); - -function naca_points(m, p, t, N=80) = - let ( - upper = [for (i=[0:N]) - let ( - x = 0.5 * (1 - cos(i * 180 / N)), - yt = 5 * t * (0.2969 * sqrt(max(0, x)) - 0.1260 * x - 0.3516 * pow(x,2) + 0.2843 * pow(x,3) - 0.1015 * pow(x,4)), - yc = naca_camber(x, m, p), - dyc = naca_camber_deriv(x, m, p), - theta = atan(dyc) - ) - [x - yt * sin(theta), yc + yt * cos(theta)] - ], - lower = [for (i=[N-1:-1:1]) // Skip duplicate endpoints to form a closed loop - let ( - x = 0.5 * (1 - cos(i * 180 / N)), - yt = 5 * t * (0.2969 * sqrt(max(0, x)) - 0.1260 * x - 0.3516 * pow(x,2) + 0.2843 * pow(x,3) - 0.1015 * pow(x,4)), - yc = naca_camber(x, m, p), - dyc = naca_camber_deriv(x, m, p), - theta = atan(dyc) - ) - [x + yt * sin(theta), yc - yt * cos(theta)] - ] - ) - concat(upper, lower); - - -// --- Modules --- - -// Generates a rounded-end cylinder between two points, safely extended to cut cleanly -module strut(p1, p2, r) { - v = p2 - p1; - ext = 5; - dir = v / norm(v); - p1_ext = p1 - dir * ext; - p2_ext = p2 + dir * ext; - hull() { - translate(p1_ext) sphere(r=r); - translate(p2_ext) sphere(r=r); - } -} - - -// --- Main Geometry Assembly --- - -// Calculate standard spar locations (25% and 70% of chord length) -x_spar1 = 0.25; -x_spar2 = 0.70; - -// Calculate 3D coordinates for the spar tubes to correctly follow the camber and taper -p1_root = [x_spar1 * root_chord, naca_camber(x_spar1, naca_m, naca_p) * root_chord, 0]; -p1_tip = [x_spar1 * tip_chord, naca_camber(x_spar1, naca_m, naca_p) * tip_chord, span]; - -p2_root = [x_spar2 * root_chord, naca_camber(x_spar2, naca_m, naca_p) * root_chord, 0]; -p2_tip = [x_spar2 * tip_chord, naca_camber(x_spar2, naca_m, naca_p) * tip_chord, span]; - - -// Rotate wing to lay "flat" for standard viewing -// (Span extends along +Y, chord along +X, thickness aligns with Z) -color(wing_color) -rotate([-90, 0, 0]) -difference() { - - // Solid Wing Shape - linear_extrude(height = span, scale = tip_chord / root_chord) - scale([root_chord, root_chord]) - polygon(naca_points(naca_m, naca_p, naca_t)); - - // Spanwise Spar Tube Cuts - strut(p1_root, p1_tip, spar_radius); - strut(p2_root, p2_tip, spar_radius); - - // Lightening Hole Cuts (spaced evenly along span) - if (lightening_holes > 0) { - for (i = [1 : lightening_holes]) { - let ( - // Space holes along the span - z_pos = i * span / (lightening_holes + 1), - - // Determine the chord length at this spanwise position - local_chord = root_chord + (tip_chord - root_chord) * (z_pos / span), - - // Position halfway between the two spars - x_pos = 0.475 * local_chord, - - // Make the hole size proportional to the local chord length - hole_r = local_chord * 0.12 - ) - // Cut through the airfoil thickness (Y axis in the unrotated frame) - translate([x_pos, 0, z_pos]) - rotate([90, 0, 0]) - cylinder(h=root_chord * 2, r=hole_r, center=true); - } - } -} -``` - -
diff --git a/CADAM/benchmarks/05-naca-airfoil-wing.scad b/CADAM/benchmarks/05-naca-airfoil-wing.scad deleted file mode 100644 index e346185..0000000 --- a/CADAM/benchmarks/05-naca-airfoil-wing.scad +++ /dev/null @@ -1,129 +0,0 @@ -// Tapered Wing Section Parameters -/* [Wing Geometry] */ -root_chord = 120; // [50:10:300] -tip_chord = 80; // [30:10:200] -span = 200; // [50:10:500] - -/* [NACA 4-Digit Profile] */ -// First digit (max camber in hundredths) -naca_m = 0.02; // [0.00:0.01:0.09] -// Second digit (position of max camber in tenths) -naca_p = 0.40; // [0.10:0.10:0.90] -// Last two digits (max thickness in hundredths) -naca_t = 0.12; // [0.05:0.01:0.30] - -/* [Structural Features] */ -spar_radius = 4; // [1:0.5:10] -lightening_holes = 5; // [0:1:10] - -/* [Appearance] */ -wing_color = "SteelBlue"; // [SteelBlue, Silver, Orange, White, DimGray] - -$fn = 64; - -// --- Mathematical Functions for NACA 4-Digit Airfoil --- - -function naca_camber(x, m, p) = - (m == 0 || p == 0) ? 0 : - (x < p) ? (m / pow(p,2)) * (2 * p * x - pow(x,2)) - : (m / pow(1-p,2)) * ((1 - 2*p) + 2 * p * x - pow(x,2)); - -function naca_camber_deriv(x, m, p) = - (m == 0 || p == 0) ? 0 : - (x < p) ? (2 * m / pow(p,2)) * (p - x) - : (2 * m / pow(1-p,2)) * (p - x); - -function naca_points(m, p, t, N=80) = - let ( - upper = [for (i=[0:N]) - let ( - x = 0.5 * (1 - cos(i * 180 / N)), - yt = 5 * t * (0.2969 * sqrt(max(0, x)) - 0.1260 * x - 0.3516 * pow(x,2) + 0.2843 * pow(x,3) - 0.1015 * pow(x,4)), - yc = naca_camber(x, m, p), - dyc = naca_camber_deriv(x, m, p), - theta = atan(dyc) - ) - [x - yt * sin(theta), yc + yt * cos(theta)] - ], - lower = [for (i=[N-1:-1:1]) // Skip duplicate endpoints to form a closed loop - let ( - x = 0.5 * (1 - cos(i * 180 / N)), - yt = 5 * t * (0.2969 * sqrt(max(0, x)) - 0.1260 * x - 0.3516 * pow(x,2) + 0.2843 * pow(x,3) - 0.1015 * pow(x,4)), - yc = naca_camber(x, m, p), - dyc = naca_camber_deriv(x, m, p), - theta = atan(dyc) - ) - [x + yt * sin(theta), yc - yt * cos(theta)] - ] - ) - concat(upper, lower); - - -// --- Modules --- - -// Generates a rounded-end cylinder between two points, safely extended to cut cleanly -module strut(p1, p2, r) { - v = p2 - p1; - ext = 5; - dir = v / norm(v); - p1_ext = p1 - dir * ext; - p2_ext = p2 + dir * ext; - hull() { - translate(p1_ext) sphere(r=r); - translate(p2_ext) sphere(r=r); - } -} - - -// --- Main Geometry Assembly --- - -// Calculate standard spar locations (25% and 70% of chord length) -x_spar1 = 0.25; -x_spar2 = 0.70; - -// Calculate 3D coordinates for the spar tubes to correctly follow the camber and taper -p1_root = [x_spar1 * root_chord, naca_camber(x_spar1, naca_m, naca_p) * root_chord, 0]; -p1_tip = [x_spar1 * tip_chord, naca_camber(x_spar1, naca_m, naca_p) * tip_chord, span]; - -p2_root = [x_spar2 * root_chord, naca_camber(x_spar2, naca_m, naca_p) * root_chord, 0]; -p2_tip = [x_spar2 * tip_chord, naca_camber(x_spar2, naca_m, naca_p) * tip_chord, span]; - - -// Rotate wing to lay "flat" for standard viewing -// (Span extends along +Y, chord along +X, thickness aligns with Z) -color(wing_color) -rotate([-90, 0, 0]) -difference() { - - // Solid Wing Shape - linear_extrude(height = span, scale = tip_chord / root_chord) - scale([root_chord, root_chord]) - polygon(naca_points(naca_m, naca_p, naca_t)); - - // Spanwise Spar Tube Cuts - strut(p1_root, p1_tip, spar_radius); - strut(p2_root, p2_tip, spar_radius); - - // Lightening Hole Cuts (spaced evenly along span) - if (lightening_holes > 0) { - for (i = [1 : lightening_holes]) { - let ( - // Space holes along the span - z_pos = i * span / (lightening_holes + 1), - - // Determine the chord length at this spanwise position - local_chord = root_chord + (tip_chord - root_chord) * (z_pos / span), - - // Position halfway between the two spars - x_pos = 0.475 * local_chord, - - // Make the hole size proportional to the local chord length - hole_r = local_chord * 0.12 - ) - // Cut through the airfoil thickness (Y axis in the unrotated frame) - translate([x_pos, 0, z_pos]) - rotate([90, 0, 0]) - cylinder(h=root_chord * 2, r=hole_r, center=true); - } - } -} diff --git a/CADAM/benchmarks/06-threaded-jar-and-lid.gif b/CADAM/benchmarks/06-threaded-jar-and-lid.gif deleted file mode 100644 index 6425913..0000000 Binary files a/CADAM/benchmarks/06-threaded-jar-and-lid.gif and /dev/null differ diff --git a/CADAM/benchmarks/06-threaded-jar-and-lid.md b/CADAM/benchmarks/06-threaded-jar-and-lid.md deleted file mode 100644 index 158ac0c..0000000 --- a/CADAM/benchmarks/06-threaded-jar-and-lid.md +++ /dev/null @@ -1,115 +0,0 @@ -# 6 — Threaded jar & screw-on lid - -> **Prompt** -> -> Create a small storage jar with external screw threads at the neck and a matching screw-on lid with internal threads. Jar body 60 mm diameter, 70 mm tall, 2.5 mm walls; show the lid unscrewed and sitting beside the jar. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Threaded jar & screw-on lid — orbiting render

- -**Parametric controls:** 9 dimensions · 2 colours - -**What it demonstrates** - -- Two **mating** threaded parts that share a pitch and diameter (external neck thread + internal lid thread) via BOSL2 threading -- Hollow jar body with printable walls -- Lid with a fluted grip rim, shown unscrewed beside the jar - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `jar_diameter` | `60` | `[20:1:100]` | | -| `jar_height` | `70` | `[20:1:200]` | | -| `wall_thickness` | `2.5` | `[1:0.1:5]` | | -| `neck_diameter` | `55` | `[20:1:100]` | | -| `neck_height` | `15` | `[5:1:30]` | | -| `thread_pitch` | `3` | `[1:0.5:5]` | | -| `lid_clearance` | `0.5` | `[0:0.1:2]` | | - -
-OpenSCAD source — 06-threaded-jar-and-lid.scad - -```scad -include -include - -/* [Jar Dimensions] */ -jar_diameter = 60; // [20:1:100] -jar_height = 70; // [20:1:200] -wall_thickness = 2.5; // [1:0.1:5] - -/* [Neck and Threading] */ -neck_diameter = 55; // [20:1:100] -neck_height = 15; // [5:1:30] -thread_pitch = 3; // [1:0.5:5] -lid_clearance = 0.5; // [0:0.1:2] - -/* [Colors] */ -jar_color = "LightSkyBlue"; -lid_color = "SteelBlue"; - -$fn = 64; - -shoulder_height = 5; -body_height = jar_height - neck_height - shoulder_height; - -// Position jar -translate([-35, 0, 0]) -color(jar_color) -difference() { - // Solid exterior - union() { - // Body - cylinder(d=jar_diameter, h=body_height); - // Shoulder - translate([0, 0, body_height]) - cylinder(d1=jar_diameter, d2=neck_diameter, h=shoulder_height); - // Neck - translate([0, 0, body_height + shoulder_height]) - threaded_rod(d=neck_diameter, l=neck_height, pitch=thread_pitch, anchor=BOTTOM); - } - - // Hollow interior - union() { - // Body interior - translate([0, 0, wall_thickness]) - cylinder(d=jar_diameter - 2 * wall_thickness, h=body_height - wall_thickness + 0.01); - - // Shoulder interior - translate([0, 0, body_height]) - cylinder(d1=jar_diameter - 2 * wall_thickness, d2=neck_diameter - 2 * wall_thickness, h=shoulder_height + 0.01); - - // Neck interior - translate([0, 0, body_height + shoulder_height]) - cylinder(d=neck_diameter - 2 * wall_thickness, h=neck_height + 1); - } -} - -// Position lid beside the jar, upside down to show internal threads -translate([35, 0, neck_height + wall_thickness]) -rotate([180, 0, 0]) -color(lid_color) -difference() { - lid_outer_d = neck_diameter + 2 * wall_thickness + 2 * lid_clearance + 2; - - // Lid exterior with grips - difference() { - cylinder(d=lid_outer_d, h=neck_height + wall_thickness); - - // Grips - for (i = [0 : 15 : 359]) { - rotate([0, 0, i]) - translate([lid_outer_d/2, 0, -1]) - cylinder(r=1.5, h=neck_height + wall_thickness + 2, $fn=16); - } - } - - // Internal threads cutout - translate([0, 0, -0.1]) - threaded_rod(d=neck_diameter + lid_clearance, l=neck_height + 0.2, pitch=thread_pitch, anchor=BOTTOM, internal=true); -} -``` - -
diff --git a/CADAM/benchmarks/06-threaded-jar-and-lid.scad b/CADAM/benchmarks/06-threaded-jar-and-lid.scad deleted file mode 100644 index fe8b970..0000000 --- a/CADAM/benchmarks/06-threaded-jar-and-lid.scad +++ /dev/null @@ -1,78 +0,0 @@ -include -include - -/* [Jar Dimensions] */ -jar_diameter = 60; // [20:1:100] -jar_height = 70; // [20:1:200] -wall_thickness = 2.5; // [1:0.1:5] - -/* [Neck and Threading] */ -neck_diameter = 55; // [20:1:100] -neck_height = 15; // [5:1:30] -thread_pitch = 3; // [1:0.5:5] -lid_clearance = 0.5; // [0:0.1:2] - -/* [Colors] */ -jar_color = "LightSkyBlue"; -lid_color = "SteelBlue"; - -$fn = 64; - -shoulder_height = 5; -body_height = jar_height - neck_height - shoulder_height; - -// Position jar -translate([-35, 0, 0]) -color(jar_color) -difference() { - // Solid exterior - union() { - // Body - cylinder(d=jar_diameter, h=body_height); - // Shoulder - translate([0, 0, body_height]) - cylinder(d1=jar_diameter, d2=neck_diameter, h=shoulder_height); - // Neck - translate([0, 0, body_height + shoulder_height]) - threaded_rod(d=neck_diameter, l=neck_height, pitch=thread_pitch, anchor=BOTTOM); - } - - // Hollow interior - union() { - // Body interior - translate([0, 0, wall_thickness]) - cylinder(d=jar_diameter - 2 * wall_thickness, h=body_height - wall_thickness + 0.01); - - // Shoulder interior - translate([0, 0, body_height]) - cylinder(d1=jar_diameter - 2 * wall_thickness, d2=neck_diameter - 2 * wall_thickness, h=shoulder_height + 0.01); - - // Neck interior - translate([0, 0, body_height + shoulder_height]) - cylinder(d=neck_diameter - 2 * wall_thickness, h=neck_height + 1); - } -} - -// Position lid beside the jar, upside down to show internal threads -translate([35, 0, neck_height + wall_thickness]) -rotate([180, 0, 0]) -color(lid_color) -difference() { - lid_outer_d = neck_diameter + 2 * wall_thickness + 2 * lid_clearance + 2; - - // Lid exterior with grips - difference() { - cylinder(d=lid_outer_d, h=neck_height + wall_thickness); - - // Grips - for (i = [0 : 15 : 359]) { - rotate([0, 0, i]) - translate([lid_outer_d/2, 0, -1]) - cylinder(r=1.5, h=neck_height + wall_thickness + 2, $fn=16); - } - } - - // Internal threads cutout - translate([0, 0, -0.1]) - threaded_rod(d=neck_diameter + lid_clearance, l=neck_height + 0.2, pitch=thread_pitch, anchor=BOTTOM, internal=true); -} \ No newline at end of file diff --git a/CADAM/benchmarks/07-bevel-gear-drive.gif b/CADAM/benchmarks/07-bevel-gear-drive.gif deleted file mode 100644 index dc8eadb..0000000 Binary files a/CADAM/benchmarks/07-bevel-gear-drive.gif and /dev/null differ diff --git a/CADAM/benchmarks/07-bevel-gear-drive.md b/CADAM/benchmarks/07-bevel-gear-drive.md deleted file mode 100644 index 127c42e..0000000 --- a/CADAM/benchmarks/07-bevel-gear-drive.md +++ /dev/null @@ -1,98 +0,0 @@ -# 7 — Right-angle bevel gear drive - -> **Prompt** -> -> Build a right-angle bevel gear drive: a 24-tooth bevel gear on a vertical shaft meshing at 90 degrees with a 16-tooth bevel pinion on a horizontal shaft, each on a short stub shaft. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Right-angle bevel gear drive — orbiting render

- -**Parametric controls:** 9 dimensions · 3 colours - -**What it demonstrates** - -- A meshing **bevel gear pair** at 90° via BOSL2 `bevel_gear()` with matched pitch cones -- 24-tooth gear + 16-tooth pinion, each on a stub shaft -- Three colours for gear / pinion / shafts - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `gear1_teeth` | `24` | `[10:1:60]` | | -| `gear2_teeth` | `16` | `[10:1:60]` | | -| `circular_pitch` | `5` | `[2:0.5:10]` | | -| `face_width` | `8` | `[4:1:20]` | | -| `bore_diameter` | `5` | `[2:0.5:20]` | | -| `shaft_length` | `30` | `[10:1:50]` | | -| `shaft_diameter` | `5` | `[2:0.5:20]` | | -| `gear2_spin` | `11.25` | `[0:0.1:45]` | | - -
-OpenSCAD source — 07-bevel-gear-drive.scad - -```scad -include -include - -/* [Gear Specifications] */ -gear1_teeth = 24; // [10:1:60] -gear2_teeth = 16; // [10:1:60] -circular_pitch = 5; // [2:0.5:10] -face_width = 8; // [4:1:20] -bore_diameter = 5; // [2:0.5:20] -shaft_length = 30; // [10:1:50] -shaft_diameter = 5; // [2:0.5:20] -gear2_spin = 11.25; // [0:0.1:45] - -/* [Colors] */ -gear1_color = "SteelBlue"; -gear2_color = "DarkOrange"; -shaft_color = "Silver"; - -$fn = 64; - -module gear_system() { - // Gear 1: Vertical (Z-axis) - color(gear1_color) - bevel_gear( - circ_pitch = circular_pitch, - teeth = gear1_teeth, - mate_teeth = gear2_teeth, - face_width = face_width, - bore = bore_diameter, - spiral = 0, - anchor = "apex" - ); - - // Vertical Shaft - color(shaft_color) - translate([0, 0, -shaft_length/2]) - cylinder(h=shaft_length, d=shaft_diameter, center=true); - - // Gear 2: Horizontal (X-axis) - color(gear2_color) - rotate([0, 90, 0]) - rotate([0, 0, gear2_spin]) // Fine-tune tooth meshing - bevel_gear( - circ_pitch = circular_pitch, - teeth = gear2_teeth, - mate_teeth = gear1_teeth, - face_width = face_width, - bore = bore_diameter, - spiral = 0, - anchor = "apex" - ); - - // Horizontal Shaft - color(shaft_color) - rotate([0, 90, 0]) - translate([0, 0, -shaft_length/2]) - cylinder(h=shaft_length, d=shaft_diameter, center=true); -} - -gear_system(); -``` - -
diff --git a/CADAM/benchmarks/07-bevel-gear-drive.scad b/CADAM/benchmarks/07-bevel-gear-drive.scad deleted file mode 100644 index 46e71f7..0000000 --- a/CADAM/benchmarks/07-bevel-gear-drive.scad +++ /dev/null @@ -1,60 +0,0 @@ -include -include - -/* [Gear Specifications] */ -gear1_teeth = 24; // [10:1:60] -gear2_teeth = 16; // [10:1:60] -circular_pitch = 5; // [2:0.5:10] -face_width = 8; // [4:1:20] -bore_diameter = 5; // [2:0.5:20] -shaft_length = 30; // [10:1:50] -shaft_diameter = 5; // [2:0.5:20] -gear2_spin = 11.25; // [0:0.1:45] - -/* [Colors] */ -gear1_color = "SteelBlue"; -gear2_color = "DarkOrange"; -shaft_color = "Silver"; - -$fn = 64; - -module gear_system() { - // Gear 1: Vertical (Z-axis) - color(gear1_color) - bevel_gear( - circ_pitch = circular_pitch, - teeth = gear1_teeth, - mate_teeth = gear2_teeth, - face_width = face_width, - bore = bore_diameter, - spiral = 0, - anchor = "apex" - ); - - // Vertical Shaft - color(shaft_color) - translate([0, 0, -shaft_length/2]) - cylinder(h=shaft_length, d=shaft_diameter, center=true); - - // Gear 2: Horizontal (X-axis) - color(gear2_color) - rotate([0, 90, 0]) - rotate([0, 0, gear2_spin]) // Fine-tune tooth meshing - bevel_gear( - circ_pitch = circular_pitch, - teeth = gear2_teeth, - mate_teeth = gear1_teeth, - face_width = face_width, - bore = bore_diameter, - spiral = 0, - anchor = "apex" - ); - - // Horizontal Shaft - color(shaft_color) - rotate([0, 90, 0]) - translate([0, 0, -shaft_length/2]) - cylinder(h=shaft_length, d=shaft_diameter, center=true); -} - -gear_system(); diff --git a/CADAM/benchmarks/08-centrifugal-impeller.gif b/CADAM/benchmarks/08-centrifugal-impeller.gif deleted file mode 100644 index 3fbe965..0000000 Binary files a/CADAM/benchmarks/08-centrifugal-impeller.gif and /dev/null differ diff --git a/CADAM/benchmarks/08-centrifugal-impeller.md b/CADAM/benchmarks/08-centrifugal-impeller.md deleted file mode 100644 index 2bf1597..0000000 --- a/CADAM/benchmarks/08-centrifugal-impeller.md +++ /dev/null @@ -1,123 +0,0 @@ -# 8 — Centrifugal pump impeller - -> **Prompt** -> -> Design a centrifugal pump impeller: a 90 mm diameter back-plate with a central 12 mm bore and a raised hub, and seven backward-curved blades that sweep from the hub out to the rim, each blade curving smoothly along its path. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Centrifugal pump impeller — orbiting render

- -**Parametric controls:** 10 dimensions · 1 colour - -**What it demonstrates** - -- Seven **backward-curved blades** swept along curved paths (BOSL2) in a clean radial array -- Raised central hub with a 12 mm bore on a circular back-plate -- Smooth turbomachinery surfaces, fused manifold to the plate - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `impeller_diameter` | `90` | `[50:1:150]` | Outer diameter of the impeller back-plate | -| `bore_diameter` | `12` | `[4:0.5:30]` | Diameter of the central bore hole | -| `backplate_thickness` | `3` | `[1:0.5:10]` | Thickness of the main back-plate | -| `hub_diameter` | `26` | `[15:1:50]` | Outer diameter of the raised central hub | -| `hub_height` | `20` | `[10:1:60]` | Total height of the hub from the bottom of the back-plate | -| `blade_count` | `7` | `[3:1:15]` | Number of backward-curved blades | -| `blade_height` | `12` | `[2:1:40]` | Height of the blades above the back-plate | -| `blade_thickness` | `3` | `[1:0.5:8]` | Thickness of each blade | -| `sweep_angle` | `75` | `[10:1:180]` | The angle (in degrees) that the blades sweep backwards | -| `part_color` | `"#B0C4DE"` | `LightSteelBlue` | | -| `steps` | `48` | `Curve resolution` | | - -
-OpenSCAD source — 08-centrifugal-impeller.scad - -```scad -include - -/* [Main Dimensions] */ -// Outer diameter of the impeller back-plate -impeller_diameter = 90; // [50:1:150] - -// Diameter of the central bore hole -bore_diameter = 12; // [4:0.5:30] - -// Thickness of the main back-plate -backplate_thickness = 3; // [1:0.5:10] - -/* [Hub Dimensions] */ -// Outer diameter of the raised central hub -hub_diameter = 26; // [15:1:50] - -// Total height of the hub from the bottom of the back-plate -hub_height = 20; // [10:1:60] - -/* [Blade Parameters] */ -// Number of backward-curved blades -blade_count = 7; // [3:1:15] - -// Height of the blades above the back-plate -blade_height = 12; // [2:1:40] - -// Thickness of each blade -blade_thickness = 3; // [1:0.5:8] - -// The angle (in degrees) that the blades sweep backwards -sweep_angle = 75; // [10:1:180] - -/* [Appearance] */ -part_color = "#B0C4DE"; // LightSteelBlue - -$fn = 64; - -module centrifugal_impeller() { - difference() { - union() { - // Back-plate - cyl(d=impeller_diameter, l=backplate_thickness, chamfer1=1, anchor=BOTTOM); - - // Raised Hub - cyl(d=hub_diameter, l=hub_height, chamfer2=1.5, anchor=BOTTOM); - - // Blades (logarithmic spiral for constant incidence angle) - // Inner radius overlaps the hub slightly to ensure a solid union - blade_inner_r = (hub_diameter / 2) - 0.5; - // Outer radius stops slightly short of the rim so the round endcaps don't overhang - blade_outer_r = (impeller_diameter / 2) - (blade_thickness / 2); - - steps = 48; // Curve resolution - - // Calculate the 2D path of the sweeping blade - pts = [ - for(i = [0 : steps]) - let( - t = i / steps, - r = blade_inner_r * pow(blade_outer_r / blade_inner_r, t), - a = -sweep_angle * t - ) - [r * cos(a), r * sin(a)] - ]; - - // Distribute and extrude the 7 blades - for(i = [0 : blade_count - 1]) { - zrot(i * 360 / blade_count) - up(backplate_thickness) - linear_extrude(height = blade_height) - stroke(pts, width=blade_thickness, endcaps="round"); - } - } - - // Central Bore (subtracted at the end to ensure a clean hole through hub and blades) - down(1) - cyl(d=bore_diameter, l=hub_height + 2, anchor=BOTTOM); - } -} - -color(part_color) -centrifugal_impeller(); -``` - -
diff --git a/CADAM/benchmarks/08-centrifugal-impeller.scad b/CADAM/benchmarks/08-centrifugal-impeller.scad deleted file mode 100644 index 280c4ac..0000000 --- a/CADAM/benchmarks/08-centrifugal-impeller.scad +++ /dev/null @@ -1,82 +0,0 @@ -include - -/* [Main Dimensions] */ -// Outer diameter of the impeller back-plate -impeller_diameter = 90; // [50:1:150] - -// Diameter of the central bore hole -bore_diameter = 12; // [4:0.5:30] - -// Thickness of the main back-plate -backplate_thickness = 3; // [1:0.5:10] - -/* [Hub Dimensions] */ -// Outer diameter of the raised central hub -hub_diameter = 26; // [15:1:50] - -// Total height of the hub from the bottom of the back-plate -hub_height = 20; // [10:1:60] - -/* [Blade Parameters] */ -// Number of backward-curved blades -blade_count = 7; // [3:1:15] - -// Height of the blades above the back-plate -blade_height = 12; // [2:1:40] - -// Thickness of each blade -blade_thickness = 3; // [1:0.5:8] - -// The angle (in degrees) that the blades sweep backwards -sweep_angle = 75; // [10:1:180] - -/* [Appearance] */ -part_color = "#B0C4DE"; // LightSteelBlue - -$fn = 64; - -module centrifugal_impeller() { - difference() { - union() { - // Back-plate - cyl(d=impeller_diameter, l=backplate_thickness, chamfer1=1, anchor=BOTTOM); - - // Raised Hub - cyl(d=hub_diameter, l=hub_height, chamfer2=1.5, anchor=BOTTOM); - - // Blades (logarithmic spiral for constant incidence angle) - // Inner radius overlaps the hub slightly to ensure a solid union - blade_inner_r = (hub_diameter / 2) - 0.5; - // Outer radius stops slightly short of the rim so the round endcaps don't overhang - blade_outer_r = (impeller_diameter / 2) - (blade_thickness / 2); - - steps = 48; // Curve resolution - - // Calculate the 2D path of the sweeping blade - pts = [ - for(i = [0 : steps]) - let( - t = i / steps, - r = blade_inner_r * pow(blade_outer_r / blade_inner_r, t), - a = -sweep_angle * t - ) - [r * cos(a), r * sin(a)] - ]; - - // Distribute and extrude the 7 blades - for(i = [0 : blade_count - 1]) { - zrot(i * 360 / blade_count) - up(backplate_thickness) - linear_extrude(height = blade_height) - stroke(pts, width=blade_thickness, endcaps="round"); - } - } - - // Central Bore (subtracted at the end to ensure a clean hole through hub and blades) - down(1) - cyl(d=bore_diameter, l=hub_height + 2, anchor=BOTTOM); - } -} - -color(part_color) -centrifugal_impeller(); \ No newline at end of file diff --git a/CADAM/benchmarks/09-herringbone-planetary-gearbox.gif b/CADAM/benchmarks/09-herringbone-planetary-gearbox.gif deleted file mode 100644 index 9873a9a..0000000 Binary files a/CADAM/benchmarks/09-herringbone-planetary-gearbox.gif and /dev/null differ diff --git a/CADAM/benchmarks/09-herringbone-planetary-gearbox.md b/CADAM/benchmarks/09-herringbone-planetary-gearbox.md deleted file mode 100644 index 6a5579f..0000000 --- a/CADAM/benchmarks/09-herringbone-planetary-gearbox.md +++ /dev/null @@ -1,190 +0,0 @@ -# 9 — Herringbone planetary gear stage - -> **Prompt** -> -> Model a herringbone planetary gear stage at module 1.5: a central sun gear with 18 teeth, three planet gears with 18 teeth each meshing around it, an internal ring gear with 54 teeth, and a carrier plate linking the three planet axles. Color the sun, planets, ring, and carrier differently. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Herringbone planetary gear stage — orbiting render

- -**Parametric controls:** 10 dimensions · 4 colours - -**What it demonstrates** - -- A full **epicyclic assembly**: sun gear + three planets + an internal ring gear + a carrier plate -- **Herringbone** teeth on every gear; ring teeth = sun + 2 × planet (54) -- Four distinct colours for sun / planets / ring / carrier - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `gear_module` | `1.5` | `[1:0.1:3]` | | -| `gear_thickness` | `10` | `[5:1:20]` | | -| `sun_twist` | `10` | `[0:1:30]` | | -| `sun_bore` | `6` | `[3:0.5:10]` | | -| `planet_bore` | `6` | `[3:0.5:10]` | | - -
-OpenSCAD source — 09-herringbone-planetary-gearbox.scad - -```scad -// Title: Herringbone Planetary Gear Stage -// Description: A robust, manifold module 1.5 planetary gear stage with herringbone teeth, carrier plate, and custom colors. -// Version: v4 - -use - -PI_VAL = 3.141592653589793; - -/* [Gear Parameters] */ -gear_module = 1.5; // [1:0.1:3] -gear_thickness = 10; // [5:1:20] -sun_twist = 10; // [0:1:30] -sun_bore = 6; // [3:0.5:10] -planet_bore = 6; // [3:0.5:10] - -/* [Colors] */ -sun_color = "Gold"; -planet_color = "Tomato"; -ring_color = "SteelBlue"; -carrier_color = "Silver"; - -/* [Calculated Constants] */ -sun_teeth = 18; -planet_teeth = 18; -ring_teeth = 54; -pitch_sun = gear_module * sun_teeth / 2; -pitch_planet = gear_module * planet_teeth / 2; -pitch_ring = gear_module * ring_teeth / 2; -center_distance = pitch_sun + pitch_planet; - -$fn = 64; - -// ============================== -// Modules -// ============================== - -module single_gear(teeth, mod, half_t, t_angle) { - gear( - number_of_teeth = teeth, - circular_pitch = PI_VAL * mod, - pressure_angle = 20, - clearance = 0.25, - gear_thickness = half_t, - rim_thickness = half_t, - hub_thickness = half_t, - bore_diameter = 0, - twist = t_angle - ); -} - -module herringbone_gear_base(mod, teeth, thickness, base_twist, is_planet) { - half_t = thickness / 2; - // Maintain constant helix angle across different gear sizes - t_angle = (base_twist * 18 / teeth) * (is_planet ? -1 : 1); - - union() { - single_gear(teeth, mod, half_t, t_angle); - - translate([0, 0, thickness]) - mirror([0, 0, 1]) - single_gear(teeth, mod, half_t, t_angle); - } -} - -module hb_gear(teeth, is_planet=false, bore=0) { - difference() { - herringbone_gear_base(gear_module, teeth, gear_thickness, sun_twist, is_planet); - if (bore > 0) { - translate([0, 0, -1]) - cylinder(r=bore/2, h=gear_thickness+2, $fn=32); - } - } -} - -module ring_gear() { - outer_radius = pitch_ring + 4 * gear_module; - - // Shift slightly to prevent Z-fighting at top and bottom - translate([0, 0, 0.01]) - difference() { - union() { - cylinder(r=outer_radius, h=gear_thickness - 0.02, $fn=128); - // Outer grip ridges - for(i=[0:10:359]) { - rotate([0, 0, i]) - translate([outer_radius, 0, 0]) - cylinder(r=gear_module, h=gear_thickness - 0.02, $fn=16); - } - } - - // Subtract a slightly scaled herringbone gear to form the internal teeth with clearance - translate([0, 0, -0.01]) - scale([1.015, 1.015, 1]) - rotate([0, 0, 360 / ring_teeth / 2]) // half tooth phase shift - herringbone_gear_base(gear_module, ring_teeth, gear_thickness, sun_twist, is_planet=true); - } -} - -module carrier() { - // Carrier plate positioned slightly above the gears - translate([0, 0, gear_thickness + 0.5]) - difference() { - union() { - // Main carrier disc - cylinder(r=center_distance + 8, h=3, $fn=64); - - // Pins connecting the planet gears - for(i=[0:120:359]) { - rotate([0, 0, i]) - translate([center_distance, 0, -gear_thickness - 0.1]) - cylinder(r=planet_bore/2 - 0.2, h=gear_thickness + 1.1, $fn=32); - } - - // Central pin acting as sun bearing - translate([0, 0, -gear_thickness - 0.1]) - cylinder(r=sun_bore/2 - 0.2, h=gear_thickness + 1.1, $fn=32); - } - - // Aesthetic weight-saving cutouts - for(i=[0:60:359]) { - rotate([0, 0, i + 30]) - translate([center_distance * 0.55, 0, -1]) - cylinder(r=6, h=5, $fn=32); - } - - // Central hole through the carrier shaft - translate([0, 0, -gear_thickness - 0.2]) - cylinder(r=sun_bore/2 - 1.5, h=gear_thickness + 5, $fn=16); - } -} - -// ============================== -// Assembly -// ============================== - -// Central Sun Gear -color(sun_color) -hb_gear(sun_teeth, is_planet=false, bore=sun_bore); - -// Planet Gears (x3) -color(planet_color) -for(i=[0:120:359]) { - rotate([0, 0, i]) - translate([center_distance, 0, 0]) - rotate([0, 0, 360 / planet_teeth / 2]) // Phase shift by half tooth for perfect meshing - hb_gear(planet_teeth, is_planet=true, bore=planet_bore); -} - -// Internal Ring Gear -color(ring_color) -ring_gear(); - -// Carrier Plate -color(carrier_color) -carrier(); -``` - -
diff --git a/CADAM/benchmarks/09-herringbone-planetary-gearbox.scad b/CADAM/benchmarks/09-herringbone-planetary-gearbox.scad deleted file mode 100644 index 3fa9693..0000000 --- a/CADAM/benchmarks/09-herringbone-planetary-gearbox.scad +++ /dev/null @@ -1,155 +0,0 @@ -// Title: Herringbone Planetary Gear Stage -// Description: A robust, manifold module 1.5 planetary gear stage with herringbone teeth, carrier plate, and custom colors. -// Version: v4 - -use - -PI_VAL = 3.141592653589793; - -/* [Gear Parameters] */ -gear_module = 1.5; // [1:0.1:3] -gear_thickness = 10; // [5:1:20] -sun_twist = 10; // [0:1:30] -sun_bore = 6; // [3:0.5:10] -planet_bore = 6; // [3:0.5:10] - -/* [Colors] */ -sun_color = "Gold"; -planet_color = "Tomato"; -ring_color = "SteelBlue"; -carrier_color = "Silver"; - -/* [Calculated Constants] */ -sun_teeth = 18; -planet_teeth = 18; -ring_teeth = 54; -pitch_sun = gear_module * sun_teeth / 2; -pitch_planet = gear_module * planet_teeth / 2; -pitch_ring = gear_module * ring_teeth / 2; -center_distance = pitch_sun + pitch_planet; - -$fn = 64; - -// ============================== -// Modules -// ============================== - -module single_gear(teeth, mod, half_t, t_angle) { - gear( - number_of_teeth = teeth, - circular_pitch = PI_VAL * mod, - pressure_angle = 20, - clearance = 0.25, - gear_thickness = half_t, - rim_thickness = half_t, - hub_thickness = half_t, - bore_diameter = 0, - twist = t_angle - ); -} - -module herringbone_gear_base(mod, teeth, thickness, base_twist, is_planet) { - half_t = thickness / 2; - // Maintain constant helix angle across different gear sizes - t_angle = (base_twist * 18 / teeth) * (is_planet ? -1 : 1); - - union() { - single_gear(teeth, mod, half_t, t_angle); - - translate([0, 0, thickness]) - mirror([0, 0, 1]) - single_gear(teeth, mod, half_t, t_angle); - } -} - -module hb_gear(teeth, is_planet=false, bore=0) { - difference() { - herringbone_gear_base(gear_module, teeth, gear_thickness, sun_twist, is_planet); - if (bore > 0) { - translate([0, 0, -1]) - cylinder(r=bore/2, h=gear_thickness+2, $fn=32); - } - } -} - -module ring_gear() { - outer_radius = pitch_ring + 4 * gear_module; - - // Shift slightly to prevent Z-fighting at top and bottom - translate([0, 0, 0.01]) - difference() { - union() { - cylinder(r=outer_radius, h=gear_thickness - 0.02, $fn=128); - // Outer grip ridges - for(i=[0:10:359]) { - rotate([0, 0, i]) - translate([outer_radius, 0, 0]) - cylinder(r=gear_module, h=gear_thickness - 0.02, $fn=16); - } - } - - // Subtract a slightly scaled herringbone gear to form the internal teeth with clearance - translate([0, 0, -0.01]) - scale([1.015, 1.015, 1]) - rotate([0, 0, 360 / ring_teeth / 2]) // half tooth phase shift - herringbone_gear_base(gear_module, ring_teeth, gear_thickness, sun_twist, is_planet=true); - } -} - -module carrier() { - // Carrier plate positioned slightly above the gears - translate([0, 0, gear_thickness + 0.5]) - difference() { - union() { - // Main carrier disc - cylinder(r=center_distance + 8, h=3, $fn=64); - - // Pins connecting the planet gears - for(i=[0:120:359]) { - rotate([0, 0, i]) - translate([center_distance, 0, -gear_thickness - 0.1]) - cylinder(r=planet_bore/2 - 0.2, h=gear_thickness + 1.1, $fn=32); - } - - // Central pin acting as sun bearing - translate([0, 0, -gear_thickness - 0.1]) - cylinder(r=sun_bore/2 - 0.2, h=gear_thickness + 1.1, $fn=32); - } - - // Aesthetic weight-saving cutouts - for(i=[0:60:359]) { - rotate([0, 0, i + 30]) - translate([center_distance * 0.55, 0, -1]) - cylinder(r=6, h=5, $fn=32); - } - - // Central hole through the carrier shaft - translate([0, 0, -gear_thickness - 0.2]) - cylinder(r=sun_bore/2 - 1.5, h=gear_thickness + 5, $fn=16); - } -} - -// ============================== -// Assembly -// ============================== - -// Central Sun Gear -color(sun_color) -hb_gear(sun_teeth, is_planet=false, bore=sun_bore); - -// Planet Gears (x3) -color(planet_color) -for(i=[0:120:359]) { - rotate([0, 0, i]) - translate([center_distance, 0, 0]) - rotate([0, 0, 360 / planet_teeth / 2]) // Phase shift by half tooth for perfect meshing - hb_gear(planet_teeth, is_planet=true, bore=planet_bore); -} - -// Internal Ring Gear -color(ring_color) -ring_gear(); - -// Carrier Plate -color(carrier_color) -carrier(); \ No newline at end of file diff --git a/CADAM/benchmarks/10-radial-aircraft-engine.gif b/CADAM/benchmarks/10-radial-aircraft-engine.gif deleted file mode 100644 index 349d5e3..0000000 Binary files a/CADAM/benchmarks/10-radial-aircraft-engine.gif and /dev/null differ diff --git a/CADAM/benchmarks/10-radial-aircraft-engine.md b/CADAM/benchmarks/10-radial-aircraft-engine.md deleted file mode 100644 index d12b4ab..0000000 --- a/CADAM/benchmarks/10-radial-aircraft-engine.md +++ /dev/null @@ -1,229 +0,0 @@ -# 10 — 9-cylinder radial aircraft engine - -> **Prompt** -> -> Design a 9-cylinder radial aircraft engine: a central round crankcase with nine finned cylinders arranged evenly in a star pattern around it, each cylinder with stacked cooling fins and a domed cylinder head, and a central propeller shaft hub at the front. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

9-cylinder radial aircraft engine — orbiting render

- -**Parametric controls:** 15 dimensions · 6 colours - -**What it demonstrates** - -- Nine finned cylinders in a radial star, generated as a pattern around a crankcase -- Stacked cooling fins, domed heads, and a central propeller hub -- 15 parametric controls across 6 distinct part colours - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `num_cylinders` | `9` | `[3:1:18]` | | -| `crankcase_diameter` | `100` | `[50:5:150]` | | -| `crankcase_thickness` | `40` | `[20:5:80]` | | -| `hub_diameter` | `30` | `[10:2:60]` | | -| `hub_length` | `35` | `[10:5:80]` | | -| `shaft_diameter` | `12` | `[5:1:30]` | | -| `shaft_length` | `40` | `[10:5:100]` | | -| `cylinder_diameter` | `22` | `[10:2:50]` | | -| `cylinder_length` | `60` | `[30:5:120]` | | -| `fin_thickness` | `1.2` | `[0.5:0.1:3]` | | -| `fin_spacing` | `3.5` | `[1.5:0.5:10]` | | -| `fin_overhang` | `3` | `[1:0.5:10]` | | -| `pushrod_diameter` | `3` | `[1:0.5:6]` | | -| `intake_diameter` | `4` | `[1:0.5:8]` | | - -
-OpenSCAD source — 10-radial-aircraft-engine.scad - -```scad -/* [Engine Core] */ -num_cylinders = 9; // [3:1:18] -crankcase_diameter = 100; // [50:5:150] -crankcase_thickness = 40; // [20:5:80] -hub_diameter = 30; // [10:2:60] -hub_length = 35; // [10:5:80] -shaft_diameter = 12; // [5:1:30] -shaft_length = 40; // [10:5:100] - -/* [Cylinders] */ -cylinder_diameter = 22; // [10:2:50] -cylinder_length = 60; // [30:5:120] -fin_thickness = 1.2; // [0.5:0.1:3] -fin_spacing = 3.5; // [1.5:0.5:10] -fin_overhang = 3; // [1:0.5:10] - -/* [Details] */ -pushrod_diameter = 3; // [1:0.5:6] -intake_diameter = 4; // [1:0.5:8] - -/* [Colors] */ -crankcase_color = "SlateGray"; -barrel_color = "Silver"; -head_color = "DimGray"; -pushrod_color = "LightGray"; -intake_color = "Gray"; -shaft_color = "Silver"; - -$fn = 64; - -module engine() { - // Crankcase - color(crankcase_color) { - // Main body - cylinder(d=crankcase_diameter, h=crankcase_thickness, center=true); - - // Chamfer rings to soften the drum edges - translate([0, 0, crankcase_thickness/2]) - rotate_extrude() translate([crankcase_diameter/2, 0, 0]) circle(d=4); - translate([0, 0, -crankcase_thickness/2]) - rotate_extrude() translate([crankcase_diameter/2, 0, 0]) circle(d=4); - - // Front reduction gear housing - translate([0, 0, crankcase_thickness/2]) - cylinder(d1=crankcase_diameter * 0.85, d2=hub_diameter * 1.5, h=12); - - translate([0, 0, crankcase_thickness/2 + 12]) - cylinder(d1=hub_diameter * 1.5, d2=hub_diameter * 1.2, h=hub_length - 12); - - // Bearing housing cap - translate([0, 0, crankcase_thickness/2 + hub_length]) - cylinder(d=hub_diameter * 1.25, h=5); - - // Rear accessory section - translate([0, 0, -crankcase_thickness/2]) rotate([180, 0, 0]) - cylinder(d1=crankcase_diameter * 0.85, d2=crankcase_diameter * 0.6, h=25); - - // Crankcase ribs/bolts details - for(i=[0:num_cylinders-1]) { - rotate([0, 0, i * 360/num_cylinders + 180/num_cylinders]) - translate([crankcase_diameter/2, 0, 0]) - cylinder(d=8, h=crankcase_thickness, center=true); - } - } - - // Prop Shaft - color(shaft_color) { - translate([0, 0, crankcase_thickness/2 + hub_length]) { - cylinder(d=shaft_diameter, h=shaft_length); - - // Propeller mounting flange - translate([0, 0, shaft_length * 0.3]) { - difference() { - cylinder(d=shaft_diameter * 2.5, h=4); - // Bolt holes - for(b=[0:5]) { - rotate([0, 0, b * 360/6]) - translate([shaft_diameter * 0.9, 0, -1]) - cylinder(d=2, h=6); - } - } - } - translate([0, 0, shaft_length * 0.3 + 4]) - cylinder(d=shaft_diameter * 1.5, h=shaft_length * 0.1); - } - } - - // Cylinders and Rods - for(i=[0:num_cylinders-1]) { - angle = i * 360 / num_cylinders; - rotate([0, 0, angle]) { - // Cylinder - translate([crankcase_diameter/2 - 5, 0, 0]) - rotate([0, 90, 0]) - radial_cylinder(); - - // Pushrods (Front) - pushrod_base_x = crankcase_diameter * 0.31; - pushrod_base_z = crankcase_thickness/2 + 6; - pushrod_top_x = crankcase_diameter/2 - 5 + cylinder_length * 0.9; - pushrod_top_y = cylinder_diameter * 0.25; - pushrod_top_z = 0; - - draw_rod([pushrod_base_x, -pushrod_top_y, pushrod_base_z], - [pushrod_top_x, -pushrod_top_y, pushrod_top_z], - pushrod_diameter, pushrod_color); - - draw_rod([pushrod_base_x, pushrod_top_y, pushrod_base_z], - [pushrod_top_x, pushrod_top_y, pushrod_top_z], - pushrod_diameter, pushrod_color); - - // Intake pipe (Back) - intake_base_x = crankcase_diameter * 0.37; - intake_base_z = -crankcase_thickness/2 - 8; - intake_top_x = crankcase_diameter/2 - 5 + cylinder_length * 0.85; - intake_top_y = 0; - intake_top_z = -cylinder_diameter * 0.4; - - draw_rod([intake_base_x, 0, intake_base_z], - [intake_top_x, 0, intake_top_z], - intake_diameter, intake_color); - } - } -} - -module radial_cylinder() { - // Barrel - color(barrel_color) { - // Core - cylinder(d=cylinder_diameter, h=cylinder_length * 0.7); - - // Fins - num_fins = floor((cylinder_length * 0.65) / fin_spacing); - for(f=[1:num_fins]) { - translate([0, 0, f * fin_spacing + 2]) - cylinder(d=cylinder_diameter + 2 * fin_overhang, h=fin_thickness, center=true); - } - } - - // Head - color(head_color) { - translate([0, 0, cylinder_length * 0.7]) { - // Lower head block - cylinder(d=cylinder_diameter + 2, h=cylinder_length * 0.2); - - // Domed top - translate([0, 0, cylinder_length * 0.2]) - scale([1, 1, 0.7]) sphere(d=cylinder_diameter + 2); - - // Rocker boxes - translate([0, cylinder_diameter * 0.25, cylinder_length * 0.2]) - rotate([90, 0, 0]) - cylinder(d=cylinder_diameter * 0.5, h=cylinder_diameter * 0.5, center=true); - translate([0, -cylinder_diameter * 0.25, cylinder_length * 0.2]) - rotate([90, 0, 0]) - cylinder(d=cylinder_diameter * 0.5, h=cylinder_diameter * 0.5, center=true); - - // Head fins - head_fins = 3; - for(f=[1:head_fins]) { - translate([0, 0, f * fin_spacing - 1]) - cylinder(d=cylinder_diameter + 4, h=fin_thickness, center=true); - } - } - } -} - -module draw_rod(p1, p2, dia, rod_color) { - color(rod_color) { - dist = norm(p2 - p1); - dir = (p2 - p1) / dist; - axis = cross([0,0,1], dir); - angle = acos(max(-1, min(1, dir[2]))); - - translate(p1) - if (norm(axis) > 0.001) { - rotate(a=angle, v=axis) - cylinder(d=dia, h=dist); - } else { - cylinder(d=dia, h=dist); - } - } -} - -engine(); -``` - -
diff --git a/CADAM/benchmarks/10-radial-aircraft-engine.scad b/CADAM/benchmarks/10-radial-aircraft-engine.scad deleted file mode 100644 index b5f6e30..0000000 --- a/CADAM/benchmarks/10-radial-aircraft-engine.scad +++ /dev/null @@ -1,185 +0,0 @@ -/* [Engine Core] */ -num_cylinders = 9; // [3:1:18] -crankcase_diameter = 100; // [50:5:150] -crankcase_thickness = 40; // [20:5:80] -hub_diameter = 30; // [10:2:60] -hub_length = 35; // [10:5:80] -shaft_diameter = 12; // [5:1:30] -shaft_length = 40; // [10:5:100] - -/* [Cylinders] */ -cylinder_diameter = 22; // [10:2:50] -cylinder_length = 60; // [30:5:120] -fin_thickness = 1.2; // [0.5:0.1:3] -fin_spacing = 3.5; // [1.5:0.5:10] -fin_overhang = 3; // [1:0.5:10] - -/* [Details] */ -pushrod_diameter = 3; // [1:0.5:6] -intake_diameter = 4; // [1:0.5:8] - -/* [Colors] */ -crankcase_color = "SlateGray"; -barrel_color = "Silver"; -head_color = "DimGray"; -pushrod_color = "LightGray"; -intake_color = "Gray"; -shaft_color = "Silver"; - -$fn = 64; - -module engine() { - // Crankcase - color(crankcase_color) { - // Main body - cylinder(d=crankcase_diameter, h=crankcase_thickness, center=true); - - // Chamfer rings to soften the drum edges - translate([0, 0, crankcase_thickness/2]) - rotate_extrude() translate([crankcase_diameter/2, 0, 0]) circle(d=4); - translate([0, 0, -crankcase_thickness/2]) - rotate_extrude() translate([crankcase_diameter/2, 0, 0]) circle(d=4); - - // Front reduction gear housing - translate([0, 0, crankcase_thickness/2]) - cylinder(d1=crankcase_diameter * 0.85, d2=hub_diameter * 1.5, h=12); - - translate([0, 0, crankcase_thickness/2 + 12]) - cylinder(d1=hub_diameter * 1.5, d2=hub_diameter * 1.2, h=hub_length - 12); - - // Bearing housing cap - translate([0, 0, crankcase_thickness/2 + hub_length]) - cylinder(d=hub_diameter * 1.25, h=5); - - // Rear accessory section - translate([0, 0, -crankcase_thickness/2]) rotate([180, 0, 0]) - cylinder(d1=crankcase_diameter * 0.85, d2=crankcase_diameter * 0.6, h=25); - - // Crankcase ribs/bolts details - for(i=[0:num_cylinders-1]) { - rotate([0, 0, i * 360/num_cylinders + 180/num_cylinders]) - translate([crankcase_diameter/2, 0, 0]) - cylinder(d=8, h=crankcase_thickness, center=true); - } - } - - // Prop Shaft - color(shaft_color) { - translate([0, 0, crankcase_thickness/2 + hub_length]) { - cylinder(d=shaft_diameter, h=shaft_length); - - // Propeller mounting flange - translate([0, 0, shaft_length * 0.3]) { - difference() { - cylinder(d=shaft_diameter * 2.5, h=4); - // Bolt holes - for(b=[0:5]) { - rotate([0, 0, b * 360/6]) - translate([shaft_diameter * 0.9, 0, -1]) - cylinder(d=2, h=6); - } - } - } - translate([0, 0, shaft_length * 0.3 + 4]) - cylinder(d=shaft_diameter * 1.5, h=shaft_length * 0.1); - } - } - - // Cylinders and Rods - for(i=[0:num_cylinders-1]) { - angle = i * 360 / num_cylinders; - rotate([0, 0, angle]) { - // Cylinder - translate([crankcase_diameter/2 - 5, 0, 0]) - rotate([0, 90, 0]) - radial_cylinder(); - - // Pushrods (Front) - pushrod_base_x = crankcase_diameter * 0.31; - pushrod_base_z = crankcase_thickness/2 + 6; - pushrod_top_x = crankcase_diameter/2 - 5 + cylinder_length * 0.9; - pushrod_top_y = cylinder_diameter * 0.25; - pushrod_top_z = 0; - - draw_rod([pushrod_base_x, -pushrod_top_y, pushrod_base_z], - [pushrod_top_x, -pushrod_top_y, pushrod_top_z], - pushrod_diameter, pushrod_color); - - draw_rod([pushrod_base_x, pushrod_top_y, pushrod_base_z], - [pushrod_top_x, pushrod_top_y, pushrod_top_z], - pushrod_diameter, pushrod_color); - - // Intake pipe (Back) - intake_base_x = crankcase_diameter * 0.37; - intake_base_z = -crankcase_thickness/2 - 8; - intake_top_x = crankcase_diameter/2 - 5 + cylinder_length * 0.85; - intake_top_y = 0; - intake_top_z = -cylinder_diameter * 0.4; - - draw_rod([intake_base_x, 0, intake_base_z], - [intake_top_x, 0, intake_top_z], - intake_diameter, intake_color); - } - } -} - -module radial_cylinder() { - // Barrel - color(barrel_color) { - // Core - cylinder(d=cylinder_diameter, h=cylinder_length * 0.7); - - // Fins - num_fins = floor((cylinder_length * 0.65) / fin_spacing); - for(f=[1:num_fins]) { - translate([0, 0, f * fin_spacing + 2]) - cylinder(d=cylinder_diameter + 2 * fin_overhang, h=fin_thickness, center=true); - } - } - - // Head - color(head_color) { - translate([0, 0, cylinder_length * 0.7]) { - // Lower head block - cylinder(d=cylinder_diameter + 2, h=cylinder_length * 0.2); - - // Domed top - translate([0, 0, cylinder_length * 0.2]) - scale([1, 1, 0.7]) sphere(d=cylinder_diameter + 2); - - // Rocker boxes - translate([0, cylinder_diameter * 0.25, cylinder_length * 0.2]) - rotate([90, 0, 0]) - cylinder(d=cylinder_diameter * 0.5, h=cylinder_diameter * 0.5, center=true); - translate([0, -cylinder_diameter * 0.25, cylinder_length * 0.2]) - rotate([90, 0, 0]) - cylinder(d=cylinder_diameter * 0.5, h=cylinder_diameter * 0.5, center=true); - - // Head fins - head_fins = 3; - for(f=[1:head_fins]) { - translate([0, 0, f * fin_spacing - 1]) - cylinder(d=cylinder_diameter + 4, h=fin_thickness, center=true); - } - } - } -} - -module draw_rod(p1, p2, dia, rod_color) { - color(rod_color) { - dist = norm(p2 - p1); - dir = (p2 - p1) / dist; - axis = cross([0,0,1], dir); - angle = acos(max(-1, min(1, dir[2]))); - - translate(p1) - if (norm(axis) > 0.001) { - rotate(a=angle, v=axis) - cylinder(d=dia, h=dist); - } else { - cylinder(d=dia, h=dist); - } - } -} - -engine(); \ No newline at end of file diff --git a/CADAM/benchmarks/11-turbofan-jet-engine.gif b/CADAM/benchmarks/11-turbofan-jet-engine.gif deleted file mode 100644 index 51749f1..0000000 Binary files a/CADAM/benchmarks/11-turbofan-jet-engine.gif and /dev/null differ diff --git a/CADAM/benchmarks/11-turbofan-jet-engine.md b/CADAM/benchmarks/11-turbofan-jet-engine.md deleted file mode 100644 index 0e19ee3..0000000 --- a/CADAM/benchmarks/11-turbofan-jet-engine.md +++ /dev/null @@ -1,210 +0,0 @@ -# 11 — Turbofan jet engine - -> **Prompt** -> -> A complete high-bypass turbofan: a front fan you can see into, a bypass cowl, an internal core with compressor/turbine stages, outlet guide vanes, and an exhaust plug. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Turbofan jet engine — orbiting render

- -**Parametric controls:** 2 dimensions · 10 colours - -**What it demonstrates** - -- A full high-bypass turbofan — fan, spinner, bypass cowl, core stages, guide vanes, exhaust plug -- ~26 swept fan blades visible through the intake, like the real thing -- Ten distinct part colours across the whole assembly - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `blade_count` | `26` | `[16:2:36]` | Number of front fan blades | - -
-OpenSCAD source — 11-turbofan-jet-engine.scad - -```scad -// [Engine Configuration] -// Show 1/4 cutaway to reveal internal components -cutaway_view = true; -// Number of front fan blades -blade_count = 26; // [16:2:36] - -// [Colors] -nacelle_color = "White"; -fan_color = "Silver"; -spinner_color = "DimGray"; -core_cowl_color = "DarkSlateGray"; -strut_color = "LightSlateGray"; -compressor_color = "LightGray"; -combustor_color = "FireBrick"; -turbine_color = "Peru"; -exhaust_color = "SaddleBrown"; -shaft_color = "LightGray"; - -// Main Execution -// Orient engine horizontally and center it -rotate([-90, 0, 0]) -translate([0, 0, -155]) { - engine_casings(); - internals(); -} - -// === Assemblies === - -module engine_casings() { - if (cutaway_view) { - difference() { - casings(); - // 90-degree wedge cutout to reveal interior - translate([0, 0, -50]) - cube([200, 200, 500]); - } - } else { - casings(); - } -} - -module casings() { - // Outer Nacelle Cowl - color(nacelle_color) - rotate_extrude($fn=128) - nacelle_profile(); - - // Inner Core Cowl - color(core_cowl_color) - rotate_extrude($fn=128) - core_cowl_profile(); - - // Bypass Struts / Outlet Guide Vanes - color(strut_color) - translate([0, 0, 70]) - for(i = [0 : 24]) { - rotate([0, 0, i * 360 / 25]) - translate([36, 0, 0]) - rotate([0, 90, 0]) - linear_extrude(height=42, twist=5) - rotate([0, 0, 15]) - scale([1, 0.15]) - circle(r=8, $fn=16); - } -} - -module internals() { - // Nose Spinner - color(spinner_color) - nose_spinner(); - - // Front Fan Blades - color(fan_color) - translate([0, 0, 40]) - for(i = [0 : blade_count - 1]) { - rotate([0, 0, i * 360 / blade_count]) - translate([23, 0, 0]) - rotate([-15, 0, 0]) - fan_blade(); - } - - // Central Shaft - color(shaft_color) - rotate_extrude($fn=64) - polygon([ - [0, 40], [24, 40], - [16, 55], - [16, 135], - [16, 240], - [0, 240] - ]); - - // Compressor Stages - color(compressor_color) { - blade_row(65, 36, 15, 33, 10); - blade_row(80, 36, 15, 31, 9); - blade_row(95, 40, 15, 29, 8); - blade_row(110, 40, 15, 27, 7); - blade_row(125, 46, 15, 25, 6); - } - - // Combustor - color(combustor_color) - translate([0, 0, 135]) - rotate_extrude($fn=64) - polygon([ - [16, 0], [21, 5], [21, 10], - [18, 15], - [21, 20], [21, 25], [16, 30] - ]); - - // Turbine Stages - color(turbine_color) { - blade_row(180, 30, 15, 28, 12); - blade_row(195, 30, 15, 27.5, 12); - blade_row(210, 30, 15, 26.5, 11); - blade_row(225, 30, 15, 25.5, 10); - } - - // Exhaust Plug Cone - color(exhaust_color) - translate([0, 0, 240]) - cylinder(r1=16, r2=2, h=70, $fn=64); -} - -// === Components === - -module nose_spinner() { - rotate_extrude($fn=64) - intersection() { - square([30, 40]); - translate([-20, 40]) - circle(r=45, $fn=128); - } -} - -module fan_blade() { - rotate([0, 90, 0]) - linear_extrude(height=50, twist=-50, slices=30, scale=0.7) - scale([1, 0.12]) - circle(r=20, $fn=32); -} - -module blade_row(z_pos, count, inner_r, outer_r, chord) { - translate([0, 0, z_pos]) - for(i = [0 : count - 1]) { - rotate([0, 0, i * 360 / count]) - translate([inner_r - 1, 0, 0]) - rotate([25, 90, 0]) // Pitch angle - linear_extrude(height = outer_r - inner_r + 2) - scale([1, 0.2]) - circle(r=chord/2, $fn=16); - } -} - -module nacelle_profile() { - offset(r=1.5, $fn=16) - polygon([ - [76, 15], // front intake lip - [82, 50], // thickest outer curve - [78, 150], // rear outer trailing edge - [76, 150], // rear inner - [77, 80], // inner bypass wall - [75.5, 40], // fan clearance - [74.5, 20] // front inner transition - ]); -} - -module core_cowl_profile() { - offset(r=1, $fn=16) - polygon([ - [36, 55], // front outer (behind fan) - [38, 90], // max thickness - [26, 260], // rear outer tapering nozzle - [24, 260], // rear inner nozzle lip - [36, 90], // inner max - [34, 55] // front inner (compressor intake) - ]); -} -``` - -
diff --git a/CADAM/benchmarks/11-turbofan-jet-engine.scad b/CADAM/benchmarks/11-turbofan-jet-engine.scad deleted file mode 100644 index 0f3ec99..0000000 --- a/CADAM/benchmarks/11-turbofan-jet-engine.scad +++ /dev/null @@ -1,179 +0,0 @@ -// [Engine Configuration] -// Show 1/4 cutaway to reveal internal components -cutaway_view = true; -// Number of front fan blades -blade_count = 26; // [16:2:36] - -// [Colors] -nacelle_color = "White"; -fan_color = "Silver"; -spinner_color = "DimGray"; -core_cowl_color = "DarkSlateGray"; -strut_color = "LightSlateGray"; -compressor_color = "LightGray"; -combustor_color = "FireBrick"; -turbine_color = "Peru"; -exhaust_color = "SaddleBrown"; -shaft_color = "LightGray"; - -// Main Execution -// Orient engine horizontally and center it -rotate([-90, 0, 0]) -translate([0, 0, -155]) { - engine_casings(); - internals(); -} - -// === Assemblies === - -module engine_casings() { - if (cutaway_view) { - difference() { - casings(); - // 90-degree wedge cutout to reveal interior - translate([0, 0, -50]) - cube([200, 200, 500]); - } - } else { - casings(); - } -} - -module casings() { - // Outer Nacelle Cowl - color(nacelle_color) - rotate_extrude($fn=128) - nacelle_profile(); - - // Inner Core Cowl - color(core_cowl_color) - rotate_extrude($fn=128) - core_cowl_profile(); - - // Bypass Struts / Outlet Guide Vanes - color(strut_color) - translate([0, 0, 70]) - for(i = [0 : 24]) { - rotate([0, 0, i * 360 / 25]) - translate([36, 0, 0]) - rotate([0, 90, 0]) - linear_extrude(height=42, twist=5) - rotate([0, 0, 15]) - scale([1, 0.15]) - circle(r=8, $fn=16); - } -} - -module internals() { - // Nose Spinner - color(spinner_color) - nose_spinner(); - - // Front Fan Blades - color(fan_color) - translate([0, 0, 40]) - for(i = [0 : blade_count - 1]) { - rotate([0, 0, i * 360 / blade_count]) - translate([23, 0, 0]) - rotate([-15, 0, 0]) - fan_blade(); - } - - // Central Shaft - color(shaft_color) - rotate_extrude($fn=64) - polygon([ - [0, 40], [24, 40], - [16, 55], - [16, 135], - [16, 240], - [0, 240] - ]); - - // Compressor Stages - color(compressor_color) { - blade_row(65, 36, 15, 33, 10); - blade_row(80, 36, 15, 31, 9); - blade_row(95, 40, 15, 29, 8); - blade_row(110, 40, 15, 27, 7); - blade_row(125, 46, 15, 25, 6); - } - - // Combustor - color(combustor_color) - translate([0, 0, 135]) - rotate_extrude($fn=64) - polygon([ - [16, 0], [21, 5], [21, 10], - [18, 15], - [21, 20], [21, 25], [16, 30] - ]); - - // Turbine Stages - color(turbine_color) { - blade_row(180, 30, 15, 28, 12); - blade_row(195, 30, 15, 27.5, 12); - blade_row(210, 30, 15, 26.5, 11); - blade_row(225, 30, 15, 25.5, 10); - } - - // Exhaust Plug Cone - color(exhaust_color) - translate([0, 0, 240]) - cylinder(r1=16, r2=2, h=70, $fn=64); -} - -// === Components === - -module nose_spinner() { - rotate_extrude($fn=64) - intersection() { - square([30, 40]); - translate([-20, 40]) - circle(r=45, $fn=128); - } -} - -module fan_blade() { - rotate([0, 90, 0]) - linear_extrude(height=50, twist=-50, slices=30, scale=0.7) - scale([1, 0.12]) - circle(r=20, $fn=32); -} - -module blade_row(z_pos, count, inner_r, outer_r, chord) { - translate([0, 0, z_pos]) - for(i = [0 : count - 1]) { - rotate([0, 0, i * 360 / count]) - translate([inner_r - 1, 0, 0]) - rotate([25, 90, 0]) // Pitch angle - linear_extrude(height = outer_r - inner_r + 2) - scale([1, 0.2]) - circle(r=chord/2, $fn=16); - } -} - -module nacelle_profile() { - offset(r=1.5, $fn=16) - polygon([ - [76, 15], // front intake lip - [82, 50], // thickest outer curve - [78, 150], // rear outer trailing edge - [76, 150], // rear inner - [77, 80], // inner bypass wall - [75.5, 40], // fan clearance - [74.5, 20] // front inner transition - ]); -} - -module core_cowl_profile() { - offset(r=1, $fn=16) - polygon([ - [36, 55], // front outer (behind fan) - [38, 90], // max thickness - [26, 260], // rear outer tapering nozzle - [24, 260], // rear inner nozzle lip - [36, 90], // inner max - [34, 55] // front inner (compressor intake) - ]); -} \ No newline at end of file diff --git a/CADAM/benchmarks/12-axial-turbine-blisk.gif b/CADAM/benchmarks/12-axial-turbine-blisk.gif deleted file mode 100644 index bbc2a08..0000000 Binary files a/CADAM/benchmarks/12-axial-turbine-blisk.gif and /dev/null differ diff --git a/CADAM/benchmarks/12-axial-turbine-blisk.md b/CADAM/benchmarks/12-axial-turbine-blisk.md deleted file mode 100644 index 793c853..0000000 --- a/CADAM/benchmarks/12-axial-turbine-blisk.md +++ /dev/null @@ -1,180 +0,0 @@ -# 12 — Axial turbine blisk - -> **Prompt** -> -> Model an axial-flow turbine blisk (bladed disk) like a jet engine compressor stage: a central hub with a shaft bore and a single ring of about 28 thin aerofoil blades around the rim, each blade clearly twisted along its height from root to tip like a real turbine blade. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

Axial turbine blisk — orbiting render

- -**Parametric controls:** 14 dimensions · 1 colour - -**What it demonstrates** - -- A single-stage bladed disk: a ring of twisted aerofoil blades on a central hub -- Each blade twists root-to-tip like a real turbine blade -- Keyed central shaft bore - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `num_blades` | `28` | `[10:1:60]` | Number of blades around the hub | -| `hub_radius` | `45` | `[20:1:100]` | Outer radius of the central hub | -| `bore_radius` | `12` | `[5:1:30]` | Radius of the central shaft hole | -| `blade_height` | `45` | `[20:1:100]` | Radial height of each blade | -| `hub_center_thickness` | `30` | `[10:1:60]` | Thickness of the hub at the center | -| `hub_rim_thickness` | `22` | `[10:1:50]` | Thickness of the hub at the rim | -| `flange_width` | `8` | `[0:1:20]` | Width of the collar around the bore | -| `flange_height` | `5` | `[0:1:20]` | Height of the collar around the bore | -| `blade_chord` | `22` | `[10:1:50]` | Length of the blade profile (chord) | -| `root_stagger` | `30` | `[0:1:90]` | Angle of the blade at the root | -| `blade_twist` | `35` | `[-60:1:60]` | Total twist from root to tip | -| `camber_pct` | `10` | `[0:1:20]` | Aerodynamic camber (curvature) | -| `thickness_pct` | `6` | `[2:1:15]` | Maximum thickness of the blade profile | -| `steps` | `30` | `Resolution per side` | | - -
-OpenSCAD source — 12-axial-turbine-blisk.scad - -```scad -// Axial-Flow Turbine Blisk -// A parametric model of a jet engine compressor stage - -/* [Blisk Dimensions] */ -// Number of blades around the hub -num_blades = 28; // [10:1:60] -// Outer radius of the central hub -hub_radius = 45; // [20:1:100] -// Radius of the central shaft hole -bore_radius = 12; // [5:1:30] -// Radial height of each blade -blade_height = 45; // [20:1:100] - -/* [Hub Profile] */ -// Thickness of the hub at the center -hub_center_thickness = 30; // [10:1:60] -// Thickness of the hub at the rim -hub_rim_thickness = 22; // [10:1:50] -// Width of the collar around the bore -flange_width = 8; // [0:1:20] -// Height of the collar around the bore -flange_height = 5; // [0:1:20] - -/* [Blade Aerodynamics] */ -// Length of the blade profile (chord) -blade_chord = 22; // [10:1:50] -// Angle of the blade at the root -root_stagger = 30; // [0:1:90] -// Total twist from root to tip -blade_twist = 35; // [-60:1:60] -// Aerodynamic camber (curvature) -camber_pct = 10; // [0:1:20] -// Maximum thickness of the blade profile -thickness_pct = 6; // [2:1:15] - -/* [Settings] */ -blisk_color = "#A8AEB3"; -$fn = 72; - -// --- Main Model --- - -color(blisk_color) -difference() { - union() { - hub(); - blade_array(); - } - // Central bore keyway to lock the blisk to a shaft - translate([bore_radius + 1.5, 0, 0]) - cube([4, 6, hub_center_thickness * 3], center=true); -} - -// --- Modules --- - -module hub() { - // Generates the profiled central disk - rotate_extrude(convexity = 4) - polygon([ - [bore_radius, hub_center_thickness/2 + flange_height], - [bore_radius + flange_width, hub_center_thickness/2 + flange_height], - [bore_radius + flange_width, hub_center_thickness/2], - [hub_radius, hub_rim_thickness/2], - [hub_radius, -hub_rim_thickness/2], - [bore_radius + flange_width, -hub_center_thickness/2], - [bore_radius + flange_width, -hub_center_thickness/2 - flange_height], - [bore_radius, -hub_center_thickness/2 - flange_height] - ]); -} - -module blade_array() { - // Radial array of aerofoil blades - for (i = [0 : num_blades - 1]) { - rotate([0, 0, i * 360 / num_blades]) - // Embed the blade root slightly into the hub rim - translate([hub_radius - 2, 0, 0]) - // Lay the blade down so it points outward radially - rotate([0, 90, 0]) - // Extrude with aerodynamic twist - linear_extrude(height = blade_height + 2, twist = blade_twist, slices = 45, convexity = 2) - // Set the root angle (stagger) - rotate([0, 0, root_stagger]) - // Center the aerofoil on the extrusion axis - translate([-blade_chord/2, 0]) - naca_airfoil(blade_chord, thickness_pct, camber_pct, 40); - } -} - -module naca_airfoil(c, t_pct, m_pct, p_pct) { - // Generates a robust NACA-style highly cambered profile - t_val = t_pct / 100; - m = m_pct / 100; - p = p_pct / 100; - - // Thickness distribution function - function y_t(x) = 5 * t_val * c * (0.2969*sqrt(abs(x/c)) - 0.1260*(x/c) - 0.3516*pow(x/c,2) + 0.2843*pow(x/c,3) - 0.1015*pow(x/c,4)); - - // Camber line function - function y_c(x) = (m == 0) ? 0 : - ( (x/c) <= p ) ? m * c / pow(p,2) * (2*p*(x/c) - pow(x/c,2)) - : m * c / pow(1-p,2) * ((1-2*p) + 2*p*(x/c) - pow(x/c,2)); - - // Camber gradient for normal vector - function dy_c(x) = (m == 0) ? 0 : - ( (x/c) <= p ) ? 2 * m / pow(p,2) * (p - (x/c)) - : 2 * m / pow(1-p,2) * (p - (x/c)); - - function theta(x) = atan(dy_c(x)); - - steps = 30; // Resolution per side - - // Generate upper surface points - pts_upper = [ for (i=[0:steps]) - let ( - x = c * (1 - cos(i * 180 / steps))/2, - yt = y_t(x), - yc = y_c(x), - th = theta(x) - ) - [ x - yt * sin(th), yc + yt * cos(th) ] - ]; - - // Generate lower surface points - pts_lower = [ for (i=[steps:-1:0]) - let ( - x = c * (1 - cos(i * 180 / steps))/2, - yt = y_t(x), - yc = y_c(x), - th = theta(x) - ) - [ x + yt * sin(th), yc - yt * cos(th) ] - ]; - - // Combine and apply offset to guarantee manifold trailing edges and robust printability - offset(r=0.6) - polygon(concat(pts_upper, pts_lower)); -} -``` - -
diff --git a/CADAM/benchmarks/12-axial-turbine-blisk.scad b/CADAM/benchmarks/12-axial-turbine-blisk.scad deleted file mode 100644 index 465fdac..0000000 --- a/CADAM/benchmarks/12-axial-turbine-blisk.scad +++ /dev/null @@ -1,136 +0,0 @@ -// Axial-Flow Turbine Blisk -// A parametric model of a jet engine compressor stage - -/* [Blisk Dimensions] */ -// Number of blades around the hub -num_blades = 28; // [10:1:60] -// Outer radius of the central hub -hub_radius = 45; // [20:1:100] -// Radius of the central shaft hole -bore_radius = 12; // [5:1:30] -// Radial height of each blade -blade_height = 45; // [20:1:100] - -/* [Hub Profile] */ -// Thickness of the hub at the center -hub_center_thickness = 30; // [10:1:60] -// Thickness of the hub at the rim -hub_rim_thickness = 22; // [10:1:50] -// Width of the collar around the bore -flange_width = 8; // [0:1:20] -// Height of the collar around the bore -flange_height = 5; // [0:1:20] - -/* [Blade Aerodynamics] */ -// Length of the blade profile (chord) -blade_chord = 22; // [10:1:50] -// Angle of the blade at the root -root_stagger = 30; // [0:1:90] -// Total twist from root to tip -blade_twist = 35; // [-60:1:60] -// Aerodynamic camber (curvature) -camber_pct = 10; // [0:1:20] -// Maximum thickness of the blade profile -thickness_pct = 6; // [2:1:15] - -/* [Settings] */ -blisk_color = "#A8AEB3"; -$fn = 72; - -// --- Main Model --- - -color(blisk_color) -difference() { - union() { - hub(); - blade_array(); - } - // Central bore keyway to lock the blisk to a shaft - translate([bore_radius + 1.5, 0, 0]) - cube([4, 6, hub_center_thickness * 3], center=true); -} - -// --- Modules --- - -module hub() { - // Generates the profiled central disk - rotate_extrude(convexity = 4) - polygon([ - [bore_radius, hub_center_thickness/2 + flange_height], - [bore_radius + flange_width, hub_center_thickness/2 + flange_height], - [bore_radius + flange_width, hub_center_thickness/2], - [hub_radius, hub_rim_thickness/2], - [hub_radius, -hub_rim_thickness/2], - [bore_radius + flange_width, -hub_center_thickness/2], - [bore_radius + flange_width, -hub_center_thickness/2 - flange_height], - [bore_radius, -hub_center_thickness/2 - flange_height] - ]); -} - -module blade_array() { - // Radial array of aerofoil blades - for (i = [0 : num_blades - 1]) { - rotate([0, 0, i * 360 / num_blades]) - // Embed the blade root slightly into the hub rim - translate([hub_radius - 2, 0, 0]) - // Lay the blade down so it points outward radially - rotate([0, 90, 0]) - // Extrude with aerodynamic twist - linear_extrude(height = blade_height + 2, twist = blade_twist, slices = 45, convexity = 2) - // Set the root angle (stagger) - rotate([0, 0, root_stagger]) - // Center the aerofoil on the extrusion axis - translate([-blade_chord/2, 0]) - naca_airfoil(blade_chord, thickness_pct, camber_pct, 40); - } -} - -module naca_airfoil(c, t_pct, m_pct, p_pct) { - // Generates a robust NACA-style highly cambered profile - t_val = t_pct / 100; - m = m_pct / 100; - p = p_pct / 100; - - // Thickness distribution function - function y_t(x) = 5 * t_val * c * (0.2969*sqrt(abs(x/c)) - 0.1260*(x/c) - 0.3516*pow(x/c,2) + 0.2843*pow(x/c,3) - 0.1015*pow(x/c,4)); - - // Camber line function - function y_c(x) = (m == 0) ? 0 : - ( (x/c) <= p ) ? m * c / pow(p,2) * (2*p*(x/c) - pow(x/c,2)) - : m * c / pow(1-p,2) * ((1-2*p) + 2*p*(x/c) - pow(x/c,2)); - - // Camber gradient for normal vector - function dy_c(x) = (m == 0) ? 0 : - ( (x/c) <= p ) ? 2 * m / pow(p,2) * (p - (x/c)) - : 2 * m / pow(1-p,2) * (p - (x/c)); - - function theta(x) = atan(dy_c(x)); - - steps = 30; // Resolution per side - - // Generate upper surface points - pts_upper = [ for (i=[0:steps]) - let ( - x = c * (1 - cos(i * 180 / steps))/2, - yt = y_t(x), - yc = y_c(x), - th = theta(x) - ) - [ x - yt * sin(th), yc + yt * cos(th) ] - ]; - - // Generate lower surface points - pts_lower = [ for (i=[steps:-1:0]) - let ( - x = c * (1 - cos(i * 180 / steps))/2, - yt = y_t(x), - yc = y_c(x), - th = theta(x) - ) - [ x + yt * sin(th), yc - yt * cos(th) ] - ]; - - // Combine and apply offset to guarantee manifold trailing edges and robust printability - offset(r=0.6) - polygon(concat(pts_upper, pts_lower)); -} diff --git a/CADAM/benchmarks/13-v8-engine.gif b/CADAM/benchmarks/13-v8-engine.gif deleted file mode 100644 index 009ae8c..0000000 Binary files a/CADAM/benchmarks/13-v8-engine.gif and /dev/null differ diff --git a/CADAM/benchmarks/13-v8-engine.md b/CADAM/benchmarks/13-v8-engine.md deleted file mode 100644 index 8c75c15..0000000 --- a/CADAM/benchmarks/13-v8-engine.md +++ /dev/null @@ -1,490 +0,0 @@ -# 13 — V8 engine - -> **Prompt** -> -> A complete V8 internal combustion engine: two banks of four cylinders in a 90° V, cylinder heads with ribbed valve covers, an intake manifold in the valley, exhaust headers down each bank, a crankshaft with counterweights, pistons and connecting rods, a front pulley, and an oil pan. - -Fully parametric OpenSCAD built from the prompt above — adjustable dimensions and colours, exported as `.SCAD` and rendered to the orbiting preview with [`render.sh`](render.sh). - -

V8 engine — orbiting render

- -**Parametric controls:** 22 dimensions · 8 colours - -**What it demonstrates** - -- A complete V8: 90° cylinder banks, heads, ribbed valve covers, intake manifold, exhaust headers, and oil pan -- Even the internal rotating assembly — crankshaft with counterweights, pistons, and connecting rods — modelled inside the block -- 22 parametric controls across 8 part colours; ~460 lines of OpenSCAD — the most complex benchmark here - -**Editable parameters** - -| Parameter | Default | Range / options | Description | -| --- | --- | --- | --- | -| `crank_angle` | `45` | `[0:1:360]` | Rotate the crankshaft to see the pistons move | - -
-OpenSCAD source — 13-v8-engine.scad - -```scad -// V8 Engine Model - -/* [Visibility] */ -// Enable cutaway view to see internal mechanics -cutaway = true; - -/* [Animation] */ -// Rotate the crankshaft to see the pistons move -crank_angle = 45; // [0:1:360] - -/* [Colors] */ -block_color = "Silver"; -head_color = "DarkGray"; -valve_cover_color = "FireBrick"; -intake_color = "DimGray"; -exhaust_color = "Peru"; -pulley_color = "Black"; -oil_pan_color = "DarkSlateGray"; -internals_color = "LightSteelBlue"; - -/* [Hidden] */ -$fn = 32; -bore = 10; -stroke = 15; -crank_r = stroke / 2; -conrod_len = 35; -cyl_spacing = 28; -deck_height = 50; -bank_angle = 45; -pin_angles = [0, 90, 270, 180]; -main_y = [0, 28, 56, 84, 112]; -pin_y_start = [8, 36, 64, 92]; - -// Core kinematics calculation for piston position -function get_D(crank_ang, bank_ang) = - let(Px = crank_r * sin(crank_ang), - Pz = crank_r * cos(crank_ang), - K = Px * sin(bank_ang) + Pz * cos(bank_ang)) - K + sqrt(K*K - crank_r*crank_r + conrod_len*conrod_len); - -module assemble_engine() { - engine_stand(); - engine_block(); - heads(); - valve_covers(); - spark_plugs(); - oil_pan(); - intake_manifold(); - exhaust_headers(); - front_accessories(); - alternator(); - belt(); - front_pulley(); - fan(); - flywheel(); - internals(crank_angle); -} - -module cutaway_cutter() { - if(cutaway) { - intersection() { - // Diagonal cut plane along cylinder axis - translate([0, 50, 0]) - rotate([0, bank_angle, 0]) - translate([0.1, 0, -50]) - cube([80, 100, 150]); - - // Limit strictly to right half to preserve left side - translate([0, 50, -50]) cube([100, 100, 150]); - } - } -} - -module engine_block() { - color(block_color) - difference() { - union() { - // Main block body - translate([-25, 0, -10]) cube([50, 120, 20]); - - // Banks - intersect_bank(bank_angle); - intersect_bank(-bank_angle); - - // Side reinforcement ribs - for(y = main_y) { - translate([-26, y-2, -10]) cube([52, 4, 15]); - } - // Rear bell housing flange - translate([-26, -4, -10]) cube([52, 4, 30]); - } - - // Hollow out valley - translate([-10, -1, 20]) cube([20, 122, 40]); - - // Hollow out crankcase - translate([0, -1, 0]) rotate([-90,0,0]) cylinder(r=18, h=122); - translate([-18, -1, -20]) cube([36, 122, 20]); - - // Cylinder bores - for(i=[0:3]) { - y_s = pin_y_start[i]; - // Right bank - translate([0, y_s + 7.5, 0]) - rotate([0, bank_angle, 0]) - translate([0, 0, 10]) cylinder(r=bore, h=deck_height+10); - - // Left bank - translate([0, y_s + 12.5, 0]) - rotate([0, -bank_angle, 0]) - translate([0, 0, 10]) cylinder(r=bore, h=deck_height+10); - } - - cutaway_cutter(); - } -} - -module intersect_bank(ang) { - rotate([0, ang, 0]) - translate([-14, 0, -20]) cube([28, 120, deck_height + 20]); -} - -module heads() { - color(head_color) - difference() { - union() { - head_shape(bank_angle); - head_shape(-bank_angle); - } - cutaway_cutter(); - } -} - -module head_shape(ang) { - rotate([0, ang, 0]) - translate([-14, 0, deck_height]) - difference() { - cube([28, 120, 18]); - // Spark plug recesses - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - translate([14, y_s, 9]) rotate([0, 90, 0]) cylinder(r=4, h=10, center=true); - } - } -} - -module spark_plugs() { - color("White") - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - // Right - rotate([0, bank_angle, 0]) translate([14, y_s, deck_height + 9]) rotate([0, 90, 0]) cylinder(r=2, h=8); - // Left - rotate([0, -bank_angle, 0]) translate([-14, y_s, deck_height + 9]) rotate([0, -90, 0]) cylinder(r=2, h=8); - } -} - -module valve_covers() { - color(valve_cover_color) - difference() { - union() { - valve_cover_shape(bank_angle); - valve_cover_shape(-bank_angle); - } - cutaway_cutter(); - } -} - -module valve_cover_shape(ang) { - rotate([0, ang, 0]) - translate([-12, 0, deck_height + 18]) { - // Base - hull() { - cube([24, 120, 2]); - translate([2, 2, 8]) cube([20, 116, 2]); - } - // Ribs - for(y=[5 : 10 : 115]) { - translate([4, y, 10]) cube([16, 4, 2]); - } - // Oil cap - if(ang > 0) { - translate([12, 20, 10]) cylinder(r=5, h=4); - } - } -} - -module oil_pan() { - color(oil_pan_color) - difference() { - union() { - hull() { - translate([-25, 0, -10]) cube([50, 120, 1]); - translate([-15, 10, -30]) cube([30, 100, 1]); - } - for(y=[15:5:105]) { - translate([-15, y, -32]) cube([30, 2, 4]); - } - } - // Hollow inside - hull() { - translate([-23, 2, -10]) cube([46, 116, 1]); - translate([-13, 12, -28]) cube([26, 96, 1]); - } - cutaway_cutter(); - } -} - -module intake_manifold() { - color(intake_color) - difference() { - union() { - // Central plenum - translate([-10, 10, 35]) cube([20, 100, 15]); - - // Runners to Right head - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - hull() { - translate([10, y_s-4, 40]) cube([2, 8, 8]); - rotate([0, bank_angle, 0]) translate([-14, y_s-4, deck_height-2]) cube([5, 8, 12]); - } - } - - // Runners to Left head - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - hull() { - translate([-12, y_s-4, 40]) cube([2, 8, 8]); - rotate([0, -bank_angle, 0]) translate([9, y_s-4, deck_height-2]) cube([5, 8, 12]); - } - } - - // Throttle body - translate([0, 110, 42.5]) rotate([-90,0,0]) cylinder(r=8, h=15); - } - cutaway_cutter(); - } -} - -module exhaust_headers() { - color(exhaust_color) - difference() { - union() { - // Right bank - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - header_pipe(bank_angle, 1, y_s); - } - // Right Collector - translate([50, 10, -25]) rotate([-90,0,0]) cylinder(r=6, h=100); - - // Left bank - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - header_pipe(-bank_angle, -1, y_s); - } - // Left Collector - translate([-50, 10, -25]) rotate([-90,0,0]) cylinder(r=6, h=100); - } - cutaway_cutter(); - } -} - -module header_pipe(ang, dir, y) { - gx = dir * (14*cos(45) + (deck_height+7.5)*sin(45)); - gz = (deck_height+7.5)*cos(45) - 14*sin(45); - - hull() { - translate([gx, y, gz]) rotate([0, 90, 0]) cylinder(r=4, h=2, center=true); - translate([gx + dir*5, y, gz - 5]) sphere(r=4); - } - hull() { - translate([gx + dir*5, y, gz - 5]) sphere(r=4); - translate([dir*50, y, -25]) sphere(r=5); - } -} - -module front_accessories() { - color(block_color) - difference() { - union() { - // Timing cover - hull() { - translate([-25, 120, -10]) cube([50, 4, 20]); - translate([-15, 120, 40]) cube([30, 4, 10]); - } - // Water pump - translate([0, 124, 30]) rotate([-90,0,0]) cylinder(r=12, h=8); - // Water pump pulley - color(pulley_color) translate([0, 132, 30]) rotate([-90,0,0]) { - cylinder(r=10, h=8); - translate([0,0,8]) cylinder(r=8, h=2); - } - } - cutaway_cutter(); - } -} - -module alternator() { - color("LightGray") - difference() { - union() { - translate([20, 125, 40]) rotate([-90,0,0]) cylinder(r=8, h=10); - color(pulley_color) translate([20, 135, 40]) rotate([-90,0,0]) cylinder(r=6, h=5); - } - cutaway_cutter(); - } -} - -module belt() { - color("#222222") - difference() { - hull() { - translate([0, 134, 30]) rotate([-90,0,0]) cylinder(r=10, h=4); - translate([0, 134, 0]) rotate([-90,0,0]) cylinder(r=16, h=4); - translate([20, 135, 40]) rotate([-90,0,0]) cylinder(r=6, h=4); - } - hull() { - translate([0, 133, 30]) rotate([-90,0,0]) cylinder(r=8, h=6); - translate([0, 133, 0]) rotate([-90,0,0]) cylinder(r=14, h=6); - translate([20, 134, 40]) rotate([-90,0,0]) cylinder(r=4, h=6); - } - cutaway_cutter(); - } -} - -module fan() { - color("Silver") - difference() { - union() { - translate([0, 142, 30]) rotate([-90,0,0]) cylinder(r=5, h=2); - for(a=[0:72:359]) { - rotate([0, a, 0]) - translate([5, 142.5, 30]) - rotate([20, 0, 0]) - cube([25, 2, 8]); - } - } - cutaway_cutter(); - } -} - -module front_pulley() { - color(pulley_color) - difference() { - translate([0, 124, 0]) rotate([-90,0,0]) { - cylinder(r=12, h=8); - translate([0,0,8]) cylinder(r=16, h=8); - } - cutaway_cutter(); - } -} - -module flywheel() { - color(pulley_color) - translate([0, -5, 0]) rotate([-90,0,0]) cylinder(r=25, h=5); -} - -module engine_stand() { - color("Orange") - union() { - // Floor base - translate([-40, -40, -60]) cube([80, 160, 5]); - // Upright - translate([-15, -30, -55]) cube([30, 15, 75]); - // Stand head - translate([-10, -15, -10]) cube([20, 10, 20]); - // Standoff mounts to bell housing - for(x=[-15, 15]) { - for(z=[-5, 15]) { - translate([x, -15, z]) rotate([-90,0,0]) cylinder(r=2, h=15); - } - } - } -} - -module internals(crank_angle_offset=0) { - color(internals_color) { - // Main journals - for(y = main_y) { - translate([0, y, 0]) { - translate([0, 4, 0]) rotate([-90,0,0]) cylinder(r=5, h=8, center=true); - } - } - - for(i = [0:3]) { - ang = crank_angle_offset + pin_angles[i]; - y_s = pin_y_start[i]; - - // Web 1 - web(ang, y_s); - - // Crank Pin - translate([0, y_s + 5, 0]) - rotate([0, ang, 0]) - translate([0, 0, crank_r]) - translate([0, 5, 0]) rotate([-90,0,0]) cylinder(r=4, h=10, center=true); - - // Web 2 - web(ang, y_s + 15); - - // Piston 1 (Right Bank) - piston_and_rod(ang, bank_angle, y_s + 7.5); - - // Piston 2 (Left Bank) - piston_and_rod(ang, -bank_angle, y_s + 12.5); - } - } -} - -module web(angle, y_pos) { - translate([0, y_pos, 0]) - rotate([0, angle, 0]) { - hull() { - translate([0, 2.5, 0]) rotate([-90,0,0]) cylinder(r=6, h=5, center=true); - translate([0, 2.5, crank_r]) rotate([-90,0,0]) cylinder(r=6, h=5, center=true); - } - // Counterweight - translate([0, 2.5, -crank_r/2 + 1]) - cube([16, 5, crank_r + 10], center=true); - } -} - -module piston_and_rod(crank_ang, bank_ang, y_pos) { - D = get_D(crank_ang, bank_ang); - Px = crank_r * sin(crank_ang); - Pz = crank_r * cos(crank_ang); - Wx = D * sin(bank_ang); - Wz = D * cos(bank_ang); - - rod_ang = atan2(Wx - Px, Wz - Pz); - - translate([0, y_pos, 0]) { - // Conrod - translate([Px, 0, Pz]) - rotate([0, rod_ang, 0]) - translate([0, -2.5, 0]) { - hull() { - rotate([-90,0,0]) cylinder(r=4, h=5); - translate([0, 0, conrod_len]) rotate([-90,0,0]) cylinder(r=3, h=5); - } - } - - // Piston pin - translate([Wx, 0, Wz]) - rotate([0, bank_ang, 0]) - rotate([-90,0,0]) cylinder(r=2.5, h=10, center=true); - - // Piston body - translate([Wx, 0, Wz]) - rotate([0, bank_ang, 0]) { - translate([0, 0, -6]) rotate([-90,0,0]) cylinder(r=bore-0.5, h=12, center=true); - translate([0, 0, 6]) rotate([-90,0,0]) cylinder(r=bore-0.5, h=4, center=true); - } - } -} - -assemble_engine(); -``` - -
diff --git a/CADAM/benchmarks/13-v8-engine.scad b/CADAM/benchmarks/13-v8-engine.scad deleted file mode 100644 index 3284441..0000000 --- a/CADAM/benchmarks/13-v8-engine.scad +++ /dev/null @@ -1,472 +0,0 @@ -// V8 Engine Model - -/* [Visibility] */ -// Enable cutaway view to see internal mechanics -cutaway = true; - -/* [Animation] */ -// Rotate the crankshaft to see the pistons move -crank_angle = 45; // [0:1:360] - -/* [Colors] */ -block_color = "Silver"; -head_color = "DarkGray"; -valve_cover_color = "FireBrick"; -intake_color = "DimGray"; -exhaust_color = "Peru"; -pulley_color = "Black"; -oil_pan_color = "DarkSlateGray"; -internals_color = "LightSteelBlue"; - -/* [Hidden] */ -$fn = 32; -bore = 10; -stroke = 15; -crank_r = stroke / 2; -conrod_len = 35; -cyl_spacing = 28; -deck_height = 50; -bank_angle = 45; -pin_angles = [0, 90, 270, 180]; -main_y = [0, 28, 56, 84, 112]; -pin_y_start = [8, 36, 64, 92]; - -// Core kinematics calculation for piston position -function get_D(crank_ang, bank_ang) = - let(Px = crank_r * sin(crank_ang), - Pz = crank_r * cos(crank_ang), - K = Px * sin(bank_ang) + Pz * cos(bank_ang)) - K + sqrt(K*K - crank_r*crank_r + conrod_len*conrod_len); - -module assemble_engine() { - engine_stand(); - engine_block(); - heads(); - valve_covers(); - spark_plugs(); - oil_pan(); - intake_manifold(); - exhaust_headers(); - front_accessories(); - alternator(); - belt(); - front_pulley(); - fan(); - flywheel(); - internals(crank_angle); -} - -module cutaway_cutter() { - if(cutaway) { - intersection() { - // Diagonal cut plane along right cylinder axis - rotate([0, bank_angle, 0]) - // Massive bounding box starting at main journal 3 to cleanly slice front-right - translate([0.1, 56, -150]) - cube([300, 200, 400]); - - // Limit strictly to right side of the engine to preserve left bank - translate([0.1, 56, -150]) cube([300, 200, 400]); - } - } -} - -module engine_block() { - color(block_color) - difference() { - union() { - // Main block body - translate([-25, 0, -10]) cube([50, 120, 20]); - - // Banks - intersect_bank(bank_angle); - intersect_bank(-bank_angle); - - // Side reinforcement ribs - for(y = main_y) { - translate([-26, y-2, -10]) cube([52, 4, 15]); - } - // Rear bell housing flange - translate([-26, -4, -10]) cube([52, 4, 30]); - - // Main bearing supports (bulkheads) connecting block to crank - for(y = main_y) { - translate([-15, y, -15]) cube([30, 8, 15]); - } - } - - // Hollow out valley - translate([-10, -1, 20]) cube([20, 122, 40]); - - // Hollow out crankcase bays between the bulkheads - for(i = [0:3]) { - y_start_hollow = main_y[i] + 8; - hollow_len = main_y[i+1] - y_start_hollow; - if (hollow_len > 0) { - translate([0, y_start_hollow, 0]) rotate([-90,0,0]) cylinder(r=18, h=hollow_len); - translate([-18, y_start_hollow, -20]) cube([36, hollow_len, 20]); - } - } - // Front and rear crank clearance - translate([0, -5, 0]) rotate([-90,0,0]) cylinder(r=18, h=5); - translate([-18, -5, -20]) cube([36, 5, 20]); - translate([0, 120, 0]) rotate([-90,0,0]) cylinder(r=18, h=5); - translate([-18, 120, -20]) cube([36, 5, 20]); - - // Cut the shaft hole for the crank through the solid bulkheads perfectly matching radius - translate([0, -10, 0]) rotate([-90,0,0]) cylinder(r=5, h=140); - - // Cylinder bores - for(i=[0:3]) { - y_s = pin_y_start[i]; - // Right bank - translate([0, y_s + 7.5, 0]) - rotate([0, bank_angle, 0]) - translate([0, 0, 10]) cylinder(r=bore, h=deck_height+10); - - // Left bank - translate([0, y_s + 12.5, 0]) - rotate([0, -bank_angle, 0]) - translate([0, 0, 10]) cylinder(r=bore, h=deck_height+10); - } - - cutaway_cutter(); - } -} - -module intersect_bank(ang) { - rotate([0, ang, 0]) - translate([-14, 0, -20]) cube([28, 120, deck_height + 20]); -} - -module heads() { - color(head_color) - difference() { - union() { - head_shape(bank_angle); - head_shape(-bank_angle); - } - cutaway_cutter(); - } -} - -module head_shape(ang) { - rotate([0, ang, 0]) - translate([-14, 0, deck_height]) - difference() { - cube([28, 120, 18]); - // Spark plug recesses - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - translate([14, y_s, 9]) rotate([0, 90, 0]) cylinder(r=4, h=10, center=true); - } - } -} - -module spark_plugs() { - color("White") - difference() { - union() { - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - // Right - rotate([0, bank_angle, 0]) translate([14, y_s, deck_height + 9]) rotate([0, 90, 0]) cylinder(r=2, h=8); - // Left - rotate([0, -bank_angle, 0]) translate([-14, y_s, deck_height + 9]) rotate([0, -90, 0]) cylinder(r=2, h=8); - } - } - cutaway_cutter(); - } -} - -module valve_covers() { - color(valve_cover_color) - difference() { - union() { - valve_cover_shape(bank_angle); - valve_cover_shape(-bank_angle); - } - cutaway_cutter(); - } -} - -module valve_cover_shape(ang) { - rotate([0, ang, 0]) - translate([-12, 0, deck_height + 18]) { - // Base - hull() { - cube([24, 120, 2]); - translate([2, 2, 8]) cube([20, 116, 2]); - } - // Ribs - for(y=[5 : 10 : 115]) { - translate([4, y, 10]) cube([16, 4, 2]); - } - // Oil cap - if(ang > 0) { - translate([12, 20, 10]) cylinder(r=5, h=4); - } - } -} - -module oil_pan() { - color(oil_pan_color) - difference() { - union() { - hull() { - translate([-25, 0, -10]) cube([50, 120, 1]); - translate([-15, 10, -30]) cube([30, 100, 1]); - } - for(y=[15:5:105]) { - translate([-15, y, -32]) cube([30, 2, 4]); - } - } - // Hollow inside - hull() { - translate([-23, 2, -10]) cube([46, 116, 1]); - translate([-13, 12, -28]) cube([26, 96, 1]); - } - cutaway_cutter(); - } -} - -module intake_manifold() { - color(intake_color) - difference() { - union() { - // Central plenum - translate([-10, 10, 35]) cube([20, 100, 15]); - - // Runners to Right head - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - hull() { - translate([10, y_s-4, 40]) cube([2, 8, 8]); - rotate([0, bank_angle, 0]) translate([-14, y_s-4, deck_height-2]) cube([5, 8, 12]); - } - } - - // Runners to Left head - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - hull() { - translate([-12, y_s-4, 40]) cube([2, 8, 8]); - rotate([0, -bank_angle, 0]) translate([9, y_s-4, deck_height-2]) cube([5, 8, 12]); - } - } - - // Throttle body - translate([0, 110, 42.5]) rotate([-90,0,0]) cylinder(r=8, h=15); - } - cutaway_cutter(); - } -} - -module exhaust_headers() { - color(exhaust_color) - difference() { - union() { - // Right bank - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - header_pipe(bank_angle, 1, y_s); - } - // Right Collector - translate([50, 10, -25]) rotate([-90,0,0]) cylinder(r=6, h=100); - - // Left bank - for(i=[0:3]) { - y_s = pin_y_start[i] + 10; - header_pipe(-bank_angle, -1, y_s); - } - // Left Collector - translate([-50, 10, -25]) rotate([-90,0,0]) cylinder(r=6, h=100); - } - cutaway_cutter(); - } -} - -module header_pipe(ang, dir, y) { - gx = dir * (14*cos(45) + (deck_height+7.5)*sin(45)); - gz = (deck_height+7.5)*cos(45) - 14*sin(45); - - hull() { - translate([gx, y, gz]) rotate([0, 90, 0]) cylinder(r=4, h=2, center=true); - translate([gx + dir*5, y, gz - 5]) sphere(r=4); - } - hull() { - translate([gx + dir*5, y, gz - 5]) sphere(r=4); - translate([dir*50, y, -25]) sphere(r=5); - } -} - -module front_accessories() { - color(block_color) - union() { - // Timing cover - hull() { - translate([-25, 120, -10]) cube([50, 4, 20]); - translate([-15, 120, 40]) cube([30, 4, 10]); - } - // Water pump - translate([0, 124, 30]) rotate([-90,0,0]) cylinder(r=12, h=8); - // Water pump pulley - color(pulley_color) translate([0, 132, 30]) rotate([-90,0,0]) { - cylinder(r=10, h=8); - translate([0,0,8]) cylinder(r=8, h=2); - } - } -} - -module alternator() { - color("LightGray") - union() { - translate([20, 125, 40]) rotate([-90,0,0]) cylinder(r=8, h=10); - color(pulley_color) translate([20, 135, 40]) rotate([-90,0,0]) cylinder(r=6, h=5); - } -} - -module belt() { - color("#222222") - difference() { - hull() { - translate([0, 134, 30]) rotate([-90,0,0]) cylinder(r=10, h=4); - translate([0, 134, 0]) rotate([-90,0,0]) cylinder(r=16, h=4); - translate([20, 135, 40]) rotate([-90,0,0]) cylinder(r=6, h=4); - } - hull() { - translate([0, 133, 30]) rotate([-90,0,0]) cylinder(r=8, h=6); - translate([0, 133, 0]) rotate([-90,0,0]) cylinder(r=14, h=6); - translate([20, 134, 40]) rotate([-90,0,0]) cylinder(r=4, h=6); - } - } -} - -module fan() { - color("Silver") - union() { - translate([0, 142, 30]) rotate([-90,0,0]) cylinder(r=5, h=2); - // Fan blades removed per user request - } -} - -module front_pulley() { - color(pulley_color) - translate([0, 124, 0]) rotate([-90,0,0]) { - cylinder(r=12, h=8); - translate([0,0,8]) cylinder(r=16, h=8); - } -} - -module flywheel() { - color(pulley_color) - translate([0, -5, 0]) rotate([-90,0,0]) cylinder(r=25, h=5); -} - -module engine_stand() { - color("Orange") - union() { - // Floor base - translate([-40, -40, -60]) cube([80, 160, 5]); - // Upright - translate([-15, -30, -55]) cube([30, 15, 75]); - // Stand head - translate([-10, -15, -10]) cube([20, 10, 20]); - // Standoff mounts to bell housing - for(x=[-15, 15]) { - for(z=[-5, 15]) { - translate([x, -15, z]) rotate([-90,0,0]) cylinder(r=2, h=15); - } - } - } -} - -module internals(crank_angle_offset=0) { - color(internals_color) { - - // Front extension connecting to front pulley - translate([0, 120, 0]) rotate([-90,0,0]) cylinder(r=5, h=20); - - // Rear extension connecting to flywheel - translate([0, -10, 0]) rotate([-90,0,0]) cylinder(r=5, h=10); - - // Main journals nested in bulkheads - for(y = main_y) { - translate([0, y, 0]) { - translate([0, 4, 0]) rotate([-90,0,0]) cylinder(r=5, h=8, center=true); - } - } - - for(i = [0:3]) { - ang = crank_angle_offset + pin_angles[i]; - y_s = pin_y_start[i]; - - // Web 1 - web(ang, y_s); - - // Crank Pin - translate([0, y_s + 5, 0]) - rotate([0, ang, 0]) - translate([0, 0, crank_r]) - translate([0, 5, 0]) rotate([-90,0,0]) cylinder(r=4, h=10, center=true); - - // Web 2 - web(ang, y_s + 15); - - // Piston 1 (Right Bank) - piston_and_rod(ang, bank_angle, y_s + 7.5); - - // Piston 2 (Left Bank) - piston_and_rod(ang, -bank_angle, y_s + 12.5); - } - } -} - -module web(angle, y_pos) { - translate([0, y_pos, 0]) - rotate([0, angle, 0]) { - hull() { - translate([0, 2.5, 0]) rotate([-90,0,0]) cylinder(r=6, h=5, center=true); - translate([0, 2.5, crank_r]) rotate([-90,0,0]) cylinder(r=6, h=5, center=true); - } - // Counterweight - translate([0, 2.5, -crank_r/2 + 1]) - cube([16, 5, crank_r + 10], center=true); - } -} - -module piston_and_rod(crank_ang, bank_ang, y_pos) { - D = get_D(crank_ang, bank_ang); - Px = crank_r * sin(crank_ang); - Pz = crank_r * cos(crank_ang); - Wx = D * sin(bank_ang); - Wz = D * cos(bank_ang); - - rod_ang = atan2(Wx - Px, Wz - Pz); - - translate([0, y_pos, 0]) { - // Conrod - translate([Px, 0, Pz]) - rotate([0, rod_ang, 0]) - translate([0, -2.5, 0]) { - hull() { - rotate([-90,0,0]) cylinder(r=4, h=5); - translate([0, 0, conrod_len]) rotate([-90,0,0]) cylinder(r=3, h=5); - } - } - - // Piston pin - translate([Wx, 0, Wz]) - rotate([0, bank_ang, 0]) - rotate([-90,0,0]) cylinder(r=2.5, h=10, center=true); - - // Piston body - translate([Wx, 0, Wz]) - rotate([0, bank_ang, 0]) { - translate([0, 0, -6]) rotate([-90,0,0]) cylinder(r=bore-0.5, h=12, center=true); - translate([0, 0, 6]) rotate([-90,0,0]) cylinder(r=bore-0.5, h=4, center=true); - } - } -} - -assemble_engine(); \ No newline at end of file diff --git a/CADAM/benchmarks/README.md b/CADAM/benchmarks/README.md deleted file mode 100644 index 1da94ae..0000000 --- a/CADAM/benchmarks/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# CADAM Benchmarks - -A showcase of what [CADAM](https://adam.new/cadam) builds from a single plain-language -description. Each benchmark starts from the prompt shown and comes out as fully parametric -OpenSCAD — adjustable dimensions and colours, ready to export as `.STL`, `.SCAD`, or `.DXF`. -The `.scad` source for each model is included here, so they double as a record of how well -CADAM turns plain language into real, printable, fully parametric CAD. - -### Complex machines & assemblies - -| Model | What it shows | Controls | -| --- | --- | --- | -| [V8 engine](13-v8-engine.md) | complete V8 — banks, heads, valve covers, manifold, headers, crank, pistons, oil pan | 22 dims · 8 colors | -| [9-cylinder radial aircraft engine](10-radial-aircraft-engine.md) | nine finned cylinders in a radial star + prop hub | 15 dims · 6 colors | -| [Turbofan jet engine](11-turbofan-jet-engine.md) | full engine — fan, bypass cowl, core stages, exhaust plug | 2 dims · 10 colors | -| [Axial turbine blisk](12-axial-turbine-blisk.md) | ring of twisted aerofoil blades on a keyed hub | 14 dims · 1 color | - -### Parametric fundamentals - -| Model | What it shows | Controls | -| --- | --- | --- | -| [Twisted hexagonal vase](01-twisted-hex-vase.md) | generative twist-loft, hollow shell with solid floor | 6 dims · 1 color | -| [Knurled control knob](02-knurled-control-knob.md) | diamond knurling, D-bore + set screw, pointer | 15 dims · 2 colors | -| [Hex bolt & nut](03-hex-bolt-and-nut.md) | **real ISO threads** (BOSL2 `screw`/`nut`) | 3 dims · 2 colors | -| [Honeycomb bracket](04-honeycomb-bracket.md) | generative hex lattice, filleted L-bracket | 13 dims · 1 color | -| [NACA 2412 wing](05-naca-airfoil-wing.md) | true airfoil from the NACA equations, tapered loft | 9 dims · 1 color | -| [Threaded jar & lid](06-threaded-jar-and-lid.md) | two **mating** threaded parts | 9 dims · 2 colors | -| [Bevel gear drive](07-bevel-gear-drive.md) | meshing bevel gear pair at 90° | 9 dims · 3 colors | -| [Centrifugal impeller](08-centrifugal-impeller.md) | 7 swept backward-curved blades | 10 dims · 1 color | -| [Planetary gear stage](09-herringbone-planetary-gearbox.md) | full epicyclic assembly, herringbone teeth | 10 dims · 4 colors | - -## Regenerating the GIFs - -`render.sh` turns any `.scad` into a clean orbiting GIF (and, with `--sheet`, a -4-view contact sheet). It mirrors CADAM's own preview: BOSL2 on the library path, -`color()` parts preserved, a clean orbit around the vertical axis. - -Prerequisites (macOS shown; any OpenSCAD ≥ 2021.01 with BOSL2 support works): - -```bash -# OpenSCAD CLI + ImageMagick -brew install --cask openscad@snapshot -brew install imagemagick - -# BOSL2 (and BOSL) on the OpenSCAD library path — these are bundled in the repo -mkdir -p /tmp/oscad-libs/BOSL2 /tmp/oscad-libs/BOSL -unzip -o ../public/libraries/BOSL2.zip -d /tmp/oscad-libs/BOSL2 -unzip -o ../public/libraries/BOSL.zip -d /tmp/oscad-libs/BOSL -``` - -Then: - -```bash -./render.sh 03-hex-bolt-and-nut.scad # -> 03-hex-bolt-and-nut.gif -./render.sh --sheet 09-herringbone-planetary-gearbox.scad # -> *.sheet.png (inspection) -``` - -Knobs (env vars): `FRAMES` (default 36), `SIZE` (520), `ELEV` (62°), `FPS` (24), -`COLORSCHEME` (Tomorrow), `OPENSCADPATH` (`/tmp/oscad-libs`), `OPENSCAD_BIN`. diff --git a/CADAM/benchmarks/render.sh b/CADAM/benchmarks/render.sh deleted file mode 100755 index 6f3d1e6..0000000 --- a/CADAM/benchmarks/render.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env bash -# -# render.sh — turn a CADAM benchmark .scad into an orbiting GIF (and an optional -# multi-view contact sheet for inspection). Mirrors how CADAM previews models in -# the browser: BOSL2/MCAD on the library path, color() parts preserved, a clean -# orbit around the vertical axis. -# -# Usage: -# ./render.sh model.scad -> model.gif (orbit) -# ./render.sh model.scad out.gif -> out.gif -# ./render.sh --sheet model.scad -> model.sheet.png (iso/front/right/top) -# -# Env knobs (sane defaults): -# FRAMES=36 SIZE=520 ELEV=62 FPS=24 COLORSCHEME=Tomorrow BG=#0d1117 -# -set -euo pipefail - -# --- locate the OpenSCAD CLI (snapshot/nightly first, then stable) ------------ -find_openscad() { - if [[ -n "${OPENSCAD_BIN:-}" && -x "${OPENSCAD_BIN}" ]]; then echo "${OPENSCAD_BIN}"; return; fi - for c in \ - "/Applications/OpenSCAD (Nightly).app/Contents/MacOS/OpenSCAD" \ - "/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD" \ - "$(command -v openscad 2>/dev/null || true)"; do - [[ -n "$c" && -x "$c" ]] && { echo "$c"; return; } - done - echo "ERROR: OpenSCAD CLI not found. Set OPENSCAD_BIN." >&2; exit 1 -} -OSCAD="$(find_openscad)" - -# BOSL2 / BOSL / MCAD live here (unzipped from public/libraries/*.zip). -export OPENSCADPATH="${OPENSCADPATH:-/tmp/oscad-libs}" - -FRAMES="${FRAMES:-36}" -SIZE="${SIZE:-520}" -ELEV="${ELEV:-62}" -FPS="${FPS:-24}" -COLORSCHEME="${COLORSCHEME:-Tomorrow}" # clean near-white backdrop -RENDER_FLAG="${RENDER_FLAG:---render}" # full (manifold) render; --preview is faster but CSG-fuzzy - -SHEET=0 -if [[ "${1:-}" == "--sheet" ]]; then SHEET=1; shift; fi - -SRC="${1:?usage: render.sh [--sheet] model.scad [out.(gif|png)]}" -BASE="$(basename "${SRC%.scad}")" -DIR="$(cd "$(dirname "$SRC")" && pwd)" -OUT="${2:-}" - -delay=$(awk "BEGIN{printf \"%.0f\", 100/${FPS}}") -tmp="$(mktemp -d)" -trap 'rm -rf "$tmp"' EXIT - -render_frame() { # rotx roty rotz file - "$OSCAD" -o "$4" --imgsize="${SIZE},${SIZE}" --projection=perspective \ - --colorscheme="$COLORSCHEME" $RENDER_FLAG --viewall --autocenter \ - --camera="0,0,0,$1,$2,$3,0" "$SRC" 2>"$tmp/err.log" || { - echo "OpenSCAD failed on $SRC:" >&2; cat "$tmp/err.log" >&2; exit 1; } -} - -if [[ "$SHEET" == "1" ]]; then - OUT="${OUT:-$DIR/$BASE.sheet.png}" - render_frame 62 0 25 "$tmp/iso.png" - render_frame 90 0 0 "$tmp/front.png" - render_frame 90 0 90 "$tmp/right.png" - render_frame 0 0 0 "$tmp/top.png" - magick montage "$tmp/iso.png" "$tmp/front.png" "$tmp/right.png" "$tmp/top.png" \ - -label '' -tile 2x2 -geometry +6+6 -background white "$OUT" - echo "wrote $OUT" - exit 0 -fi - -OUT="${OUT:-$DIR/$BASE.gif}" -echo "rendering $FRAMES frames of $BASE ..." -i=0 -while [[ $i -lt $FRAMES ]]; do - az=$(awk "BEGIN{printf \"%.2f\", $i*360/$FRAMES}") - printf -v n "%03d" "$i" - render_frame "$ELEV" 0 "$az" "$tmp/f_$n.png" - i=$((i+1)) -done - -echo "assembling $OUT ..." -magick -delay "$delay" -loop 0 "$tmp"/f_*.png \ - -layers OptimizePlus -fuzz 3% -colors 200 "$OUT" -# second pass: strip + max compression -magick "$OUT" -strip -layers Optimize "$OUT" -echo "wrote $OUT ($(du -h "$OUT" | cut -f1))" diff --git a/CADAM/components.json b/CADAM/components.json deleted file mode 100644 index aa38200..0000000 --- a/CADAM/components.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "tailwind.config.js", - "css": "src/index.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - } -} diff --git a/CADAM/eslint.config.js b/CADAM/eslint.config.js deleted file mode 100644 index 775acc1..0000000 --- a/CADAM/eslint.config.js +++ /dev/null @@ -1,40 +0,0 @@ -import js from '@eslint/js'; -import globals from 'globals'; -import reactHooks from 'eslint-plugin-react-hooks'; -import reactRefresh from 'eslint-plugin-react-refresh'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config( - { ignores: ['dist'] }, - { - extends: [js.configs.recommended, ...tseslint.configs.recommended], - files: ['**/*.{ts,tsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...reactHooks.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - '@typescript-eslint/no-unused-vars': [ - 'error', - { - args: 'all', - argsIgnorePattern: '^_', - caughtErrors: 'all', - caughtErrorsIgnorePattern: '^_', - destructuredArrayIgnorePattern: '^_', - varsIgnorePattern: '^_', - ignoreRestSiblings: true, - }, - ], - }, - }, -); diff --git a/CADAM/package-lock.json b/CADAM/package-lock.json deleted file mode 100644 index 7e96a05..0000000 --- a/CADAM/package-lock.json +++ /dev/null @@ -1,13701 +0,0 @@ -{ - "name": "vite-react-typescript-starter", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "vite-react-typescript-starter", - "version": "0.0.0", - "dependencies": { - "@ai-sdk/anthropic": "^3.0.78", - "@ai-sdk/google": "^3.0.75", - "@ai-sdk/react": "^3.0.100", - "@anthropic-ai/sdk": "^0.96.0", - "@fal-ai/client": "^1.10.1", - "@google/genai": "^2.2.0", - "@hookform/resolvers": "^3.9.0", - "@openrouter/ai-sdk-provider": "^2.9.0", - "@radix-ui/react-accordion": "^1.2.0", - "@radix-ui/react-alert-dialog": "^1.1.1", - "@radix-ui/react-aspect-ratio": "^1.1.0", - "@radix-ui/react-avatar": "^1.1.0", - "@radix-ui/react-checkbox": "^1.1.1", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.1", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-hover-card": "^1.1.1", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-menubar": "^1.1.1", - "@radix-ui/react-navigation-menu": "^1.2.0", - "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-progress": "^1.1.0", - "@radix-ui/react-radio-group": "^1.2.0", - "@radix-ui/react-scroll-area": "^1.1.0", - "@radix-ui/react-select": "^2.1.1", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.0", - "@radix-ui/react-slot": "^1.2.2", - "@radix-ui/react-switch": "^1.1.0", - "@radix-ui/react-tabs": "^1.1.3", - "@radix-ui/react-toast": "^1.2.1", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.2", - "@radix-ui/react-use-controllable-state": "^1.2.2", - "@react-three/drei": "^10.0.7", - "@react-three/fiber": "^9.1.2", - "@sentry/react": "^9.1.0", - "@sentry/vite-plugin": "^3.1.2", - "@sitnik/nanoid": "npm:@jsr/sitnik__nanoid@^5.1.2", - "@streamdown/cjk": "^1.0.3", - "@streamdown/code": "^1.1.1", - "@streamdown/math": "^1.0.2", - "@streamdown/mermaid": "^1.0.2", - "@supabase/supabase-js": "^2.108.2", - "@tanstack/react-query": "^5.64.2", - "@tanstack/react-router": "^1.169.2", - "@tanstack/react-start": "^1.167.65", - "@types/omggif": "^1.0.5", - "@types/three": "^0.160.0", - "@zip.js/zip.js": "^2.7.63", - "ai": "^6.0.177", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "embla-carousel-react": "^8.6.0", - "fflate": "^0.8.2", - "framer-motion": "^12.16.0", - "image-type": "^6.1.0", - "input-otp": "^1.2.4", - "lottie-react": "^2.4.1", - "lucide-react": "^0.446.0", - "motion": "^12.39.0", - "omggif": "^1.0.10", - "openai": "^6.37.0", - "posthog-js": "^1.307.2", - "react": "19.2.1", - "react-colorful": "^5.6.1", - "react-dom": "19.2.1", - "react-easy-crop": "^5.5.0", - "react-hook-form": "^7.53.0", - "react-resizable-panels": "^2.1.7", - "recharts": "^2.12.7", - "replicate": "^1.0.1", - "sonner": "^1.5.0", - "streamdown": "^2.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.160.1", - "vaul": "^1.0.0", - "zod": "^3.23.8" - }, - "devDependencies": { - "@eslint/js": "^9.11.1", - "@tanstack/eslint-plugin-query": "^5.64.2", - "@types/node": "^22.7.3", - "@types/react": "^19.2.1", - "@types/react-dom": "^19.2.1", - "@vitejs/plugin-react": "^6.0.1", - "autoprefixer": "^10.4.20", - "csv-parse": "^6.2.1", - "eslint": "^9.11.1", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.12", - "globals": "^15.9.0", - "husky": "^9.1.7", - "lint-staged": "^16.1.5", - "nitro": "^3.0.260429-beta", - "postcss": "^8.4.47", - "prettier": "^3.5.2", - "prettier-plugin-tailwindcss": "^0.6.11", - "supabase": "^2.15.8", - "tailwindcss": "^3.4.13", - "typescript": "^5.8.3", - "typescript-eslint": "^8.7.0", - "vite": "^8.0.11" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0", - "npm": ">=10" - } - }, - "node_modules/@ai-sdk/anthropic": { - "version": "3.0.78", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.78.tgz", - "integrity": "sha512-0OY12G20cUt6iU6htpEA1491Oz++NVxZxlmWGX4B7rSbeZ5pnDmOu6YtW9BKzdZlNx5Gn23i6WMxyZFoMKNcgA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/gateway": { - "version": "3.0.112", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.112.tgz", - "integrity": "sha512-jiBao9pR4owWyjo0BnuNc7WSQBGOD0thysE4AFgZXaG+zMFbISQXUkJr7ePw/phBvePy7jE5FSA2Lf7lwqUiiQ==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@vercel/oidc": "3.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/google": { - "version": "3.0.75", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.75.tgz", - "integrity": "sha512-XAm31ftiOrzlb8NjDzT7kw0xw+4lmgFdGFn1QKM73nXFFKyN1kWLESBV75UGNfjXP8X1YJ0YydnMVqO0jaPghw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.27", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", - "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@standard-schema/spec": "^1.1.0", - "eventsource-parser": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "3.0.100", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.100.tgz", - "integrity": "sha512-/NKblah16RqFYeQGTqRYGu55k7wSRGKq6i7ZGHEjK+TqW1+De4Yeh1uAE80VBVmZ22Fc0vI+coUcqWXWOU7THw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "4.0.15", - "ai": "6.0.98", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" - } - }, - "node_modules/@ai-sdk/react/node_modules/@ai-sdk/gateway": { - "version": "3.0.54", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.54.tgz", - "integrity": "sha512-zA4NHCQTY9iCHwQfjLliT9BxBGBCUIj4d7dD2R8uIzXcj5doYGNR8TwEbJmOOnub9namarsN00nteqgmC2X0Sg==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.15", - "@vercel/oidc": "3.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", - "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.15.tgz", - "integrity": "sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@standard-schema/spec": "^1.1.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react/node_modules/@vercel/oidc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", - "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@ai-sdk/react/node_modules/ai": { - "version": "6.0.98", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.98.tgz", - "integrity": "sha512-bHwggEe/cCvu+9GkAsSzIp+y5grL0N4se0QjUeHaiZ7rI4o2k4/d2zK/R8tun5kcX8tsw3HYkN+297rS2TYclw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "3.0.54", - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.15", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.96.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.96.0.tgz", - "integrity": "sha512-KlCsODtTyb17bLUVCSDC2HtSvAbJf60sEiPEax9dInF+aDF92vS4TZJ5XD7YCQXNb1/5icYaw8Y7wMjPlIV9Zg==", - "license": "MIT", - "dependencies": { - "json-schema-to-ts": "^3.1.1", - "standardwebhooks": "^1.0.0" - }, - "bin": { - "anthropic-ai-sdk": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@borewit/text-codec": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", - "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT" - }, - "node_modules/@chevrotain/types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", - "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", - "license": "Apache-2.0" - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@fal-ai/client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@fal-ai/client/-/client-1.10.1.tgz", - "integrity": "sha512-c3AVeH31OioiI2J1BfW8Cryi1DhUYldnY3X35nv6xLMq3fU2NQOo+eYaR5mL2O8MoHHh+HzXdQuIyanIyeq+ug==", - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "eventsource-parser": "^1.1.2", - "robot3": "^0.4.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@fal-ai/client/node_modules/eventsource-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", - "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", - "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", - "dependencies": { - "@floating-ui/dom": "^1.7.2" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" - }, - "node_modules/@google/genai": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-2.2.0.tgz", - "integrity": "sha512-RA3cuaKLldWTrpxhNm2nAe0Oez/UEuoH11jFjPzbYL7TSP83lMk+ic7pQKZ4ekJdZfnIdgxWl1DwJoUwxmvWGQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "google-auth-library": "^10.3.0", - "p-retry": "^4.6.2", - "protobufjs": "^7.5.4", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.25.2" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", - "license": "MIT", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", - "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==" - }, - "node_modules/@mermaid-js/parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", - "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", - "license": "MIT", - "dependencies": { - "@chevrotain/types": "~11.1.1" - } - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.1.0.tgz", - "integrity": "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@msgpack/msgpack": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.3.tgz", - "integrity": "sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==", - "license": "ISC", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oozcitak/dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-2.0.2.tgz", - "integrity": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==", - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "^2.0.2", - "@oozcitak/url": "^3.0.0", - "@oozcitak/util": "^10.0.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@oozcitak/infra": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-2.0.2.tgz", - "integrity": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==", - "license": "MIT", - "dependencies": { - "@oozcitak/util": "^10.0.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@oozcitak/url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-3.0.0.tgz", - "integrity": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==", - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "^2.0.2", - "@oozcitak/util": "^10.0.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@oozcitak/util": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-10.0.0.tgz", - "integrity": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==", - "license": "MIT", - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@openrouter/ai-sdk-provider": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz", - "integrity": "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "ai": "^6.0.0", - "zod": "^3.25.0 || ^4.0.0" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@posthog/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.8.0.tgz", - "integrity": "sha512-SfmG1EdbR+2zpQccgBUxM/snCROB9WGkY7VH1r9iaoTNqoaN9IkmIEA/07cZLY4DxVP8jt6Vdfe3s84xksac1g==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.14.tgz", - "integrity": "sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.14", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", - "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.2.tgz", - "integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.15.tgz", - "integrity": "sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz", - "integrity": "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.15.tgz", - "integrity": "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz", - "integrity": "sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.7.tgz", - "integrity": "sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.9.tgz", - "integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.5.tgz", - "integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.5.tgz", - "integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.14.tgz", - "integrity": "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz", - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" - }, - "node_modules/@react-three/drei": { - "version": "10.5.1", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.5.1.tgz", - "integrity": "sha512-ixEU41HC64adcZQV2tCIHKTFxT/HRSu3QgZrDqBeQNyNou6FYgoM2sIxujgKYGWf4bVkN5A+OBGnr8/CzVVhrQ==", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mediapipe/tasks-vision": "0.10.17", - "@monogrid/gainmap-js": "^3.0.6", - "@use-gesture/react": "^10.3.1", - "camera-controls": "^3.0.0", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.56", - "glsl-noise": "^0.0.0", - "hls.js": "^1.5.17", - "maath": "^0.10.8", - "meshline": "^3.3.1", - "stats-gl": "^2.2.8", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.8.3", - "three-stdlib": "^2.35.6", - "troika-three-text": "^0.52.4", - "tunnel-rat": "^0.1.2", - "use-sync-external-store": "^1.4.0", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^9.0.0", - "react": "^19", - "react-dom": "^19", - "three": ">=0.159" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.2.0.tgz", - "integrity": "sha512-esZe+E9T/aYEM4HlBkirr/yRE8qWTp9WUsLISyHHMCHKlJv85uc5N4wwKw+Ay0QeTSITw6T9Q3Svpu383Q+CSQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.28.9", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^2.0.0", - "react-reconciler": "^0.31.0", - "react-use-measure": "^2.1.7", - "scheduler": "^0.25.0", - "suspend-react": "^0.1.3", - "use-sync-external-store": "^1.4.0", - "zustand": "^5.0.3" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-native": ">=0.78", - "three": ">=0.156" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.40.tgz", - "integrity": "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==", - "license": "MIT" - }, - "node_modules/@sentry-internal/browser-utils": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.47.1.tgz", - "integrity": "sha512-twv6YhrUlPkvKz4/iQDH4KHgcv9t4cMjmZPf4/dCSCXn4/GOjzjx2d74c1w+1KOdS7lcsQzI+MtbK6SeYLiGfQ==", - "license": "MIT", - "dependencies": { - "@sentry/core": "9.47.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry-internal/feedback": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.47.1.tgz", - "integrity": "sha512-xJ4vKvIpAT8e+Sz80YrsNinPU0XV7jPxPjdZ4ex8R2mMvx7pM0gq8JiR/sIVmNiOE0WiUDr6VwLDE8j2APSRMA==", - "license": "MIT", - "dependencies": { - "@sentry/core": "9.47.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry-internal/replay": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.47.1.tgz", - "integrity": "sha512-O9ZEfySpstGtX1f73m3NbdbS2utwPikaFt6sgp74RG4ZX4LlXe99VAjKR464xKECpYsLmj2bYpiK4opURF0pBA==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "9.47.1", - "@sentry/core": "9.47.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry-internal/replay-canvas": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.47.1.tgz", - "integrity": "sha512-r9nve+l5+elGB9NXSN1+PUgJy790tXN1e8lZNH2ziveoU91jW4yYYt34mHZ30fU9tOz58OpaRMj3H3GJ/jYZVA==", - "license": "MIT", - "dependencies": { - "@sentry-internal/replay": "9.47.1", - "@sentry/core": "9.47.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.6.1.tgz", - "integrity": "sha512-zmvUa4RpzDG3LQJFpGCE8lniz8Rk1Wa6ZvvK+yEH+snZeaHHRbSnAQBMR607GOClP+euGHNO2YtaY4UAdNTYbg==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@sentry/browser": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.47.1.tgz", - "integrity": "sha512-at5JOLziw5QpVYytxTDU6xijdV6lDQ/Rxp/qXJaHXud3gIK4suv2cXW+tupJfwoUoHFCnDNfccjCmPmP0yRqiA==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "9.47.1", - "@sentry-internal/feedback": "9.47.1", - "@sentry-internal/replay": "9.47.1", - "@sentry-internal/replay-canvas": "9.47.1", - "@sentry/core": "9.47.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry/bundler-plugin-core": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.6.1.tgz", - "integrity": "sha512-/ubWjPwgLep84sUPzHfKL2Ns9mK9aQrEX4aBFztru7ygiJidKJTxYGtvjh4dL2M1aZ0WRQYp+7PF6+VKwdZXcQ==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.6.1", - "@sentry/cli": "^2.49.0", - "dotenv": "^16.3.1", - "find-up": "^5.0.0", - "glob": "^9.3.2", - "magic-string": "0.30.8", - "unplugin": "1.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@sentry/cli": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.5.tgz", - "integrity": "sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==", - "hasInstallScript": true, - "license": "FSL-1.1-MIT", - "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@sentry/cli-darwin": "2.58.5", - "@sentry/cli-linux-arm": "2.58.5", - "@sentry/cli-linux-arm64": "2.58.5", - "@sentry/cli-linux-i686": "2.58.5", - "@sentry/cli-linux-x64": "2.58.5", - "@sentry/cli-win32-arm64": "2.58.5", - "@sentry/cli-win32-i686": "2.58.5", - "@sentry/cli-win32-x64": "2.58.5" - } - }, - "node_modules/@sentry/cli-darwin": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.5.tgz", - "integrity": "sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==", - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.5.tgz", - "integrity": "sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==", - "cpu": [ - "arm" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm64": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.5.tgz", - "integrity": "sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==", - "cpu": [ - "arm64" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-i686": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.5.tgz", - "integrity": "sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==", - "cpu": [ - "x86", - "ia32" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-x64": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.5.tgz", - "integrity": "sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==", - "cpu": [ - "x64" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "linux", - "freebsd", - "android" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-arm64": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.5.tgz", - "integrity": "sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==", - "cpu": [ - "arm64" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-i686": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.5.tgz", - "integrity": "sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==", - "cpu": [ - "x86", - "ia32" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-x64": { - "version": "2.58.5", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.5.tgz", - "integrity": "sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==", - "cpu": [ - "x64" - ], - "license": "FSL-1.1-MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/core": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.47.1.tgz", - "integrity": "sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry/react": { - "version": "9.47.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.47.1.tgz", - "integrity": "sha512-Anqt0hG1R+nktlwEiDc2FmD+6DUGMJOLuArgr7q1cSCdPbK2Gb1eZ2rF57Ui+CDo9XLvlX9QP2is/M08rrVe3w==", - "license": "MIT", - "dependencies": { - "@sentry/browser": "9.47.1", - "@sentry/core": "9.47.1", - "hoist-non-react-statics": "^3.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^16.14.0 || 17.x || 18.x || 19.x" - } - }, - "node_modules/@sentry/vite-plugin": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.6.1.tgz", - "integrity": "sha512-x8WMdv2K2HcGS2ezEUIEZXpT/fNeWQ9rsEeF0K9DfKXK8Z9lzRmCr6TVA6I9+yW39Is+1/0cv1Rsu0LhO7lHzg==", - "license": "MIT", - "dependencies": { - "@sentry/bundler-plugin-core": "3.6.1", - "unplugin": "1.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@shikijs/core": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", - "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", - "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", - "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", - "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", - "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", - "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@sitnik/nanoid": { - "name": "@jsr/sitnik__nanoid", - "version": "5.1.5", - "resolved": "https://npm.jsr.io/~/11/@jsr/sitnik__nanoid/5.1.5.tgz", - "integrity": "sha512-XhK9dGdHVpR+F25N0tn7/uNTLDUZeILw5ESDK+2EGSJAxC6xTia/hzdDfWX5EPDHs/YS25Zf2oTFykQCEVIHpQ==" - }, - "node_modules/@stablelib/base64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", - "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "node_modules/@streamdown/cjk": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@streamdown/cjk/-/cjk-1.0.3.tgz", - "integrity": "sha512-WRg8HR/gHbBoTgsMd91OKFUClIoDcEFVofJvluvEAyjx3KpU0aGgD9tGDqHkHj14ShoMSkX0IYetWGegTcwIJw==", - "license": "Apache-2.0", - "dependencies": { - "remark-cjk-friendly": "^2.0.1", - "remark-cjk-friendly-gfm-strikethrough": "^2.0.1", - "unist-util-visit": "^5.0.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@streamdown/code": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@streamdown/code/-/code-1.1.1.tgz", - "integrity": "sha512-i7HTNuDgZWb+VdrNVOam9gQhIc5MSSDXKWXgbUrn/4vSRaSMM+Rtl10MQj4wLWPNpF7p80waJsAqFP8HZfb0Jg==", - "license": "Apache-2.0", - "dependencies": { - "shiki": "^3.19.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@streamdown/math": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@streamdown/math/-/math-1.0.2.tgz", - "integrity": "sha512-r8Ur9/lBuFnzZAFdEWrLUF2s/gRwRRRwruqltdZibyjbCBnuW7SJbFm26nXqvpJPW/gzpBUMrBVBzd88z05D5g==", - "license": "Apache-2.0", - "dependencies": { - "katex": "^0.16.27", - "rehype-katex": "^7.0.1", - "remark-math": "^6.0.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@streamdown/mermaid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@streamdown/mermaid/-/mermaid-1.0.2.tgz", - "integrity": "sha512-Fr/4sBWnAeSnxM3PcrV/+DiZe5oPMq9gOkUIAH7ZauJeuwrZ/DVzD4g0zlav6AH0axh2m/sOfrfLtY5aLT7niw==", - "license": "Apache-2.0", - "dependencies": { - "mermaid": "^11.12.2" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@supabase/auth-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.108.2.tgz", - "integrity": "sha512-tNaQmBgodDZwgB40mRwVbxFy8IDYwjdpcZ0BYrWiwlULCSQoJj4QoG4zgJT7QRPXcqipefNOzvO/qAu4dF98ag==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/cli-darwin-arm64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-darwin-arm64/-/cli-darwin-arm64-2.107.0.tgz", - "integrity": "sha512-930MojHei14+PrGNF0QzlPJAjOYilCofgO9aTtKiQ6x36ZUI7dc4ujl5VzccC/19ex/f4ird0lH1d2U92MwDqQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@supabase/cli-darwin-x64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-darwin-x64/-/cli-darwin-x64-2.107.0.tgz", - "integrity": "sha512-qcnichkHiCCNybtCqoeqYO6q8WuTxilaah18QilZskEM+zCSdV5rOXXfeF1BPexRxsvGYbghZ+fEQfWp7+lOUQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@supabase/cli-linux-arm64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-linux-arm64/-/cli-linux-arm64-2.107.0.tgz", - "integrity": "sha512-an0dsOhPcLQXZ0sFEBm6NU1HFUjXCStHxetfJvgt4u7SiH/EyDMLfDvV7W9ef56bgG+3hoWHtih2Kplj3cecQA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@supabase/cli-linux-arm64-musl": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.107.0.tgz", - "integrity": "sha512-5se1bYRIzivL+ehImnwFjBpzKZ+AwLS6/cBg6lvJOJdWatuaK9Edu6wOZAmPjVMy4vZRJ27tdL+3F7N+Vk64AA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@supabase/cli-linux-x64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-linux-x64/-/cli-linux-x64-2.107.0.tgz", - "integrity": "sha512-8ttnpfBFEXk0JFmH6gw8ZCVcMa/UNH1sD6iG9PQLbK2eXdZ6kDIzGs5g+CEvxZ3j6HxEIYn9h9rfxoqGoBUgwA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@supabase/cli-linux-x64-musl": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-linux-x64-musl/-/cli-linux-x64-musl-2.107.0.tgz", - "integrity": "sha512-gXDzvDsmmJw9HbeVRFD6xboGwbu/cpBp84ZESEcXKyB8Onvs3igWKwoXMofx+ppFM1EaZb/flTwJ77b19EMD1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@supabase/cli-windows-arm64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-windows-arm64/-/cli-windows-arm64-2.107.0.tgz", - "integrity": "sha512-V/4q5dbDgBQXhDAJaHamTm9u/kY2UJ4nNibVKOYMaLh9q7H74b8unteJ+rYHSwWZy0EIT8DTDryGP6xatKQicw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@supabase/cli-windows-x64": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/@supabase/cli-windows-x64/-/cli-windows-x64-2.107.0.tgz", - "integrity": "sha512-ciDDFUGHt6bFjtVD00cojFhB5oscZAyjPo2vg94RGUeKHXx1zo/UzfMvUlCA32y5b5KONZ4TKStCHhlFK7Clrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@supabase/functions-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.108.2.tgz", - "integrity": "sha512-RNUX8EiBy3iLwAX19jtRzLyePnl11/fHcgwDHLnpKcDSXt/5qBnh3LUwAtIjT21Q66QsmNUR2esrHziLCpNubw==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/phoenix": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.4.tgz", - "integrity": "sha512-Gt0pqoXuIqX/8dvG0OKp/wMCobXNH3klNbUPBNyOfN0YA1IswrM3HyWFMOPk1Jy+BRaIyDPcFx4jLBwHNmlyfQ==", - "license": "MIT" - }, - "node_modules/@supabase/postgrest-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.108.2.tgz", - "integrity": "sha512-GQ28/Y8hk3CFmkb3kXH1h/AQx6JIYSQfO0CJMRVBcEKZoNy6C45cXAZ4fcJvRC5Id0cs6xnkUV0+c0rIocigsw==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.108.2.tgz", - "integrity": "sha512-aAGxCSUemZvQIibnCdvNvgaKib28I4rfrNjKbQ9cG1uBLwUsI7hVpGXgEbypCCDhLjQlDTAiJlu7rgljYUT73g==", - "license": "MIT", - "dependencies": { - "@supabase/phoenix": "^0.4.2", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.108.2.tgz", - "integrity": "sha512-TVZPQxXGxY2+A6yTtm77zUHsh70lBhYUEaJL8RQC+BghcX/ygiMG/rmXrNVBce30/WAeNPa8FiG8HbqlGeV05g==", - "license": "MIT", - "dependencies": { - "iceberg-js": "^0.8.1", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.108.2", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.108.2.tgz", - "integrity": "sha512-hFhnPveb5JQg4a0QYicM0swT253YHMdfeRAl2BKHOlI5VAzuHxUGSr8RbwNLYNPauWOgQMS1H8sz8bvYlgwUfQ==", - "license": "MIT", - "dependencies": { - "@supabase/auth-js": "2.108.2", - "@supabase/functions-js": "2.108.2", - "@supabase/postgrest-js": "2.108.2", - "@supabase/realtime-js": "2.108.2", - "@supabase/storage-js": "2.108.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@tanstack/eslint-plugin-query": { - "version": "5.81.2", - "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.81.2.tgz", - "integrity": "sha512-h4k6P6fm5VhKP5NkK+0TTVpGGyKQdx6tk7NYYG7J7PkSu7ClpLgBihw7yzK8N3n5zPaF3IMyErxfoNiXWH/3/A==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^8.18.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@tanstack/history": { - "version": "1.161.6", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.6.tgz", - "integrity": "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==", - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.83.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.0.tgz", - "integrity": "sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.83.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.83.0.tgz", - "integrity": "sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==", - "dependencies": { - "@tanstack/query-core": "5.83.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-router": { - "version": "1.169.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.169.2.tgz", - "integrity": "sha512-OJM7Kguc7ERnweaNRWsyWgIKcl3z23rD1B4jaxjzd9RGdnzpt2HfrWa9rggbT0Hfzhfo4D2ZmsfoTme035tniQ==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.161.6", - "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "1.169.2", - "isbot": "^5.1.22" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-start": { - "version": "1.167.65", - "resolved": "https://registry.npmjs.org/@tanstack/react-start/-/react-start-1.167.65.tgz", - "integrity": "sha512-vCGga3RECeR4VpSVuXIU/+zxak5f2qdpUXdZ2yrgcwwKoYPtatdJm6zjS0Py7UOecRqLqMtSeuOjowBJ1higWQ==", - "license": "MIT", - "dependencies": { - "@tanstack/react-router": "1.169.2", - "@tanstack/react-start-client": "1.166.48", - "@tanstack/react-start-rsc": "0.0.44", - "@tanstack/react-start-server": "1.166.52", - "@tanstack/router-utils": "1.161.8", - "@tanstack/start-client-core": "1.168.2", - "@tanstack/start-plugin-core": "1.169.20", - "@tanstack/start-server-core": "1.167.30", - "pathe": "^2.0.3" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rsbuild/core": "^2.0.0", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0", - "vite": ">=7.0.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - }, - "@vitejs/plugin-rsc": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-start-client": { - "version": "1.166.48", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-client/-/react-start-client-1.166.48.tgz", - "integrity": "sha512-6fqwCwe6v+Nvtdf6vg6gxs/0gCXyZEHF18EslNeG/kca2wnXYFuXRhqGJjJaEgMk3WF4IE9mUgFuBSAOY3P7nQ==", - "license": "MIT", - "dependencies": { - "@tanstack/react-router": "1.169.2", - "@tanstack/router-core": "1.169.2", - "@tanstack/start-client-core": "1.168.2" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-start-server": { - "version": "1.166.52", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-server/-/react-start-server-1.166.52.tgz", - "integrity": "sha512-46Gx+byIndYywUtyna5h3qatHipJkPFqo/miexfuYPgeVAI6ypQzsw7wxF194H6VAP43m2q+fdLPBXStufoOGw==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.161.6", - "@tanstack/react-router": "1.169.2", - "@tanstack/router-core": "1.169.2", - "@tanstack/start-client-core": "1.168.2", - "@tanstack/start-server-core": "1.167.30" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-start/node_modules/@tanstack/react-start-rsc": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-rsc/-/react-start-rsc-0.0.44.tgz", - "integrity": "sha512-5iYUWSBjTwJbV8bTLJHZ5dHm8c/79J6spxPlKsjt9/R0mQaQQjLVNMpv5CrOZ2vPTaZx1ALoGdSWP4WdPcuKRA==", - "license": "MIT", - "dependencies": { - "@tanstack/react-router": "1.169.2", - "@tanstack/react-start-server": "1.166.52", - "@tanstack/router-core": "1.169.2", - "@tanstack/router-utils": "1.161.8", - "@tanstack/start-client-core": "1.168.2", - "@tanstack/start-fn-stubs": "1.161.6", - "@tanstack/start-plugin-core": "1.169.20", - "@tanstack/start-server-core": "1.167.30", - "@tanstack/start-storage-context": "1.166.35", - "pathe": "^2.0.3" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rspack/core": ">=2.0.0-0", - "@vitejs/plugin-rsc": ">=0.5.20", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0", - "react-server-dom-rspack": ">=0.0.2" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "@vitejs/plugin-rsc": { - "optional": true - }, - "react-server-dom-rspack": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-store": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", - "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", - "license": "MIT", - "dependencies": { - "@tanstack/store": "0.9.3", - "use-sync-external-store": "^1.6.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/router-core": { - "version": "1.169.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.169.2.tgz", - "integrity": "sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.161.6", - "cookie-es": "^3.0.0", - "seroval": "^1.5.4", - "seroval-plugins": "^1.5.4" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-generator": { - "version": "1.166.42", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.166.42.tgz", - "integrity": "sha512-2qBWC0t78r6b3vI+AbnvCZcFAvbYBDlLuWZrTjQbcjUmwG3qyeQp983tJyDuj9wb5//adG1tgAGXZkJ3aDwdBg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.169.2", - "@tanstack/router-utils": "1.161.8", - "@tanstack/virtual-file-routes": "1.161.7", - "jiti": "^2.7.0", - "magic-string": "^0.30.21", - "prettier": "^3.5.0", - "zod": "^3.24.2" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-generator/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/@tanstack/router-plugin": { - "version": "1.167.35", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.167.35.tgz", - "integrity": "sha512-UAScU5VAzLYVY4FML/Cbc5S5TucT4I8Ata05yozGOe4ZfepTKRffA5xWLtD2N+ov5svdv0KTX/kqlZnYPe28mA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.169.2", - "@tanstack/router-generator": "1.166.42", - "@tanstack/router-utils": "1.161.8", - "@tanstack/virtual-file-routes": "1.161.7", - "chokidar": "^3.6.0", - "unplugin": "^3.0.0", - "zod": "^3.24.2" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rsbuild/core": ">=1.0.2 || ^2.0.0", - "@tanstack/react-router": "^1.169.2", - "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", - "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", - "webpack": ">=5.92.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - }, - "@tanstack/react-router": { - "optional": true - }, - "vite": { - "optional": true - }, - "vite-plugin-solid": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-plugin/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@tanstack/router-plugin/node_modules/unplugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", - "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@tanstack/router-plugin/node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "license": "MIT" - }, - "node_modules/@tanstack/router-utils": { - "version": "1.161.8", - "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.161.8.tgz", - "integrity": "sha512-xyiLWEKjfBAVhauDSSjXxyf7s8elU6SM+V050sbkofvGmIIvkwPFtDsX7Gvwh14kBd6iCwAT+RiPvXTxAptY0Q==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.5", - "@babel/generator": "^7.28.5", - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "ansis": "^4.1.0", - "babel-dead-code-elimination": "^1.0.12", - "diff": "^8.0.2", - "pathe": "^2.0.3", - "tinyglobby": "^0.2.15" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/start-client-core": { - "version": "1.168.2", - "resolved": "https://registry.npmjs.org/@tanstack/start-client-core/-/start-client-core-1.168.2.tgz", - "integrity": "sha512-/bckv9k/yxY4VmSY2V2MeX7NBsS5uqGvdSPs5WIvW3Uv35DXPrdiumKXTNJeZRNRMtxrM+YfxQPjXLx3C7ykvg==", - "license": "MIT", - "dependencies": { - "@tanstack/router-core": "1.169.2", - "@tanstack/start-fn-stubs": "1.161.6", - "@tanstack/start-storage-context": "1.166.35", - "seroval": "^1.5.4" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/start-fn-stubs": { - "version": "1.161.6", - "resolved": "https://registry.npmjs.org/@tanstack/start-fn-stubs/-/start-fn-stubs-1.161.6.tgz", - "integrity": "sha512-Y6QSlGiLga8cHfvxGGaonXIlt2bIUTVdH6AMjmpMp7+ANNCp+N96GQbjjhLye3JkaxDfP68x5iZA8NK4imgRig==", - "license": "MIT", - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/start-plugin-core": { - "version": "1.169.20", - "resolved": "https://registry.npmjs.org/@tanstack/start-plugin-core/-/start-plugin-core-1.169.20.tgz", - "integrity": "sha512-MLSH5P3auFpnol1lMGQhUrpJH7+P5knzBXMnJjXG+nVOvmcYbY0JA+nQMl81kKiqfkEceAiaEdKhl8Zc5Ldolw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.27.1", - "@babel/core": "^7.28.5", - "@babel/types": "^7.28.5", - "@rolldown/pluginutils": "1.0.0-beta.40", - "@tanstack/router-core": "1.169.2", - "@tanstack/router-generator": "1.166.42", - "@tanstack/router-plugin": "1.167.35", - "@tanstack/router-utils": "1.161.8", - "@tanstack/start-client-core": "1.168.2", - "@tanstack/start-server-core": "1.167.30", - "cheerio": "^1.0.0", - "exsolve": "^1.0.7", - "lightningcss": "^1.32.0", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "seroval": "^1.5.4", - "source-map": "^0.7.6", - "srvx": "^0.11.9", - "tinyglobby": "^0.2.15", - "ufo": "^1.5.4", - "vitefu": "^1.1.1", - "xmlbuilder2": "^4.0.3", - "zod": "^3.24.2" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@rsbuild/core": "^2.0.0", - "vite": ">=7.0.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@tanstack/start-plugin-core/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@tanstack/start-server-core": { - "version": "1.167.30", - "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.167.30.tgz", - "integrity": "sha512-GC0PXzYYSEwfAOC2NxGXFUyYvfbSjVoqnIrzJsyInKd8xQxGEQaVdrebbyx9TV5cj7A5e7EJcWAsf3G3wRDQBw==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.161.6", - "@tanstack/router-core": "1.169.2", - "@tanstack/start-client-core": "1.168.2", - "@tanstack/start-storage-context": "1.166.35", - "fetchdts": "^0.1.6", - "h3-v2": "npm:h3@2.0.1-rc.20", - "seroval": "^1.5.4" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/start-storage-context": { - "version": "1.166.35", - "resolved": "https://registry.npmjs.org/@tanstack/start-storage-context/-/start-storage-context-1.166.35.tgz", - "integrity": "sha512-ZKDkKiorJrKwfEHjatEwRHG7EP3raJPhh6CSl4CFmHW0naIvwaW5gQcxcT8IlHtoGDLYDAjBEcSr3MZyXgqmOA==", - "license": "MIT", - "dependencies": { - "@tanstack/router-core": "1.169.2" - }, - "engines": { - "node": ">=22.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/store": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", - "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/virtual-file-routes": { - "version": "1.161.7", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.161.7.tgz", - "integrity": "sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==", - "license": "MIT", - "bin": { - "intent": "bin/intent.js" - }, - "engines": { - "node": ">=20.19" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tokenizer/inflate": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "token-types": "^6.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz", - "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, - "node_modules/@types/omggif": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/omggif/-/omggif-1.0.5.tgz", - "integrity": "sha512-gDQJflz1rOgEcUXkMAl80bDGN46f5mp8GbcM5dyvq+zsFV6YRBRtmNxlJJ5mjY77T7BRkRFzdIBVmK90QYhCxA==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.1.tgz", - "integrity": "sha512-1U5NQWh/GylZQ50ZMnnPjkYHEaGhg6t5i/KI0LDDh3t4E3h3T3vzm+GLY2BRzMfIjSBwzm6tginoZl5z0O/qsA==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.1.tgz", - "integrity": "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==" - }, - "node_modules/@types/three": { - "version": "0.160.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.160.0.tgz", - "integrity": "sha512-jWlbUBovicUKaOYxzgkLlhkiEQJkhCVvg4W2IYD2trqD2om3VK4DGLpHH5zQHNr7RweZK/5re/4IVhbhvxbV9w==", - "dependencies": { - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.6.10", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/three/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.22", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.22.tgz", - "integrity": "sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.38.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@upsetjs/venn.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", - "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", - "license": "MIT", - "optionalDependencies": { - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1" - } - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", - "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.7" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", - "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.65", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.65.tgz", - "integrity": "sha512-55R4/i0yQ0glT6kDCM64sn3smirbtqcnG0lIoCnNeZa5yCusFP3iCuf1Cmpu5PjrOMHHQgciDgBL0V6vGqJ7fg==", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ai": { - "version": "6.0.177", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.177.tgz", - "integrity": "sha512-1xQtbeWwNcLyyM86ixZhkKvT+WRXc1lvarIKqPVtsyn8F9NDikwUMBqYu+aQKDgMht50SMXh4qboYuU8MeHZZA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "3.0.112", - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", - "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", - "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camera-controls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.0.tgz", - "integrity": "sha512-w5oULNpijgTRH0ARFJJ0R5ct1nUM3R3WP7/b8A6j9uTGpRfnsypc/RBMPQV8JQDPayUe37p/TZZY1PcUr4czOQ==", - "engines": { - "node": ">=20.11.0", - "npm": ">=10.8.2" - }, - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", - "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", - "license": "MIT" - }, - "node_modules/core-js": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", - "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crossws": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.5.tgz", - "integrity": "sha512-wUR89x/Rw7/8t+vn0CmGDYM9TD6VtARGb0LD5jq2wjtMy1vCP4M+sm6N6TigWeTYvnA8MoW29NqqXD0ep0rfBA==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "srvx": ">=0.11.5" - }, - "peerDependenciesMeta": { - "srvx": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/csv-parse": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-6.2.1.tgz", - "integrity": "sha512-LRLMV+UCyfMokp8Wb411duBf1gaBKJfOfBWU9eHMJ+b+cJYZsNu3AFmjJf3+yPGd59Exz1TsMjaSFyxnYB9+IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.2.tgz", - "integrity": "sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", - "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", - "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.187", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz", - "integrity": "sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==" - }, - "node_modules/embla-carousel": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==" - }, - "node_modules/embla-carousel-react": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", - "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", - "dependencies": { - "embla-carousel": "8.6.0", - "embla-carousel-reactive-utils": "8.6.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", - "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-runner": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/env-runner/-/env-runner-0.1.7.tgz", - "integrity": "sha512-i7h96jxETJYhXy5grgHNJ9xNzCzWIn9Ck/VkkYgOlE4gOqknsLX3CmlVb5LmwNex8sOoLFVZLz+TIw/+b5rktA==", - "dev": true, - "license": "MIT", - "dependencies": { - "crossws": "^0.4.4", - "exsolve": "^1.0.8", - "httpxy": "^0.5.0", - "srvx": "^0.11.13" - }, - "bin": { - "env-runner": "dist/cli.mjs" - }, - "peerDependencies": { - "@netlify/runtime": "^4", - "miniflare": "^4.20260317.3" - }, - "peerDependenciesMeta": { - "@netlify/runtime": { - "optional": true - }, - "miniflare": { - "optional": true - } - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-toolkit": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.48.1.tgz", - "integrity": "sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", - "dev": true, - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", - "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-sha256": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", - "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", - "license": "Unlicense" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/fetch-blob/node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/fetchdts": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/fetchdts/-/fetchdts-0.1.7.tgz", - "integrity": "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==", - "license": "MIT" - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-type": { - "version": "21.3.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", - "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", - "license": "MIT", - "dependencies": { - "@tokenizer/inflate": "^0.4.1", - "strtok3": "^10.3.4", - "token-types": "^6.1.1", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.39.0.tgz", - "integrity": "sha512-+vnLfzrv0MzjLzNl+nvNvR7jdg3q4cxxjz/YvzfifHl0TREtL00cs1RoMTxs+1PzLiEqZGV6gYsBY0oEAYZ24w==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.39.0", - "motion-utils": "^12.39.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gaxios/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/gaxios/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gaxios/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", - "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" - }, - "node_modules/google-auth-library": { - "version": "10.6.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.1.4", - "gcp-metadata": "8.1.2", - "google-logging-utils": "1.1.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/h3": { - "version": "2.0.1-rc.22", - "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.22.tgz", - "integrity": "sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rou3": "^0.8.1", - "srvx": "^0.11.15" - }, - "bin": { - "h3": "bin/h3.mjs" - }, - "engines": { - "node": ">=20.11.1" - }, - "peerDependencies": { - "crossws": "^0.4.1" - }, - "peerDependenciesMeta": { - "crossws": { - "optional": true - } - } - }, - "node_modules/h3-v2": { - "name": "h3", - "version": "2.0.1-rc.20", - "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.20.tgz", - "integrity": "sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==", - "license": "MIT", - "dependencies": { - "rou3": "^0.8.1", - "srvx": "^0.11.13" - }, - "bin": { - "h3": "bin/h3.mjs" - }, - "engines": { - "node": ">=20.11.1" - }, - "peerDependencies": { - "crossws": "^0.4.1" - }, - "peerDependenciesMeta": { - "crossws": { - "optional": true - } - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-dom": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", - "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", - "license": "ISC", - "dependencies": { - "@types/hast": "^3.0.0", - "hastscript": "^9.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", - "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-dom": "^5.0.0", - "hast-util-from-html": "^2.0.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-sanitize": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "unist-util-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hls.js": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.7.tgz", - "integrity": "sha512-QW2fnwDGKGc9DwQUGLbmMOz8G48UZK7PVNJPcOUql1b8jubKx4/eMHNP5mGqr6tYlJNDG1g10Lx2U/qPzL6zwQ==" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hookable": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", - "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/httpxy": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.2.tgz", - "integrity": "sha512-C5OM92bmywDDdKTuYCGejdNFAb/zy0LX4srimOudYko847HvoWL2Eeik9odh9friPKu/JrlWv4z/amrJoxq2Cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iceberg-js": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", - "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-type": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/image-type/-/image-type-6.1.0.tgz", - "integrity": "sha512-SBKn3TelGQdOLAROwl99gN7HUWWozZCHQIH5PmvpJUA/u5+BJBCsVz7lSO+Q3Kl2K/uw9QU6GDcksA16RtuzSw==", - "license": "MIT", - "dependencies": { - "file-type": "^21.3.4" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/input-otp": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", - "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/isbot": { - "version": "5.1.40", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.40.tgz", - "integrity": "sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/its-fine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", - "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", - "dependencies": { - "@types/react-reconciler": "^0.28.9" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-to-ts": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/katex": { - "version": "0.16.45", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz", - "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/lint-staged": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz", - "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.5.0", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^9.0.1", - "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/listr2": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz", - "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lottie-react": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", - "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", - "license": "MIT", - "dependencies": { - "lottie-web": "^5.10.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/lottie-web": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", - "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.446.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.446.0.tgz", - "integrity": "sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", - "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "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.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", - "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "longest-streak": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.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.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "11.15.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz", - "integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.1.1", - "@types/d3": "^7.4.3", - "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.1", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.14", - "dayjs": "^1.11.19", - "dompurify": "^3.3.1", - "es-toolkit": "^1.45.1", - "katex": "^0.16.25", - "khroma": "^2.1.0", - "marked": "^16.3.0", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" - } - }, - "node_modules/mermaid/node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "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.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.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.0.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.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-cjk-friendly": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly/-/micromark-extension-cjk-friendly-2.0.1.tgz", - "integrity": "sha512-OkzoYVTL1ChbvQ8Cc1ayTIz7paFQz8iS9oIYmewncweUSwmWR+hkJF9spJ1lxB90XldJl26A1F4IkPOKS3bDXw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.1.0", - "micromark-extension-cjk-friendly-util": "3.0.1", - "micromark-util-chunked": "^2.0.1", - "micromark-util-resolve-all": "^2.0.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "micromark": "^4.0.0", - "micromark-util-types": "^2.0.0" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-cjk-friendly-gfm-strikethrough": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-gfm-strikethrough/-/micromark-extension-cjk-friendly-gfm-strikethrough-2.0.1.tgz", - "integrity": "sha512-wVC0zwjJNqQeX+bb07YTPu/CvSAyCTafyYb7sMhX1r62/Lw5M/df3JyYaANyp8g15c1ypJRFSsookTqA1IDsUg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.1.0", - "get-east-asian-width": "^1.4.0", - "micromark-extension-cjk-friendly-util": "3.0.1", - "micromark-util-character": "^2.1.1", - "micromark-util-chunked": "^2.0.1", - "micromark-util-resolve-all": "^2.0.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "micromark": "^4.0.0", - "micromark-util-types": "^2.0.0" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-cjk-friendly-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-util/-/micromark-extension-cjk-friendly-util-3.0.1.tgz", - "integrity": "sha512-GcbXqTTHOsiZHyF753oIddP/J2eH8j9zpyQPhkof6B2JNxfEJabnQqxbCgzJNuNes0Y2jTNJ3LiYPSXr6eJA8w==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.4.0", - "micromark-util-character": "^2.1.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/motion": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.39.0.tgz", - "integrity": "sha512-H4a+Ze+a9j+/NTla5ezfb/g9vmIOxC+viDj++NGDZyTZkdRKjiOz3kSv6TalRWM8ZmD2y/CfC6TkQc97ybyqSA==", - "license": "MIT", - "dependencies": { - "framer-motion": "^12.39.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/motion-dom": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.39.0.tgz", - "integrity": "sha512-Xn7aAcGDhco/JZTXOub64UmaYn73C6J1Po7Fk+8EvkJsNGTqfhon6UJY53vJKXW5v5Zl8HrYsVxv6oPXeGoGLQ==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.39.0" - } - }, - "node_modules/motion-utils": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", - "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nf3": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/nf3/-/nf3-0.3.17.tgz", - "integrity": "sha512-N9zEWySuJFw+gR0lhS5863YsvNeudOdqRyFvNb+jMXbeTJOdrjDqkCpDginIZfUm0LzT1t1nCRiDeqQm/8kirQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nitro": { - "version": "3.0.260429-beta", - "resolved": "https://registry.npmjs.org/nitro/-/nitro-3.0.260429-beta.tgz", - "integrity": "sha512-KweLVCUN5X9v9g+4yxAyRcz3FcOlnjmt9FyrAIWDxJETJmNT7I0JV0clgsONjo2nI0U5gwedXYA3RaNtF5XWzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.4.2", - "crossws": "^0.4.5", - "db0": "^0.3.4", - "env-runner": "^0.1.7", - "h3": "^2.0.1-rc.20", - "hookable": "^6.1.1", - "nf3": "^0.3.16", - "ocache": "^0.1.4", - "ofetch": "^2.0.0-alpha.3", - "ohash": "^2.0.11", - "rolldown": "^1.0.0-rc.17", - "srvx": "^0.11.15", - "unenv": "^2.0.0-rc.24", - "unstorage": "^2.0.0-alpha.7" - }, - "bin": { - "nitro": "dist/cli/index.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@vercel/queue": "^0.1.6", - "dotenv": "*", - "giget": "*", - "jiti": "^2.6.1", - "rollup": "^4.60.2", - "vite": "^7 || ^8", - "xml2js": "^0.6.2", - "zephyr-agent": "^0.2.0" - }, - "peerDependenciesMeta": { - "@vercel/queue": { - "optional": true - }, - "dotenv": { - "optional": true - }, - "giget": { - "optional": true - }, - "jiti": { - "optional": true - }, - "rollup": { - "optional": true - }, - "vite": { - "optional": true - }, - "xml2js": { - "optional": true - }, - "zephyr-agent": { - "optional": true - } - } - }, - "node_modules/nitro/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/nitro/node_modules/db0": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.4.tgz", - "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@electric-sql/pglite": "*", - "@libsql/client": "*", - "better-sqlite3": "*", - "drizzle-orm": "*", - "mysql2": "*", - "sqlite3": "*" - }, - "peerDependenciesMeta": { - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "drizzle-orm": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/nitro/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "dev": true, - "license": "BlueOak-1.0.0", - "optional": true, - "peer": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/nitro/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/nitro/node_modules/unstorage": { - "version": "2.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-2.0.0-alpha.7.tgz", - "integrity": "sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@azure/app-configuration": "^1.11.0", - "@azure/cosmos": "^4.9.1", - "@azure/data-tables": "^13.3.2", - "@azure/identity": "^4.13.0", - "@azure/keyvault-secrets": "^4.10.0", - "@azure/storage-blob": "^12.31.0", - "@capacitor/preferences": "^6 || ^7 || ^8", - "@deno/kv": ">=0.13.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.36.2", - "@vercel/blob": ">=0.27.3", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "chokidar": "^4 || ^5", - "db0": ">=0.3.4", - "idb-keyval": "^6.2.2", - "ioredis": "^5.9.3", - "lru-cache": "^11.2.6", - "mongodb": "^6 || ^7", - "ofetch": "*", - "uploadthing": "^7.7.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "chokidar": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "lru-cache": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "ofetch": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", - "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", - "license": "BSD-3-Clause" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/ocache": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/ocache/-/ocache-0.1.4.tgz", - "integrity": "sha512-e7geNdWjxSnvsSgvLuPvgKgu7ubM10ZmTPOgpr7mz2BXYtvjMKTiLhjFi/gWU8chkuP6hNkZBsa9LzOusyaqkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ohash": "^2.0.11" - } - }, - "node_modules/ofetch": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-2.0.0-alpha.3.tgz", - "integrity": "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "license": "MIT" - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/openai": { - "version": "6.37.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.37.0.tgz", - "integrity": "sha512-0H5dEGFmmLv6KSd0W1w2nyL8WsLkX6yoLeQpU+dZAOuGcany5qkYQMmj35ZrKgb6yiyYqpUzFOpR8mZQkgqeEQ==", - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/posthog-js": { - "version": "1.307.2", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.307.2.tgz", - "integrity": "sha512-Fnyia8nMwKtM80FeZi6nV0WlywDThBxldN+erQGQsDYQ9LByTMrAwrvKttFZ+KK1sE8DUPpT9/JkRrdwRNaUTg==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@posthog/core": "1.8.0", - "core-js": "^3.38.1", - "fflate": "^0.4.8", - "preact": "^10.19.3", - "web-vitals": "^4.2.4" - } - }, - "node_modules/posthog-js/node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", - "license": "MIT" - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/preact": { - "version": "10.29.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.2.tgz", - "integrity": "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", - "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", - "dev": true, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-hermes": "*", - "@prettier/plugin-oxc": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-multiline-arrays": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-hermes": { - "optional": true - }, - "@prettier/plugin-oxc": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-multiline-arrays": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", - "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.3.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", - "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz", - "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/react-easy-crop": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.5.6.tgz", - "integrity": "sha512-Jw3/ozs8uXj3NpL511Suc4AHY+mLRO23rUgipXvNYKqezcFSYHxe4QXibBymkOoY6oOtLVMPO2HNPRHYvMPyTw==", - "license": "MIT", - "dependencies": { - "normalize-wheel": "^1.0.1", - "tslib": "^2.0.1" - }, - "peerDependencies": { - "react": ">=16.4.0", - "react-dom": ">=16.4.0" - } - }, - "node_modules/react-hook-form": { - "version": "7.60.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz", - "integrity": "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-reconciler": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz", - "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==", - "dependencies": { - "scheduler": "^0.25.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", - "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-smooth": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", - "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", - "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "optional": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recharts": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", - "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/recharts/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/rehype-harden": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/rehype-harden/-/rehype-harden-1.1.8.tgz", - "integrity": "sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==", - "license": "MIT", - "dependencies": { - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/rehype-katex": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", - "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/katex": "^0.16.0", - "hast-util-from-html-isomorphic": "^2.0.0", - "hast-util-to-text": "^4.0.0", - "katex": "^0.16.0", - "unist-util-visit-parents": "^6.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sanitize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-sanitize": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-cjk-friendly": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/remark-cjk-friendly/-/remark-cjk-friendly-2.0.1.tgz", - "integrity": "sha512-6WwkoQyZf/4j5k53zdFYrR8Ca+UVn992jXdLUSBDZR4eBpFhKyVxmA4gUHra/5fesjGIxrDhHesNr/sVoiiysA==", - "license": "MIT", - "dependencies": { - "micromark-extension-cjk-friendly": "2.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/mdast": "^4.0.0", - "unified": "^11.0.0" - }, - "peerDependenciesMeta": { - "@types/mdast": { - "optional": true - } - } - }, - "node_modules/remark-cjk-friendly-gfm-strikethrough": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/remark-cjk-friendly-gfm-strikethrough/-/remark-cjk-friendly-gfm-strikethrough-2.0.1.tgz", - "integrity": "sha512-pWKj25O2eLXIL1aBupayl1fKhco+Brw8qWUWJPVB9EBzbQNd7nGLj0nLmJpggWsGLR5j5y40PIdjxby9IEYTuA==", - "license": "MIT", - "dependencies": { - "micromark-extension-cjk-friendly-gfm-strikethrough": "2.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/mdast": "^4.0.0", - "unified": "^11.0.0" - }, - "peerDependenciesMeta": { - "@types/mdast": { - "optional": true - } - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "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.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", - "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-math": "^3.0.0", - "micromark-extension-math": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remend": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/remend/-/remend-1.3.0.tgz", - "integrity": "sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw==", - "license": "Apache-2.0" - }, - "node_modules/replicate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/replicate/-/replicate-1.4.0.tgz", - "integrity": "sha512-1ufKejfUVz/azy+5TnzQP7U1+MHVWZ6psnQ06az8byUUnRhT+DZ/MvewzB1NQYBVMgNKR7xPDtTwlcP5nv/5+w==", - "license": "Apache-2.0", - "engines": { - "git": ">=2.11.0", - "node": ">=18.0.0", - "npm": ">=7.19.0", - "yarn": ">=1.7.0" - }, - "optionalDependencies": { - "readable-stream": ">=4.0.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/robot3": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/robot3/-/robot3-0.4.1.tgz", - "integrity": "sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==", - "license": "BSD-2-Clause" - }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, - "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.133.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" - } - }, - "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/rou3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.8.1.tgz", - "integrity": "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==", - "license": "MIT" - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/seroval": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", - "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", - "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", - "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.23.0", - "@shikijs/engine-javascript": "3.23.0", - "@shikijs/engine-oniguruma": "3.23.0", - "@shikijs/langs": "3.23.0", - "@shikijs/themes": "3.23.0", - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sonner": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz", - "integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/srvx": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", - "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", - "license": "MIT", - "bin": { - "srvx": "bin/srvx.mjs" - }, - "engines": { - "node": ">=20.16.0" - } - }, - "node_modules/standardwebhooks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.0.0.tgz", - "integrity": "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==", - "license": "MIT", - "dependencies": { - "@stablelib/base64": "^1.0.0", - "fast-sha256": "^1.3.0" - } - }, - "node_modules/stats-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", - "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", - "dependencies": { - "@types/three": "*", - "three": "^0.170.0" - }, - "peerDependencies": { - "@types/three": "*", - "three": "*" - } - }, - "node_modules/stats-gl/node_modules/three": { - "version": "0.170.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==" - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" - }, - "node_modules/streamdown": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/streamdown/-/streamdown-2.5.0.tgz", - "integrity": "sha512-/tTnURfIOxZK/pqJAxsfCvETG/XCJHoWnk3jq9xLcuz6CSpnjjuxSRBTTL4PKGhxiZQf0lqPxGhImdpwcZ2XwA==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1", - "hast-util-to-jsx-runtime": "^2.3.6", - "html-url-attributes": "^3.0.1", - "marked": "^17.0.1", - "mermaid": "^11.12.2", - "rehype-harden": "^1.1.8", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remend": "1.3.0", - "tailwind-merge": "^3.4.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/streamdown/node_modules/tailwind-merge": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", - "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strtok3": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", - "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/stylis": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", - "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supabase": { - "version": "2.107.0", - "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.107.0.tgz", - "integrity": "sha512-qYAbm3D//buhnY5v4L//IrBQhowN2Jd2kx16hNyOfu0+TVuWVIR1L5WsS/YOk+UJh3Ch5ABmqKebWpwn1p0ysg==", - "dev": true, - "license": "MIT", - "bin": { - "supabase": "dist/supabase.js" - }, - "optionalDependencies": { - "@supabase/cli-darwin-arm64": "2.107.0", - "@supabase/cli-darwin-x64": "2.107.0", - "@supabase/cli-linux-arm64": "2.107.0", - "@supabase/cli-linux-arm64-musl": "2.107.0", - "@supabase/cli-linux-x64": "2.107.0", - "@supabase/cli-linux-x64-musl": "2.107.0", - "@supabase/cli-windows-arm64": "2.107.0", - "@supabase/cli-windows-x64": "2.107.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/swr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", - "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/tailwind-merge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", - "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "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": "^3.1.3", - "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-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.160.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.160.1.tgz", - "integrity": "sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==" - }, - "node_modules/three-mesh-bvh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", - "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.0.tgz", - "integrity": "sha512-kv0Byb++AXztEGsULgMAs8U2jgUdz6HPpAB/wDJnLiLlaWQX2APHhiTJIN7rqW+Of0eRgcp7jn05U1BsCP3xBA==", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tinyexec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", - "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/token-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", - "license": "MIT", - "dependencies": { - "@borewit/text-codec": "^0.2.1", - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/troika-three-text": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", - "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.52.4", - "troika-worker-utils": "^0.52.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", - "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", - "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==" - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tunnel-rat/node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", - "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.38.0", - "@typescript-eslint/parser": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, - "node_modules/uint8array-extras": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - }, - "node_modules/unenv": { - "version": "2.0.0-rc.24", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", - "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unplugin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", - "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.8.1", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.5.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", - "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/vaul": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", - "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitefu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", - "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", - "license": "Apache-2.0" - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack-sources": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", - "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", - "license": "MIT" - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "license": "MIT", - "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 - } - } - }, - "node_modules/xmlbuilder2": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-4.0.3.tgz", - "integrity": "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==", - "license": "MIT", - "dependencies": { - "@oozcitak/dom": "^2.0.2", - "@oozcitak/infra": "^2.0.2", - "@oozcitak/util": "^10.0.0", - "js-yaml": "^4.1.1" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.6.tgz", - "integrity": "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/CADAM/package.json b/CADAM/package.json deleted file mode 100644 index be3e922..0000000 --- a/CADAM/package.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "name": "vite-react-typescript-starter", - "private": true, - "version": "0.0.0", - "type": "module", - "engines": { - "node": "^20.19.0 || >=22.12.0", - "npm": ">=10" - }, - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint . --ignore-pattern 'supabase/**'", - "typecheck": "tsc -b --noEmit", - "format": "prettier --write .", - "preview": "vite preview", - "prepare": "husky" - }, - "dependencies": { - "@ai-sdk/anthropic": "^3.0.78", - "@ai-sdk/google": "^3.0.75", - "@ai-sdk/react": "^3.0.100", - "@anthropic-ai/sdk": "^0.96.0", - "@fal-ai/client": "^1.10.1", - "@google/genai": "^2.2.0", - "@hookform/resolvers": "^3.9.0", - "@openrouter/ai-sdk-provider": "^2.9.0", - "@radix-ui/react-accordion": "^1.2.0", - "@radix-ui/react-alert-dialog": "^1.1.1", - "@radix-ui/react-aspect-ratio": "^1.1.0", - "@radix-ui/react-avatar": "^1.1.0", - "@radix-ui/react-checkbox": "^1.1.1", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.1", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-hover-card": "^1.1.1", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-menubar": "^1.1.1", - "@radix-ui/react-navigation-menu": "^1.2.0", - "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-progress": "^1.1.0", - "@radix-ui/react-radio-group": "^1.2.0", - "@radix-ui/react-scroll-area": "^1.1.0", - "@radix-ui/react-select": "^2.1.1", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.0", - "@radix-ui/react-slot": "^1.2.2", - "@radix-ui/react-switch": "^1.1.0", - "@radix-ui/react-tabs": "^1.1.3", - "@radix-ui/react-toast": "^1.2.1", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.2", - "@radix-ui/react-use-controllable-state": "^1.2.2", - "@react-three/drei": "^10.0.7", - "@react-three/fiber": "^9.1.2", - "@sentry/react": "^9.1.0", - "@sentry/vite-plugin": "^3.1.2", - "@sitnik/nanoid": "npm:@jsr/sitnik__nanoid@^5.1.2", - "@streamdown/cjk": "^1.0.3", - "@streamdown/code": "^1.1.1", - "@streamdown/math": "^1.0.2", - "@streamdown/mermaid": "^1.0.2", - "@supabase/supabase-js": "^2.108.2", - "@tanstack/react-query": "^5.64.2", - "@tanstack/react-router": "^1.169.2", - "@tanstack/react-start": "^1.167.65", - "@types/omggif": "^1.0.5", - "@types/three": "^0.160.0", - "@zip.js/zip.js": "^2.7.63", - "ai": "^6.0.177", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "embla-carousel-react": "^8.6.0", - "fflate": "^0.8.2", - "framer-motion": "^12.16.0", - "image-type": "^6.1.0", - "input-otp": "^1.2.4", - "lottie-react": "^2.4.1", - "lucide-react": "^0.446.0", - "motion": "^12.39.0", - "omggif": "^1.0.10", - "openai": "^6.37.0", - "posthog-js": "^1.307.2", - "react": "19.2.1", - "react-colorful": "^5.6.1", - "react-dom": "19.2.1", - "react-easy-crop": "^5.5.0", - "react-hook-form": "^7.53.0", - "react-resizable-panels": "^2.1.7", - "recharts": "^2.12.7", - "replicate": "^1.0.1", - "sonner": "^1.5.0", - "streamdown": "^2.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.160.1", - "vaul": "^1.0.0", - "zod": "^3.23.8" - }, - "devDependencies": { - "@eslint/js": "^9.11.1", - "@tanstack/eslint-plugin-query": "^5.64.2", - "@types/node": "^22.7.3", - "@types/react": "^19.2.1", - "@types/react-dom": "^19.2.1", - "@vitejs/plugin-react": "^6.0.1", - "autoprefixer": "^10.4.20", - "csv-parse": "^6.2.1", - "eslint": "^9.11.1", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.12", - "globals": "^15.9.0", - "husky": "^9.1.7", - "lint-staged": "^16.1.5", - "nitro": "^3.0.260429-beta", - "postcss": "^8.4.47", - "prettier": "^3.5.2", - "prettier-plugin-tailwindcss": "^0.6.11", - "supabase": "^2.15.8", - "tailwindcss": "^3.4.13", - "typescript": "^5.8.3", - "typescript-eslint": "^8.7.0", - "vite": "^8.0.11" - }, - "lint-staged": { - "!(supabase/**)*.{js,jsx,ts,tsx}": [ - "eslint", - "prettier --write" - ], - "supabase/**/*.{js,ts}": [ - "deno lint", - "prettier --write" - ], - "*.{json,css,scss,md,html,yml,yaml}": [ - "prettier --write" - ] - } -} diff --git a/CADAM/postcss.config.js b/CADAM/postcss.config.js deleted file mode 100644 index 2aa7205..0000000 --- a/CADAM/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/CADAM/public/Adam-Logo.png b/CADAM/public/Adam-Logo.png deleted file mode 100644 index d3ea2f1..0000000 Binary files a/CADAM/public/Adam-Logo.png and /dev/null differ diff --git a/CADAM/public/Geist-Regular.ttf b/CADAM/public/Geist-Regular.ttf deleted file mode 100644 index 6fdfffa..0000000 Binary files a/CADAM/public/Geist-Regular.ttf and /dev/null differ diff --git a/CADAM/public/Github-Banner-Dark.png b/CADAM/public/Github-Banner-Dark.png deleted file mode 100644 index 355964d..0000000 Binary files a/CADAM/public/Github-Banner-Dark.png and /dev/null differ diff --git a/CADAM/public/Github-Banner-Light.png b/CADAM/public/Github-Banner-Light.png deleted file mode 100644 index 67dbd39..0000000 Binary files a/CADAM/public/Github-Banner-Light.png and /dev/null differ diff --git a/CADAM/public/adam-icon.ico b/CADAM/public/adam-icon.ico deleted file mode 100644 index 8520526..0000000 Binary files a/CADAM/public/adam-icon.ico and /dev/null differ diff --git a/CADAM/public/adam-logo-full.svg b/CADAM/public/adam-logo-full.svg deleted file mode 100644 index 92c255e..0000000 --- a/CADAM/public/adam-logo-full.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CADAM/public/adam-logo-pink.svg b/CADAM/public/adam-logo-pink.svg deleted file mode 100644 index fcd6fcf..0000000 --- a/CADAM/public/adam-logo-pink.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/CADAM/public/adam-logo.svg b/CADAM/public/adam-logo.svg deleted file mode 100644 index 04f83c9..0000000 --- a/CADAM/public/adam-logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/CADAM/public/cadam-icon.ico b/CADAM/public/cadam-icon.ico deleted file mode 100644 index cabf6dd..0000000 Binary files a/CADAM/public/cadam-icon.ico and /dev/null differ diff --git a/CADAM/public/cadam-icon.svg b/CADAM/public/cadam-icon.svg deleted file mode 100644 index 628f615..0000000 --- a/CADAM/public/cadam-icon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/CADAM/public/cadam-launch.gif b/CADAM/public/cadam-launch.gif deleted file mode 100644 index 2faae01..0000000 Binary files a/CADAM/public/cadam-launch.gif and /dev/null differ diff --git a/CADAM/public/cadam-logo.svg b/CADAM/public/cadam-logo.svg deleted file mode 100644 index a42b384..0000000 --- a/CADAM/public/cadam-logo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/CADAM/public/city.hdr b/CADAM/public/city.hdr deleted file mode 100644 index e3121c1..0000000 Binary files a/CADAM/public/city.hdr and /dev/null differ diff --git a/CADAM/public/fusion.svg b/CADAM/public/fusion.svg deleted file mode 100644 index 77c361a..0000000 --- a/CADAM/public/fusion.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/CADAM/public/libraries/BOSL.zip b/CADAM/public/libraries/BOSL.zip deleted file mode 100644 index 7cd0cac..0000000 Binary files a/CADAM/public/libraries/BOSL.zip and /dev/null differ diff --git a/CADAM/public/libraries/BOSL2.zip b/CADAM/public/libraries/BOSL2.zip deleted file mode 100644 index 3eac5b0..0000000 Binary files a/CADAM/public/libraries/BOSL2.zip and /dev/null differ diff --git a/CADAM/public/libraries/MCAD.zip b/CADAM/public/libraries/MCAD.zip deleted file mode 100644 index 61a9864..0000000 Binary files a/CADAM/public/libraries/MCAD.zip and /dev/null differ diff --git a/CADAM/public/onshape.png b/CADAM/public/onshape.png deleted file mode 100644 index ec91a91..0000000 Binary files a/CADAM/public/onshape.png and /dev/null differ diff --git a/CADAM/public/screenshot-1.jpeg b/CADAM/public/screenshot-1.jpeg deleted file mode 100644 index 1875209..0000000 Binary files a/CADAM/public/screenshot-1.jpeg and /dev/null differ diff --git a/CADAM/public/screenshot-2.jpeg b/CADAM/public/screenshot-2.jpeg deleted file mode 100644 index 7be4fdf..0000000 Binary files a/CADAM/public/screenshot-2.jpeg and /dev/null differ diff --git a/CADAM/public/screenshot-3.jpeg b/CADAM/public/screenshot-3.jpeg deleted file mode 100644 index acf9f63..0000000 Binary files a/CADAM/public/screenshot-3.jpeg and /dev/null differ diff --git a/CADAM/public/solidworks.svg b/CADAM/public/solidworks.svg deleted file mode 100644 index 50dbf43..0000000 --- a/CADAM/public/solidworks.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/CADAM/scripts/load-prod-snapshot.mjs b/CADAM/scripts/load-prod-snapshot.mjs deleted file mode 100644 index 91b4e3f..0000000 --- a/CADAM/scripts/load-prod-snapshot.mjs +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env node -// One-off loader for the production conversations + messages snapshot into -// a freshly-reset local Supabase. The schema lives in the migration at -// supabase/migrations/20260518000000_parametric_ai_sdk_parts.sql — that's -// where `_content_to_parts_v1` and the parts/metadata backfill UPDATE come -// from. This script just gets the CSV bytes into the database and then -// re-fires the same backfill UPDATE so the new rows pick up parts/metadata. -// -// Usage: NODE_PATH=/tmp/node_modules node scripts/load-prod-snapshot.mjs - -import { createReadStream, createWriteStream, mkdirSync, existsSync } from 'fs'; -import { writeFile } from 'fs/promises'; -import { parse as parseStream } from 'csv-parse'; -import { spawn } from 'child_process'; - -const PG_URL = 'postgresql://postgres:postgres@127.0.0.1:54322/postgres'; -const RAW_CONVS = '/Users/dylan-at-adam/Downloads/migration_work/conversations_raw.csv'; -const RAW_MSGS_CLEAN = '/Users/dylan-at-adam/Downloads/migration_work/messages_clean.csv'; -const WORK = '/tmp/cadam_load'; -if (!existsSync(WORK)) mkdirSync(WORK, { recursive: true }); - -function run(cmd, args, opts = {}) { - return new Promise((resolve, reject) => { - const p = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'], ...opts }); - let out = '', err = ''; - p.stdout?.on('data', (c) => (out += c.toString())); - p.stderr?.on('data', (c) => (err += c.toString())); - p.on('close', (code) => { - if (code !== 0) reject(new Error(`${cmd} ${args.slice(0,3).join(' ')} exited ${code}: ${err}\n${out}`)); - else resolve({ out, err }); - }); - p.on('error', reject); - }); -} - -function psql(sql) { - return run('psql', [PG_URL, '-v', 'ON_ERROR_STOP=1', '-c', sql]); -} - -function psqlFile(path) { - return run('psql', [PG_URL, '-v', 'ON_ERROR_STOP=1', '-f', path]); -} - -async function step(label, fn) { - const t = Date.now(); - process.stdout.write(`[${label}] starting...\n`); - const res = await fn(); - process.stdout.write(`[${label}] done in ${((Date.now() - t) / 1000).toFixed(1)}s\n`); - return res; -} - -// 1. Scan conversations CSV → unique user_ids. The CSV columns already -// match the target table, so we'll \copy from the original file later. -const userIds = new Set(); -const conversationIds = new Set(); -await step('scan conversations for user_ids', async () => { - const parser = createReadStream(RAW_CONVS).pipe(parseStream({ columns: true, relax_quotes: true })); - let n = 0; - for await (const row of parser) { - if (row.user_id) userIds.add(row.user_id); - if (row.id) conversationIds.add(row.id); - n++; - if (n % 25000 === 0) process.stdout.write(` rows=${n} distinct_users=${userIds.size}\n`); - } - process.stdout.write(` total conversations=${n}, distinct user_ids=${userIds.size}\n`); -}); - -// 2. Generate auth.users SQL. -await step('write auth.users SQL', async () => { - const out = createWriteStream(`${WORK}/auth_users.sql`); - out.write(`-- Auto-generated dummy auth.users so FK references resolve.\n`); - out.write(`SET session_replication_role = replica;\n`); // silence on_auth_user_created trigger - let i = 0; - for (const id of userIds) { - if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)) continue; - out.write( - `INSERT INTO auth.users (instance_id, id, aud, role, email, encrypted_password, email_confirmed_at, raw_app_meta_data, raw_user_meta_data, created_at, updated_at, confirmation_token, email_change, email_change_token_new, recovery_token) VALUES ('00000000-0000-0000-0000-000000000000', '${id}', 'authenticated', 'authenticated', 'u_${id}@local.invalid', '', now(), '{"provider":"email"}'::jsonb, '{}'::jsonb, now(), now(), '', '', '', '') ON CONFLICT (id) DO NOTHING;\n` - ); - i++; - } - out.write(`SET session_replication_role = DEFAULT;\n`); - out.end(); - await new Promise((r) => out.on('close', r)); - process.stdout.write(` wrote ${i} INSERT statements\n`); -}); - -// 3. Apply auth.users. -await step('create auth.users', () => psqlFile(`${WORK}/auth_users.sql`)); - -await step('truncate target tables', () => psql( - `SET session_replication_role = replica; TRUNCATE public.messages, public.conversations RESTART IDENTITY CASCADE; SET session_replication_role = DEFAULT;` -)); - -// 4. Stream raw CSVs into PostgreSQL with native \copy. -// - replica-mode silences update_leaf_trigger (otherwise the leaf-pointer -// update fires once per inserted message, dragging the load to a crawl). -// - we drop the existing indexes on `messages` before COPY and recreate -// them after, so PostgreSQL doesn't maintain them inline. -await step('drop messages indexes', () => psql( - `DROP INDEX IF EXISTS public.messages_conversation_id_idx;` -)); - -// `\copy` is a psql client-side meta-command; it can only run from stdin -// or a -f script, not from -c. Emit one tiny SQL script per table. -function copySql(table, columns, file) { - return `SET session_replication_role = replica;\n\\copy public.${table} (${columns.join(', ')}) FROM '${file}' WITH (FORMAT csv, HEADER true);\n`; -} - -await step('\\copy conversations', async () => { - const sqlPath = `${WORK}/copy_conversations.sql`; - await writeFile(sqlPath, copySql('conversations', - ['id','created_at','user_id','title','type','privacy','current_message_leaf_id','settings','updated_at'], - RAW_CONVS)); - return psqlFile(sqlPath); -}); - -await step('\\copy messages', async () => { - const sqlPath = `${WORK}/copy_messages.sql`; - await writeFile(sqlPath, copySql('messages', - ['id','created_at','conversation_id','role','content','rating','parent_message_id'], - RAW_MSGS_CLEAN)); - return psqlFile(sqlPath); -}); - -await step('recreate messages indexes', () => psql( - `CREATE INDEX IF NOT EXISTS messages_conversation_id_idx ON public.messages USING btree (conversation_id);` -)); - -// 5. Backfill parts/metadata. -await step('backfill parts + metadata', () => psql( - `UPDATE public.messages m - SET parts = public._content_to_parts_v1(m.id, m.role, m.content, c.user_id, c.id), - metadata = public._content_to_metadata_v1(m.content) - FROM public.conversations c - WHERE c.id = m.conversation_id - AND m.content IS NOT NULL - AND m.parts = '[]'::jsonb;` -)); - -// 6. Verify counts and spot-check. -await step('verify counts', async () => { - const { out } = await psql( - `SELECT (SELECT count(*) FROM public.conversations) AS conv_n, - (SELECT count(*) FROM public.messages) AS msg_n, - (SELECT count(*) FROM public.messages WHERE jsonb_array_length(parts) > 0) AS msg_with_parts, - (SELECT count(*) FROM public.messages WHERE content IS NOT NULL AND jsonb_array_length(parts) = 0) AS msg_empty_parts;` - ); - process.stdout.write(out); -}); - -process.stdout.write('Load complete.\n'); diff --git a/CADAM/shared/Tree.ts b/CADAM/shared/Tree.ts deleted file mode 100644 index e0aaa0e..0000000 --- a/CADAM/shared/Tree.ts +++ /dev/null @@ -1,83 +0,0 @@ -export type TreeNode = T & { - children: TreeNode[]; - parent: TreeNode | null; - get siblings(): TreeNode[]; -}; - -interface TreeElement { - id: string; - parent_message_id: string | null; -} - -class Tree { - allNodes: Map> = new Map(); - rootNodes: TreeNode[] = []; - - constructor(elements: T[]) { - const nodes: Map> = new Map(); // UUID -> node - const rootNodes: TreeNode[] = []; - // First pass: Create all nodes - elements.forEach((element) => { - const node: TreeNode = { - ...element, - children: [], - parent: null, - get siblings() { - return this.parent ? this.parent.children : rootNodes; - }, - }; - nodes.set(element.id, node); - }); - - // Second pass: Build parent-child relationships - elements.forEach((element) => { - const node = nodes.get(element.id); - if (node) { - if (element.parent_message_id) { - const parentNode = nodes.get(element.parent_message_id); - if (parentNode) { - parentNode.children.push(node); - node.parent = parentNode; - } - } else { - // No parent means this is a root node - rootNodes.push(node); - } - } - }); - - this.allNodes = nodes; - this.rootNodes = rootNodes; - } - - getPath(id: string): TreeNode[] { - const path: TreeNode[] = []; - // Visited-set defense against `parent_message_id` cycles in the data - // (e.g. a row that points at itself). Without this guard `getPath` - // walks the chain forever and locks the entire UI. The server contract - // shouldn't allow cycles to land in the DB, but the tree is rendered - // straight from a Supabase query so we treat it as untrusted. - const visited = new Set(); - let currentNode = this.allNodes.get(id); - - while (currentNode) { - if (visited.has(currentNode.id)) { - console.warn( - `[Tree.getPath] cycle detected at message ${currentNode.id} — truncating walk`, - ); - break; - } - visited.add(currentNode.id); - path.unshift(currentNode); - if (currentNode.parent) { - currentNode = currentNode.parent; - } else { - break; - } - } - - return path; - } -} - -export default Tree; diff --git a/CADAM/shared/chatAi.ts b/CADAM/shared/chatAi.ts deleted file mode 100644 index 439a9cc..0000000 --- a/CADAM/shared/chatAi.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { tool, type InferUITools, type UIMessage } from 'ai'; -import { z } from 'zod'; -import type { MeshFileType, Model } from './types.ts'; - -export const createMeshInputSchema = z.object({ - text: z.string().optional(), - imageIds: z.array(z.string()).optional(), - meshId: z.string().optional(), - model: z.enum(['fast', 'quality', 'ultra']).optional(), - meshTopology: z.enum(['quads', 'polys']).optional(), - polygonCount: z.number().optional(), -}); - -export const createMeshOutputSchema = z.object({ - id: z.string(), - fileType: z.enum(['glb', 'stl', 'obj', 'fbx']), -}); - -export const parametricArtifactSchema = z.object({ - title: z.string().min(1), - version: z.string().default('v1'), - code: z.string().min(20), -}); - -export const parametricCompileOutputSchema = z.object({ - status: z.literal('success'), - message: z.string(), - inspection: z - .object({ - views: z.array( - z.enum(['ISO', 'FRONT', 'BACK', 'LEFT', 'RIGHT', 'TOP', 'BOTTOM']), - ), - imageAttached: z.boolean(), - }) - .optional(), -}); - -export const answerUserSchema = z.object({ - message: z.string().min(1), -}); - -export const chatTools = { - build_parametric_model: tool({ - description: - 'Create or update the complete OpenSCAD CAD artifact. After the browser compiles it, inspect the returned multi-view preview sheet and call this tool again if the model needs another revision.', - inputSchema: parametricArtifactSchema, - outputSchema: parametricCompileOutputSchema, - }), - answer_user: tool({ - description: - 'Send the final user-facing chat message. Use this for normal non-CAD replies, and after a CAD build when the multi-view preview satisfies the user request.', - inputSchema: answerUserSchema, - outputSchema: answerUserSchema, - }), - create_mesh: tool({ - description: - 'Create a 3D mesh from text, images, or an existing mesh plus edit instructions.', - inputSchema: createMeshInputSchema, - outputSchema: createMeshOutputSchema, - }), -}; - -export type AppTools = InferUITools; - -export type MeshContextData = { - meshId: string; - fileType: MeshFileType; - filename?: string; - boundingBox?: { x: number; y: number; z: number }; -}; - -export type MeshPreferencesData = { - topology: 'quads' | 'polys'; - polygonCount: number; -}; - -/** - * Conversation-level signals the server emits as transient stream parts - * (`writer.write({ transient: true, type: 'data-X', data })`). Transient - * parts never land in `messages.parts` — they're side-channel updates the - * client folds straight into the conversation query cache. - * - * * `title-update` fires once when the server generates a title for - * a fresh conversation; client updates `conversations.title`. - * * `suggestions-update` fires after each assistant turn finishes; - * client updates `conversations.settings.suggestions` so the pills - * below the input refresh in lock-step with the response. - */ -export type ConversationTitleUpdate = { - conversationId: string; - title: string; -}; -export type ConversationSuggestionsUpdate = { - conversationId: string; - suggestions: string[]; -}; - -export type AppDataTypes = { - 'mesh-context': MeshContextData; - 'mesh-preferences': MeshPreferencesData; - 'title-update': ConversationTitleUpdate; - 'suggestions-update': ConversationSuggestionsUpdate; -}; - -export const meshContextDataSchema = z.object({ - meshId: z.string(), - fileType: z.enum(['glb', 'stl', 'obj', 'fbx']), - filename: z.string().optional(), - boundingBox: z - .object({ x: z.number(), y: z.number(), z: z.number() }) - .optional(), -}); - -export const meshPreferencesDataSchema = z.object({ - topology: z.enum(['quads', 'polys']), - polygonCount: z.number(), -}); - -export type AppUIMessage = UIMessage< - { - model?: Model; - billingTokens?: number; - // The model's original OpenSCAD for this message's artifact, captured - // lazily on the FIRST parameter edit (see `persistParameterEdit`). - // Parameter edits rewrite the live `tool-build_parametric_model` input - // code in place, which would otherwise move the derived `defaultValue` - // to the edited value on every reload. Stashing the original here — - // message metadata is UI-only and NOT sent to the model by - // `convertToModelMessages` — lets the client re-derive stable defaults - // (Reset / slider home / auto range) with no second code copy in the - // model's context, no migration, and no storage cost on the (common) - // never-edited artifacts. - originalCode?: string; - }, - AppDataTypes, - AppTools ->; diff --git a/CADAM/shared/database.ts b/CADAM/shared/database.ts deleted file mode 100644 index 495275a..0000000 --- a/CADAM/shared/database.ts +++ /dev/null @@ -1,447 +0,0 @@ -export type Json = - | string - | number - | boolean - | null - | { [key: string]: Json | undefined } - | Json[]; - -export type Database = { - graphql_public: { - Tables: { - [_ in never]: never; - }; - Views: { - [_ in never]: never; - }; - Functions: { - graphql: { - Args: { - extensions?: Json; - operationName?: string; - query?: string; - variables?: Json; - }; - Returns: Json; - }; - }; - Enums: { - [_ in never]: never; - }; - CompositeTypes: { - [_ in never]: never; - }; - }; - public: { - Tables: { - conversations: { - Row: { - created_at: string | null; - current_message_leaf_id: string | null; - id: string; - privacy: Database['public']['Enums']['privacy_type']; - settings: Json; - title: string; - type: Database['public']['Enums']['conversation-type']; - updated_at: string | null; - user_id: string; - }; - Insert: { - created_at?: string | null; - current_message_leaf_id?: string | null; - id?: string; - privacy?: Database['public']['Enums']['privacy_type']; - settings?: Json; - title: string; - type?: Database['public']['Enums']['conversation-type']; - updated_at?: string | null; - user_id: string; - }; - Update: { - created_at?: string | null; - current_message_leaf_id?: string | null; - id?: string; - privacy?: Database['public']['Enums']['privacy_type']; - settings?: Json; - title?: string; - type?: Database['public']['Enums']['conversation-type']; - updated_at?: string | null; - user_id?: string; - }; - Relationships: []; - }; - images: { - Row: { - conversation_id: string; - created_at: string; - id: string; - image_generation_call_id: string | null; - prompt: Json; - status: Database['public']['Enums']['generation-status']; - user_id: string; - }; - Insert: { - conversation_id: string; - created_at?: string; - id?: string; - image_generation_call_id?: string | null; - prompt?: Json; - status?: Database['public']['Enums']['generation-status']; - user_id: string; - }; - Update: { - conversation_id?: string; - created_at?: string; - id?: string; - image_generation_call_id?: string | null; - prompt?: Json; - status?: Database['public']['Enums']['generation-status']; - user_id?: string; - }; - Relationships: [ - { - foreignKeyName: 'images_conversation_id_fkey'; - columns: ['conversation_id']; - isOneToOne: false; - referencedRelation: 'conversations'; - referencedColumns: ['id']; - }, - ]; - }; - meshes: { - Row: { - conversation_id: string; - created_at: string; - file_type: Database['public']['Enums']['mesh_file_type']; - id: string; - images: string[] | null; - prompt: Json; - status: Database['public']['Enums']['generation-status']; - user_id: string; - }; - Insert: { - conversation_id: string; - created_at?: string; - file_type?: Database['public']['Enums']['mesh_file_type']; - id?: string; - images?: string[] | null; - prompt?: Json; - status?: Database['public']['Enums']['generation-status']; - user_id: string; - }; - Update: { - conversation_id?: string; - created_at?: string; - file_type?: Database['public']['Enums']['mesh_file_type']; - id?: string; - images?: string[] | null; - prompt?: Json; - status?: Database['public']['Enums']['generation-status']; - user_id?: string; - }; - Relationships: [ - { - foreignKeyName: 'meshes_conversation_id_fkey'; - columns: ['conversation_id']; - isOneToOne: false; - referencedRelation: 'conversations'; - referencedColumns: ['id']; - }, - ]; - }; - messages: { - Row: { - conversation_id: string; - content: Json | null; - created_at: string; - id: string; - metadata: Json; - parent_message_id: string | null; - parts: Json; - rating: number; - role: string; - }; - Insert: { - conversation_id: string; - content?: Json | null; - created_at?: string; - id?: string; - metadata?: Json; - parent_message_id?: string | null; - parts?: Json; - rating?: number; - role: string; - }; - Update: { - conversation_id?: string; - content?: Json | null; - created_at?: string; - id?: string; - metadata?: Json; - parent_message_id?: string | null; - parts?: Json; - rating?: number; - role?: string; - }; - Relationships: [ - { - foreignKeyName: 'messages_conversation_id_fkey'; - columns: ['conversation_id']; - isOneToOne: false; - referencedRelation: 'conversations'; - referencedColumns: ['id']; - }, - ]; - }; - previews: { - Row: { - conversation_id: string; - created_at: string; - id: string; - mesh_id: string; - status: Database['public']['Enums']['generation-status']; - updated_at: string; - user_id: string; - }; - Insert: { - conversation_id: string; - created_at?: string; - id?: string; - mesh_id: string; - status?: Database['public']['Enums']['generation-status']; - updated_at?: string; - user_id: string; - }; - Update: { - conversation_id?: string; - created_at?: string; - id?: string; - mesh_id?: string; - status?: Database['public']['Enums']['generation-status']; - updated_at?: string; - user_id?: string; - }; - Relationships: [ - { - foreignKeyName: 'previews_conversation_id_fkey'; - columns: ['conversation_id']; - isOneToOne: false; - referencedRelation: 'conversations'; - referencedColumns: ['id']; - }, - { - foreignKeyName: 'previews_mesh_id_fkey'; - columns: ['mesh_id']; - isOneToOne: false; - referencedRelation: 'meshes'; - referencedColumns: ['id']; - }, - ]; - }; - profiles: { - Row: { - avatar_path: string | null; - created_at: string; - full_name: string; - id: string; - notifications_enabled: boolean; - updated_at: string; - user_id: string; - }; - Insert: { - avatar_path?: string | null; - created_at?: string; - full_name: string; - id?: string; - notifications_enabled?: boolean; - updated_at?: string; - user_id: string; - }; - Update: { - avatar_path?: string | null; - created_at?: string; - full_name?: string; - id?: string; - notifications_enabled?: boolean; - updated_at?: string; - user_id?: string; - }; - Relationships: []; - }; - prompts: { - Row: { - created_at: string; - id: number; - type: Database['public']['Enums']['prompt_type']; - user_id: string; - }; - Insert: { - created_at?: string; - id?: number; - type?: Database['public']['Enums']['prompt_type']; - user_id: string; - }; - Update: { - created_at?: string; - id?: number; - type?: Database['public']['Enums']['prompt_type']; - user_id?: string; - }; - Relationships: []; - }; - }; - Views: { - [_ in never]: never; - }; - Functions: { - [_ in never]: never; - }; - Enums: { - 'conversation-type': 'parametric' | 'creative'; - 'generation-status': 'pending' | 'success' | 'failure'; - mesh_file_type: 'glb' | 'stl' | 'obj' | 'fbx'; - mesh_model_type: 'quality' | 'fast'; - privacy_type: 'public' | 'private'; - prompt_type: 'mesh' | 'image' | 'chat'; - }; - CompositeTypes: { - [_ in never]: never; - }; - }; -}; - -type DatabaseWithoutInternals = Omit; - -type DefaultSchema = DatabaseWithoutInternals[Extract< - keyof Database, - 'public' ->]; - -export type Tables< - DefaultSchemaTableNameOrOptions extends - | keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) - | { schema: keyof DatabaseWithoutInternals }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } - ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & - DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views']) - : never = never, -> = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} - ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & - DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views'])[TableName] extends { - Row: infer R; - } - ? R - : never - : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema['Tables'] & - DefaultSchema['Views']) - ? (DefaultSchema['Tables'] & - DefaultSchema['Views'])[DefaultSchemaTableNameOrOptions] extends { - Row: infer R; - } - ? R - : never - : never; - -export type TablesInsert< - DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema['Tables'] - | { schema: keyof DatabaseWithoutInternals }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } - ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] - : never = never, -> = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} - ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { - Insert: infer I; - } - ? I - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] - ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { - Insert: infer I; - } - ? I - : never - : never; - -export type TablesUpdate< - DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema['Tables'] - | { schema: keyof DatabaseWithoutInternals }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } - ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] - : never = never, -> = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} - ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { - Update: infer U; - } - ? U - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] - ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { - Update: infer U; - } - ? U - : never - : never; - -export type Enums< - DefaultSchemaEnumNameOrOptions extends - | keyof DefaultSchema['Enums'] - | { schema: keyof DatabaseWithoutInternals }, - EnumName extends DefaultSchemaEnumNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } - ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums'] - : never = never, -> = DefaultSchemaEnumNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} - ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums'][EnumName] - : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] - ? DefaultSchema['Enums'][DefaultSchemaEnumNameOrOptions] - : never; - -export type CompositeTypes< - PublicCompositeTypeNameOrOptions extends - | keyof DefaultSchema['CompositeTypes'] - | { schema: keyof DatabaseWithoutInternals }, - CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } - ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'] - : never = never, -> = PublicCompositeTypeNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} - ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'][CompositeTypeName] - : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema['CompositeTypes'] - ? DefaultSchema['CompositeTypes'][PublicCompositeTypeNameOrOptions] - : never; - -export const Constants = { - graphql_public: { - Enums: {}, - }, - public: { - Enums: { - 'conversation-type': ['parametric', 'creative'], - 'generation-status': ['pending', 'success', 'failure'], - mesh_file_type: ['glb', 'stl', 'obj', 'fbx'], - mesh_model_type: ['quality', 'fast'], - privacy_type: ['public', 'private'], - prompt_type: ['mesh', 'image', 'chat'], - }, - }, -} as const; diff --git a/CADAM/shared/imageRefs.ts b/CADAM/shared/imageRefs.ts deleted file mode 100644 index 26cef4e..0000000 --- a/CADAM/shared/imageRefs.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Helpers for resolving uploaded-image file parts to private-storage objects. -// -// Uploaded images live in the (private, RLS-protected) `images` bucket at -// `${userId}/${conversationId}/${imageId}`. An AI SDK file part carries the -// image id in its `filename` (`${imageId}.png`); the part's `url` is a stable -// REFERENCE string, not something to fetch directly. The bytes are resolved -// from storage by id at the two boundaries that actually need them: -// * the chat server downloads them to base64 for the model, and -// * the client downloads them via a signed URL for display. -// -// Persisting a base64 data URL in the part (as the AI SDK migration -// accidentally did) duplicates the whole image into `messages.parts`; a raw -// `/storage/.../public/...` path (as the backfill wrote) never resolves -// because the bucket is private. Both are avoided by keeping `url` a -// reference and resolving by id. - -export function imageIdFromFilename( - filename: string | null | undefined, -): string | null { - if (!filename) return null; - return filename.replace(/\.[^.]+$/, '') || null; -} - -export function imageStoragePath( - userId: string, - conversationId: string, - imageId: string, -): string { - return `${userId}/${conversationId}/${imageId}`; -} - -// Canonical reference persisted in a file part's `url`. Kept in the exact -// shape the 2026-05-18 AI-SDK backfill produced so every row in -// `messages.parts` carries a single, uniform format. Never fetched directly — -// see the note above. -export function imageFilePartUrl( - userId: string, - conversationId: string, - imageId: string, -): string { - return `/storage/v1/object/public/images/${imageStoragePath( - userId, - conversationId, - imageId, - )}`; -} diff --git a/CADAM/shared/models.ts b/CADAM/shared/models.ts deleted file mode 100644 index a29329c..0000000 --- a/CADAM/shared/models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { Model } from './types'; - -// Model ids persisted in conversation settings (and submitted by stale -// clients) outlive the picker catalog. Map retired ids to their successors -// so old conversations keep resolving to a routable, correctly priced model. -export const LEGACY_MODEL_IDS: Record = { - 'openai/gpt-5.5': 'openai/gpt-5.6-sol', -}; - -export function normalizeModelId(model: Model): Model { - return LEGACY_MODEL_IDS[model] ?? model; -} diff --git a/CADAM/shared/parametricParts.test.ts b/CADAM/shared/parametricParts.test.ts deleted file mode 100644 index f3683e8..0000000 --- a/CADAM/shared/parametricParts.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import assert from 'node:assert/strict'; -import { describe, it } from 'node:test'; -import { cleanAssistantText } from './parametricParts.ts'; - -describe('parametric assistant text cleanup', () => { - it('removes leaked view metadata before final prose', () => { - assert.equal( - cleanAssistantText( - ', viewpoint_state:{"distance":624},"zoom_info":A fallback automatic framing was used instead.}ளர்This 12 DOF robot arm is ready.', - ), - 'This 12 DOF robot arm is ready.', - ); - }); - - it('removes metadata-only fragments', () => { - assert.equal( - cleanAssistantText(',title:Detailed San Francisco,version:v1}'), - '', - ); - }); -}); diff --git a/CADAM/shared/parametricParts.ts b/CADAM/shared/parametricParts.ts deleted file mode 100644 index 388e133..0000000 --- a/CADAM/shared/parametricParts.ts +++ /dev/null @@ -1,186 +0,0 @@ -import type { - AppUIMessage, - MeshContextData, - MeshPreferencesData, -} from './chatAi.ts'; -import type { ParametricArtifact } from './types.ts'; - -/** - * Narrow an unknown DB jsonb value into the AI SDK's UI part array. - * - * Every callsite (`messages.parts` from supabase, draft message rows held - * in cache, etc.) crosses an untrusted boundary, so a bare - * `parts as AppUIMessage['parts']` would let a malformed row or an - * upstream SDK shape change crash the renderer before any part-specific - * narrowing runs. - * - * Element-level validation is intentionally minimal: we require each - * element to be a non-null object with a string `type` discriminator, - * which is what every downstream `switch (part.type)` already keys on. - * Beyond that we trust the SDK union — adding a full zod schema for the - * dozen+ part shapes would have to be kept in lock-step with the AI SDK - * release on every bump, and silently rejected parts (e.g. a new - * `source-document`) would degrade messages instead of just rendering - * what we know how to render. - */ -export function asParametricParts(parts: unknown): AppUIMessage['parts'] { - if (!Array.isArray(parts)) return []; - return parts.filter( - (part): part is AppUIMessage['parts'][number] => - typeof part === 'object' && - part !== null && - 'type' in part && - typeof (part as { type: unknown }).type === 'string', - ); -} - -export function getMeshContextPart( - parts: unknown, -): MeshContextData | undefined { - const list = asParametricParts(parts); - for (let index = list.length - 1; index >= 0; index -= 1) { - const part = list[index]; - if (part.type === 'data-mesh-context') return part.data; - } - return undefined; -} - -export function getMeshPreferencesPart( - parts: unknown, -): MeshPreferencesData | undefined { - const list = asParametricParts(parts); - for (let index = list.length - 1; index >= 0; index -= 1) { - const part = list[index]; - if (part.type === 'data-mesh-preferences') return part.data; - } - return undefined; -} - -export function getParametricText(parts: unknown): string { - return asParametricParts(parts) - .filter((part) => part.type === 'text') - .map((part) => cleanAssistantText(part.text)) - .join(''); -} - -export function cleanAssistantText(text: string): string { - text = text.replace(/!\[[^\]]*]\([^)]+\)/g, ''); - - const metadataLeak = - /(?:^|\n)\s*,?\s*(?:"?(?:viewpoint_state|zoom_info|title|version)"?\s*:)/i.exec( - text, - ); - if (metadataLeak) { - const before = text.slice(0, metadataLeak.index); - const leaked = text.slice(metadataLeak.index); - const proseStart = - /\b(?:Done|Here(?:'s| is)?|This|I(?:'ve| created| updated| made| added| fixed)|The model)\b/i.exec( - leaked, - ); - text = before + (proseStart ? leaked.slice(proseStart.index) : ''); - } - - const attachmentLeak = - /(?:^|\n)[^\n{}]*(?:alt=media|preview sheet attached automatically)[^\n{}]*[})]?\s*/i.exec( - text, - ); - if (attachmentLeak) { - text = - text.slice(0, attachmentLeak.index) + - text.slice(attachmentLeak.index + attachmentLeak[0].length); - } - - text = text.replace( - /(?:^|\n)\s*[^{}\n]*(?:\.png|\.jpe?g|\.webp|\.gif)[^{}\n]*[})]?\s*/gi, - '\n', - ); - - const marker = /Drafting final message:\s*/i.exec(text); - if (!marker) return text; - - const draft = text.slice(marker.index + marker[0].length).trimStart(); - if (!draft) return ''; - - const quote = draft[0]; - if (quote !== '"' && quote !== "'") return draft; - - const quoteEnd = draft.indexOf(quote, 1); - if (quoteEnd === -1) return draft.slice(1).trim(); - - return draft.slice(1, quoteEnd).trim(); -} - -export function getBuildParametricModelPart(parts: unknown) { - const parametricParts = asParametricParts(parts); - for (let index = parametricParts.length - 1; index >= 0; index -= 1) { - const part = parametricParts[index]; - if (part.type === 'tool-build_parametric_model') return part; - } - return undefined; -} - -export function getBuildParametricModelOutput( - parts: unknown, -): ParametricArtifact | undefined { - const part = getBuildParametricModelPart(parts); - if (!part || part.state === 'input-streaming') return undefined; - - if ('input' in part && isParametricArtifact(part.input)) { - return part.input; - } - if (part.state === 'output-available' && isParametricArtifact(part.output)) { - return part.output; - } - return undefined; -} - -export const getBuildParametricModelArtifact = getBuildParametricModelOutput; - -export function hasPendingBuildParametricModel(parts: unknown): boolean { - const part = getBuildParametricModelPart(parts); - return part?.state === 'input-streaming' || part?.state === 'input-available'; -} - -export function replaceBuildParametricModelOutput( - parts: unknown, - artifact: ParametricArtifact, -): AppUIMessage['parts'] { - const parametricParts = asParametricParts(parts); - let targetIndex = -1; - for (let index = parametricParts.length - 1; index >= 0; index -= 1) { - const part = parametricParts[index]; - if ( - part.type === 'tool-build_parametric_model' && - part.state !== 'input-streaming' - ) { - targetIndex = index; - break; - } - } - - return parametricParts.map((part, index) => { - if ( - index === targetIndex && - part.type === 'tool-build_parametric_model' && - part.state !== 'input-streaming' - ) { - return { ...part, input: artifact }; - } - return part; - }); -} - -export function isParametricArtifact( - value: unknown, -): value is ParametricArtifact { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - return false; - } - const artifact = value as Partial; - // Title + code are the only load-bearing fields. `version` is metadata - // and `parts` is optional. Parameters are derived client-side from - // `code` via `parseParameters` so we don't check for them here either. - return ( - typeof artifact.title === 'string' && typeof artifact.code === 'string' - ); -} diff --git a/CADAM/shared/parseParameters.ts b/CADAM/shared/parseParameters.ts deleted file mode 100644 index fe2ae53..0000000 --- a/CADAM/shared/parseParameters.ts +++ /dev/null @@ -1,286 +0,0 @@ -import type { - Parameter, - ParameterOption, - ParameterRange, - ParameterType, -} from './types.ts'; - -/** - * Extract editable parameters from a piece of OpenSCAD source. - * - * This is the single source of truth for "what does this CAD model expose - * as a slider/input?" — the model only emits the OpenSCAD `code`, and we - * derive parameter metadata client-side from the variable declarations at - * the top of the file. That removes the divergent-UI problem we had when - * different models (Claude vs Gemini) produced different shaped - * parameter arrays for the same code: now the same source always renders - * the same ``, regardless of provider. - * - * The format the model is told to emit is the Customizer-style annotation - * vocabulary: - * - * // Description of the parameter - * name = 10; // [1:50] ← min:max - * name = 10; // [1:1:50] ← min:step:max - * name = "red"; // [red, green, blue] ← enum options - * name = "label"; // 20 ← maxLength for strings, step for numbers - * \/* [Group Name] *\/ ← starts a new group section - * - * Variable declarations after the first `module` or `function` keyword - * are NOT exposed (they're implementation, not API). - * - * TODO: Use AST parser instead of regex. Regex breaks on multi-line - * expressions, nested arrays, and any clever OpenSCAD trick. An AST - * parser would handle that gracefully — for now, the regex covers the - * shapes the model actually emits. - */ -export default function parseParameters(script: string): Parameter[] { - // Limit to the top of the file. Anything below the first `module` or - // `function` is internal logic that the user shouldn't tweak as a - // parameter. - script = script.split(/^(module |function )/m)[0]; - - const parameters: Record = {}; - const parameterRegex = - /^([a-z0-9A-Z_$]+)\s*=\s*([^;]+);[\t\f\cK ]*(\/\/[^\n]*)?/gm; - const groupRegex = /^\/\*\s*\[([^\]]+)\]\s*\*\//gm; - - // Build a list of source ranges keyed by group, so a `/* [Group] */` - // marker influences only the variables declared below it. We track each - // group's start offset directly off the regex match position — using the - // marker text as an id and then `indexOf`-ing it would collide whenever - // the same group label appears twice in the source. - const groupSections: { startIndex: number; group: string; code: string }[] = [ - { startIndex: 0, group: '', code: script }, - ]; - let tmpGroup: RegExpExecArray | null; - while ((tmpGroup = groupRegex.exec(script))) { - groupSections.push({ - startIndex: tmpGroup.index, - group: tmpGroup[1].trim(), - code: '', - }); - } - groupSections.forEach((group, index) => { - const nextGroup = groupSections[index + 1]; - const endIndex = nextGroup ? nextGroup.startIndex : script.length; - group.code = script.substring(group.startIndex, endIndex); - }); - - groupSections.forEach((groupSection) => { - let match; - while ((match = parameterRegex.exec(groupSection.code)) !== null) { - const name = match[1]; - const value = match[2]; - let typeAndValue: - | { value: Parameter['value']; type: Parameter['type'] } - | undefined; - try { - typeAndValue = convertType(value); - } catch { - continue; - } - if (!typeAndValue) continue; - - let description: Parameter['description'] = undefined; - let options: ParameterOption[] = []; - let range: ParameterRange = {}; - - // Skip values that reference another variable or span lines — - // they're computed expressions, not constants. Once we hit one, - // bail out of THIS group section because anything further is - // probably derived from it. - if ( - value !== 'true' && - value !== 'false' && - (value.match(/^[a-zA-Z_]/) || value.split('\n').length > 1) - ) { - continue; - } - - // The trailing `// ...` comment carries Customizer-style hints. - if (match[3]) { - const rawComment = match[3].replace(/^\/\/\s*/, '').trim(); - const cleaned = rawComment.replace(/^\[+|\]+$/g, ''); - - if (!isNaN(Number(rawComment))) { - // Bare number — step for numerics, maxLength for strings. - if (typeAndValue.type === 'string') { - range = { max: parseFloat(cleaned) }; - } else { - range = { step: parseFloat(cleaned) }; - } - } else if (rawComment.startsWith('[') && cleaned.includes(',')) { - // `[a, b:Label, c]` — enum options. `value:Label` lets the - // model pick a human label distinct from the underlying value. - options = cleaned - .trim() - .split(',') - .map((option) => { - const parts = option.trim().split(':'); - let optionValue: ParameterOption['value'] = parts[0]; - const label: ParameterOption['label'] = parts[1]; - if (typeAndValue.type === 'number') { - optionValue = parseFloat(optionValue); - } - return { value: optionValue, label }; - }); - } else if (cleaned.match(/([0-9]+:?)+/)) { - // `[min:max]` or `[min:step:max]` — slider bounds. - const [min, maxOrStep, max] = cleaned.trim().split(':'); - if (min && (maxOrStep || max)) { - range = { min: parseFloat(min) }; - } - if (max || maxOrStep || min) { - range = { ...range, max: parseFloat(max || maxOrStep || min) }; - } - if (max && maxOrStep) { - range = { ...range, step: parseFloat(maxOrStep) }; - } - } - } - - // The description is the last `// ...` comment on the line - // IMMEDIATELY above the variable declaration. - let above = script.split( - new RegExp(`^${escapeRegExp(match[0])}`, 'gm'), - )[0]; - if (above.endsWith('\n')) above = above.slice(0, -1); - const splitted = above.split('\n').reverse(); - const lastLineBeforeDefinition = splitted[0]; - if (lastLineBeforeDefinition.trim().startsWith('//')) { - description = lastLineBeforeDefinition.replace(/^\/\/\/*\s*/, ''); - if (description.length === 0) description = undefined; - } - - // Snake_case → Title Case for the visible label. `$fn` gets a - // special name because OpenSCAD users recognise it as resolution. - // Filtering empty tokens guards against names with leading, trailing, - // or repeated underscores (e.g. `__width`) producing `word[0]` on an - // empty string and crashing. - let displayName = name - .replace(/_/g, ' ') - .split(' ') - .filter(Boolean) - .map((word) => word[0].toUpperCase() + word.slice(1)) - .join(' '); - if (name === '$fn') displayName = 'Resolution'; - - // Flatten `name = [a, b, c]` (number[]) into N scalar sliders - // `name[0]`, `name[1]`, ... — far easier to manipulate via the - // sidebar than a single multi-value field. - if ( - typeAndValue.type === 'number[]' && - Array.isArray(typeAndValue.value) - ) { - const labels = numberArrayLabels(name, typeAndValue.value.length); - typeAndValue.value.forEach((itemValue, index) => { - parameters[`${name}[${index}]`] = { - description, - group: groupSection.group, - name: `${name}[${index}]`, - displayName: displayNameForArrayItem(displayName, labels[index]), - defaultValue: itemValue, - range, - options, - value: itemValue, - type: 'number', - }; - }); - continue; - } - - parameters[name] = { - description, - group: groupSection.group, - name, - displayName, - defaultValue: typeAndValue.value, - range, - options, - ...typeAndValue, - }; - } - }); - - return Object.values(parameters); -} - -function numberArrayLabels(name: string, length: number) { - if (length === 2) return ['X', 'Y']; - if (length !== 3) return Array.from({ length }, (_, i) => `${i + 1}`); - const lowerName = name.toLowerCase(); - if ( - lowerName.includes('size') || - lowerName.includes('dimension') || - lowerName.includes('body') || - lowerName.includes('torso') || - lowerName.includes('head') || - lowerName.includes('foot') || - lowerName.includes('base') - ) { - return ['Width', 'Depth', 'Height']; - } - return ['X', 'Y', 'Z']; -} - -function displayNameForArrayItem(displayName: string, label: string) { - if (['Width', 'Depth', 'Height'].includes(label)) { - return displayName.replace(/\s+Size$/i, '') + ` ${label}`; - } - return `${displayName} ${label}`; -} - -function convertType(rawValue: string): { - value: Parameter['value']; - type: ParameterType; -} { - if (/^-?\d+(\.\d+)?$/.test(rawValue)) { - return { value: parseFloat(rawValue), type: 'number' }; - } - if (rawValue === 'true' || rawValue === 'false') { - return { value: rawValue === 'true', type: 'boolean' }; - } - if (/^".*"$/.test(rawValue)) { - return { value: rawValue.replace(/^"(.*)"$/, '$1'), type: 'string' }; - } - if (rawValue.startsWith('[') && rawValue.endsWith(']')) { - const arrayValue = rawValue - .slice(1, -1) - .split(',') - .map((item) => item.trim()); - if ( - arrayValue.length > 0 && - arrayValue.every((item) => /^-?\d+(\.\d+)?$/.test(item)) - ) { - return { - value: arrayValue.map((item) => parseFloat(item)), - type: 'number[]', - }; - } - if ( - arrayValue.length > 0 && - arrayValue.every((item) => /^".*"$/.test(item)) - ) { - return { - value: arrayValue.map((item) => item.slice(1, -1)), - type: 'string[]', - }; - } - if ( - arrayValue.length > 0 && - arrayValue.every((item) => item === 'true' || item === 'false') - ) { - return { - value: arrayValue.map((item) => item === 'true'), - type: 'boolean[]', - }; - } - throw new Error(`Invalid array value: ${rawValue}`); - } - throw new Error(`Invalid value: ${rawValue}`); -} - -function escapeRegExp(string: string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -} diff --git a/CADAM/shared/suggestions.test.ts b/CADAM/shared/suggestions.test.ts deleted file mode 100644 index 558bb17..0000000 --- a/CADAM/shared/suggestions.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import assert from 'node:assert/strict'; -import { describe, it } from 'node:test'; -import { - countSuggestionWords, - limitSuggestionWords, - normalizeConversationSuggestions, -} from './suggestions.ts'; - -describe('suggestion word limits', () => { - it('counts whitespace-separated words', () => { - assert.equal(countSuggestionWords(' add mounting holes '), 3); - assert.equal(countSuggestionWords(''), 0); - }); - - it('treats punctuation and hyphenated terms as part of a word', () => { - assert.equal(countSuggestionWords('make snap-fit tabs'), 3); - assert.equal(countSuggestionWords('add ribs, fillets'), 3); - }); - - it('limits suggestions to three words', () => { - assert.equal( - limitSuggestionWords('make the brackets thicker'), - 'make the brackets', - ); - }); - - it('keeps valid suggestions before truncating fallback suggestions', () => { - assert.deepEqual( - normalizeConversationSuggestions([ - 'make the brackets much thicker', - 'add fillets', - ' add screw holes ', - 'increase wall thickness', - ]), - ['add fillets', 'add screw holes'], - ); - }); - - it('deduplicates accepted suggestions before filling slots', () => { - assert.deepEqual( - normalizeConversationSuggestions([ - 'add fillets', - 'add fillets', - 'add screw holes', - 'increase wall thickness', - ]), - ['add fillets', 'add screw holes'], - ); - }); - - it('truncates invalid suggestions only when needed to fill two slots', () => { - assert.deepEqual( - normalizeConversationSuggestions([ - 'add chamfers', - 'make the handle much larger', - 'add four mounting holes', - ]), - ['add chamfers', 'make the handle'], - ); - }); -}); diff --git a/CADAM/shared/suggestions.ts b/CADAM/shared/suggestions.ts deleted file mode 100644 index 5770fe0..0000000 --- a/CADAM/shared/suggestions.ts +++ /dev/null @@ -1,51 +0,0 @@ -const MAX_SUGGESTION_WORDS = 3; -const MAX_SUGGESTIONS = 2; - -export function countSuggestionWords(suggestion: string): number { - const trimmed = suggestion.trim(); - if (!trimmed) return 0; - return trimmed.split(/\s+/).length; -} - -export function limitSuggestionWords( - suggestion: string, - maxWords = MAX_SUGGESTION_WORDS, -): string { - return suggestion.trim().split(/\s+/).slice(0, maxWords).join(' '); -} - -export function normalizeConversationSuggestions( - suggestions: string[], - maxSuggestions = MAX_SUGGESTIONS, -): string[] { - const trimmedSuggestions = suggestions - .map((suggestion) => suggestion.trim()) - .filter(Boolean); - - const accepted = Array.from( - new Set( - trimmedSuggestions.filter( - (suggestion) => - countSuggestionWords(suggestion) <= MAX_SUGGESTION_WORDS, - ), - ), - ); - - if (accepted.length >= maxSuggestions) { - return accepted.slice(0, maxSuggestions); - } - - const seen = new Set(accepted); - const fallback = trimmedSuggestions - .filter( - (suggestion) => countSuggestionWords(suggestion) > MAX_SUGGESTION_WORDS, - ) - .map((suggestion) => limitSuggestionWords(suggestion)) - .filter((suggestion) => { - if (!suggestion || seen.has(suggestion)) return false; - seen.add(suggestion); - return true; - }); - - return [...accepted, ...fallback].slice(0, maxSuggestions); -} diff --git a/CADAM/shared/types.ts b/CADAM/shared/types.ts deleted file mode 100644 index 6923585..0000000 --- a/CADAM/shared/types.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Database } from './database.ts'; -import type { AppUIMessage } from './chatAi.ts'; -export type Model = string; -export type CreativeModel = 'quality' | 'fast' | 'ultra'; - -export type Prompt = { - text?: string; - images?: string[]; - mesh?: string; - model?: Model; -}; - -type MessageRow = Database['public']['Tables']['messages']['Row']; - -export type Message = Pick< - MessageRow, - 'conversation_id' | 'created_at' | 'id' | 'parent_message_id' | 'rating' -> & { - role: 'user' | 'assistant'; - metadata: AppUIMessage['metadata']; - parts: AppUIMessage['parts']; -}; - -export type MeshFileType = Database['public']['Enums']['mesh_file_type']; - -export type Mesh = { - id: string; - fileType: MeshFileType; -}; - -export type MeshData = Omit< - Database['public']['Tables']['meshes']['Row'], - 'prompt' -> & { - prompt: Prompt; -}; - -export type ParametricArtifact = { - title: string; - version: string; - code: string; -}; - -// label is optional: an OpenSCAD customizer comment can list bare values -// (e.g. `[Assembled, Exploded]`) with no `value:label` pair, in which case -// the parser leaves label undefined and the UI falls back to the value. -export type ParameterOption = { value: string | number; label?: string }; - -export type ParameterRange = { min?: number; max?: number; step?: number }; - -export type ParameterType = - | 'string' - | 'number' - | 'boolean' - | 'string[]' - | 'number[]' - | 'boolean[]'; - -export type Parameter = { - name: string; - displayName: string; - value: string | boolean | number | string[] | number[] | boolean[]; - defaultValue: string | boolean | number | string[] | number[] | boolean[]; - // Type should always exist, but old messages don't have it. - type?: ParameterType; - description?: string; - group?: string; - range?: ParameterRange; - options?: ParameterOption[]; - maxLength?: number; -}; - -export type Conversation = Omit< - Database['public']['Tables']['conversations']['Row'], - 'settings' -> & { - settings: ConversationSettings; -}; - -export type GenerationStatus = Database['public']['Enums']['generation-status']; - -export type ConversationSettings = { - model?: Model; - /** - * Per-conversation follow-up suggestions rendered as pills above the - * chat input. Regenerated server-side after each non-tool-call - * assistant turn — see `emitConversationSuggestions` in - * `src/server/aiChat.ts`. - */ - suggestions?: string[]; -} | null; - -export type Profile = Database['public']['Tables']['profiles']['Row']; diff --git a/CADAM/src/App.tsx b/CADAM/src/App.tsx deleted file mode 100644 index 63c6c5e..0000000 --- a/CADAM/src/App.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { AuthProvider } from '@/contexts/AuthProvider'; -import { TooltipProvider } from './components/ui/tooltip'; -import { Toaster } from './components/ui/toaster'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { Outlet } from '@tanstack/react-router'; -import { MeshFilesProvider } from '@/contexts/MeshFilesContext'; -import { PostHogProvider } from '@/contexts/PostHogProvider'; -import { ErrorView } from '@/views/ErrorView'; -import { isSupabaseConfigMissing } from '@/lib/supabase'; - -const queryClient = new QueryClient(); - -function MissingConfig() { - return ( -
-
- Missing API Keys. Please copy .env.local.template to .env.local and - restart. -
-
- ); -} - -function App({ error }: { error?: unknown }) { - if (isSupabaseConfigMissing) { - return ; - } - - return ( - - - - - - - {error !== undefined ? : } - - - - - - ); -} - -export default App; diff --git a/CADAM/src/assets/adam-loading.json b/CADAM/src/assets/adam-loading.json deleted file mode 100644 index 1cc938d..0000000 --- a/CADAM/src/assets/adam-loading.json +++ /dev/null @@ -1 +0,0 @@ -{"v": "5.7.5", "fr": 100, "ip": 0, "op": 100, "w": 360, "h": 348, "nm": "Comp 1", "ddd": 0, "metadata": {}, "assets": [{"id": "0", "layers": [{"ddd": 0, "ind": 1, "ty": 3, "nm": "Property 1=1", "sr": 1, "ks": {"p": {"a": 0, "k": [219, 213], "ix": 2}, "a": {"a": 0, "k": [180, 174], "ix": 2}, "s": {"a": 1, "k": [{"t": 0, "s": [223.57, 223.57], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 45, "s": [280, 280], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 60, "s": [180, 180], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 80, "s": [223.57, 223.57], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}], "ix": 2}, "r": {"a": 1, "k": [{"t": 0, "s": [0], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 45, "s": [360], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 60, "s": [360], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 80, "s": [360], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "ip": 0, "op": 101, "st": 0, "bm": 0}, {"ddd": 0, "refId": "1", "w": 191, "h": 178, "ind": 2, "ty": 0, "nm": "Vector", "sr": 1, "ks": {"p": {"a": 0, "k": [84, 85], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "ip": 0, "op": 101, "st": 0, "bm": 0, "parent": 1, "ef": [{"ty": 25, "nm": "Drop Shadow", "mn": "ADBE Drop Shadow", "ef": [{"ty": 2, "nm": "Shadow Color", "mn": "ADBE Drop Shadow-0001", "v": {"a": 0, "k": [0, 0.651, 1], "ix": 2}}, {"ty": 0, "nm": "Opacity", "mn": "ADBE Drop Shadow-0002", "v": {"a": 0, "k": 0, "ix": 2}}, {"ty": 1, "nm": "Direction", "mn": "ADBE Drop Shadow-0003", "v": {"a": 0, "k": 180, "ix": 2}}, {"ty": 0, "nm": "Distance", "mn": "ADBE Drop Shadow-0004", "v": {"a": 0, "k": 2, "ix": 2}}, {"ty": 0, "nm": "Softness", "mn": "ADBE Drop Shadow-0005", "v": {"a": 0, "k": 64, "ix": 2}}], "np": 5, "ix": 0, "en": 1}]}, {"ddd": 0, "ind": 3, "ty": 4, "nm": "Property 1=1 Overscan", "sr": 1, "ks": {"p": {"a": 0, "k": [0, 0], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "shapes": [{"ty": "rc", "d": 1, "s": {"a": 0, "k": [438, 426], "ix": 2}, "p": {"a": 0, "k": [219, 213], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0, 0], "ix": 2}, "o": {"a": 0, "k": 0, "ix": 2}, "r": 1, "bm": 0}], "ip": 0, "op": 101, "st": 0, "bm": 0}]}, {"id": "1", "layers": [{"ddd": 0, "ind": 2, "ty": 4, "nm": "Vector", "sr": 1, "ks": {"p": {"a": 0, "k": [-84, -85], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "shapes": [{"ty": "gr", "it": [{"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[99.99989332651889, 72.40497644476014], [56.416949183479694, 78.55799975636965], [56.36991210460734, 78.56798502395334], [52.81316933905467, 79.0684958329472], [52.72845281612657, 79.0684958329472], [52.69076744576632, 79.0684958329472], [52.6627063939255, 79.0684958329472], [52.59669921432611, 79.0684958329472], [13.37021114593276, 58.99019788574161], [6.4168721415211, 37.538048364533545], [17.92420872871168, 37.36122518910001], [18.460539286598575, 40.26603745826638], [18.68636111983924, 41.21793132657788], [20.060074059842165, 45.55544296244443], [20.86926204826596, 47.48865605269411], [21.198586789722036, 48.19541830530381], [22.12065902639588, 50.0403495055622], [22.544078667662447, 50.785997759369124], [23.560275435669315, 52.46409396633331], [44.740262518696014, 67.67493828594057], [50.329135099711856, 68.23430563129905], [52.041629681587956, 68.1754549240457], [61.06485498747713, 65.73200806722502], [66.75742011845261, 63.02345905953516], [85.74509233834316, 53.955903435737795], [99.99054161800677, 72.39525931629427], [99.99989332651889, 72.40497644476014]], "i": [[0, 0], [0, 0], [0.009353536609210874, -0.009983976099695787], [0, 0], [0.028327854185477747, 0], [0.009620780243630157, 0], [0.018707073218421747, 0], [0.018974316852841032, 0], [8.665783953487518, 13.50306482084326], [0.41398755724958314, 7.389455773638653], [0, 0], [-0.22582109245260232, -0.9813197684173586], [-0.07528260430318157, -0.30424852662588986], [-0.5457120368193003, -1.4229793236786912], [-0.3011037256928176, -0.6376608255107875], [-0.12231753604763612, -0.23567438362613247], [-0.3292979341880329, -0.6182182803114945], [-0.1505384939368275, -0.24513289081988504], [-0.3575456183215734, -0.5493814402157408], [-8.063817350820988, -1.6583908963589982], [-1.8536035961289854, 0.009983976099695787], [-0.5740399112607016, 0.04913167180285336], [-2.85095804934976, 1.4229793236786912], [0, 0], [0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0], [0, 0], [-0.009353536609210874, 0], [-0.009353536609210874, 0], [-0.028327854185477747, 0], [-14.452283233263731, 1.1675996749873034], [-4.271733255019195, -6.653531934686663], [0, 0], [0.13172452586897107, 0.9715985413576438], [0.07525588384623919, 0.3239537689211792], [0.36695260814290837, 1.4623897627293383], [0.24463507209527224, 0.6476447268965329], [0.10350356797977969, 0.23567438362613247], [0.2822630082309851, 0.6082343333858174], [0.1317512405385067, 0.25511686051552795], [0.3105106923645256, 0.5593653871414178], [5.306769374659905, 8.272775248480771], [1.862957341808265, 0.38280666209125597], [0.5740399112607016, 0], [3.1144604378282654, -0.22569041393048958], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.651, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [53.20838165283203, 58.27268600463867], "ix": 2}, "a": {"a": 0, "k": [53.20838273401999, 58.27268608870358], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[100, 72.40115254777537], [85.75455664664089, 53.961802496330144], [74.43544541689835, 10.812105156372203], [79.78941113986423, 1.5973047249384813], [100, 72.40115254777537]], "i": [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0.478, 0.788, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [87.21772003173828, 36.999229431152344], "ix": 2}, "a": {"a": 0, "k": [87.21772270844917, 36.999228636356925], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[74.43456239752679, 10.814411298513358], [74.4442519053958, 10.825067642530547], [80.11784100933974, 32.473506656215775], [66.6065186267899, 32.60119625286181], [64.92235178045745, 28.50881623269706], [63.58613012434217, 26.173274968915273], [34.81305057591235, 18.087018165166675], [28.08545339963051, 27.017263244187898], [26.88125499217076, 37.25267839382284], [17.932772238724347, 37.38918160668986], [17.999003136318873, 27.282100170494882], [28.950729415485032, 8.959650030758498], [49.942467435845685, 5.534779027997023], [74.43456239752679, 10.814411298513358]], "i": [[0, 0], [0, 0], [0, 0], [0, 0], [0.6868167452415628, 1.344421210983291], [0.48932352723036177, 0.7654294339383179], [8.995162031684158, -6.280604341058385], [1.3078915130104312, -3.6015619302333546], [-0.357572332991109, -3.5721613503295204], [0, 0], [-0.5174910673552954, 3.2581919381934035], [-6.0689747321339995, 4.219754116163987], [-7.216653603116098, -1.9136128858068495], [0, 0]], "o": [[0, 0], [0, 0], [0, 0], [-0.43293506394067727, -1.383831650033938], [-0.39525367531626615, -0.7850557783019415], [-6.896762797647162, -10.745701378207245], [-3.152141733854169, 2.1982088598384237], [-1.147812490629031, 3.1502072878331013], [0, 0], [-0.4798631080699556, -3.4347506177036338], [1.1667333289498436, -7.458108860110007], [6.219566944780236, -4.347338424487938], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.651, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [48.85443878173828, 20.997005462646484], "ix": 2}, "a": {"a": 0, "k": [48.854437885313246, 20.99700476451377], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[85.75284394463837, 53.964128311721794], [65.68277369066895, 49.96838912709126], [66.6054993024147, 32.589552603125426], [80.11682168496453, 32.46186300647939], [85.75284394463837, 53.964128311721794]], "i": [[0, 0], [0, 0], [1.9099918279224002, 6.015608207150187], [0, 0], [0, 0]], "o": [[0, 0], [2.4559709651378028, -5.063715431797047], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0.478, 0.788, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [75.71781158447266, 43.21299743652344], "ix": 2}, "a": {"a": 0, "k": [75.71780881765366, 43.21299565910059], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[85.75284394463837, 53.964128311721794], [66.76543840845063, 63.03167810640791], [61.07287327747515, 65.74022711409776], [44.738665379631364, 67.68316316192457], [23.558761264867766, 52.472307184094795], [20.058586557410898, 45.56366200931718], [17.922721226280412, 37.36944423597276], [26.870738764823024, 37.23229399175618], [26.946100616086767, 37.91908862375412], [30.982554026266094, 48.9004085080913], [49.41489595602019, 60.06801221543256], [59.746275939879304, 56.9866449099505], [63.867445872986735, 52.95338373615694], [65.66439029408812, 49.970009620020775], [85.73414052761416, 53.964128311721794], [85.75284394463837, 53.964128311721794]], "i": [[0, 0], [0, 0], [0, 0], [5.57951716856342, 1.1481572208678739], [5.306687887972933, 8.272775248480771], [0.9032575162431118, 2.365151327371433], [0.38576651833669734, 2.7379739969970807], [0, 0], [-0.028327848398071002, -0.22569041393048958], [-2.211175697623825, -3.454455563989367], [-6.859081131227228, -0.15711624816076636], [-3.1051065069519703, 2.1686246629299855], [-1.1384588375482594, 1.5406851100188446], [-0.4986770414133715, 1.050156654053044], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [-5.062133006185522, 2.512283742456352], [-8.063549185542046, -1.6583908963589982], [-1.420775205669435, -2.217756420120211], [-1.0444157003036996, -2.688842421966582], [0, 0], [0.028327848398071002, 0.22569041393048958], [0.48932348093110783, 3.738998893859899], [4.50706754778172, 7.026354604312311], [3.6321112839089813, 0.07855812408038318], [1.5994545829357278, -1.1187307742828356], [0.6868166989423088, -0.9324508677128907], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0.478, 0.788, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [51.83778381347656, 52.740299224853516], "ix": 2}, "a": {"a": 0, "k": [51.837782585459394, 52.740297465287554], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[79.78826736309438, 1.599589372231876], [74.43456239752679, 10.814411298513358], [49.942467435845685, 5.534779027997023], [28.950729415485032, 8.959650030758498], [22.599677774971344, 15.40709155102781], [21.24477788862601, 17.60530041086623], [18.008027416506962, 27.281456053700953], [17.989212881273247, 27.35975267610855], [17.838674375761606, 28.50790689134093], [17.725763459141273, 29.499211380862803], [17.65988813981717, 30.372546316760133], [17.60344749726827, 31.628687732588993], [17.60344749726827, 32.61972991210429], [17.622260550925862, 33.532475469211995], [17.65988813981717, 34.562925355382035], [17.735171467546195, 35.534524534298725], [17.782207064842424, 36.11333196570018], [17.932772238724347, 37.38918160668986], [6.425437133109896, 37.56573955756118], [6.35956107299773, 34.59235070900871], [8.137882082185754, 22.590509372250423], [8.457800296813035, 21.540485330478482], [10.885336852926072, 15.593529845480198], [35.06687419794876, 0], [79.78826736309438, 1.599589372231876]], "i": [[0, 0], [0, 0], [0, 0], [6.219566944780236, -4.347338424487938], [1.6936313398272198, -2.5024310871537585], [0.4139875109503292, -0.7556556537974243], [0.5457387051895819, -3.454455563989367], [0, 0], [0.037627939029416226, -0.3825439422252937], [0.028220952101784637, -0.3239537689211792], [0.009406984757354056, -0.29426455693024695], [0.009406984757354056, -0.4219543357360091], [-0.009406984757354056, -0.33367499598089406], [-0.018813969514708113, -0.30424852662588986], [-0.018813969514708113, -0.3433962458105747], [-0.037627939029416226, -0.3239537689211792], [-0.018813969514708113, -0.19626394457548538], [-0.056468630447918396, -0.4219543357360091], [0, 0], [-0.018813969514708113, 0.9910409954770734], [-1.1479193493071735, 3.876199778480524], [0, 0], [-0.9597262161399112, 1.913639298967234], [-13.238753859357654, 0.06869409517984829], [0, 0]], "o": [[0, 0], [0, 0], [-7.216653603116098, -1.9136128858068495], [-2.5404202487720404, 1.7566017665784064], [-0.4892700978912905, 0.7163765519097924], [-1.6089685240337133, 2.944011949413118], [0, 0], [-0.056441904203569274, 0.37308541226157527], [-0.04706164641399018, 0.33367499598089406], [-0.028220952101784637, 0.2845433071005663], [-0.037627939029416226, 0.4219543357360091], [0, 0.3239537689211792], [0, 0.30424852662588986], [0, 0.3433962458105747], [0.018813969514708113, 0.3236910035152853], [0, 0.1862799748798425], [0.04706164641399018, 0.4219543357360091], [0, 0], [-0.056468630447918396, -0.9910409954770734], [0.028220952101784637, -4.082395481219962], [0, 0], [0.6586225367463474, -2.041197740609981], [2.9168333686738626, -5.829170641336706], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0.478, 0.788, 1], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [43.07101058959961, 18.782869338989258], "ix": 2}, "a": {"a": 0, "k": [43.071012099029964, 18.78286977878059], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[6.349299676743795, 34.59329793958802], [3.51715579223372, 38.86223591062409], [1.7670639937769064, 43.072057949844606], [8.127619945143756, 22.59150760755323], [6.349299676743795, 34.59329793958802]], "i": [[0, 0], [0.6304015672823425, -1.256141871228176], [0.4892620418211013, -1.4424217777981208], [0, 0], [0.03762793324200948, -4.082395481219962]], "o": [[-1.260829710336459, 1.5112586634338063], [-0.677463184759299, 1.3641264305086145], [0, 0], [-1.1479192567086656, 3.8764099908052394], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.502, 0.8], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [4.9473419189453125, 32.831783294677734], "ix": 2}, "a": {"a": 0, "k": [4.947341969460331, 32.831782778698916], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[99.9980561721217, 72.40170048423354], [72.39175930764644, 82.76480523051453], [70.61325161986645, 76.54321408318579], [99.9980561721217, 72.40170048423354]], "i": [[0, 0], [0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.502, 0.8], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [85.30565643310547, 77.583251953125], "ix": 2}, "a": {"a": 0, "k": [85.30565389599407, 77.58325285737403], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Filled region", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[65.68277369066895, 49.96838912709126], [63.88556258586475, 52.95149510410958], [56.78168359436532, 28.035165968376674], [28.08397182350375, 27.00497839221321], [34.811302316082774, 18.074651705634388], [63.58438186451259, 26.16091142393861], [66.60477036696034, 32.598631443908616], [65.68277369066895, 49.978112084668375], [65.68277369066895, 49.96838912709126]], "i": [[0, 0], [0.6868166989423088, -0.9321881933868601], [0, 0], [0, 0], [-3.151873938969257, 2.1982090419981506], [-6.8967620568590995, -10.745702106846153], [-0.6961702594245724, -2.2080354663000863], [2.4557037258439385, -5.063715796116501], [0, 0]], "o": [[-0.5080305555963812, 1.0498939797270135], [0, 0], [0, 0], [1.3078914204119232, -3.6016409875547812], [8.995161290896094, -6.280604341058385], [1.317244888295679, 2.051076809072959], [1.9099918279224002, 6.015608935789094], [0, 0], [0, 0]]}}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.502, 0.8], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [47.950496673583984, 33.97163009643555], "ix": 2}, "a": {"a": 0, "k": [47.95049535351028, 33.971629494814735], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "it": [{"ty": "gr", "nm": "Filled region", "it": [{"ty": "gr", "nm": "Path", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[70.61306790442673, 76.54735275217845], [70.5940918773952, 76.52791266613546], [72.3725995651752, 82.7495038134642], [38.6878403254442, 87.50896732591045], [36.01566962322097, 87.89177089128636], [35.9028950116043, 87.89177089128636], [18.04429343693778, 83.95650873594994], [5.436074301516862, 72.39638433476692], [1.4183905162949078, 44.13358574268276], [1.7665291447951461, 43.0542645877318], [3.516621313645992, 38.854159676977154], [6.348765568550098, 34.575504577475215], [17.997231171271267, 27.26434178304962], [22.21252267255947, 26.803241595266126], [28.07451640466277, 26.999504856742636], [56.78158877349321, 28.0396777004898], [63.87611013017602, 52.95600100711145], [66.76475095712782, 63.03430120647368], [70.61306790442673, 76.54735275217845]], "i": [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0.04703492595704781, 0], [5.607819346918873, 3.0325013193332215], [3.1614686259661506, 4.94600928113744], [-2.7380500958816807, 9.136388684078796], [0, 0], [-0.6868702671791419, 1.3638636651027205], [-1.2608299881319827, 1.5112586634338063], [-5.193831419275258, 1.1481572208678739], [-1.4960581630044278, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0], [0, 0], [-0.028327854185477747, 0], [-5.937357435337203, 0.5299389405563795], [-4.9962317592792, -2.6791211038270037], [-5.589002589320965, -8.704450811276496], [0, 0], [0.4892621344196092, -1.4329633161443], [0.6398086034029316, -1.2661257726139212], [2.5781019151919753, -3.071649084057838], [1.3172719270599924, -0.29426455693024695], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]}}}, {"ty": "tr", "p": {"a": 0, "k": [36.18629837036133, 57.40161895751953], "ix": 2}, "a": {"a": 0, "k": [36.186299786807304, 57.401620239215845], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "gr", "nm": "Path", "it": [{"ty": "sh", "d": 1, "ks": {"a": 0, "k": {"c": true, "v": [[26.964119544940413, 37.931696991403584], [26.964119544940413, 37.94141411986945], [26.954764873276055, 37.94141411986945], [25.08229562753698, 39.030723456959734], [20.067249333024062, 45.5959727730162], [22.193709618901877, 62.27867351419432], [43.88172767421824, 68.37284028943922], [44.74733259997291, 67.7054886580399], [49.42356613951398, 60.09034354065915], [46.77036553801778, 45.11490496462094], [26.964119544940413, 37.931696991403584]], "i": [[0, 0], [0, 0], [0, 0], [0.6115876802381806, -0.43193837374154953], [1.0067612578450937, -2.6496946572419655], [-3.4061038832584387, -5.318831950763087], [-6.783986704454365, 4.730039980416836], [-0.2728560184096501, 0.22569041393048958], [-0.7525588153127649, 2.993091062442301], [3.02974410009718, 4.740024155042171], [6.6052004685099295, -3.111059340948758]], "o": [[0, 0], [0, 0], [-0.6494026885095238, 0.30424852662588986], [-2.3334668430967027, 1.6192433137941082], [-1.9006386378341682, 5.0440097568724065], [5.203345730767276, 8.096216568970542], [0.31053740703406124, -0.21596918687077477], [2.342927262257109, -1.9429342262295302], [1.2044682395118338, -4.720318844436984], [-4.74224331189868, -7.389455773638653], [0, 0]]}}}, {"ty": "tr", "p": {"a": 0, "k": [34.48055648803711, 53.69573211669922], "ix": 2}, "a": {"a": 0, "k": [34.480558155816, 53.6957310200882], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "fl", "c": {"a": 0, "k": [0, 0.502, 0.8], "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "r": 1, "bm": 0}, {"ty": "tr", "p": {"a": 0, "k": [0, 0], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "tr", "p": {"a": 0, "k": [36.18629837036133, 57.40161895751953], "ix": 2}, "a": {"a": 0, "k": [36.186299786807304, 57.401620239215845], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}, {"ty": "tr", "p": {"a": 0, "k": [180, 174], "ix": 2}, "a": {"a": 0, "k": [50, 44], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}]}], "ip": 0, "op": 101, "st": 0, "bm": 0}, {"ddd": 0, "ind": 4, "ty": 4, "nm": "Vector Overscan", "sr": 1, "ks": {"p": {"a": 0, "k": [0, 0], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "shapes": [{"ty": "rc", "d": 1, "s": {"a": 0, "k": [191, 178], "ix": 2}, "p": {"a": 0, "k": [95.5, 89], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}}, {"ty": "fl", "c": {"a": 0, "k": [0, 0, 0], "ix": 2}, "o": {"a": 0, "k": 0, "ix": 2}, "r": 1, "bm": 0}], "ip": 0, "op": 101, "st": 0, "bm": 0}]}], "layers": [{"ddd": 0, "refId": "0", "w": 438, "h": 426, "ind": 1, "ty": 0, "nm": "Property 1=1", "sr": 1, "ks": {"p": {"a": 0, "k": [-39, -39], "ix": 2}, "a": {"a": 0, "k": [0, 0], "ix": 2}, "s": {"a": 0, "k": [100, 100], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 2}, "o": {"a": 0, "k": 100, "ix": 2}, "sk": {"a": 0, "k": 0, "ix": 2}, "sa": {"a": 0, "k": 0, "ix": 2}}, "ao": 0, "ip": 0, "op": 101, "st": 0, "bm": 0, "ef": [{"ty": 25, "nm": "Drop Shadow", "mn": "ADBE Drop Shadow", "ef": [{"ty": 2, "nm": "Shadow Color", "mn": "ADBE Drop Shadow-0001", "v": {"a": 1, "k": [{"t": 45, "s": [0, 0, 0], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 60, "s": [0, 0.651, 1], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}], "ix": 2}}, {"ty": 0, "nm": "Opacity", "mn": "ADBE Drop Shadow-0002", "v": {"a": 1, "k": [{"t": 0, "s": [0], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 45, "s": [0], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 60, "s": [191.25], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}, {"t": 80, "s": [0], "i": {"x": [0.75], "y": [0.75]}, "o": {"x": [0.25], "y": [0.25]}}], "ix": 2}}, {"ty": 1, "nm": "Direction", "mn": "ADBE Drop Shadow-0003", "v": {"a": 0, "k": 180, "ix": 2}}, {"ty": 0, "nm": "Distance", "mn": "ADBE Drop Shadow-0004", "v": {"a": 0, "k": 15, "ix": 2}}, {"ty": 0, "nm": "Softness", "mn": "ADBE Drop Shadow-0005", "v": {"a": 0, "k": 35, "ix": 2}}], "np": 5, "ix": 0, "en": 1}]}], "markers": []} \ No newline at end of file diff --git a/CADAM/src/client.tsx b/CADAM/src/client.tsx deleted file mode 100644 index 71824ab..0000000 --- a/CADAM/src/client.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import * as Sentry from '@sentry/react'; -import { StartClient } from '@tanstack/react-start/client'; -import { StrictMode, startTransition } from 'react'; -import { hydrateRoot } from 'react-dom/client'; - -import { getRouter } from './router'; - -function getSentryTracesSampleRate() { - const configuredRate = import.meta.env.VITE_SENTRY_TRACES_SAMPLE_RATE; - - if (configuredRate !== undefined && configuredRate !== '') { - const parsedRate = Number(configuredRate); - if (Number.isFinite(parsedRate) && parsedRate >= 0 && parsedRate <= 1) { - return parsedRate; - } - } - - return import.meta.env.PROD ? 0.1 : 1.0; -} - -const router = getRouter(); - -Sentry.init({ - dsn: import.meta.env.VITE_SENTRY_DSN ?? '', - environment: import.meta.env.VITE_SENTRY_ENVIRONMENT ?? 'local', - integrations: [Sentry.tanstackRouterBrowserTracingIntegration(router)], - tracesSampleRate: getSentryTracesSampleRate(), -}); - -startTransition(() => { - hydrateRoot( - document, - - - , - ); -}); diff --git a/CADAM/src/components/ConditionalWrapper.tsx b/CADAM/src/components/ConditionalWrapper.tsx deleted file mode 100644 index 74aedfe..0000000 --- a/CADAM/src/components/ConditionalWrapper.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export function ConditionalWrapper({ - condition, - wrapper, - children, -}: { - condition: boolean; - wrapper: (children: React.ReactNode) => React.ReactNode; - children: React.ReactNode; -}) { - return condition ? wrapper(children) : children; -} diff --git a/CADAM/src/components/CreditsButton.tsx b/CADAM/src/components/CreditsButton.tsx deleted file mode 100644 index 3c8527d..0000000 --- a/CADAM/src/components/CreditsButton.tsx +++ /dev/null @@ -1,276 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import { Zap } from 'lucide-react'; - -import { Button } from '@/components/ui/button'; -import { useIsMobile } from '@/hooks/useIsMobile'; -import { getLevel, useAuth } from '@/contexts/AuthContext'; -import { BILLING_URL, BILLING_UPGRADE_URL } from '@/config/billing'; -import { cn } from '@/lib/utils'; - -function formatCompact(n: number): string { - if (n >= 1_000_000) { - const v = n / 1_000_000; - return `${v >= 10 ? v.toFixed(0) : v.toFixed(1)}M`; - } - if (n >= 1_000) { - const v = n / 1_000; - return `${v >= 100 ? v.toFixed(0) : v.toFixed(1)}K`; - } - return n.toLocaleString(); -} - -function formatFull(n: number): string { - return n.toLocaleString(); -} - -function formatPeriodEnd(iso: string | null | undefined): string | null { - if (!iso) return null; - const d = new Date(iso); - if (Number.isNaN(d.getTime())) return null; - return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); -} - -export function CreditsButton() { - const isMobile = useIsMobile(); - const { user, billing } = useAuth(); - const level = getLevel(billing); - const totalTokens = billing?.tokens.total ?? 0; - const freeTokens = billing?.tokens.free ?? 0; - const subscriptionTokens = billing?.tokens.subscription ?? 0; - const purchasedTokens = billing?.tokens.purchased ?? 0; - const periodEnd = formatPeriodEnd( - billing?.subscription?.currentPeriodEnd ?? null, - ); - - const [open, setOpen] = useState(false); - // Card opened by click stays pinned — mouse-leave alone won't dismiss it. - // Only outside-click (or an explicit close action) clears this. - const [pinnedByClick, setPinnedByClick] = useState(false); - const openTimer = useRef(null); - const closeTimer = useRef(null); - const wrapperRef = useRef(null); - - // Close when clicking outside while open (dismisses both hover + click open states) - useEffect(() => { - if (!open) return; - const onDocClick = (e: MouseEvent) => { - if (e.target instanceof Node && wrapperRef.current?.contains(e.target)) { - return; - } - setOpen(false); - setPinnedByClick(false); - }; - document.addEventListener('mousedown', onDocClick); - return () => document.removeEventListener('mousedown', onDocClick); - }, [open]); - - // Clear any in-flight hover timers when the component unmounts (e.g. the - // user navigates away from `/` while a 300ms open-delay is still pending). - useEffect(() => { - return () => { - if (openTimer.current) window.clearTimeout(openTimer.current); - if (closeTimer.current) window.clearTimeout(closeTimer.current); - }; - }, []); - - // Drop any pinned/hover state when crossing into the mobile renderer so - // resizing back to desktop doesn't re-surface a stale popover. - useEffect(() => { - if (!isMobile) return; - setOpen(false); - setPinnedByClick(false); - if (openTimer.current) { - window.clearTimeout(openTimer.current); - openTimer.current = null; - } - if (closeTimer.current) { - window.clearTimeout(closeTimer.current); - closeTimer.current = null; - } - }, [isMobile]); - - if (!user) return null; - - if (isMobile) { - return ( - - - {formatCompact(totalTokens)} - - ); - } - - const isFree = level === 'free'; - const headerLabel = isFree - ? 'Daily credits' - : periodEnd - ? `Renews ${periodEnd}` - : 'Current credits'; - - const handleEnter = () => { - if (closeTimer.current) { - window.clearTimeout(closeTimer.current); - closeTimer.current = null; - } - if (open) return; - // slight hover-intent delay so brushing past the pill doesn't pop the card - if (openTimer.current) window.clearTimeout(openTimer.current); - openTimer.current = window.setTimeout(() => setOpen(true), 300); - }; - - const handleLeave = () => { - if (openTimer.current) { - window.clearTimeout(openTimer.current); - openTimer.current = null; - } - // If the user explicitly clicked to pin the card, don't auto-close on - // mouse-leave — they'll dismiss it themselves via outside-click. - if (pinnedByClick) return; - // small delay so moving between pill and card doesn't flicker the card closed - closeTimer.current = window.setTimeout(() => setOpen(false), 120); - }; - - const handlePillClick = () => { - setOpen(true); - setPinnedByClick(true); - if (openTimer.current) { - window.clearTimeout(openTimer.current); - openTimer.current = null; - } - if (closeTimer.current) { - window.clearTimeout(closeTimer.current); - closeTimer.current = null; - } - }; - - return ( - <> -
- - - {open && ( -
- {/* Header */} -
-
- {headerLabel} -
- -
- -
- - {/* Credits breakdown */} -
-
-
- - Credits -
- - {formatFull(totalTokens)} - -
- -
- {!isFree && ( -
- Monthly credits - - {formatFull(subscriptionTokens)} - -
- )} - {freeTokens > 0 && ( -
- Daily free credits - - {formatFull(freeTokens)} - -
- )} - {purchasedTokens > 0 && ( -
- Add-on credits - - {formatFull(purchasedTokens)} - -
- )} -
-
- -
- - {/* Footer link */} - - View plans - - -
- )} -
- - ); -} diff --git a/CADAM/src/components/FreePlanTrialPill.tsx b/CADAM/src/components/FreePlanTrialPill.tsx deleted file mode 100644 index 18ff0f5..0000000 --- a/CADAM/src/components/FreePlanTrialPill.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useState } from 'react'; -import { getLevel, useAuth } from '@/contexts/AuthContext'; -import { TrialDialog } from '@/components/auth/TrialDialog'; - -/** - * "Free plan | Start free trial" pill shown above the greeting for signed-in - * free-plan users who haven't used their trial yet — the CADAM port of the - * workspace pill. It renders nothing until billing has resolved (so it never - * flashes on a paying user) and disappears once the trial has been used. - * - * The fade is mount-triggered (`animate-in fade-in`) rather than driven by a - * parent `reveal` gate: because the pill only mounts after the network-backed - * billing query resolves, a parent opacity flag would already be `true` by - * then and the pill would pop in. Animating on mount fades it in whenever it - * actually appears. - * - * `TrialDialog` is mounted on first open (not up front) so its - * `useSubscriptionProducts` query doesn't fire for every free-plan visitor who - * never opens it — and then stays mounted so Radix can play its close - * animation, which a `{open && ...}` unmount would skip. - */ -export function FreePlanTrialPill() { - const { user, billing, isLoading } = useAuth(); - const [trialOpen, setTrialOpen] = useState(false); - const [dialogMounted, setDialogMounted] = useState(false); - - const level = getLevel(billing); - const hasTrialed = billing?.user.hasTrialed ?? false; - - // Only signed-in free-plan users who can still start a trial, and only once - // billing has resolved. The `!billing` guard matters because the billing - // query throws on error — leaving `isLoading` false but `billing` null — and - // `getLevel(null)` reads as 'free'. Without it, a paid user whose billing - // fetch transiently fails would be shown the trial pill. - if (!user || isLoading || !billing || level !== 'free' || hasTrialed) { - return null; - } - - return ( - <> -
- Free plan -
- {dialogMounted && ( - - )} - - ); -} diff --git a/CADAM/src/components/ImageViewer.tsx b/CADAM/src/components/ImageViewer.tsx deleted file mode 100644 index f807e48..0000000 --- a/CADAM/src/components/ImageViewer.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import { Check, DownloadIcon, Frown, Loader2, PlusIcon } from 'lucide-react'; -import { useMemo, useState } from 'react'; -import { useItemSelection } from '@/hooks/useItemSelection'; -import { cn } from '@/lib/utils'; -import { useImageData } from '@/hooks/useImageData'; -import { useConversation } from '@/contexts/ConversationContext'; -import { getSafeFilename } from '@/utils/file-utils'; - -export function ImageViewer({ - image, - className, - hoverable = true, - clickable = true, -}: { - image: string; - className?: string; - hoverable?: boolean; - clickable?: boolean; -}) { - const [loaded, setLoaded] = useState(false); - const { images, selectItem } = useItemSelection(); - const { conversation } = useConversation(); - - const { - data: { data: imageData, isLoading: isImageDataLoading }, - url: { data: imageUrl, isLoading: isImageLoading }, - } = useImageData(image); - - const handleDownload = () => { - const url = imageUrl?.url || ''; - // Parse MIME from the data URL (e.g. "data:image/jpeg;base64,...") so - // the downloaded file's extension matches the actual bytes. gpt-image-2 - // generates jpeg, Gemini/Flux fallbacks generate png — hardcoding .png - // would mislabel jpeg downloads and some viewers reject the mismatch. - const mimeMatch = url.match(/^data:(image\/\w+);/); - const mime = mimeMatch?.[1] ?? 'image/png'; - const ext = - mime === 'image/jpeg' ? 'jpg' : mime === 'image/webp' ? 'webp' : 'png'; - const link = document.createElement('a'); - link.href = url; - const name = getSafeFilename(conversation.title); - link.download = `${name}.${ext}`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - - const isSelected = useMemo( - () => images.some((img) => img.id === image), - [images, image], - ); - - if (imageData?.status === 'failure') { - return ( -
- - Image generation failed -
- ); - } - - if (isImageDataLoading || isImageLoading || imageData?.status === 'pending') { - return ( -
- -
- ); - } - - if (!imageUrl) { - return ( -
- - Image not found -
- ); - } - - return ( -
-
- Image setLoaded(true)} - /> - {!loaded && ( -
- -
- )} - {clickable && ( - <> - {/* Bottom shadow gradient that appears on hover */} -
- {/* White download icon that appears on hover */} -
- -
- {/* Selected Image Checkbox */} -
{ - e.stopPropagation(); - selectItem( - { id: image, source: 'selection', url: imageUrl.url }, - 'image', - ); - }} - > - {isSelected && } - {!isSelected && } -
- - )} -
-
- ); -} diff --git a/CADAM/src/components/Layout.tsx b/CADAM/src/components/Layout.tsx deleted file mode 100644 index 7210f7e..0000000 --- a/CADAM/src/components/Layout.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { useEffect, useState } from 'react'; -import { Outlet, useLocation } from '@tanstack/react-router'; -import { PanelLeft } from 'lucide-react'; - -import { Sidebar } from './Sidebar'; -import { CreditsButton } from './CreditsButton'; -import { useAuth } from '@/contexts/AuthContext'; -import { Button } from '@/components/ui/button'; -import { useIsMobile } from '@/hooks/useIsMobile'; -import { Loader2 } from 'lucide-react'; -import { LayoutContext } from '@/contexts/LayoutContext'; - -export function Layout() { - const { user, isLoading } = useAuth(); - const isMobile = useIsMobile(); - const location = useLocation(); - const [isSidebarOpen, setIsSidebarOpen] = useState(true); - const [hasLoadedSidebarPreference, setHasLoadedSidebarPreference] = - useState(false); - - useEffect(() => { - const storedSidebarPreference = localStorage.getItem('sidebarOpen'); - - if (storedSidebarPreference !== null) { - setIsSidebarOpen(storedSidebarPreference !== 'false'); - } - - setHasLoadedSidebarPreference(true); - }, []); - - useEffect(() => { - if (hasLoadedSidebarPreference) { - localStorage.setItem('sidebarOpen', isSidebarOpen.toString()); - } - }, [hasLoadedSidebarPreference, isSidebarOpen]); - - if (isLoading) { - return ( -
- -
- ); - } - - if (!user) { - return ( -
- - - - -
- ); - } - - return ( -
-
- -
- {/* Credits button — home page only. Mirrors the sidebar-toggle's - movement: eases inward when the sidebar opens (so it lands - inside the rounded panel) and back to the edge when it closes. - The `!user` branch above returns early, so no `user` guard here. */} - {location.pathname === '/' && ( -
- -
- )} - {/* Toggle Sidebar Button - Positioned on main content area */} - {!isMobile && user && ( - - )} -
- - - -
-
-
-
- ); -} diff --git a/CADAM/src/components/LimitReachedMessage.tsx b/CADAM/src/components/LimitReachedMessage.tsx deleted file mode 100644 index b1e5b6a..0000000 --- a/CADAM/src/components/LimitReachedMessage.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { getLevel, useAuth } from '@/contexts/AuthContext'; -import { Link } from '@tanstack/react-router'; -import { TrialDialog } from './auth/TrialDialog'; -import { BILLING_UPGRADE_URL } from '@/config/billing'; -import { useState, useEffect } from 'react'; - -const TRIAL_DIALOG_SHOWN_KEY = 'adam_trial_dialog_shown'; - -export function LimitReachedMessage() { - const { billing } = useAuth(); - const level = getLevel(billing); - const hasTrialed = billing?.user.hasTrialed ?? false; - const [showTrialDialog, setShowTrialDialog] = useState(false); - - // Automatically open trial dialog for free users who haven't trialed - useEffect(() => { - if (level === 'free' && !hasTrialed) { - // Check if dialog has been shown before - const hasDialogBeenShown = - localStorage.getItem(TRIAL_DIALOG_SHOWN_KEY) === 'true'; - - if (!hasDialogBeenShown) { - // Wait 1 second before showing the trial dialog - const timer = setTimeout(() => { - setShowTrialDialog(true); - // Mark dialog as shown in localStorage - localStorage.setItem(TRIAL_DIALOG_SHOWN_KEY, 'true'); - }, 1000); - - return () => clearTimeout(timer); - } - } - }, [level, hasTrialed]); - - const handleTrialClick = () => { - setShowTrialDialog(true); - }; - - return ( -
- - {level === 'free' && !hasTrialed && ( - - )} -
- ); -} - -function LimitReachedSpan({ onTrialClick }: { onTrialClick?: () => void }) { - const { billing } = useAuth(); - const level = getLevel(billing); - const hasTrialed = billing?.user.hasTrialed ?? false; - - // Free tier with trial already used - if (level === 'free' && hasTrialed) { - return ( - - You've used all your tokens.{' '} - - Upgrade - {' '} - for more tokens, or{' '} - - buy a token pack - - . - - ); - } - - // Free tier without trial - if (level === 'free' && !hasTrialed) { - return ( - - You've used all your tokens.{' '} - - Start a free trial - {' '} - to experience all Pro features for 7 days, completely free. - - ); - } - - // Standard or Pro tier - return ( - - You've used all your tokens for this period.{' '} - - Buy more tokens - {' '} - or{' '} - - upgrade your plan - - . - - ); -} diff --git a/CADAM/src/components/LowPromptsWarningMessage.tsx b/CADAM/src/components/LowPromptsWarningMessage.tsx deleted file mode 100644 index 2ef9e01..0000000 --- a/CADAM/src/components/LowPromptsWarningMessage.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { getLevel, useAuth } from '@/contexts/AuthContext'; -import { Link } from '@tanstack/react-router'; -import { TrialDialog } from './auth/TrialDialog'; -import { BILLING_UPGRADE_URL } from '@/config/billing'; -import { cn } from '@/lib/utils'; - -export function LowPromptsWarningMessage({ - tokensRemaining, - layout = 'inline', -}: { - tokensRemaining: number; - layout?: 'inline' | 'stacked'; -}) { - return ( -
- -
- ); -} - -function LowTokensWarningContent({ - tokensRemaining, - layout, -}: { - tokensRemaining: number; - layout: 'inline' | 'stacked'; -}) { - const { billing } = useAuth(); - const level = getLevel(billing); - const hasTrialed = billing?.user.hasTrialed ?? false; - - const tokensText = `You have ${tokensRemaining} token${tokensRemaining === 1 ? '' : 's'} remaining`; - - // Free tier with trial already used - if (level === 'free' && hasTrialed) { - return ( - - {tokensText}.{' '} - - Upgrade - {' '} - for more tokens. - - ); - } - - // Free tier without trial - pure CSS layout control - if (level === 'free' && !hasTrialed) { - return ( -
- {tokensText}. - - - Start a free trial of Pro - - -
- ); - } - - // Paid tier - return ( - - {tokensText}.{' '} - - Buy more tokens - {' '} - or{' '} - - upgrade - - . - - ); -} diff --git a/CADAM/src/components/ModelSelector.tsx b/CADAM/src/components/ModelSelector.tsx deleted file mode 100644 index fd3d65e..0000000 --- a/CADAM/src/components/ModelSelector.tsx +++ /dev/null @@ -1,250 +0,0 @@ -import { Check, ChevronDown } from 'lucide-react'; -import { useState, useEffect, useRef } from 'react'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; -import { Button } from '@/components/ui/button'; -import { ProviderLogo } from '@/components/ProviderLogo'; -import { cn } from '@/lib/utils'; -import { Model } from '@shared/types'; -import { ModelConfig } from '../types/misc.ts'; -import { useConversation } from '@/contexts/ConversationContext'; - -interface ModelSelectorProps { - models: ModelConfig[]; - selectedModel: string; - onModelChange: (modelId: Model) => void; - disabled?: boolean; - className?: string; - type?: 'parametric' | 'creative'; // Optional type prop that takes precedence over conversation context - focused?: boolean; // New prop to indicate if text area is focused -} - -export function ModelSelector({ - models, - selectedModel, - onModelChange, - className, - disabled, - type, - focused = false, -}: ModelSelectorProps) { - const [isDropdownOpen, setIsDropdownOpen] = useState(false); - const { conversation } = useConversation(); - - // Use provided type prop or fall back to conversation context - const currentType = type || conversation.type; - - // Track previous model name for slide animation - const [prevModelName, setPrevModelName] = useState(null); - const [isSliding, setIsSliding] = useState(false); - const [slideDirection, setSlideDirection] = useState<'up' | 'down'>('up'); - - const selectedModelConfig = models.find((m) => m.id === selectedModel); - - // Store previous selected model name and type - const prevNameRef = useRef(selectedModelConfig?.name); - const prevTypeRef = useRef<'parametric' | 'creative' | undefined>( - currentType, - ); - const recentTypeChangeRef = useRef(0); // Timestamp of last type change - - // --------------------------------------------------------------------------- - // Focus management - // --------------------------------------------------------------------------- - // Radix will always move focus back to the trigger after the dropdown closes. - // When the user opened the menu via *keyboard* this is great for accessibility - // because they can keep tabbing. But when the user opened the menu with a - // *pointer* (mouse / touch), that behaviour leaves an unwanted focus outline - // "stuck" on the button. We therefore: - // 1. Track *how* the menu was opened (pointer vs. keyboard). - // 2. If it was opened via pointer, cancel the automatic focus-return and - // blur the trigger so no outline is shown. - // --------------------------------------------------------------------------- - const openedWithPointerRef = useRef(false); - - // Ref to the trigger button so we can blur it if needed. - const triggerRef = useRef(null); - - // Trigger slide animation when selected model changes - useEffect(() => { - if ( - prevNameRef.current && - prevNameRef.current !== selectedModelConfig?.name - ) { - setPrevModelName(prevNameRef.current); - setIsSliding(true); - - // Check if type changed (mode switch) - const typeChanged = prevTypeRef.current !== currentType; - const now = Date.now(); - const recentTypeChange = now - recentTypeChangeRef.current < 100; // Within 100ms - - if (typeChanged) { - // Mode switching logic: parametric = down, creative = up - const direction = currentType === 'parametric' ? 'down' : 'up'; - setSlideDirection(direction); - recentTypeChangeRef.current = now; - } else if (!recentTypeChange) { - // Within same mode: preserve existing index-based logic - // But only if we haven't had a recent type change - const prevIndex = models.findIndex( - (m) => m.name === prevNameRef.current, - ); - const newIndex = models.findIndex((m) => m.id === selectedModel); - if (prevIndex !== -1 && newIndex !== -1) { - const direction = newIndex > prevIndex ? 'up' : 'down'; - setSlideDirection(direction); - } - } - } - - prevNameRef.current = selectedModelConfig?.name; - prevTypeRef.current = currentType; - }, [selectedModelConfig?.name, currentType, models, selectedModel]); - - const handleSlideEnd = () => { - setPrevModelName(null); - setIsSliding(false); - }; - - return ( - - - - - { - if (openedWithPointerRef.current) { - event.preventDefault(); - openedWithPointerRef.current = false; - triggerRef.current?.blur(); - } - }} - > - {models.map((model) => ( - { - onModelChange(model.id); - setIsDropdownOpen(false); - event.stopPropagation(); - }} - disabled={!!model.disabled} - > -
- -
- - {model.name} - - {model.description && ( -

- {model.description} -

- )} -
- {selectedModel === model.id && ( - - )} -
-
- ))} -
-
- ); -} diff --git a/CADAM/src/components/NewProductBanner.tsx b/CADAM/src/components/NewProductBanner.tsx deleted file mode 100644 index 6350ca8..0000000 --- a/CADAM/src/components/NewProductBanner.tsx +++ /dev/null @@ -1,241 +0,0 @@ -import { ArrowRight, X } from 'lucide-react'; -import posthog from 'posthog-js'; -import { useEffect, useRef, useState, useSyncExternalStore } from 'react'; -import { Button } from '@/components/ui/button'; -import { cn } from '@/lib/utils'; - -// Copy lives in one place so the owner can swap headline/subtext/CTA without -// touching the markup. See the PR summary for runner-up options. -const COPY = { - headline: 'The new Adam is here', - subtext: - 'Adam now works inside your real CAD in SolidWorks, Onshape, and Fusion, editing models, BOMs, and drawings.', - cta: 'Try now', -} as const; - -// Versioned so a redesign can re-surface the banner for users who dismissed an -// older iteration (v4: SolidWorks logo added, larger layout). Un-scoped: CADAM -// has no team/integration concept, so one key is enough. -const DISMISSED_KEY = 'adam-product-banner-dismissed:v4'; - -// Dismissal lives in localStorage but is read through useSyncExternalStore so -// same-tab writes re-render the banner immediately; the native "storage" event -// only fires in other tabs. -const DISMISSAL_CHANGE_EVENT = 'adam-product-banner-dismissal-change'; - -// Session-scoped fallback so a dismissal still sticks when localStorage is -// unavailable (private mode, storage-blocking extensions) — without it the -// snapshot would read false again and the banner would reappear post-exit. -let memoryDismissed = false; - -function readDismissed(): boolean { - try { - return localStorage.getItem(DISMISSED_KEY) === '1'; - } catch { - return memoryDismissed; - } -} - -function writeDismissed(dismissed: boolean): void { - memoryDismissed = dismissed; - try { - if (dismissed) { - localStorage.setItem(DISMISSED_KEY, '1'); - } else { - localStorage.removeItem(DISMISSED_KEY); - } - } catch { - // localStorage unavailable — the in-memory fallback above still holds. - } - window.dispatchEvent(new Event(DISMISSAL_CHANGE_EVENT)); -} - -function subscribeToDismissal(onChange: () => void): () => void { - window.addEventListener(DISMISSAL_CHANGE_EVENT, onChange); - window.addEventListener('storage', onChange); - return () => { - window.removeEventListener(DISMISSAL_CHANGE_EVENT, onChange); - window.removeEventListener('storage', onChange); - }; -} - -/** - * Announcement card on the CADAM home page inviting users up to the full Adam - * product (https://adam.new). Floats in the space below the composer, shows - * unless dismissed, then fades + slides + scales out and stays gone (persisted - * in localStorage). - */ -export function NewProductBanner() { - const [dismissing, setDismissing] = useState(false); - // Starts hidden so the entrance transition has a "from" frame to animate out - // of; flipped on after first paint (rAF), matching PromptView's fade-in. - const [entered, setEntered] = useState(false); - // The server snapshot (hidden) is also what renders during hydration, so a - // stored dismissal can't mismatch SSR'd markup and the card never flashes. - const dismissed = useSyncExternalStore( - subscribeToDismissal, - readDismissed, - () => true, - ); - // Tracks the exit-fallback timer so it can be cancelled if the card unmounts - // mid-exit (e.g. navigating away during the 450ms window) — otherwise the - // callback fires on a stale fiber. - const dismissTimeoutRef = useRef(null); - - useEffect(() => { - const frame = requestAnimationFrame(() => setEntered(true)); - return () => cancelAnimationFrame(frame); - }, []); - - useEffect( - () => () => { - if (dismissTimeoutRef.current !== null) { - window.clearTimeout(dismissTimeoutRef.current); - } - }, - [], - ); - - if (dismissed && !dismissing) { - return null; - } - - // visible drives the single enter/exit transition: false on first paint - // (slide-up entrance) and again once dismissing (slide-down exit). - const visible = entered && !dismissing; - - // Persist immediately, but keep the card mounted while the exit plays; the - // card's transitionend handler does the actual unmount. The timeout is a - // fallback for environments where transitionend never fires (zeroed durations - // under reduced-motion overrides) — a no-op if the handler already ran. - const dismiss = () => { - setDismissing(true); - writeDismissed(true); - dismissTimeoutRef.current = window.setTimeout(() => { - dismissTimeoutRef.current = null; - setDismissing(false); - }, 450); - }; - - const handleCtaClick = () => { - try { - posthog.capture('new_product_banner_click', { location: 'prompt_view' }); - } catch { - // Analytics failures (e.g. blocked by an ad-blocker) must never block - // the link's navigation. - } - }; - - return ( -
{ - if ( - dismissing && - event.target === event.currentTarget && - event.propertyName === 'opacity' - ) { - if (dismissTimeoutRef.current !== null) { - window.clearTimeout(dismissTimeoutRef.current); - dismissTimeoutRef.current = null; - } - setDismissing(false); - } - }} - > - {/* Dismiss peels out of the corner so it doesn't crowd the CTA inside the card. */} - - -
- {/* Avatar-style stack with Adam as the clear lead: a larger front - chip, with the CAD tools smaller and receding behind it in copy - order. Each chip is ringed with the card background so the - overlaps read as clean notches instead of borders-on-borders. - On hover the stack fans gently apart. */} -
-
- Adam -
-
- SolidWorks -
-
- Onshape -
-
- Fusion 360 -
-
- -
-

- {COPY.headline} -

-

- {COPY.subtext} -

-
- - -
-
- ); -} diff --git a/CADAM/src/components/ProviderLogo.tsx b/CADAM/src/components/ProviderLogo.tsx deleted file mode 100644 index 626e490..0000000 --- a/CADAM/src/components/ProviderLogo.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { cn } from '@/lib/utils'; - -/** - * Monochrome provider marks for the model pickers. Each renders in - * `currentColor` so rows can tint them via text color utilities. - * Keys match the `provider` field on ModelConfig entries in lib/utils. - */ -const PROVIDER_ICONS: Record = { - OpenAI: ( - - ), - // Claude spark rather than the Anthropic "A" wordmark: it is the mark - // users recognize from claude.ai next to model names. - Anthropic: ( - - ), - Google: ( - - ), - xAI: ( - - ), - 'Moonshot AI': , - 'Z.AI': , -}; - -interface ProviderLogoProps { - provider?: string; - className?: string; -} - -export function ProviderLogo({ provider, className }: ProviderLogoProps) { - const icon = provider ? PROVIDER_ICONS[provider] : undefined; - if (!icon) return null; - return ( - - ); -} diff --git a/CADAM/src/components/Sidebar.tsx b/CADAM/src/components/Sidebar.tsx deleted file mode 100644 index 66c879a..0000000 --- a/CADAM/src/components/Sidebar.tsx +++ /dev/null @@ -1,477 +0,0 @@ -import { useState } from 'react'; -import { Link, useNavigate } from '@tanstack/react-router'; -import { Menu, Plus, LogOut, Crown, Settings, LayoutGrid } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '@/components/ui/tooltip'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; -import { useAuth } from '@/contexts/AuthContext'; -import { supabase, ssoProvider } from '@/lib/supabase'; -import { BILLING_URL } from '@/config/billing'; -import { - Sheet, - SheetContent, - SheetDescription, - SheetHeader, - SheetTitle, - SheetTrigger, -} from './ui/sheet'; -import { useIsMobile } from '@/hooks/useIsMobile'; -import { useQuery } from '@tanstack/react-query'; -import { ConditionalWrapper } from './ConditionalWrapper'; -import { DiscordIcon, GitHubIcon } from './icons/CompanyIcons'; -import { cn } from '@/lib/utils'; -import { Conversation, ConversationSettings } from '@shared/types'; -import { UserAvatar } from '@/components/chat/UserAvatar'; -import { useProfile } from '@/services/profileService'; - -interface SidebarProps { - isSidebarOpen: boolean; - setIsSidebarOpen: (open: boolean) => void; -} - -type SidebarPath = '/' | '/history'; - -function DesktopSidebar({ isSidebarOpen, setIsSidebarOpen }: SidebarProps) { - const navigate = useNavigate(); - const { user, signOut } = useAuth(); - const isMobile = useIsMobile(); - const { data: profile } = useProfile(); - - // Get 10 most recent conversations - const { data: recentConversations } = useQuery({ - queryKey: ['conversations', 'recent'], - initialData: [], - queryFn: async () => { - const { data, error } = await supabase - .from('conversations') - .select('*') - .order('updated_at', { ascending: false }) - .eq('user_id', user?.id ?? '') - .limit(10) - .overrideTypes>(); - - if (error) throw error; - - return data; - }, - }); - - const handleSignOut = async () => { - try { - if (ssoProvider) { - // In SSO mode root is the app's only auth surface, so sign-out lands - // there. Navigate BEFORE the session dies: on a guarded route the - // AuthGuard would otherwise fire the provider redirect the moment the - // session goes away and sign the user straight back in. - await navigate({ to: '/' }); - await signOut(); - return; - } - await signOut(); - navigate({ to: '/signin' }); - } catch (error) { - console.error('Error signing out:', error); - } - }; - - const sidebarNavigate = (path: SidebarPath) => { - if (isMobile) { - setIsSidebarOpen(false); // setIsSidebarOpen is actually setOpen from Sheet component - } - navigate({ to: path }); - }; - - const renderUserSectionTrigger = () => { - if (isSidebarOpen) { - return ( -
- -
- - {profile?.full_name || user?.email?.split('@')[0] || 'User'} - - - {user?.email} - -
-
- ); - } - - return ( - - ); - }; - - return ( -
-
- ( - - {children} - - Home - Home Page - - - )} - > - - -
- -
-
- ( - - {children} - - New Creation - - Start a new conversation - - - - )} - > -
- -
-
- -
- -
-
- {/* GitHub Button - Collapsed state */} - {!isSidebarOpen && ( - - - - - - - - GitHub - - View source code - - - - )} - - {/* GitHub Button - Expanded state */} - {isSidebarOpen && ( - - - - )} - - {/* Discord Button - Collapsed state */} - {!isSidebarOpen && ( - - - - - - - - Discord - - Join our community - - - - )} - - {/* Discord Button - Expanded state */} - {isSidebarOpen && ( - - - - )} - - - - {renderUserSectionTrigger()} - - -
-
-

- {profile?.full_name || - user?.email?.split('@')[0] || - 'User'} -

-

- {user?.email} -

-
-
- - - - - - Settings - - - - - - Subscriptions - - - - - - - Sign out - -
-
-
-
-
-
- ); -} - -function MobileSidebar({ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isSidebarOpen, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - setIsSidebarOpen, -}: SidebarProps) { - const [open, setOpen] = useState(false); - - return ( - - - - - - {/* For aria stuff */} - - AdamCAD - - AI-powered CAD software for everyone - - - - - - ); -} - -export function Sidebar({ isSidebarOpen, setIsSidebarOpen }: SidebarProps) { - const isMobile = useIsMobile(); - const { user } = useAuth(); - - // Don't display the sidebar if the user isn't logged in - if (user == null) { - return <>; - } - - return isMobile ? ( - - ) : ( - - ); -} diff --git a/CADAM/src/components/TextAreaChat.tsx b/CADAM/src/components/TextAreaChat.tsx deleted file mode 100644 index 23a435d..0000000 --- a/CADAM/src/components/TextAreaChat.tsx +++ /dev/null @@ -1,1735 +0,0 @@ -import React, { - useState, - useRef, - KeyboardEvent, - useEffect, - useMemo, - useCallback, -} from 'react'; -import { - ArrowUp, - ImagePlus, - Images, - Loader2, - Square, - CircleX, - Wand2, - Box, - X, -} from 'lucide-react'; -import { - cn, - CREATIVE_MODELS, - PARAMETRIC_MODELS, - parametricModelSupportsVision, -} from '@/lib/utils'; -import { CreativeModel, MeshFileType, Model } from '@shared/types'; -import type { AppUIMessage } from '@shared/chatAi'; -import { imageFilePartUrl } from '@shared/imageRefs'; -import { - shouldShowPolygonControls, - getModelDefaultPolygonCount, - getMaxPolygonCount, - isCreativeModel, -} from '@/constants/meshConstants'; -import { MessageItem } from '../types/misc.ts'; -import { useToast } from '@/hooks/use-toast'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '@/components/ui/tooltip'; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from '@/components/ui/popover'; -import { Slider } from '@/components/ui/slider'; -import { Input } from '@/components/ui/input'; -import { useMutation } from '@tanstack/react-query'; -import { supabase } from '@/lib/supabase'; -import { useAuth } from '@/contexts/AuthContext'; -import { ModelSelector } from '@/components/ModelSelector'; -import { Button } from '@/components/ui/button'; -import { Textarea } from '@/components/ui/textarea'; -import { Avatar } from '@/components/ui/avatar'; -import { useItemSelection } from '@/hooks/useItemSelection'; -import { - generatePreview, - parseSTL, - renderMultipleAngles, - BoundingBox, -} from '@/utils/meshUtils'; -import { useMeshFiles } from '@/contexts/MeshFilesContext'; -import { AnimatePresence, motion } from 'framer-motion'; -import { apiJson } from '@/services/api'; -import { z } from 'zod'; - -const promptResponseSchema = z.object({ prompt: z.string().optional() }); - -interface TextAreaChatProps { - type: 'parametric' | 'creative'; - onSubmit: (parts: AppUIMessage['parts']) => void; - onFocus?: () => void; - isLoading?: boolean; - placeholder?: string; - stopGenerating?: () => void; - disabled?: boolean; - model: Model; - setModel: (model: Model) => void; - showPromptGenerator?: boolean; - showFullLabels?: boolean; // Controls whether to show full text labels on buttons - onTypeChange?: (type: 'parametric' | 'creative') => void; - conversation: { - id: string; - user_id: string; - }; -} - -// SVG Icon component for the quads/polys toggle -const QuadsPolysSvg = ({ color = '#D7D7D7' }: { color?: string }) => ( - - - - - -); - -// SVG Icon component for the polygon count toggle -const PolygonCountSvg = ({ color = '#D7D7D7' }: { color?: string }) => ( - - - - - - - - - - - -); - -// Polygon Input State Machine -type PolygonInputState = { type: 'idle' } | { type: 'editing'; value: string }; - -// Polygon Button Component -interface PolygonButtonProps { - polygonCount: number; - meshTopology: 'quads' | 'polys'; - model: CreativeModel; - showFullLabels: boolean; - isLoading: boolean; - disabled: boolean; - onPolygonCountChange: (count: number) => void; - onReset: () => void; -} - -// Quads Button Component -interface QuadsButtonProps { - meshTopology: 'quads' | 'polys'; - showFullLabels: boolean; - isLoading: boolean; - disabled: boolean; - onToggle: () => void; -} - -const QuadsButton = ({ - meshTopology, - showFullLabels, - isLoading, - disabled, - onToggle, -}: QuadsButtonProps) => { - const isQuadsEnabled = meshTopology === 'quads'; - - const buttonContent = ( - - ); - - // Component abstraction instead of nested ternaries - if (showFullLabels) { - return buttonContent; - } - - return ( - - {buttonContent} - - {isQuadsEnabled ? 'Quad topology enabled' : 'Enable quad topology'} - - - ); -}; - -const PolygonButton = ({ - polygonCount, - meshTopology, - model, - showFullLabels, - isLoading, - disabled, - onPolygonCountChange, - onReset, -}: PolygonButtonProps) => { - // Computed values - no useState needed - const maxPolygonCount = getMaxPolygonCount(model, meshTopology); - // Use model-specific default for determining if value is custom - const defaultPolygonCount = getModelDefaultPolygonCount(model, meshTopology); - const maxInputValue = Math.floor(maxPolygonCount / 1000); - const isCustom = polygonCount !== defaultPolygonCount; - - // Only state needed - popover open/closed and input editing - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const [isSliderDragging, setIsSliderDragging] = useState(false); - const [closeGuardUntil, setCloseGuardUntil] = useState(0); - const [inputState, setInputState] = useState({ - type: 'idle', - }); - - const formatPolygonCount = (count: number) => { - return count >= 1000 ? `${Math.floor(count / 1000)}K` : count.toString(); - }; - - const handleSliderChange = (value: number[]) => { - onPolygonCountChange(value[0]); - }; - - const handleInputStart = (e: React.FocusEvent) => { - setInputState({ - type: 'editing', - value: Math.floor(polygonCount / 1000).toString(), - }); - // Auto-select all text when focused - e.target.select(); - }; - - const handleInputChange = (value: string) => { - if (inputState.type === 'editing') { - if (value === '' || (/^\d+$/.test(value) && parseInt(value, 10) >= 0)) { - setInputState({ type: 'editing', value }); - } - } - }; - - const handleInputComplete = () => { - if (inputState.type === 'editing') { - const numValue = parseInt(inputState.value, 10); - if (!isNaN(numValue) && numValue >= 1 && numValue <= maxInputValue) { - onPolygonCountChange(numValue * 1000); - } - setInputState({ type: 'idle' }); - } - }; - - const handleInputKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter') { - e.preventDefault(); - handleInputComplete(); - setIsPopoverOpen(false); // Close the popover - } - }; - - const buttonContent = ( - - ); - - const popoverContent = ( - e.preventDefault()} - onInteractOutside={(e) => { - // Keep popover open if user is dragging or within post-drag guard window - if (isSliderDragging || Date.now() < closeGuardUntil) { - e.preventDefault(); - } - }} - > -
-
- setIsSliderDragging(true)} - onPointerUp={() => { - setIsSliderDragging(false); - setCloseGuardUntil(Date.now() + 150); - }} - /> -
- handleInputChange(e.target.value)} - onFocus={(e) => handleInputStart(e)} - onBlur={handleInputComplete} - onKeyDown={handleInputKeyDown} - onClick={(e) => { - e.stopPropagation(); - // Also select all text when clicking on the input - (e.target as HTMLInputElement).select(); - }} - onMouseDown={(e) => e.stopPropagation()} - className="h-6 w-12 rounded-md border border-adam-neutral-700 bg-adam-neutral-800 px-1 py-0 text-center text-xs text-adam-text-primary selection:bg-[#70B8FF7A] selection:text-white focus:ring-1 focus:ring-adam-blue/20" - /> - k -
-
-
-
- ); - - // Component abstraction instead of nested ternaries - if (showFullLabels) { - return ( -
- - {buttonContent} - {popoverContent} - -
- ); - } - - return ( -
- - -
- - {buttonContent} - {popoverContent} - -
-
- Adjust poly count -
-
- ); -}; - -const SUPPORTED_MESH_EXTENSIONS = ['.glb', '.stl', '.obj', '.fbx'] as const; - -const VALID_IMAGE_FORMATS = [ - 'image/jpeg', - 'image/jpg', - 'image/png', - 'image/webp', -]; - -const getMeshFileType = (filename: string): MeshFileType => { - const lowerFilename = filename.toLowerCase(); - if (lowerFilename.endsWith('.stl')) return 'stl'; - if (lowerFilename.endsWith('.obj')) return 'obj'; - if (lowerFilename.endsWith('.fbx')) return 'fbx'; - return 'glb'; -}; - -const isSupportedMeshFile = ( - filename: string, - type: 'creative' | 'parametric', -): boolean => { - const lowerFilename = filename.toLowerCase(); - if (type === 'creative') { - return SUPPORTED_MESH_EXTENSIONS.some((ext) => lowerFilename.endsWith(ext)); - } - // Parametric mode only supports STL (for OpenSCAD import) - return lowerFilename.endsWith('.stl'); -}; - -function TextAreaChat({ - onSubmit, - onFocus, - isLoading = false, - placeholder = 'What can Adam help you build today?', - type, - stopGenerating, - disabled = false, - model, - setModel, - showPromptGenerator = false, - showFullLabels = false, - onTypeChange, - conversation, -}: TextAreaChatProps) { - const [isFocused, setIsFocused] = useState(false); - const textareaRef = useRef(null); - const [input, setInput] = useState(''); - const [isDragging, setIsDragging] = useState(false); - const [isDragHover, setIsDragHover] = useState(false); - const [isGeneratingPrompt, setIsGeneratingPrompt] = useState(false); - const [dropMessageOpacityClass, setDropMessageOpacityClass] = useState( - 'opacity-0 pointer-events-none', - ); - const [dropMessageTransitionClass, setDropMessageTransitionClass] = - useState(''); - const prevIsDraggingRef = useRef(isDragging); - const { toast } = useToast(); - const { session } = useAuth(); - const { images, mesh, setImages, setMesh } = useItemSelection(); - const meshFiles = useMeshFiles(); - const creativeModel = - type === 'creative' && isCreativeModel(model) ? model : null; - const showPolygonControls = creativeModel - ? shouldShowPolygonControls(creativeModel) - : false; - - // Parametric mode: bounding box and filename from STL parsing - const [meshBoundingBox, setMeshBoundingBox] = useState( - null, - ); - const [meshFilename, setMeshFilename] = useState(null); - - // Quads vs Polys toggle state (only for ultra model) - const [meshTopology, setMeshTopology] = useState<'quads' | 'polys'>(() => { - // Default to 'polys' (quads disabled by default) - // Only use localStorage if it's explicitly set to 'quads' - if (typeof window !== 'undefined') { - const stored = localStorage.getItem('adam-mesh-topology'); - // Only return 'quads' if explicitly stored, otherwise default to 'polys' - return stored === 'quads' ? 'quads' : 'polys'; - } - return 'polys'; - }); - - // Polygon count state - single source of truth for user overrides - const [polygonOverrides, setPolygonOverrides] = useState< - Record - >(() => { - if (typeof window !== 'undefined') { - try { - const stored = localStorage.getItem('adam-polygon-overrides'); - if (stored) { - const parsed = JSON.parse(stored); - // Validate that it's an object with number values - if (typeof parsed === 'object' && parsed !== null) { - const isValid = Object.entries(parsed).every( - ([key, value]) => - typeof key === 'string' && typeof value === 'number', - ); - return isValid ? parsed : {}; - } - } - } catch (error) { - console.warn( - 'Failed to parse polygon overrides from localStorage, resetting:', - error, - ); - localStorage.removeItem('adam-polygon-overrides'); - } - } - return {}; - }); - - // Set polygon count for current model+topology combination - const setPolygonCountForCurrentModel = useCallback( - (count: number) => { - if (!creativeModel) return; - const modelTopologyKey = `${creativeModel}-${meshTopology}`; - const defaultCount = getModelDefaultPolygonCount( - creativeModel, - meshTopology, - ); - - // If setting to default, remove the override instead of storing it - if (count === defaultCount) { - setPolygonOverrides((prev) => { - const { [modelTopologyKey]: _, ...rest } = prev; - return rest; - }); - } else { - setPolygonOverrides((prev) => ({ - ...prev, - [modelTopologyKey]: count, - })); - } - }, - [creativeModel, meshTopology], - ); - - // Persist meshTopology changes to localStorage - const handleMeshTopologyChange = useCallback( - (newTopology: 'quads' | 'polys') => { - setMeshTopology(newTopology); - if (!creativeModel) return; - - // Reset polygon count to the model-specific default for the new topology. - const modelTopologyKey = `${creativeModel}-${newTopology}`; - setPolygonOverrides((prev) => { - const { [modelTopologyKey]: _, ...rest } = prev; - return rest; - }); - }, - [creativeModel], - ); - - // Derived polygon count - no useState needed, calculated from model + topology + overrides - const polygonCount = useMemo(() => { - if (!creativeModel) return 0; - const modelTopologyKey = `${creativeModel}-${meshTopology}`; - const userOverride = polygonOverrides[modelTopologyKey]; - return ( - userOverride ?? getModelDefaultPolygonCount(creativeModel, meshTopology) - ); - }, [creativeModel, meshTopology, polygonOverrides]); - - // Persist polygon overrides to localStorage - useEffect(() => { - if (typeof window !== 'undefined') { - localStorage.setItem( - 'adam-polygon-overrides', - JSON.stringify(polygonOverrides), - ); - } - }, [polygonOverrides]); - - // Persist mesh topology to localStorage - useEffect(() => { - if (typeof window !== 'undefined') { - localStorage.setItem('adam-mesh-topology', meshTopology); - } - }, [meshTopology]); - - // Reset polygon count to default for current model and topology - const resetPolygonCount = useCallback(() => { - if (!creativeModel) return; - const modelTopologyKey = `${creativeModel}-${meshTopology}`; - setPolygonOverrides((prev) => { - const { [modelTopologyKey]: _, ...rest } = prev; - return rest; - }); - }, [creativeModel, meshTopology]); - - // When model changes, clear any polygon overrides to use the new model's defaults - useEffect(() => { - if (!creativeModel) return; - - // Clear all overrides when switching models to ensure we use the new model's defaults - setPolygonOverrides({}); - }, [creativeModel]); - - // Computed polygon values for server submission - const maxPolygonCount = creativeModel - ? getMaxPolygonCount(creativeModel, meshTopology) - : 0; - - // Refs for the two hot-zones - const topDropZoneRef = useRef(null); - const textAreaContainerZoneRef = useRef(null); - - // Animation variants for image/mesh thumbnails - const itemAnimationVariants = { - initial: { opacity: 0, scale: 0.8 }, - animate: { - opacity: 1, - scale: 1, - }, - exit: { - opacity: 0, - scale: 0.8, - }, - }; - - const memoizedModels = useMemo(() => { - if (type === 'creative') { - return CREATIVE_MODELS; - } - return PARAMETRIC_MODELS; - }, [type]); - - // ------------------------------------------------------------ - // Placeholder – Typed-out Animation - // When the target placeholder (based on mode & image state) - // changes, we progressively reveal each character so it looks - // like it's being typed in real-time. This gives users a more - // delightful sense of state change without abrupt flashes. - // ------------------------------------------------------------ - - // Helper to decide which placeholder we're targeting right now - const computeTargetPlaceholder = useCallback(() => { - if (type === 'creative') { - if (images.length > 0) return 'Edit uploaded image...'; - // Model-specific placeholders - if (model === 'quality') return 'Make a rough 3D asset...'; - if (model === 'fast') return 'Make a textureless 3D asset...'; - if (model === 'ultra') return 'Make a production ready 3D asset...'; - return 'Speak anything into existence...'; - } - return placeholder; - }, [type, images.length, placeholder, model]); - - // The text currently shown in the placeholder (animates) - const [placeholderAnim, setPlaceholderAnim] = useState(''); - const [placeholderOpacity, setPlaceholderOpacity] = useState(1); - const placeholderRef = useRef(''); - - // Shared helper that performs the crossfade animation - const startCrossfade = (target: string) => { - placeholderRef.current = target; - - // Start fade out - setPlaceholderOpacity(0); - - // After fade out, update text and fade in - setTimeout(() => { - setPlaceholderAnim(target); - setPlaceholderOpacity(1); - }, 150); - }; - - // Kick off crossfade effect whenever the target placeholder changes - useEffect(() => { - const target = computeTargetPlaceholder(); - - // If nothing has changed, make sure we're synced and bail. - if (target === placeholderRef.current) { - if (placeholderAnim !== target) { - setPlaceholderAnim(target); - } - return; - } - - startCrossfade(target); - }, [ - type, - images.length, - placeholder, - model, - computeTargetPlaceholder, - placeholderAnim, - ]); - - useEffect(() => { - if (type === 'creative' && images.length > 1) { - if (model !== 'quality') { - setModel('quality'); - } - } - }, [images, setModel, model, type]); - - const handleSubmit = async () => { - const hasNoInput = images.length === 0 && !input?.trim() && !mesh; - const hasUploadingImages = images.some((img) => img.isUploading); - - if (hasNoInput || isLoading || hasUploadingImages) { - return; - } - const text = input.trim(); - const parts: AppUIMessage['parts'] = []; - - if (text) { - parts.push({ type: 'text', text }); - } - - for (const image of images) { - if (!image.url || image.isUploading) continue; - parts.push({ - type: 'file', - mediaType: 'image/png', - // Reference the storage object, NOT the base64 preview. The bytes were - // already uploaded to `images/${user}/${conv}/${id}`; persisting the - // data URL here would balloon `messages.parts` with the whole image. - // Display + model-feeding resolve the bytes from storage by id. - url: imageFilePartUrl(conversation.user_id, conversation.id, image.id), - filename: `${image.id}.png`, - }); - } - - const submittedMesh = mesh - ? { id: mesh.id, fileType: mesh.fileType || ('glb' as MeshFileType) } - : undefined; - - if (creativeModel) { - if (submittedMesh) { - parts.push({ - type: 'data-mesh-context', - data: { - meshId: submittedMesh.id, - fileType: submittedMesh.fileType, - }, - }); - } - if (showPolygonControls) { - parts.push({ - type: 'data-mesh-preferences', - data: { - topology: meshTopology, - polygonCount: Math.min(polygonCount, maxPolygonCount), - }, - }); - } - } else if (type === 'parametric' && mesh) { - parts.push({ - type: 'data-mesh-context', - data: { - meshId: mesh.id, - fileType: 'stl', - filename: meshFilename || 'model.stl', - ...(meshBoundingBox ? { boundingBox: meshBoundingBox } : {}), - }, - }); - } - onSubmit(parts); - setInput(''); - setImages([]); - setMesh(null); - setMeshBoundingBox(null); - setMeshFilename(null); - }; - - const { mutateAsync: uploadImageAsync } = useMutation({ - mutationFn: async ({ file, id }: { file: File; id: string }) => { - const { error } = await supabase.storage - .from('images') - .upload(`${conversation.user_id}/${conversation.id}/${id}`, file); - - if (error) throw error; - - const reader = new FileReader(); - const urlPromise = new Promise((resolve) => { - reader.onload = () => { - resolve(reader.result as string); - }; - }); - reader.readAsDataURL(file); - const url = (await urlPromise) as string; - - return url; - }, - onError: () => { - toast({ - title: 'Error', - description: 'Failed to upload image', - variant: 'destructive', - }); - }, - }); - - const { mutateAsync: uploadMeshAsync } = useMutation({ - mutationFn: async ({ file, id }: { file: File; id: string }) => { - // Determine file extension - const fileExtension = getMeshFileType(file.name); - - const { error } = await supabase.storage - .from('meshes') - .upload( - `${conversation.user_id}/${conversation.id}/${id}.${fileExtension}`, - file, - ); - - if (error) throw error; - - // Check if preview exists in storage - const previewPath = `${conversation.user_id}/${conversation.id}/preview-${id}`; - - const { data } = await supabase.storage - .from('images') - .createSignedUrl(previewPath, 60 * 60); // 1 hour expiry - - if (data && data.signedUrl) { - return data.signedUrl; - } - - // If preview doesn't exist, generate it with the correct file type - const preview = await generatePreview(file, fileExtension); - - // Only upload if the current user is the conversation owner - if (session?.user.id === conversation.user_id) { - // Convert data URL to Blob - const response = await fetch(preview); - const blob = await response.blob(); - - // Save the preview to storage - const { error: uploadError } = await supabase.storage - .from('images') - .upload(previewPath, blob, { - contentType: 'image/png', - upsert: true, - }); - - if (uploadError) { - console.error('Error uploading preview:', uploadError); - return preview; // Return the preview anyway even if upload fails - } - - // Get the signed URL of the uploaded preview - const { data } = await supabase.storage - .from('images') - .createSignedUrl(previewPath, 60 * 60); // 1 hour expiry - return data?.signedUrl; - } - - // If not the owner, just return the generated preview - return preview; - }, - onError: () => { - toast({ - title: 'Error', - description: 'Failed to upload mesh', - variant: 'destructive', - }); - }, - }); - - const addItems = async (files: FileList) => { - const newItems = Array.from(files); - let hasSmallImages = false; - let hasLargeImages = false; - let hasInvalidImages = false; - let hasInvalidItems = false; - const MAX_FILE_SIZE = 100 * 1024 * 1024; // 100MB limit - - const validImages = await Promise.all( - newItems.map(async (file) => { - // First check file type Must be jpeg, png, gif, or webp. - if (!file.type.includes('image')) { - return null; - } - - if (!VALID_IMAGE_FORMATS.includes(file.type)) { - hasInvalidImages = true; - return null; - } - - // Check file size - if (file.size > MAX_FILE_SIZE) { - hasLargeImages = true; - return null; - } - - // Check dimensions asynchronously - return new Promise((resolve) => { - const img = new Image(); - img.src = URL.createObjectURL(file); - img.onload = () => { - if (img.naturalWidth < 256 || img.naturalHeight < 256) { - hasSmallImages = true; - resolve(null); // Image too small - } else { - resolve(file); // Valid image - } - URL.revokeObjectURL(img.src); - }; - img.onerror = () => { - resolve(null); // Invalid image - URL.revokeObjectURL(img.src); - }; - }); - }), - ); - - const validMeshes = newItems.map((file) => { - if (!isSupportedMeshFile(file.name, type)) { - return null; - } - - return file; - }); - - // Filter out null values (invalid images) - const filteredImages = validImages.filter( - (img): img is File => img !== null, - ); - - const filteredMeshes = validMeshes.filter( - (mesh): mesh is File => mesh !== null, - ); - - hasInvalidItems = - newItems.length > filteredImages.length + filteredMeshes.length; - - // Show specific errors first, then generic error only if there are truly invalid file types - if (hasSmallImages) { - toast({ - title: 'Image too small', - description: - 'Some images were not added because they are smaller than 256x256 pixels.', - }); - } else if (hasLargeImages) { - toast({ - title: 'Image too large', - description: - 'Some images were not added because they are larger than 100MB.', - }); - } else if (hasInvalidImages) { - toast({ - title: 'Invalid image format', - description: - 'Some images were not added because they are not valid image formats. Must be jpeg, png, or webp.', - }); - } else if (hasInvalidItems) { - toast({ - title: 'Invalid file format', - description: - type === 'creative' - ? 'Some files were not added because they are not valid file formats. Must be jpeg, png, webp, glb, stl, or obj.' - : 'Some files were not added because they are not valid file formats. Must be jpeg, png, webp, or stl.', - }); - } - - filteredMeshes.forEach(async (file) => { - const tempId = crypto.randomUUID(); - const fileType = getMeshFileType(file.name); - setMesh({ id: tempId, isUploading: true, source: 'upload', fileType }); - try { - // For parametric mode STL files, extract bounding box and generate multi-angle renders - if (type === 'parametric' && fileType === 'stl') { - const { geometry, boundingBox } = await parseSTL(file); - setMeshBoundingBox(boundingBox); - setMeshFilename(file.name); - - // Store STL blob in context for WASM filesystem access - meshFiles.setMeshFile(file.name, file); - - // Generate multi-angle renders and upload as images - const renders = await renderMultipleAngles(geometry, boundingBox); - for (const renderBlob of renders) { - const renderId = crypto.randomUUID(); - const renderFile = new File( - [renderBlob], - `render-${renderId}.png`, - { - type: 'image/png', - }, - ); - const url = URL.createObjectURL(renderBlob); - setImages((prevImages) => [ - ...prevImages, - { id: renderId, isUploading: true, source: 'upload', url }, - ]); - try { - const signedUrl = await uploadImageAsync({ - file: renderFile, - id: renderId, - }); - URL.revokeObjectURL(url); - setImages((prevImages) => - prevImages.map((img) => - img.id === renderId - ? { ...img, isUploading: false, url: signedUrl } - : img, - ), - ); - } catch (renderError) { - console.error('Error uploading render:', renderError); - setImages((prevImages) => - prevImages.filter((img) => img.id !== renderId), - ); - } - } - - geometry.dispose(); - } - - const url = await uploadMeshAsync({ file: file, id: tempId }); - setMesh({ - id: tempId, - isUploading: false, - url, - source: 'upload', - fileType, - }); - } catch (error) { - console.error('Error uploading mesh:', error); - setMesh(null); - setMeshBoundingBox(null); - setMeshFilename(null); - } - }); - - // Upload each valid image immediately - filteredImages.forEach(async (file) => { - const tempId = crypto.randomUUID(); - const url = URL.createObjectURL(file); - setImages((prevImages) => [ - ...prevImages, - { id: tempId, isUploading: true, source: 'upload', url }, - ]); - try { - const signedUrl = await uploadImageAsync({ file, id: tempId }); - URL.revokeObjectURL(url); - setImages((prevImages) => - prevImages.map((img) => - img.id === tempId - ? { ...img, isUploading: false, url: signedUrl } - : img, - ), - ); - } catch (error) { - console.error('Error uploading image:', error); - setImages((prevImages) => - prevImages.filter((img) => img.id !== tempId), - ); - } - }); - }; - - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - handleSubmit(); - } - }; - - const handlePaste = (event: React.ClipboardEvent) => { - const files = event.clipboardData.files; - if (files && files.length > 0) { - event.preventDefault(); - addItems(files); - } - }; - - const handleDrop = async (event: React.DragEvent) => { - event.preventDefault(); // Signal that this component handled the drop - const droppedFiles = event.dataTransfer?.files; - - let shouldAddItems = false; - const target = event.target as Node; - - if ( - topDropZoneRef.current?.contains(target) || - textAreaContainerZoneRef.current?.contains(target) - ) { - shouldAddItems = true; - } - - if (shouldAddItems && droppedFiles && droppedFiles.length > 0) { - await addItems(droppedFiles); - } - - // Always reset drag states, regardless of whether files were added - setIsDragging(false); - setIsDragHover(false); - }; - - const handleItemsChange = (selectedItems: FileList | null) => { - if (selectedItems && selectedItems.length > 0) { - addItems(selectedItems); - } - }; - - const handleMeshRemoved = async () => { - if (mesh?.source === 'upload') { - try { - const fileExtension = mesh.fileType || 'glb'; // Default to glb if fileType is not set - await Promise.all([ - supabase.storage - .from('meshes') - .remove([ - `${session?.user?.id}/${conversation.id}/${mesh.id}.${fileExtension}`, - ]), - supabase.storage - .from('images') - .remove([ - `${session?.user?.id}/${conversation.id}/preview-${mesh.id}`, - ]), - ]); - } catch (error) { - console.error('Error removing mesh:', error); - } - } - setMesh(null); - }; - - const handleImageRemoved = async (image: MessageItem) => { - if (!image.isUploading) { - // Only try to remove from storage if the item has been uploaded - if (image.source === 'upload') { - try { - await supabase.storage - .from('images') - .remove([`${session?.user?.id}/${conversation.id}/${image.id}`]); - } catch (error) { - console.error('Error removing image:', error); - } - } - setImages((prevImages) => - prevImages.filter((img) => img.id !== image.id), - ); - } - }; - - const generatePrompt = async () => { - if (isGeneratingPrompt) return; - setIsGeneratingPrompt(true); - try { - const data = await apiJson( - 'prompt-generator', - { - method: 'POST', - body: JSON.stringify({ - existingText: input.trim() || undefined, - type, - }), - }, - promptResponseSchema, - ); - if (!data?.prompt) throw new Error('No prompt generated'); - - setInput(data.prompt); - } catch (error) { - console.error('Error generating prompt:', error); - toast({ - title: 'Error', - description: 'Failed to generate prompt', - variant: 'destructive', - }); - } finally { - setIsGeneratingPrompt(false); - } - }; - - // Add global drag-and-drop listeners so that dropping files anywhere on the page is handled. - useEffect(() => { - // Prevent default browser behaviour (e.g. opening the image in a new tab) - const preventDefaults = (e: DragEvent) => { - e.preventDefault(); - }; - - const handleDragEnter = (e: DragEvent) => { - e.preventDefault(); - setIsDragging(true); - // When a drag operation newly enters the window, assume it's not hovering - // over a specific component's hot-zone yet. Hot-zones will override this. - setIsDragHover(false); - }; - - const handleDragLeave = (e: DragEvent) => { - e.preventDefault(); - // When leaving the window entirely (relatedTarget is null), reset dragging state - if (e.relatedTarget === null) { - setIsDragging(false); - setIsDragHover(false); - } - }; - - const handleDropGlobal = async (e: DragEvent) => { - // If a more specific drop handler (like in TextAreaChat) already handled this event - // and called e.preventDefault(), the global handler should not interfere. - if (e.defaultPrevented) { - return; - } - - // If we're here, the drop occurred outside a component that handled it. - // Prevent the browser's default action (e.g., opening the file). - e.preventDefault(); - - // For a global drop outside handled areas, we don't add items. - // We just clear the overall drag UI state. - setIsDragging(false); - setIsDragHover(false); - // NO call to addItems() here. - }; - - window.addEventListener('dragenter', handleDragEnter); - window.addEventListener('dragover', preventDefaults); - window.addEventListener('dragleave', handleDragLeave); - window.addEventListener('drop', handleDropGlobal); - - return () => { - window.removeEventListener('dragenter', handleDragEnter); - window.removeEventListener('dragover', preventDefaults); - window.removeEventListener('dragleave', handleDragLeave); - window.removeEventListener('drop', handleDropGlobal); - }; - }, []); - - useEffect(() => { - if (images.length === 0 && mesh === null) { - // Case 1: No items are present in the drop zone - if (isDragging) { - // If dragging, the message should be visible and can transition - setDropMessageOpacityClass('opacity-100'); - setDropMessageTransitionClass( - 'transition-opacity duration-200 ease-in-out', - ); - } else { - // Not dragging. Message should be hidden. - if (prevIsDraggingRef.current) { - // If it WAS dragging and now it's not, it should fade out. - setDropMessageTransitionClass( - 'transition-opacity duration-200 ease-in-out', - ); - setDropMessageOpacityClass('opacity-0 pointer-events-none'); - } else { - // If it was NOT dragging and still isn't (e.g., mounting fresh after image removal), - // it should be instantly hidden, no transition. - setDropMessageTransitionClass(''); - setDropMessageOpacityClass('opacity-0 pointer-events-none'); - } - } - } else { - // Case 2: Items ARE present in the drop zone, message should be instantly hidden. - setDropMessageTransitionClass(''); - setDropMessageOpacityClass('opacity-0 pointer-events-none'); - } - prevIsDraggingRef.current = isDragging; - }, [isDragging, images.length, mesh]); // Listen to images.length and mesh too - - return ( -
{ - event.preventDefault(); - setIsDragging(true); - }} - onDragOver={(event) => { - event.preventDefault(); - setIsDragging(true); - }} - onDragLeave={(event) => { - event.preventDefault(); - // If the drag operation leaves the bounds of this entire component, - // then isDragHover should definitely be false. - if (!event.currentTarget.contains(event.relatedTarget as Node)) { - setIsDragHover(false); - } - }} - onClick={() => { - onFocus?.(); - textareaRef.current?.focus(); - }} - > -
0 || mesh !== null - ? 'h-20 border-adam-neutral-700 bg-adam-neutral-950 opacity-100' - : 'h-0 border-transparent bg-transparent opacity-0', - )} - onDragEnter={(event) => { - if (isDragging) { - event.preventDefault(); - setIsDragHover(true); - } - }} - onDragOver={(event) => { - if (isDragging) { - event.preventDefault(); - setIsDragHover(true); - } - }} - onDragLeave={(event) => { - if (isDragging) { - event.preventDefault(); - if (!event.currentTarget.contains(event.relatedTarget as Node)) { - setIsDragHover(false); - } - } - }} - > - {!disabled && ( - <> - {/* Case 1: Dragging, and items are ALREADY present -> Show "Add more images" prompt */} - {isDragging && (images.length > 0 || mesh !== null) ? ( -
- -

- Add more images here -

-
- ) : /* Case 2: No items (images/mesh are zero) -> Show original "Drop images and 3D models here" logic */ - images.length === 0 && mesh === null ? ( -
- -

- Drop images and 3D models here -

-
- ) : ( - /* Case 3: Items are present, and NOT dragging -> Show thumbnails */ - (images.length > 0 || mesh !== null) && ( -
0 || mesh !== null) - ? 'opacity-60' - : 'opacity-100', - 'transition-opacity duration-150', - )} - > - - {' '} - {/* Ensure no initial={false} here */} - {mesh && ( - - {mesh.url && ( - Mesh - )} - {mesh.isUploading && ( -
- -
- )} - {!mesh.isUploading && ( -
- -
- )} - -
- )} - {images.map((image) => ( - - Image - {image.isUploading && ( -
- -
- )} - -
- ))} -
-
- ) - )} - - )} -
-
{ - if (isDragging) { - event.preventDefault(); - setIsDragHover(true); - } - }} - onDragOver={(event) => { - if (isDragging) { - event.preventDefault(); - setIsDragHover(true); - } - }} - onDragLeave={(event) => { - if (isDragging) { - event.preventDefault(); - if (!event.currentTarget.contains(event.relatedTarget as Node)) { - setIsDragHover(false); - } - } - }} - > -
- -
- Adam Logo -
-
-
-