diff --git a/.geminiignore b/.geminiignore new file mode 100644 index 00000000..067d8bc3 --- /dev/null +++ b/.geminiignore @@ -0,0 +1,85 @@ +# ============================================================================= +# KROW Workforce - .geminiignore +# +# Indicates to Gemini which files/folders to ignore during analysis +# to maintain relevant context and save tokens. +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Standard Ignores (Same as .gitignore) +# ----------------------------------------------------------------------------- +node_modules/ +dist/ +build/ +coverage/ +.git/ +.idea/ +.vscode/ +.DS_Store +secrets/ +.env* + +# ----------------------------------------------------------------------------- +# Package Manager Locks (Too large / No semantic value) +# ----------------------------------------------------------------------------- +package-lock.json +yarn.lock +pnpm-lock.yaml +pubspec.lock + +# ----------------------------------------------------------------------------- +# Build Artifacts & Caches +# ----------------------------------------------------------------------------- +.firebase/ +.vite/ +.dart_tool/ +.pub-cache/ +.gradle/ +__pycache__/ +*.tsbuildinfo +*.cache +*.log + +# ----------------------------------------------------------------------------- +# Large Binary / Media Files +# ----------------------------------------------------------------------------- +*.png +*.jpg +*.jpeg +*.gif +*.ico +*.svg +*.mp4 +*.mov +*.pdf +*.zip +*.tar.gz +*.apk +*.aab +*.ipa + +# ----------------------------------------------------------------------------- +# Generated Code (Reduce noise unless specifically debugging) +# ----------------------------------------------------------------------------- +# Data Connect generated SDKs are useful for reference, but can be verbose. +# Uncomment if you want Gemini to ignore them completely. +# **/dataconnect-generated/ + +# ----------------------------------------------------------------------------- +# Documentation to KEEP (Force Include) +# ----------------------------------------------------------------------------- +# Ensure these are never ignored even if a broad rule matches +!README.md +!CONTRIBUTING.md +!docs/*.md +!docs/**/*.md + +# ----------------------------------------------------------------------------- +# Specific Directories +# ----------------------------------------------------------------------------- +# Prototypes: We WANT Gemini to see these for context if they are synced locally, +# even if they are ignored by Git. So we do NOT ignore them here. + +# Temporary migration folders +_legacy/ +krow-workforce-export-latest/ diff --git a/.github/ISSUE_TEMPLATE/base44_backend_validation.md b/.github/ISSUE_TEMPLATE/base44_backend_validation.md deleted file mode 100644 index ce208582..00000000 --- a/.github/ISSUE_TEMPLATE/base44_backend_validation.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: 'API Validation and Backend Update from Base44' -about: 'Use this template to analyze Base44 API changes and update our backend.' -title: '[Base44] API Changes Validation and Backend Update' -labels: 'enhancement, platform:backend, sred-eligible' ---- - -### 🎯 Objective -Analyze API and event changes from the latest Base44 export, validate their impact on our system, and update our backend (Data Connect, Cloud Functions) to ensure compatibility and integrate new functionalities. - ---- - -### 🔬 SR&ED Justification -* **Technological Uncertainty:** What is the impact of Base44 API schema changes (deprecated fields, new types, modified logic) on our Data Connect GraphQL schemas and Cloud Functions logic? Is there a risk of data corruption or contract breakage with client applications? -* **Systematic Investigation:** We will perform a differential analysis ("diff") of the API schemas, update our GraphQL schema accordingly, adapt business logic in connectors and functions, and then deploy to a test environment to validate end-to-end integration. - ---- - -### 💻 Technical Implementation Notes -Refer to the [API Documentation Maintenance Guide](docs/06-maintenance-guide.md) for detailed steps on how to update the backend from a Base44 export. - ---- - -### ✅ Acceptance Criteria -- [ ] The impact analysis of API changes is documented. -- [ ] Data Connect schemas and connectors are updated. -- [ ] Affected Cloud Functions are updated. -- [ ] Changes are deployed and validated in the `dev` environment. -- [ ] **Given** an operation (query or mutation) affected by the changes is executed, **when** the API is called, **then** it should return a correct and consistent response with the new schema, without errors. diff --git a/.github/ISSUE_TEMPLATE/base44_frontend_update.md b/.github/ISSUE_TEMPLATE/base44_frontend_update.md deleted file mode 100644 index 4bfaad91..00000000 --- a/.github/ISSUE_TEMPLATE/base44_frontend_update.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: 'Frontend Update from Base44' -about: 'Use this template to integrate the latest frontend changes from a Base44 export.' -title: '[Base44] Frontend Update from Export' -labels: 'enhancement, platform:web, sred-eligible' ---- - -### 🎯 Objective -Integrate the latest UI changes (components, queries, mutations) generated from the most recent Base44 export to keep our application up-to-date with the platform schema. - ---- - -### 🔬 SR&ED Justification -* **Technological Uncertainty:** How will the newly generated queries and mutations integrate with our existing state management and caching logic (e.g., TanStack Query) without introducing regressions or performance issues? -* **Systematic Investigation:** We will implement the new generated hooks, refactor affected components, and perform performance and non-regression tests to validate that the integration is robust and performant. - ---- - -### 💻 Technical Implementation Notes -Refer to the [API Documentation Maintenance Guide](docs/06-maintenance-guide.md) for detailed steps on how to update the frontend from a Base44 export. - ---- - -### ✅ Acceptance Criteria -- [ ] The Data Connect generated code is updated to the latest version. -- [ ] All components and pages affected by the changes are updated and function as expected. -- [ ] The code is linted and formatted correctly. -- [ ] The functionality is manually tested and works in the `dev` environment. -- [ ] **Given** I navigate to a page affected by the update, **when** data is loaded, **then** I should see the new data structured correctly with no console errors. diff --git a/.github/ISSUE_TEMPLATE/sred_task.md b/.github/ISSUE_TEMPLATE/sred_task.md deleted file mode 100644 index 05c5c782..00000000 --- a/.github/ISSUE_TEMPLATE/sred_task.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: SR&ED Task -about: Use this template for a new development task that may be eligible for SR&ED. -title: '[Category] Short description of the task' -labels: 'sred-eligible' ---- - -### 🎯 Objective -*(A concise, one-sentence summary of what this issue aims to accomplish. Ex: "Connect the Events page to the development backend.")* - ---- - -### 🔬 SR&ED Justification -* **Technological Uncertainty:** What is the technical challenge or unknown we are trying to solve? *(Ex: "Can the Data Connect generated SDK be performantly integrated with TanStack Query in our existing React architecture?")* -* **Systematic Investigation:** What is our planned approach to resolve this uncertainty? *(Ex: "We will build a PoC on the Events page, measure load times, and document the optimal integration pattern.")* - ---- - -### 💻 Technical Implementation Notes -* **Key Files to Modify:** `file1.js`, `file2.gql`, etc. -* **Suggested Approach:** A brief description of the technical steps. *(Ex: "1. Define `listEvents` query in GraphQL. 2. Generate the SDK. 3. Create a `useEvents` hook that uses `useQuery`...")* -* **Considerations:** Potential pitfalls or points to watch out for. *(Ex: "Ensure loading and error states are handled correctly.")* - ---- - -### ✅ Acceptance Criteria -*A checklist of what must be true for the task to be considered "done."* -- [ ] The code is implemented following the technical notes. -- [ ] All new code is linted and formatted. -- [ ] The functionality is tested and works as expected in the `dev` environment. -- [ ] *(Example for a UI task)* **Given** I am on the Events page, **when** the page loads, **then** I should see a list of events coming from the `dev` backend. diff --git a/.gitignore b/.gitignore index 8c05e022..c23832af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,85 +1,170 @@ -# General -# ---------------------------------------------------------------- -# macOS generated files +# ============================================================================== +# GLOBAL & OS +# ============================================================================== .DS_Store +.DS_Store? +._* .AppleDouble .LSOverride +.Spotlight-V100 +.Trashes +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db +desktop.ini +$RECYCLE.BIN/ +.Trash-* -# IDE configuration files +# IDE & Editors .idea/ +.vscode/ *.iml *.iws +*.swp +*.swo +*~ +\#*\# +.\#* -# Log and cache files +# Logs & Cache *.log *.cache -*.pyc -__pycache__/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +*.pid +*.seed +*.pid.lock -# Secrets (never commit these) -# The secrets/ directory is handled by its own .gitignore, but this is an extra layer of safety. +# Temporary Files +*.tmp +*.temp +tmp/ +temp/ + +# ============================================================================== +# SECURITY (CRITICAL) +# ============================================================================== +# Secrets directory (contains API keys, service accounts) secrets/ -*.env -.env.* +# Environment files +.env +.env.local +.env.*.local +.env.development +.env.production +.env.test !.env.example -# OS-specific files -Thumbs.db -ehthumbs.db +# Certificates & Keys +*.pem +*.key +*.jks +*.keystore +*.p12 +*.cer +# GCP Service Account Keys +gcp_keys/ +**/*.service-account.json +**/sa.json -# Frontend Web (Vite / React) -# ---------------------------------------------------------------- -frontend-web/node_modules/ -frontend-web/dist/ -frontend-web/.env.local -frontend-web/coverage/ -frontend-web/.vite/ -/frontend-web/src/dataconnect-generated/ -/internal-api-harness/src/dataconnect-generated/ -frontend-web-free/src/dataconnect-generated/ +# NPM Auth +.npmrc +**/.npmrc +!**/.npmrc.template +# ============================================================================== +# NODE.JS / WEB (React, Vite, Functions) +# ============================================================================== +node_modules/ +dist/ +dist-ssr/ +coverage/ +.nyc_output/ +.vite/ +.temp/ +*.local +.eslintcache +.stylelintcache +.npm +.turbo +.vercel + +# Vite timestamps +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + +# Generated Data Connect SDKs in web projects +# Generally ignored as they are regenerated on build +**/dataconnect-generated/ + +# ============================================================================== +# FLUTTER / MOBILE +# ============================================================================== +# Flutter/Dart +.dart_tool/ +.pub-cache/ +.flutter-plugins +.flutter-plugins-dependencies -# Mobile (Flutter) -# ---------------------------------------------------------------- # Android .gradle/ +**/android/app/libs/ +**/android/key.properties +**/android/local.properties -mobile-apps/*/.dart_tool/ -mobile-apps/*/.pub-cache/ -mobile-apps/*/build/ -mobile-apps/*/.flutter-plugins -mobile-apps/*/.flutter-plugins-dependencies +# Build outputs +build/ +# iOS +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/flutter_export_environment.sh +**/ios/Podfile.lock +**/ios/Pods/ +**/ios/.symlinks/ -# Firebase / Backend -# ---------------------------------------------------------------- -# Python virtual environments -firebase/functions/venv/ -firebase/dataconnect/venv/ +# ============================================================================== +# FIREBASE & BACKEND +# ============================================================================== +# Firebase Cache & Emulators +.firebase/ +dataconnect/.dataconnect/ +backend/dataconnect/.dataconnect/ -# Firebase emulator logs -*.log -firebase-debug.log -firebase-debug.*.log -firestore-debug.log -ui-debug.log +# Debug Logs (Recursive) +**/firebase-debug.log +**/firebase-debug.*.log +**/firestore-debug.log +**/ui-debug.log +**/database-debug.log +**/pubsub-debug.log -# Generated SDKs (can be regenerated, so often ignored) -# Decide with your team if you want to commit these or not. -# For now, we will commit them to simplify setup for new developers. -# @dataconnect/ +# Python Virtual Envs (if used) +venv/ +env/ +ENV/ +__pycache__/ +*.py[cod] +*$py.class +*.so +# ============================================================================== +# PROJECT SPECIFIC +# ============================================================================== +# Secure hashes are committed, but the raw user list is usually kept for reference +# unless it contains sensitive info. Here we explicitly ignore the raw file. +internal/launchpad/iap-users.txt -# Temporary files from this project -# ---------------------------------------------------------------- -# The Base44 export directory should not be committed -/krow-workforce-export-latest/ +# Generated Prototypes (must be synced locally via 'make sync-prototypes') +internal/launchpad/prototypes/web/* +!internal/launchpad/prototypes/web/.keep +internal/launchpad/prototypes/mobile/**/* +!internal/launchpad/prototypes/mobile/**/.keep -# The legacy Laravel project should not be committed -/legacy-web/ - -# The temporary mobile app folders should not be committed -/flutter-mobile-client-app/ -/flutter-mobile-staff-app/ -/inspiration/ +# Temporary migration artifacts +_legacy/ +krow-workforce-export-latest/ diff --git a/.reference/base44-entity-schemas.md b/.reference/base44-entity-schemas.md deleted file mode 100644 index 33b62789..00000000 --- a/.reference/base44-entity-schemas.md +++ /dev/null @@ -1,80 +0,0 @@ -# Base44 Entity Schemas Reference - -This document serves as a developer reference for the original data schemas from the Base44 backend. It is used to ensure feature parity and data integrity during the migration to the new GCP/Firebase backend. - ---- - -## User Schema - -``` -role (text, required) -- The role of the user in the app -- Options: admin, user - -email (text, required) -- The email of the user - -full_name (text, required) -- Full name of the user - -user_role (text) -- User's role in the system -- Options: admin, procurement, operator, sector, client, vendor, workforce - -company_name (text) -- Company or organization name - -profile_picture (text) -- URL to profile picture - -phone (text) -- Phone number - -address (text) -- Address - -preferred_vendor_id (text) -- ID of the client's preferred/default vendor - -preferred_vendor_name (text) -- Name of the client's preferred vendor - -backup_vendor_ids (array) -- List of backup vendor IDs - -dashboard_layout (object) -- User's customized dashboard layout preferences (legacy, kept for backward compatibility) -- widgets (array): Ordered list of visible widgets -- hidden_widgets (array): List of hidden widgets -- layout_version (text): Layout version for migration - -dashboard_layout_client (object) -- Client dashboard layout -- widgets (array) -- hidden_widgets (array) -- layout_version (text) - -dashboard_layout_vendor (object) -- Vendor dashboard layout -- widgets (array) -- hidden_widgets (array) -- layout_version (text) - -dashboard_layout_operator (object) -- Operator dashboard layout -- widgets (array) -- hidden_widgets (array) -- layout_version (text) - -dashboard_layout_workforce (object) -- Workforce dashboard layout -- widgets (array) -- hidden_widgets (array) -- layout_version (text) - -preferences (object) -- User preferences and settings -- theme (text): Default: "light", Options: light, dark -- notifications_enabled (boolean): Default: true -- email_notifications (boolean): Default: true -``` diff --git a/Makefile b/Makefile index 9b4e59e3..b8591669 100644 --- a/Makefile +++ b/Makefile @@ -1,60 +1,21 @@ # KROW Workforce Project Makefile # ------------------------------- -# This Makefile provides a central place for common project commands. -# It is designed to be the main entry point for developers. +# This is the main entry point. It includes modular Makefiles from the 'makefiles/' directory. -# Use .PHONY to declare targets that are not files, to avoid conflicts. -.PHONY: help install dev build integrate-export prepare-export deploy-launchpad deploy-launchpad-full deploy-app admin-install admin-dev admin-build deploy-admin deploy-admin-full configure-iap-launchpad configure-iap-admin list-iap-users remove-iap-user setup-labels export-issues create-issues-from-file install-git-hooks mobile-client-install mobile-client-dev mobile-client-build mobile-staff-install mobile-staff-dev mobile-staff-build dataconnect-enable-apis dataconnect-init dataconnect-deploy dataconnect-sql-migrate dataconnect-generate-sdk dataconnect-sync dataconnect-bootstrap-db - -# The default command to run if no target is specified (e.g., just 'make'). +# The default command to run if no target is specified. .DEFAULT_GOAL := help -# --- Flutter check --- -FLUTTER := $(shell which flutter) -ifeq ($(FLUTTER),) -#$(error "flutter not found in PATH. Please install Flutter and add it to your PATH.") -endif +# --- Include Modules --- +include makefiles/common.mk +include makefiles/web.mk +include makefiles/launchpad.mk +include makefiles/mobile.mk +include makefiles/dataconnect.mk +include makefiles/tools.mk -# --- Firebase & GCP Configuration --- -GCP_DEV_PROJECT_ID := krow-workforce-dev -GCP_STAGING_PROJECT_ID := krow-workforce-staging -IAP_SERVICE_ACCOUNT := service-933560802882@gcp-sa-iap.iam.gserviceaccount.com +# --- Main Help Command --- +.PHONY: help -# --- Cloud Run Configuration --- -CR_ADMIN_SERVICE_NAME := admin-console -CR_ADMIN_REGION := us-central1 -CR_ADMIN_IMAGE_URI = us-docker.pkg.dev/$(GCP_PROJECT_ID)/gcr-io/$(CR_ADMIN_SERVICE_NAME) - -# --- Environment Detection --- -ENV ?= dev -SERVICE ?= launchpad # Default service for IAP commands: 'launchpad' or 'admin' - -# --- Conditional Variables by Environment --- -ifeq ($(ENV),staging) - GCP_PROJECT_ID := $(GCP_STAGING_PROJECT_ID) - FIREBASE_ALIAS := staging - HOSTING_TARGET := app-staging - SQL_TIER := db-n1-standard-1 -else - GCP_PROJECT_ID := $(GCP_DEV_PROJECT_ID) - FIREBASE_ALIAS := dev - HOSTING_TARGET := app-dev - SQL_TIER := db-g1-small -endif - -# --- Conditional Variables by Service for IAP commands --- -ifeq ($(SERVICE),admin) - IAP_SERVICE_NAME := $(CR_ADMIN_SERVICE_NAME) - IAP_SERVICE_REGION := $(CR_ADMIN_REGION) - IAP_PROJECT_ID := $(GCP_PROJECT_ID) # Admin console is env-specific -else - IAP_SERVICE_NAME := $(CR_LAUNCHPAD_SERVICE_NAME) - IAP_SERVICE_REGION := $(CR_LAUNCHPAD_REGION) - IAP_PROJECT_ID := $(GCP_DEV_PROJECT_ID) # Launchpad is dev-only -endif - - -# Shows this help message. help: @echo "--------------------------------------------------" @echo " KROW Workforce - Available Makefile Commands" @@ -69,479 +30,26 @@ help: @echo " --- MOBILE APP DEVELOPMENT ---" @echo " make mobile-client-install - Install dependencies for client app" @echo " make mobile-client-dev - Run client app in dev mode" - @echo " make mobile-client-build - Build client app (requires ENV & PLATFORM, optional BUILD_TYPE=apk)" - @echo "" + @echo " make mobile-client-build - Build client app (requires ENV & PLATFORM)" @echo " make mobile-staff-install - Install dependencies for staff app" @echo " make mobile-staff-dev - Run staff app in dev mode" - @echo " make mobile-staff-build - Build staff app (requires ENV & PLATFORM, optional BUILD_TYPE=apk)" + @echo " make mobile-staff-build - Build staff app (requires ENV & PLATFORM)" @echo "" @echo " --- DEPLOYMENT ---" - @echo " make deploy-launchpad-hosting - Deploys internal launchpad to Firebase Hosting (Auth via Firebase)." - @echo " make deploy-admin-full [ENV=staging] - Deploys Admin Console to Cloud Run with IAP (default: dev)." - @echo " make deploy-app [ENV=staging] - Builds and deploys the main web app via Firebase Hosting (default: dev)." + @echo " make deploy-launchpad-hosting - Deploys internal launchpad to Firebase Hosting." + @echo " make deploy-app [ENV=staging] - Builds and deploys the main web app (default: dev)." @echo "" - @echo " --- CLOUD IAP MANAGEMENT ---" - @echo " make list-iap-users [SERVICE=admin] - Lists IAP users for a service (default: launchpad)." - @echo " make remove-iap-user USER=... [SERVICE=admin] - Removes an IAP user from a service." - @echo "" - @echo " --- PROJECT MANAGEMENT & TOOLS ---" - @echo " make setup-labels - Creates/updates GitHub labels from labels.yml." - @echo " make export-issues [ARGS=\"--state=all --label=bug\"] - Exports GitHub issues to a markdown file. See scripts/export_issues.sh for options." - @echo " make create-issues-from-file - Bulk creates GitHub issues from a markdown file." + @echo " --- DEVELOPMENT TOOLS ---" @echo " make install-git-hooks - Installs git pre-push hook to protect main/dev branches." + @echo " make sync-prototypes - Builds and copies prototypes from adjacent 'client-krow-poc' repo." @echo "" @echo " --- DATA CONNECT MANAGEMENT ---" - @echo " make dataconnect-enable-apis - Enables required GCP APIs for Data Connect." - @echo " make dataconnect-init - Initializes Firebase Data Connect (interactive wizard)." - @echo " make dataconnect-deploy - Deploys Data Connect schemas (GraphQL -> Cloud SQL)." - @echo " make dataconnect-sql-migrate - Applies Data Connect SQL migrations to Cloud SQL." - @echo " make dataconnect-generate-sdk - Regenerates the Data Connect SDK (frontend-web + internal-api-harness)." - @echo " make dataconnect-sync - Runs sql:migrate + deploy + sdk:generate in order." - @echo " make dataconnect-bootstrap-db - ONE-TIME: creates krow-sql, krow_db, links Data Connect, deploys, and generates initial SDK." - @echo " make check-gcloud-beta - Validates gcloud + gcloud beta group availability." - @echo "" - @echo " --- BASE44 EXPORT WORKFLOW ---" - @echo " make integrate-export - Integrates a new Base44 export from '../krow-workforce-export-latest'." - @echo " make prepare-export - Prepares a fresh Base44 export for local use." + @echo " make dataconnect-init - Initializes Firebase Data Connect." + @echo " make dataconnect-deploy - Deploys Data Connect schemas." + @echo " make dataconnect-sql-migrate - Applies SQL migrations." + @echo " make dataconnect-generate-sdk - Regenerates the Data Connect SDK." + @echo " make dataconnect-sync - Runs migrate + deploy + generate-sdk." + @echo " make dataconnect-bootstrap-db - ONE-TIME: Full Cloud SQL + Data Connect setup." @echo "" @echo " make help - Shows this help message." - @echo "--------------------------------------------------" - -# --- Core Development --- -install: - @echo "--> Installing web frontend dependencies..." - @cd frontend-web && npm install - -dev: - @echo "--> Ensuring web frontend dependencies are installed..." - @cd frontend-web && npm install - @echo "--> Starting web frontend development server on http://localhost:5173 ..." - @cd frontend-web && npm run dev - -build: - @echo "--> Building web frontend for production..." - @cd frontend-web && VITE_APP_ENV=$(ENV) npm run build - -launchpad-dev: - @echo "--> Starting local Launchpad server using Firebase Hosting emulator..." - @echo " - Generating secure email hashes..." - @node scripts/generate-allowed-hashes.js - @firebase serve --only hosting:launchpad --project=$(FIREBASE_ALIAS) - -# --- Deployment --- -deploy-launchpad-hosting: - @echo "--> Deploying Internal Launchpad to Firebase Hosting..." - @echo " - Generating secure email hashes..." - @node scripts/generate-allowed-hashes.js - @echo " - Target: hosting:launchpad" - @echo " - Project: $(FIREBASE_ALIAS)" - @firebase deploy --only hosting:launchpad --project=$(FIREBASE_ALIAS) - @echo "--> ✅ Deployment to Firebase Hosting successful." - -deploy-app: build - @echo "--> Deploying Frontend Web App to [$(ENV)] environment..." - @firebase deploy --only hosting:$(HOSTING_TARGET) --project=$(FIREBASE_ALIAS) - -# --- Admin Console --- -admin-install: - @echo "--> Installing admin console dependencies..." - @cd admin-web && npm install - -admin-dev: - @echo "--> Starting admin console development server on http://localhost:5174 ..." - @cd admin-web && npm run dev -- --port 5174 - -admin-build: - @echo "--> Building admin console for production..." - @node scripts/patch-admin-layout-for-env-label.js - @cd admin-web && VITE_APP_ENV=$(ENV) npm run build - -# --- API Test Harness --- -harness-install: - @echo "--> Installing API Test Harness dependencies..." - @cd internal-api-harness && npm install - -harness-dev: dataconnect-sync - @echo "--> Starting API Test Harness development server on http://localhost:5175 ..." - @cd internal-api-harness && npm run dev -- --port 5175 - -harness-build: - @echo "--> Building API Test Harness for production..." - @cd internal-api-harness && npm run build -- --mode $(ENV) - -harness-deploy: harness-build - @echo "--> Deploying API Test Harness to [$(ENV)] environment..." - @firebase deploy --only hosting:api-harness-$(ENV) --project=$(FIREBASE_ALIAS) - -deploy-admin: admin-build - @echo "--> Building and deploying Admin Console to Cloud Run [$(ENV)]..." - @echo " - Step 1: Building container image..." - @cd admin-web && gcloud builds submit \ - --tag $(CR_ADMIN_IMAGE_URI) \ - --project=$(GCP_PROJECT_ID) - @echo " - Step 2: Deploying to Cloud Run..." - @gcloud run deploy $(CR_ADMIN_SERVICE_NAME) \ - --image $(CR_ADMIN_IMAGE_URI) \ - --platform managed \ - --region $(CR_ADMIN_REGION) \ - --no-allow-unauthenticated \ - --project=$(GCP_PROJECT_ID) - @echo " - Step 3: Enabling IAP on the service..." - @gcloud beta run services update $(CR_ADMIN_SERVICE_NAME) \ - --region=$(CR_ADMIN_REGION) \ - --project=$(GCP_PROJECT_ID) \ - --iap - @echo "--> ✅ Admin Console deployment to Cloud Run successful." - -deploy-admin-full: deploy-admin configure-iap-admin - @echo "✅ Admin Console deployed and IAP configured successfully!" - - -# --- Frontend Web Free --- -free-dev: dataconnect-sync - @echo "--> Starting free web development server on http://localhost:5174 ..." - @cd frontend-web-free && npm run dev -- --port 5174 - -# --- Cloud IAP Configuration --- -configure-iap-admin: - @echo "--> Configuring IAP for Cloud Run service [$(CR_ADMIN_SERVICE_NAME)] in [$(ENV)]..." - @echo " - Granting Cloud Run Invoker role to IAP Service Account..." - @gcloud run services add-iam-policy-binding $(CR_ADMIN_SERVICE_NAME) \ - --region=$(CR_ADMIN_REGION) \ - --project=$(GCP_PROJECT_ID) \ - --member=\"serviceAccount:$(IAP_SERVICE_ACCOUNT)\" \ - --role='roles/run.invoker' \ - --quiet - @echo " - Adding users from iap-users.txt..." - @cd admin-web && \ - grep -v '^#' iap-users.txt | grep -v '^$$' | while read -r member; do \ - echo " Adding $$member as IAP-secured Web App User..."; \ - gcloud beta iap web add-iam-policy-binding \ - --project=$(GCP_PROJECT_ID) \ - --resource-type=cloud-run \ - --service=$(CR_ADMIN_SERVICE_NAME) \ - --region=$(CR_ADMIN_REGION) \ - --member=\"$$member\" \ - --role='roles/iap.httpsResourceAccessor' \ - --quiet; \ - done - @echo "✅ IAP configuration for Admin Console complete." - -list-iap-users: - @echo "--> Current IAP users for Cloud Run service [$(IAP_SERVICE_NAME)]:" - @gcloud beta iap web get-iam-policy \ - --project=$(IAP_PROJECT_ID) \ - --resource-type=cloud-run \ - --service=$(IAP_SERVICE_NAME) \ - --region=$(IAP_SERVICE_REGION) - -remove-iap-user: - @if [ -z "$(USER)" ]; then \ - echo "⌠Error: Please specify USER=user:email@example.com"; \ - exit 1; \ - fi - @echo "--> Removing IAP access for $(USER) from Cloud Run service [$(IAP_SERVICE_NAME)]..." - @gcloud beta iap web remove-iam-policy-binding \ - --project=$(IAP_PROJECT_ID) \ - --resource-type=cloud-run \ - --service=$(IAP_SERVICE_NAME) \ - --region=$(IAP_SERVICE_REGION) \ - --member=\"$(USER)\" \ - --role='roles/iap.httpsResourceAccessor' \ - --quiet - @echo "✅ User removed from IAP." - -# --- Project Management --- -setup-labels: - @echo "--> Setting up GitHub labels..." - @./scripts/setup-github-labels.sh - -export-issues: - @echo "--> Exporting GitHub issues to documentation..." - @./scripts/export_issues.sh $(ARGS) - -create-issues-from-file: - @echo "--> Creating GitHub issues from file..." - @./scripts/create_issues.py $(ARGS) - -# --- Development Tools --- -install-git-hooks: - @echo "--> Installing Git hooks..." - @ln -sf ../../scripts/git-hooks/pre-push .git/hooks/pre-push - @echo "✅ pre-push hook installed successfully. Direct pushes to 'main' and 'dev' are now blocked." - -# --- Base44 Export Workflow --- -integrate-export: - @echo "--> Integrating new Base44 export into frontend-web/..." - @if [ ! -d "../krow-workforce-export-latest" ]; then \ - echo "⌠Error: Export directory '../krow-workforce-export-latest' not found."; \ - exit 1; \ - fi - - @echo " - Creating frontend-web/.local-preserve to preserve local directories (src/dataconnect-generated, src/lib)..." - @mkdir -p frontend-web/.local-preserve - @if [ -d "frontend-web/src/dataconnect-generated" ]; then \ - mv frontend-web/src/dataconnect-generated frontend-web/.local-preserve/dataconnect-generated; \ - fi - @if [ -d "frontend-web/src/lib" ]; then \ - mv frontend-web/src/lib frontend-web/.local-preserve/lib; \ - fi - - @if [ -d "frontend-web/src/api" ]; then \ - mv frontend-web/src/api frontend-web/.local-preserve/api; \ - fi - @if [ -f "frontend-web/src/firebase.js" ]; then \ - mv frontend-web/src/firebase.js frontend-web/.local-preserve/firebase.js; \ - fi - @if [ -d "frontend-web/src/components/auth" ]; then \ - mv frontend-web/src/components/auth frontend-web/.local-preserve/components-auth; \ - fi - @if [ -f "frontend-web/src/hooks/useAuth.js" ]; then \ - mv frontend-web/src/hooks/useAuth.js frontend-web/.local-preserve/useAuth.js; \ - fi - @if [ -f "frontend-web/src/pages/Login.jsx" ]; then \ - mv frontend-web/src/pages/Login.jsx frontend-web/.local-preserve/Login.jsx; \ - fi - @if [ -f "frontend-web/src/pages/Register.jsx" ]; then \ - mv frontend-web/src/pages/Register.jsx frontend-web/.local-preserve/Register.jsx; \ - fi - - @echo " - Removing old src directory..." - @rm -rf frontend-web/src - @echo " - Copying new src directory..." - @cp -R ../krow-workforce-export-latest/src ./frontend-web/src - - @echo " - Restoring preserved directories..." - @if [ -d "frontend-web/.local-preserve/dataconnect-generated" ]; then \ - rm -rf frontend-web/src/dataconnect-generated; \ - mv frontend-web/.local-preserve/dataconnect-generated frontend-web/src/dataconnect-generated; \ - fi - @if [ -d "frontend-web/.local-preserve/lib" ]; then \ - rm -rf frontend-web/src/lib; \ - mv frontend-web/.local-preserve/lib frontend-web/src/lib; \ - fi - @if [ -d "frontend-web/.local-preserve/api" ]; then \ - rm -rf frontend-web/src/api; \ - mv frontend-web/.local-preserve/api frontend-web/src/api; \ - fi - @if [ -f "frontend-web/.local-preserve/firebase.js" ]; then \ - mv frontend-web/.local-preserve/firebase.js frontend-web/src/firebase.js; \ - fi - @if [ -d "frontend-web/.local-preserve/components-auth" ]; then \ - mkdir -p frontend-web/src/components; \ - rm -rf frontend-web/src/components/auth; \ - mv frontend-web/.local-preserve/components-auth frontend-web/src/components/auth; \ - fi - @if [ -f "frontend-web/.local-preserve/useAuth.js" ]; then \ - mkdir -p frontend-web/src/hooks; \ - rm -f frontend-web/src/hooks/useAuth.js; \ - mv frontend-web/.local-preserve/useAuth.js frontend-web/src/hooks/useAuth.js; \ - fi - @if [ -f "frontend-web/.local-preserve/Login.jsx" ]; then \ - mkdir -p frontend-web/src/pages; \ - rm -f frontend-web/src/pages/Login.jsx; \ - mv frontend-web/.local-preserve/Login.jsx frontend-web/src/pages/Login.jsx; \ - fi - @if [ -f "frontend-web/.local-preserve/Register.jsx" ]; then \ - mkdir -p frontend-web/src/pages; \ - rm -f frontend-web/src/pages/Register.jsx; \ - mv frontend-web/.local-preserve/Register.jsx frontend-web/src/pages/Register.jsx; \ - fi - - @echo " - Deleting frontend-web/.local-preserve..." - @rm -rf frontend-web/.local-preserve - - @echo " - Copying new index.html..." - @cp ../krow-workforce-export-latest/index.html ./frontend-web/index.html - @echo " - Patching base44Client.js for local development..." - @node scripts/patch-base44-client.js - @echo " - Patching queryKey in Layout.jsx for local development..." - @node scripts/patch-layout-query-key.js - @echo " - Patching Dashboard.jsx for environment label..." - @node scripts/patch-dashboard-for-env-label.js - @echo " - Patching index.html for title..." - @node scripts/patch-index-html.js - @echo "--> Integration complete. Next step: 'make prepare-export'." - -prepare-export: - @echo "--> Preparing fresh Base44 export for local development..." - @node scripts/prepare-export.js - @echo "--> Preparation complete. You can now run 'make dev'." - -# --- Data Connect / Backend --- - -# Enable all required APIs for Firebase Data Connect + Cloud SQL -dataconnect-enable-apis: - @echo "--> Enabling Firebase & Data Connect APIs on project [$(GCP_PROJECT_ID)]..." - @gcloud services enable firebase.googleapis.com --project=$(GCP_PROJECT_ID) - @gcloud services enable firebasedataconnect.googleapis.com --project=$(GCP_PROJECT_ID) - @gcloud services enable sqladmin.googleapis.com --project=$(GCP_PROJECT_ID) - @gcloud services enable iam.googleapis.com --project=$(GCP_PROJECT_ID) - @gcloud services enable cloudresourcemanager.googleapis.com --project=$(GCP_PROJECT_ID) - @gcloud services enable secretmanager.googleapis.com --project=$(GCP_PROJECT_ID) - @echo "✅ APIs enabled for project [$(GCP_PROJECT_ID)]." - -# Initialize Firebase Data Connect (interactive wizard). -# This wraps the command so we remember how to run it for dev/staging/prod. -dataconnect-init: - @echo "--> Initializing Firebase Data Connect for alias [$(FIREBASE_ALIAS)] (project: $(GCP_PROJECT_ID))..." - @firebase init dataconnect --project $(FIREBASE_ALIAS) - @echo "✅ Data Connect initialization command executed. Follow the interactive steps in the CLI." - -# Deploy Data Connect schemas (GraphQL → Cloud SQL) -dataconnect-deploy: - @echo "--> Deploying Firebase Data Connect schemas to [$(ENV)] (project: $(FIREBASE_ALIAS))..." - @firebase deploy --only dataconnect --project=$(FIREBASE_ALIAS) - @echo "✅ Data Connect deployment completed for [$(ENV)]." - -# Apply pending SQL migrations for Firebase Data Connect -dataconnect-sql-migrate: - @echo "--> Applying Firebase Data Connect SQL migrations to [$(ENV)] (project: $(FIREBASE_ALIAS))..." - @firebase dataconnect:sql:migrate --project=$(FIREBASE_ALIAS) - @echo "✅ Data Connect SQL migration completed for [$(ENV)]." - -# Generate Data Connect client SDK for frontend-web and internal-api-harness -dataconnect-generate-sdk: - @echo "--> Generating Firebase Data Connect SDK for web frontend and API harness..." - @firebase dataconnect:sdk:generate --project=$(FIREBASE_ALIAS) - @echo "✅ Data Connect SDK generation completed for [$(ENV)]." - -# Unified backend schema update workflow (schema -> deploy -> SDK) -dataconnect-sync: - @echo "--> [1/3] Applying SQL migrations..." - @firebase dataconnect:sql:migrate --project=$(FIREBASE_ALIAS) - @echo "--> [2/3] Deploying Data Connect..." - @firebase deploy --only dataconnect --project=$(FIREBASE_ALIAS) - @echo "--> [3/3] Regenerating SDK..." - @firebase dataconnect:sdk:generate --project=$(FIREBASE_ALIAS) - @echo "✅ Data Connect SQL, deploy, and SDK generation completed for [$(ENV)]." - -# ------------------------------------------------------------------- -# ONE-TIME FULL SETUP FOR CLOUD SQL + DATA CONNECT -# ------------------------------------------------------------------- -# âš ï¸ WARNING: -# This should only be executed when setting up a brand new environment -# (e.g., first-time dev setup or new GCP project). -# ------------------------------------------------------------------- - -# Comprueba que gcloud y el grupo beta están disponibles -check-gcloud-beta: - @command -v gcloud >/dev/null 2>&1 || { \ - echo "⌠gcloud CLI not found. Please install it: https://cloud.google.com/sdk/docs/install"; \ - exit 1; \ - } - @gcloud beta --help >/dev/null 2>&1 || { \ - echo "⌠'gcloud beta' is not available. Run 'gcloud components update' or reinstall the SDK."; \ - exit 1; \ - } - @echo "✅ gcloud CLI and 'gcloud beta' are available." - -dataconnect-bootstrap-db: check-gcloud-beta - @echo "🔠Checking if Cloud SQL instance krow-sql already exists in [$(GCP_PROJECT_ID)]..." - @if gcloud sql instances describe krow-sql --project=$(GCP_PROJECT_ID) >/dev/null 2>&1; then \ - echo "âš ï¸ Cloud SQL instance 'krow-sql' already exists in project $(GCP_PROJECT_ID)."; \ - echo " If you really need to recreate it, delete the instance manually first."; \ - exit 1; \ - fi - - @echo "âš ï¸ Creating Cloud SQL instance krow-sql (tier: $(SQL_TIER)) (ONLY RUN THIS ONCE PER PROJECT)..." - gcloud sql instances create krow-sql \ - --database-version=POSTGRES_15 \ - --tier=$(SQL_TIER) \ - --region=us-central1 \ - --storage-size=10 \ - --storage-auto-increase \ - --availability-type=zonal \ - --backup-start-time=03:00 \ - --project=$(GCP_PROJECT_ID) - - @echo "âš ï¸ Creating Cloud SQL database krow_db..." - gcloud sql databases create krow_db \ - --instance=krow-sql \ - --project=$(GCP_PROJECT_ID) - - @echo "âš ï¸ Creating Firebase Data Connect service identity..." - gcloud beta services identity create \ - --service=firebasedataconnect.googleapis.com \ - --project=$(GCP_PROJECT_ID) - - @echo "âš ï¸ Enabling IAM authentication on Cloud SQL instance krow-sql..." - gcloud sql instances patch krow-sql \ - --project=$(GCP_PROJECT_ID) \ - --database-flags=cloudsql.iam_authentication=on \ - --quiet - - @echo "âš ï¸ Linking Data Connect service (krow-workforce-db) with Cloud SQL..." - firebase dataconnect:sql:setup krow-workforce-db --project=$(FIREBASE_ALIAS) - - @echo "âš ï¸ Deploying initial Data Connect configuration..." - @firebase deploy --only dataconnect --project=$(FIREBASE_ALIAS) - - @echo "âš ï¸ Generating initial Data Connect SDK..." - @firebase dataconnect:sdk:generate --project=$(FIREBASE_ALIAS) - - @echo "🎉 Cloud SQL + Data Connect bootstrap completed successfully!" - -# --- Mobile App Development --- -FLAVOR := -ifeq ($(ENV),dev) - FLAVOR := dev -else ifeq ($(ENV),staging) - FLAVOR := staging -else ifeq ($(ENV),prod) - FLAVOR := production -endif - -BUILD_TYPE ?= appbundle - -mobile-client-install: - @echo "--> Installing Flutter dependencies for client app..." - @cd mobile-apps/client-app && $(FLUTTER) pub get - -mobile-client-dev: - @echo "--> Running client app in dev mode..." - @echo "--> If using VS code, use the debug configurations" - @cd mobile-apps/client-app && $(FLUTTER) run --flavor dev -t lib/main_dev.dart - -mobile-client-build: - @if [ "$(ENV)" != "dev" ] && [ "$(ENV)" != "staging" ] && [ "$(ENV)" != "prod" ]; then \ - echo "ERROR: ENV must be one of dev, staging, or prod."; exit 1; \ - fi - @if [ "$(PLATFORM)" != "android" ] && [ "$(PLATFORM)" != "ios" ]; then \ - echo "ERROR: PLATFORM must be either android or ios."; exit 1; \ - fi - @echo "--> Building client app for $(PLATFORM) with flavor $(FLAVOR)..." - @cd mobile-apps/client-app && \ - $(FLUTTER) pub get && \ - $(FLUTTER) pub run build_runner build --delete-conflicting-outputs && \ - if [ "$(PLATFORM)" = "android" ]; then \ - $(FLUTTER) build $(BUILD_TYPE) --flavor $(FLAVOR); \ - elif [ "$(PLATFORM)" = "ios" ]; then \ - $(FLUTTER) build ipa --flavor $(FLAVOR); \ - fi - -mobile-staff-install: - @echo "--> Installing Flutter dependencies for staff app..." - @cd mobile-apps/staff-app && $(FLUTTER) pub get - -mobile-staff-dev: - @echo "--> Running staff app in dev mode..." - @echo "--> If using VS code, use the debug configurations" - @cd mobile-apps/staff-app && $(FLUTTER) run --flavor dev -t lib/main_dev.dart - -mobile-staff-build: - @if [ "$(ENV)" != "dev" ] && [ "$(ENV)" != "staging" ] && [ "$(ENV)" != "prod" ]; then \ - echo "ERROR: ENV must be one of dev, staging, or prod."; exit 1; \ - fi - @if [ "$(PLATFORM)" != "android" ] && [ "$(PLATFORM)" != "ios" ]; then \ - echo "ERROR: PLATFORM must be either android or ios."; exit 1; \ - fi - @echo "--> Building staff app for $(PLATFORM) with flavor $(FLAVOR)..." - @cd mobile-apps/staff-app && \ - $(FLUTTER) pub get && \ - $(FLUTTER) pub run build_runner build --delete-conflicting-outputs && \ - if [ "$(PLATFORM)" = "android" ]; then \ - $(FLUTTER) build $(BUILD_TYPE) --flavor $(FLAVOR); \ - elif [ "$(PLATFORM)" = "ios" ]; then \ - $(FLUTTER) build ipa --flavor $(FLAVOR); \ - fi \ No newline at end of file + @echo "--------------------------------------------------" \ No newline at end of file diff --git a/README.md b/README.md index d2a3b958..695004f7 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,71 @@ -# Krow Workforce Management Platform +# KROW Workforce Monorepo -Krow is a comprehensive monorepo platform designed to streamline workforce management for events, hospitality, and large-scale enterprise operations. It connects clients, operators, vendors, and staff in a unified ecosystem, leveraging modern technology to optimize every step from procurement to payroll. +KROW is a comprehensive workforce management platform designed to streamline operations for events, hospitality, and enterprise staffing. This monorepo contains all components of the ecosystem, from the data layer to the user-facing applications. -## 🚀 What's in this Monorepo? +## 🚀 Repository Structure -- **/firebase/**: This directory is the backbone of our backend infrastructure. It contains: - - **Firestore Rules (`firestore.rules`):** Defines the security and access control logic for our NoSQL database, ensuring that users can only read and write data they are authorized to access. - - **Cloud Storage Rules (`storage.rules`):** Secures file uploads and downloads (like compliance documents and user avatars). - - **Data Connect (`dataconnect/`):** Houses the configuration for Firebase Data Connect, including the GraphQL schema, connectors, queries, and mutations that define our API layer. +### 📦 Apps (`/apps`) +These are the production-ready applications for our users: +- **`web-dashboard/`**: The primary React/Vite dashboard for Admin, Vendors, and Clients. +- **`mobile-client/`**: Flutter application for final clients to manage orders and billing. +- **`mobile-staff/`**: Flutter application for staff members (scheduling, clock-in/out, earnings). -- **/admin-web/**: The central "mission control" for platform administrators. This React/Vite web application provides a secure interface for: - - **User Management:** Inviting new users (the very first client or operator) and managing roles/permissions across the entire ecosystem. - - **Platform Analytics:** Monitoring application usage, top pages, and user activity. - - **System Logs:** A log explorer for diagnosing issues and monitoring the platform's health. +### âš™ï¸ Backend (`/backend`) +The core data engine powering all applications: +- **`dataconnect/`**: Firebase Data Connect configuration, GraphQL schemas (PostgreSQL), and auto-generated SDKs. -- **/frontend-web/**: The primary web application for core business operations, used by procurement managers, operators, and clients. This React/Vite application includes modules for: - - **Vendor Management:** Onboarding, compliance tracking, and performance scorecards. - - **Event & Order Management:** Creating and managing staffing orders. - - **Invoicing & Payroll:** Financial workflows for clients and staff. - - **Dashboards:** Role-specific dashboards for different user types. +### ðŸ› ï¸ Internal (`/internal`) +Tools and resources for the development and operations team: +- **`launchpad/`**: A secure portal (DevOps Launchpad) to access internal resources, documentation, and infrastructure links. +- **`api-harness/`**: A technical tool for testing and validating the Data Connect API and Cloud Functions. +- **`prototypes/`**: Reference code and visual prototypes (synchronized from external sources). -- **/mobile-apps/**: This directory is planned for our future mobile applications. It is structured to contain two distinct apps: - - `client-app`: A dedicated application for clients to create orders, track events, and manage billing on the go. - - `staff-app`: An essential tool for workforce members to view schedules, clock in/out, manage their profiles, and track earnings. - -- **/docs/**: The single source of truth for all project documentation. This includes: - - **Vision & Roadmaps:** High-level strategy, product goals, and technical direction. - - **Architecture:** Detailed diagrams and explanations of the system architecture. - - **API Specifications:** Documentation for our GraphQL API. - - **Development Guides:** Conventions, setup instructions, and maintenance procedures. - -- **/scripts/**: A collection of automation scripts to streamline development and operational tasks. These scripts are primarily executed via the `Makefile` and handle tasks like database patching, environment setup, and code generation. - -- **/secrets/**: A Git-ignored directory for storing sensitive credentials, API keys, and environment-specific configuration files. This ensures that no confidential information is ever committed to the repository. - -## 📚 Documentation Overview - -This section provides a quick guide to the most important documentation files in this monorepo, ordered by logical reading flow: - -- **[00-vision.md](./docs/00-vision.md)**: The "Why" behind the KROW platform, outlining our core objectives and guiding principles. -- **[01-product-functional-roadmap.md](./docs/01-product-functional-roadmap.md)**: The "What" we are building, from a user-facing features perspective. -- **[02-architecture-overview.md](./docs/02-architecture-overview.md)**: Visual diagrams explaining the technical architecture of our web and mobile applications. -- **[03-backend-api-specification.md](./docs/03-backend-api-specification.md)**: The detailed technical specification for our custom backend API. -- **[04-strategy-technical-roadmap.md](./docs/04-strategy-technical-roadmap.md)**: Our strategic plan for building the platform, outlining phases and milestones. -- **[05-project-plan.md](./docs/05-project-plan.md)**: A detailed breakdown of tasks by milestone, ready for GitHub Issues. -- **[06-maintenance-guide.md](./docs/06-maintenance-guide.md)**: The operational manual for integrating updates from the Base44 visual builder. -- **[07-reference-base44-api-export.md](./docs/07-reference-base44-api-export.md)**: The raw API documentation exported from Base44, used as a reference. -- **[08-reference-base44-prompts.md](./docs/08-reference-base44-prompts.md)**: A collection of standardized prompts for interacting with the Base44 AI. - -## 🤠Contributing - -New to the KROW team? Start here to set up your environment and understand our development practices: **[CONTRIBUTING.md](./CONTRIBUTING.md)** +### 📂 Support Directories +- **`/docs`**: Project vision, technical specifications, and guides. +- **`/makefiles`**: Modularized `Makefile` logic for project automation. +- **`/scripts`**: Automation scripts (security, hachage, environment setup). +- **`/firebase`**: Global Firebase configuration (Firestore/Storage rules). ## ðŸ› ï¸ Tech Stack - -- **Frontend:** React with Vite (JavaScript) -- **Styling:** Tailwind CSS -- **Backend:** Firebase (Firestore, Cloud Storage, Authentication, Data Connect) -- **Mobile:** Flutter (planned) +- **Frontend:** React (Vite) +- **Mobile:** Flutter +- **Backend:** Firebase (Data Connect, Auth, Hosting, Functions) +- **Database:** PostgreSQL (managed via Cloud SQL & Data Connect) +- **Infrastructure:** Google Cloud Platform (GCP) ## 📦 Getting Started -1. **Clone the repository:** +This project uses a modular `Makefile` for all common tasks. + +1. **View available commands:** ```bash - git clone https://github.com/Oloodi/krow.git - cd krow + make help ``` -2. **Install dependencies for the main web app:** +2. **Install dependencies (Web):** ```bash - cd frontend-web - npm install + make install ``` -3. **Run the development server:** +3. **Run the Web Dashboard locally:** ```bash - npm run dev + make dev ``` -The main application will be available at `http://localhost:5173`. For other packages, refer to their respective `README.md` files. \ No newline at end of file +4. **Run the DevOps Launchpad locally:** + ```bash + make launchpad-dev + ``` + +## 📚 Documentation +- **[00-vision.md](./docs/00-vision.md)**: Project objectives and guiding principles. +- **[01-backend-api-specification.md](./docs/01-backend-api-specification.md)**: (Legacy) Reference for data schemas. +- **[02-codemagic-env-vars.md](./docs/02-codemagic-env-vars.md)**: Guide for CI/CD environment variables. +- **[03-contributing.md](./docs/03-contributing.md)**: Guidelines for new developers and setup checklist. +- **[04-sync-prototypes.md](./docs/04-sync-prototypes.md)**: How to sync prototypes for local dev and AI context. + +## 🤠Contributing +New to the team? Please read our **[Contributing Guide](./docs/03-contributing.md)** to get your environment set up and understand our workflow. + +--- +© 2026 KROW Workforce / Oloodi Technologies Inc. diff --git a/admin-web/.gcloudignore b/admin-web/.gcloudignore deleted file mode 100644 index 4d7d6938..00000000 --- a/admin-web/.gcloudignore +++ /dev/null @@ -1,17 +0,0 @@ -# This file specifies files that are *not* uploaded to Google Cloud -# using gcloud. It follows the same syntax as .gitignore, with the addition of -# "#!include" directives (which insert the entries of the given .gitignore-style -# file at that point). -# -# For more information, run: -# $ gcloud topic gcloudignore -# -.gcloudignore -# If you would like to upload your .git directory, .gitignore file or files -# from your .gitignore file, remove the corresponding line -# below: -.git -.gitignore - -# Node.js dependencies: -node_modules/ \ No newline at end of file diff --git a/admin-web/.gitignore b/admin-web/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/admin-web/.gitignore +++ /dev/null @@ -1,24 +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 -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/admin-web/Dockerfile b/admin-web/Dockerfile deleted file mode 100644 index f6dbb595..00000000 --- a/admin-web/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# STAGE 1: Build the React application -FROM node:20-alpine AS build - -WORKDIR /app - -# Copy package files and install dependencies -COPY package.json package-lock.json ./ -RUN npm install - -# Copy the rest of the application source code -COPY . . - -# Build the application for production -RUN npm run build - -# STAGE 2: Serve the static files with Nginx -FROM nginx:alpine - -# Copy the built files from the build stage -COPY --from=build /app/dist /usr/share/nginx/html - -# Copy the custom Nginx configuration -COPY nginx.conf /etc/nginx/conf.d/default.conf - -# Expose the port Nginx is listening on -EXPOSE 8080 - -# Command to run Nginx in the foreground -CMD ["nginx", "-g", "daemon off;"] diff --git a/admin-web/README.md b/admin-web/README.md deleted file mode 100644 index 83f8cd28..00000000 --- a/admin-web/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Krow Admin Console - -This is the central administration web application for the Krow platform, built with React and Vite. - -## Overview - -The Krow Admin Console provides a secure and centralized interface for platform administrators to perform high-level management tasks. Its primary functions are: - -- **User Ecosystem Management:** Invite, view, and manage access for all users across the platform (Clients, Operators, Vendors, etc.). -- **Platform Health Monitoring:** Get a high-level overview of system activity, usage, and performance. -- **Diagnostics and Troubleshooting:** Access system logs for maintenance and issue resolution. - -## Features - -- **Dashboard:** A central hub displaying key platform metrics like total users, active vendors, and pending invitations. -- **User Management:** A complete interface to invite new users and manage existing ones, including role assignments. -- **Analytics:** A view of application usage statistics, such as top users and most visited pages. -- **Logs Explorer:** A simple tool to monitor and filter system logs for diagnostics. - -## Getting Started - -1. Navigate to the `admin-web` directory: - ```bash - cd admin-web - ``` -2. Install the dependencies: - ```bash - npm install - ``` -3. Start the development server: - ```bash - npm run dev - ``` - -The application will be available at `http://localhost:5173/admin-web/`. \ No newline at end of file diff --git a/admin-web/components.json b/admin-web/components.json deleted file mode 100644 index ebf7e6ed..00000000 --- a/admin-web/components.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": false, - "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" - }, - "iconLibrary": "lucide" -} \ No newline at end of file diff --git a/admin-web/iap-users.txt b/admin-web/iap-users.txt deleted file mode 100644 index fa47fcfa..00000000 --- a/admin-web/iap-users.txt +++ /dev/null @@ -1,8 +0,0 @@ -# List of authorized users for the Admin Console -# Format: one email per line, lines starting with # are comments -# -# IMPORTANT: These users must belong to the 'krowwithus.com' organization. -# This is a known limitation of enabling IAP directly on Cloud Run. -# See: https://docs.cloud.google.com/run/docs/securing/identity-aware-proxy-cloud-run#known_limitations - -user:admin@krowwithus.com diff --git a/admin-web/index.html b/admin-web/index.html deleted file mode 100644 index 8204a736..00000000 --- a/admin-web/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - KROW Admin Console - - -
- - - diff --git a/admin-web/jsconfig.json b/admin-web/jsconfig.json deleted file mode 100644 index c9608645..00000000 --- a/admin-web/jsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - }, - "jsx": "react-jsx" - }, - "include": ["src/**/*.js", "src/**/*.jsx"] -} \ No newline at end of file diff --git a/admin-web/nginx.conf b/admin-web/nginx.conf deleted file mode 100644 index 54fca980..00000000 --- a/admin-web/nginx.conf +++ /dev/null @@ -1,13 +0,0 @@ -server { - listen 8080; - server_name _; - - root /usr/share/nginx/html; - index index.html; - - location / { - # First attempt to serve request as file, then - # as directory, then fall back to displaying a 404. - try_files $uri $uri/ /index.html; - } -} diff --git a/admin-web/package-lock.json b/admin-web/package-lock.json deleted file mode 100644 index fca33305..00000000 --- a/admin-web/package-lock.json +++ /dev/null @@ -1,4967 +0,0 @@ -{ - "name": "admin-web", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "admin-web", - "version": "0.0.0", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-slot": "^1.2.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^0.553.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-router-dom": "^7.9.6", - "tailwind-merge": "^3.4.0", - "tailwindcss-animate": "^1.0.7" - }, - "devDependencies": { - "@eslint/js": "^9.39.1", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.1.0", - "autoprefixer": "^10.4.22", - "eslint": "^9.39.1", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.24", - "globals": "^16.5.0", - "postcss": "^8.5.6", - "tailwindcss": "^3.4.18", - "vite": "^7.2.2" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@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/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@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.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "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.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "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/eslint-utils/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, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "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, - "license": "MIT", - "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/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "license": "MIT", - "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.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "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, - "license": "Apache-2.0", - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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==", - "license": "ISC", - "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.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "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==", - "dev": true, - "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==", - "license": "MIT", - "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.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "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-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==", - "license": "MIT", - "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==", - "license": "MIT", - "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-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "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-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@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.5", - "@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-dialog/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==", - "license": "MIT", - "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-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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.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-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==", - "license": "MIT", - "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-primitive/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==", - "license": "MIT", - "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-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", - "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", - "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", - "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", - "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", - "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", - "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", - "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", - "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", - "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", - "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", - "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", - "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", - "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", - "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", - "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", - "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", - "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", - "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", - "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", - "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", - "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", - "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", - "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.5.tgz", - "integrity": "sha512-keKxkZMqnDicuvFoJbzrhbtdLSPhj/rZThDlKWCDbgXmUg0rEUFtRssDXKYmtXluZlIqiC5VqkCgRwzuyLHKHw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.1.tgz", - "integrity": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.47", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "Python-2.0" - }, - "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==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "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/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", - "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, - "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" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", - "dev": true, - "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" - } - ], - "license": "CC-BY-4.0" - }, - "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, - "license": "MIT", - "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/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "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==", - "license": "ISC", - "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==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "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, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.0.tgz", - "integrity": "sha512-si++xzRAY9iPp60roQiFta7OFbhrgvcthrhlNAGeQptSY25uJjkfUV8OArC3KLocB8JT8ohz+qgxWCmz8RhjIg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "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==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.252", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.252.tgz", - "integrity": "sha512-53uTpjtRgS7gjIxZ4qCgFdNO2q+wJt/Z8+xAvxbCqXPJrY6h7ighUkadQmNMXH96crtpa6gPFNP7BF4UBGDuaA==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "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-plugin-react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "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.24", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", - "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", - "dev": true, - "license": "MIT", - "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, - "license": "BSD-2-Clause", - "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": "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, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "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/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "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, - "license": "BSD-2-Clause", - "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "ISC", - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "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==", - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "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==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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/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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "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": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "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==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "optional": true, - "peer": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, - "license": "MPL-2.0", - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.553.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.553.0.tgz", - "integrity": "sha512-BRgX5zrWmNy/lkVAe0dXBgd7XQdZ3HTf+Hwe3c9WK6dqgnj9h+hxV+MDncM88xDWlCq27+TKvHGE70ViODNILw==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "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, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "BlueOak-1.0.0" - }, - "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, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "license": "BlueOak-1.0.0", - "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==", - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "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.11", - "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==", - "license": "MIT", - "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.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "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" - } - ], - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "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, - "license": "MIT", - "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" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.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==", - "license": "MIT", - "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==", - "license": "MIT", - "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-router": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.6.tgz", - "integrity": "sha512-Y1tUp8clYRXpfPITyuifmSoE2vncSME18uVLgaqyxh9H35JWpIfzHo+9y3Fzh5odk/jxPW29IgLgzcdwxGqyNA==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.6.tgz", - "integrity": "sha512-2MkC2XSXq6HjGcihnx1s0DBWQETI4mlis4Ux7YTLvP67xnGxCvq+BcCQSO81qQHVUTM1V53tl4iVVaY5sReCOA==", - "license": "MIT", - "dependencies": { - "react-router": "7.9.6" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "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==", - "license": "MIT", - "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/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==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "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, - "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==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", - "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.2", - "@rollup/rollup-android-arm64": "4.53.2", - "@rollup/rollup-darwin-arm64": "4.53.2", - "@rollup/rollup-darwin-x64": "4.53.2", - "@rollup/rollup-freebsd-arm64": "4.53.2", - "@rollup/rollup-freebsd-x64": "4.53.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", - "@rollup/rollup-linux-arm-musleabihf": "4.53.2", - "@rollup/rollup-linux-arm64-gnu": "4.53.2", - "@rollup/rollup-linux-arm64-musl": "4.53.2", - "@rollup/rollup-linux-loong64-gnu": "4.53.2", - "@rollup/rollup-linux-ppc64-gnu": "4.53.2", - "@rollup/rollup-linux-riscv64-gnu": "4.53.2", - "@rollup/rollup-linux-riscv64-musl": "4.53.2", - "@rollup/rollup-linux-s390x-gnu": "4.53.2", - "@rollup/rollup-linux-x64-gnu": "4.53.2", - "@rollup/rollup-linux-x64-musl": "4.53.2", - "@rollup/rollup-openharmony-arm64": "4.53.2", - "@rollup/rollup-win32-arm64-msvc": "4.53.2", - "@rollup/rollup-win32-ia32-msvc": "4.53.2", - "@rollup/rollup-win32-x64-gnu": "4.53.2", - "@rollup/rollup-win32-x64-msvc": "4.53.2", - "fsevents": "~2.3.2" - } - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "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/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, - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", - "license": "MIT", - "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.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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==", - "license": "Apache-2.0" - }, - "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==", - "license": "0BSD" - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "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" - } - ], - "license": "MIT", - "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, - "license": "BSD-2-Clause", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", - "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "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", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.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 - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "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/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "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, - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/admin-web/package.json b/admin-web/package.json deleted file mode 100644 index a35efd40..00000000 --- a/admin-web/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "admin-web", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-slot": "^1.2.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^0.553.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-router-dom": "^7.9.6", - "tailwind-merge": "^3.4.0", - "tailwindcss-animate": "^1.0.7" - }, - "devDependencies": { - "@eslint/js": "^9.39.1", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.1.0", - "autoprefixer": "^10.4.22", - "eslint": "^9.39.1", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.24", - "globals": "^16.5.0", - "postcss": "^8.5.6", - "tailwindcss": "^3.4.18", - "vite": "^7.2.2" - } -} diff --git a/admin-web/postcss.config.js b/admin-web/postcss.config.js deleted file mode 100644 index e99ebc2c..00000000 --- a/admin-web/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} \ No newline at end of file diff --git a/admin-web/src/App.jsx b/admin-web/src/App.jsx deleted file mode 100644 index 8ab3e6c7..00000000 --- a/admin-web/src/App.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import Layout from "./pages/Layout"; -import Dashboard from "./pages/Dashboard"; -import UserManagement from "./pages/UserManagement"; -import Analytics from "./pages/Analytics"; -import Logs from "./pages/Logs"; -import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; - -function App() { - return ( - - - - } /> - } /> - } /> - } /> - - - - ); -} - -export default App; \ No newline at end of file diff --git a/admin-web/src/index.css b/admin-web/src/index.css deleted file mode 100644 index fefe8ca5..00000000 --- a/admin-web/src/index.css +++ /dev/null @@ -1,58 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; - --radius: 0.5rem; - } - .dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - } -} - -@layer base { - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -} diff --git a/admin-web/src/lib/utils.js b/admin-web/src/lib/utils.js deleted file mode 100644 index 6f706bfa..00000000 --- a/admin-web/src/lib/utils.js +++ /dev/null @@ -1,6 +0,0 @@ -import { clsx } from "clsx" -import { twMerge } from "tailwind-merge" - -export function cn(...inputs) { - return twMerge(clsx(inputs)) -} \ No newline at end of file diff --git a/admin-web/src/main.jsx b/admin-web/src/main.jsx deleted file mode 100644 index 54b39dd1..00000000 --- a/admin-web/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.jsx' -import './index.css' - -ReactDOM.createRoot(document.getElementById('root')).render( - - - , -) diff --git a/admin-web/src/pages/Analytics.jsx b/admin-web/src/pages/Analytics.jsx deleted file mode 100644 index 9510364e..00000000 --- a/admin-web/src/pages/Analytics.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import React from "react"; - -const topUsers = [ - { email: "ian.gomez@example.com", visits: 6950 }, - { email: "admin@krow.com", visits: 193 }, - { email: "paula.orte@example.com", visits: 81 }, - { email: "test.user@example.com", visits: 50 }, -]; - -const topPages = [ - { name: "VendorManagement", visits: 718 }, - { name: "Dashboard", visits: 600 }, - { name: "unknown", visits: 587 }, - { name: "ClientDashboard", visits: 475 }, - { name: "Events", visits: 456 }, -]; - -export default function Analytics() { - return ( -
-

Analytics

-

- An overview of your application's data. -

- -
-
-
-

Total Unique Users

-

3

-
-
-
- -
-
-

Top Users

-
    - {topUsers.map((user) => ( -
  • -

    {user.email}

    -

    {user.visits.toLocaleString()} visits

    -
  • - ))} -
-
-
-

Top Pages

-
    - {topPages.map((page) => ( -
  • -

    {page.name}

    -

    {page.visits.toLocaleString()}

    -
  • - ))} -
-
-
-
- ); -} \ No newline at end of file diff --git a/admin-web/src/pages/Dashboard.jsx b/admin-web/src/pages/Dashboard.jsx deleted file mode 100644 index b5ef879e..00000000 --- a/admin-web/src/pages/Dashboard.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from "react"; -import { Users, Building2, Mail, FileText } from "lucide-react"; - -const stats = [ - { name: "Total Users", stat: "15", icon: Users, color: "bg-blue-500" }, - { name: "Active Vendors", stat: "8", icon: Building2, color: "bg-green-500" }, - { name: "Pending Invitations", stat: "3", icon: Mail, color: "bg-yellow-500" }, - { name: "Open Orders", stat: "12", icon: FileText, color: "bg-purple-500" }, -]; - -export default function Dashboard() { - return ( -
-

Admin Dashboard

-

- Welcome to the Krow Admin Console. Here is a quick overview of the platform. -

- -
-
- {stats.map((item) => ( -
-
-
-
-

{item.name}

-
-
-

{item.stat}

-
-
- ))} -
-
-
- ); -} diff --git a/admin-web/src/pages/Layout.jsx b/admin-web/src/pages/Layout.jsx deleted file mode 100644 index d98a0d96..00000000 --- a/admin-web/src/pages/Layout.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from "react"; -import { Link, useLocation } from "react-router-dom"; -import { Building2, Users, BarChart3, Terminal, LayoutDashboard, LogOut } from "lucide-react"; - -const navigation = [ - { name: "Dashboard", href: "/admin-web/", icon: LayoutDashboard }, - { name: "User Management", href: "/admin-web/user-management", icon: Users }, - { name: "Analytics", href: "/admin-web/analytics", icon: BarChart3 }, - { name: "Logs Explorer", href: "/admin-web/logs", icon: Terminal }, -]; - -export default function Layout({ children }) { - const location = useLocation(); - - return ( -
- {/* Sidebar */} -
-
- {/* Sidebar header */} -
-
-
- Krow Logo -
-
-

KROW

-

Admin Console

-
-
- {import.meta.env.VITE_APP_ENV && ( - - {import.meta.env.VITE_APP_ENV === 'staging' ? 'Staging' : 'Dev'} - - )} -
- {/* Sidebar content */} -
- -
- - - Logout - -
-
-
-
- - {/* Main content */} -
-
-
-
- {children} -
-
-
-
-
- ); -} diff --git a/admin-web/src/pages/Logs.jsx b/admin-web/src/pages/Logs.jsx deleted file mode 100644 index 822f7f99..00000000 --- a/admin-web/src/pages/Logs.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from "react"; - -const logs = [ - { level: "INFO", message: "User admin@krow.com logged in.", timestamp: "2024-05-21T10:00:00Z" }, - { level: "WARN", message: "API response time is slow: 2500ms for /api/vendors", timestamp: "2024-05-21T10:01:00Z" }, - { level: "ERROR", message: "Failed to process payment for invoice INV-12345.", timestamp: "2024-05-21T10:02:00Z" }, - { level: "INFO", message: "New vendor 'New Staffing Co' invited by admin@krow.com.", timestamp: "2024-05-21T10:05:00Z" }, -]; - -export default function Logs() { - return ( -
-

Logs Explorer

-

- Monitor system logs across your application. -

- -
-
-
-
- - - - - - - - - - {logs.map((log, index) => ( - - - - - - ))} - -
LevelMessageTimestamp
- - {log.level} - - {log.message}{new Date(log.timestamp).toLocaleString()}
-
-
-
-
-
- ); -} \ No newline at end of file diff --git a/admin-web/src/pages/UserManagement.jsx b/admin-web/src/pages/UserManagement.jsx deleted file mode 100644 index 03f2810a..00000000 --- a/admin-web/src/pages/UserManagement.jsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { useState } from "react"; -import { Plus, Send } from "lucide-react"; - -const users = [ - { name: "Alex Johnson", email: "alex.j@krow.com", role: "Admin", status: "Active", avatar: "https://randomuser.me/api/portraits/men/1.jpg" }, - { name: "Samantha Lee", email: "samantha.lee@vendor.com", role: "Vendor", status: "Active", avatar: "https://randomuser.me/api/portraits/women/2.jpg" }, - { name: "Michael Chen", email: "michael.chen@client.com", role: "Client", status: "Pending", avatar: "https://randomuser.me/api/portraits/men/3.jpg" }, -]; - -function InviteUserModal({ isOpen, onClose }) { - if (!isOpen) return null; - - return ( -
-
-
-
-
-

Send Invitation

-

The user will receive an email with a link to set up their account.

-
-
- - -
-
- - -
-
-
-
- - -
-
-
-
-
- ); -} - -export default function UserManagement() { - const [isModalOpen, setIsModalOpen] = useState(false); - - return ( -
-
-
-

User Management

-

- A list of all the users in your account including their name, email and role. -

-
-
- -
-
- -
-
-
-
- - - - - - - - - - - {users.map((user) => ( - - - - - - - ))} - -
NameEmailRoleStatus
-
-
- -
-
-
{user.name}
-
-
-
{user.email}{user.role} - - {user.status} - -
-
-
-
-
- setIsModalOpen(false)} /> -
- ); -} diff --git a/admin-web/tailwind.config.js b/admin-web/tailwind.config.js deleted file mode 100644 index 7ee3f053..00000000 --- a/admin-web/tailwind.config.js +++ /dev/null @@ -1,89 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - darkMode: ["class"], - content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"], - theme: { - extend: { - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - }, - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))' - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))' - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - chart: { - '1': 'hsl(var(--chart-1))', - '2': 'hsl(var(--chart-2))', - '3': 'hsl(var(--chart-3))', - '4': 'hsl(var(--chart-4))', - '5': 'hsl(var(--chart-5))' - }, - sidebar: { - DEFAULT: 'hsl(var(--sidebar-background))', - foreground: 'hsl(var(--sidebar-foreground))', - primary: 'hsl(var(--sidebar-primary))', - 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', - accent: 'hsl(var(--sidebar-accent))', - 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', - border: 'hsl(var(--sidebar-border))', - ring: 'hsl(var(--sidebar-ring))' - } - }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out' - } - } - }, - plugins: [require("tailwindcss-animate")], -} \ No newline at end of file diff --git a/admin-web/vite.config.js b/admin-web/vite.config.js deleted file mode 100644 index ace547de..00000000 --- a/admin-web/vite.config.js +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import path from 'path' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - resolve: { - alias: { - '@': path.resolve(__dirname, './src'), - }, - }, -}) diff --git a/mobile-apps/legacy/client-app/lib/features/notificatins/data/notification_gql.dart b/apps/mobile-client/.keep similarity index 100% rename from mobile-apps/legacy/client-app/lib/features/notificatins/data/notification_gql.dart rename to apps/mobile-client/.keep diff --git a/apps/mobile-staff/.keep b/apps/mobile-staff/.keep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/apps/mobile-staff/.keep @@ -0,0 +1 @@ + diff --git a/firebase/dataconnect/connector/.keep b/backend/.keep similarity index 100% rename from firebase/dataconnect/connector/.keep rename to backend/.keep diff --git a/firebase/dataconnect/schema/.keep b/backend/cloud-functions/.keep similarity index 100% rename from firebase/dataconnect/schema/.keep rename to backend/cloud-functions/.keep diff --git a/firebase/functions/.keep b/backend/dataconnect/.keep similarity index 100% rename from firebase/functions/.keep rename to backend/dataconnect/.keep diff --git a/build.gradle b/build.gradle deleted file mode 100644 index d5d64f50..00000000 --- a/build.gradle +++ /dev/null @@ -1,141 +0,0 @@ -plugins { - id "com.android.application" - // START: FlutterFire Configuration - id 'com.google.gms.google-services' - id 'com.google.firebase.crashlytics' - // END: FlutterFire Configuration - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.troywallet" - compileSdk = 36 - ndkVersion = "25.1.8937393" - //ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - coreLibraryDesugaringEnabled true - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.troywallet" - namespace("com.example.troywallet") - minSdk = 29 - targetSdk = 35 - versionCode = flutter.versionCode - versionName = flutter.versionName - multiDexEnabled true - - } - - // KeyStore ////////////////////////////////////////////////// - // - kast.keystore..alias android..pw=android..pw=android - def keystorePropertiesFileNameDev = 'kast_key_dev.properties' - def keystorePropertiesDev = new Properties() - keystorePropertiesDev.load(new FileInputStream(rootProject.file(keystorePropertiesFileNameDev))) - - def keystorePropertiesFileNameUat = 'kast_key_uat.properties' - def keystorePropertiesUat = new Properties() - keystorePropertiesUat.load(new FileInputStream(rootProject.file(keystorePropertiesFileNameUat))) - - def keystorePropertiesFileNameStaging = 'kast_key_staging.properties' - def keystorePropertiesStaging = new Properties() - keystorePropertiesStaging.load(new FileInputStream(rootProject.file(keystorePropertiesFileNameStaging))) - - def keystorePropertiesFileNameProd = 'kast_key_prod.properties' - def keystorePropertiesProd = new Properties() - keystorePropertiesProd.load(new FileInputStream(rootProject.file(keystorePropertiesFileNameProd))) - - - signingConfigs { - configDev { - keyAlias keystorePropertiesDev['keyAlias'] - keyPassword keystorePropertiesDev['keyPassword'] - storeFile file('../kast_android_dev.jks') //keystorePropertiesSit['storeFile'] - storePassword keystorePropertiesDev['storePassword'] - } - configUat { - keyAlias keystorePropertiesUat['keyAlias'] - keyPassword keystorePropertiesUat['keyPassword'] - storeFile file('../kast_android_uat.jks') //keystorePropertiesPat['storeFile'] - storePassword keystorePropertiesUat['storePassword'] - } - - configStaging { - keyAlias keystorePropertiesStaging['keyAlias'] - keyPassword keystorePropertiesStaging['keyPassword'] - storeFile file('../kast_android_staging.jks') //keystorePropertiesPat['storeFile'] - storePassword keystorePropertiesStaging['storePassword'] - } - configProd { - keyAlias keystorePropertiesProd['keyAlias'] - keyPassword keystorePropertiesProd['keyPassword'] - storeFile file('../kast_android_prod.jks') - storePassword keystorePropertiesProd['storePassword'] - } - } - - flavorDimensions "default" - productFlavors { - dev { - dimension "default" - applicationId "dev.kastcard.com" - resValue "string", "app_name", "KAST DEV" - resValue "string", "deeplink_prefix", "/dls" - resValue "drawable", "ic_launcher", "@mipmap/ic_launcher_dev" - signingConfig signingConfigs.configDev - } - uat { - dimension "default" - applicationId "uat.kastcard.com" - resValue "string", "app_name", "KAST UAT" - resValue "string", "deeplink_prefix", "/dlp" - resValue "drawable", "ic_launcher", "@mipmap/ic_launcher_uat" - signingConfig signingConfigs.configUat - } - staging { - dimension "default" - applicationId "stg.kastcard.com" - resValue "string", "app_name", "KAST Staging" - resValue "string", "deeplink_prefix", "/dlp" - resValue "drawable", "ic_launcher", "@mipmap/ic_launcher_staging" - signingConfig signingConfigs.configStaging - } - prod { - dimension "default" - applicationId "com.kastfinance.app" - resValue "string", "app_name", "KAST" - resValue "string", "deeplink_prefix", "/dlp" - resValue "drawable", "ic_launcher", "@mipmap/ic_launcher_prod" - signingConfig signingConfigs.configProd - } - - } - - buildTypes { - release { - shrinkResources false - minifyEnabled false - } - - } -} - -flutter { - source = "../.." -} - -dependencies { - implementation "com.sumsub.sns:idensic-mobile-sdk-videoident:1.33.1" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' - implementation(files("libs/mdisdk-release-1.2.54.aar")) -} diff --git a/codemagic.yaml b/codemagic.yaml index 46b6aab7..f75718fc 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -47,7 +47,7 @@ workflows: # ================================================================================= client-app-base: &client-app-base name: Client App Base - working_directory: mobile-apps/client-app + working_directory: apps/mobile-client instance_type: mac_mini_m2 max_build_duration: 60 environment: @@ -57,15 +57,15 @@ workflows: cache: cache_paths: - $HOME/.pub-cache - - $FCI_BUILD_DIR/mobile-apps/client-app/build - - $FCI_BUILD_DIR/mobile-apps/client-app/.dart_tool + - $FCI_BUILD_DIR/apps/mobile-client/build + - $FCI_BUILD_DIR/apps/mobile-client/.dart_tool # ================================================================================= # Base workflow for staff_app # ================================================================================= staff-app-base: &staff-app-base name: Staff App Base - working_directory: mobile-apps/staff-app + working_directory: apps/mobile-staff instance_type: mac_mini_m2 max_build_duration: 60 environment: @@ -75,8 +75,8 @@ workflows: cache: cache_paths: - $HOME/.pub-cache - - $FCI_BUILD_DIR/mobile-apps/staff-app/build - - $FCI_BUILD_DIR/mobile-apps/staff-app/.dart_tool + - $FCI_BUILD_DIR/apps/mobile-staff/build + - $FCI_BUILD_DIR/apps/mobile-staff/.dart_tool # ================================================================================= # Client App Workflows - Android diff --git a/dataconnect-naming-and-enum-findings.md b/dataconnect-naming-and-enum-findings.md deleted file mode 100644 index d2c11760..00000000 --- a/dataconnect-naming-and-enum-findings.md +++ /dev/null @@ -1,253 +0,0 @@ -# DataConnect – Inconsistencies between the Base44 frontend and the backend (Firebase Data Connect + PostgreSQL) -**Author:** José Salazar -**Date:** Dec 2025 - ---- - -## 📌 Purpose of this document - -Document all findings during the integration of the new backend -(**Firebase Data Connect + PostgreSQL**) with the frontend generated by **Base44 AI**. - -This document summarizes: - -- Issues found -- camelCase vs snake_case inconsistencies -- Enum inconsistencies (uppercase/lowercase and dashes) -- Differences between what DataConnect returns vs what the frontend expects -- Recommended fixes -- Suggestions for Base44 AI to update its model -- Impact on queries, mutations, and the generated SDK - ---- - -## 1ï¸âƒ£ Enums – Different formats between Front and Backend - -### Observation - -In the frontend, enum values are in mixed formats, for example: - -- UPPERCASE: SKILLED -- camelCase: fullTime - -In the backend (DataConnect schema), enums are defined only in UPPERCASE, for example: - -- FULL_TIME -- CROSS_TRAINED -- NOT_REQUIRED -- PENDING - -DataConnect only accepts these exact values. - -### Problem - -When the frontend sends: - -- "crossTrained" instead of CROSS_TRAINED -- "fluent" instead of FLUENT - -### Impact - -- Mutations can fail or return enum validation errors. -- Filters using enums return no results. -- Behavior changes depending on how Base44 AI generated the object. - -### Recommendation - -- Define a single standard: **ALL enums must be UPPERCASE** on the frontend and backend. -- Before sending to the backend, normalize enum values to uppercase. - -### Suggestion for Base44 AI - -- Adjust models so they always generate enums in UPPERCASE. - ---- - -## 2ï¸âƒ£ Enums with dashes (“-â€) – Not valid in GraphQL - -### Observation - -In the legacy frontend, some enum values contain dashes, for example: - -- CUSTOMER-SERVICE -- CROSS-TRAINED -- PART-TIME - -But in GraphQL enums only allow letters, numbers, and underscores. -The backend had to define them as: - -- CUSTOMER_SERVICE -- CROSS_TRAINED -- PART_TIME - -### Problem - -When the frontend sends "CUSTOMER-SERVICE" or "CROSS-TRAINED": - -- The backend expects CUSTOMER_SERVICE or CROSS_TRAINED. -- There is no match between the frontend value and the DataConnect enum. - -### Impact - -- Enum filters return nothing. -- Mutations fail when trying to save invalid enum values. -- Compatibility between the Base44 model and the DataConnect schema breaks. - -### Recommendation - -- Standardize all enums to UPPERCASE SNAKE_CASE (e.g., CUSTOMER_SERVICE). -- Never use dashes “-†in enum values. - -### Suggestion for Base44 AI - -- Update models so enum values are always generated as - UPPERCASE_WITH_UNDERSCORE (e.g., CUSTOMER_SERVICE), without dashes. - ---- - -## 3ï¸âƒ£ Field names – Front in snake_case vs DataConnect in camelCase - -### Observation - -The original Base44 frontend uses snake_case field names, for example: - -- contact_number -- vendor_id -- background_check_status -- hub_location - -In DataConnect the schema is camelCase, and although you can map to the actual PostgreSQL column using @col, the GraphQL type remains camelCase, for example: - -- contactNumber (mapped to "contact_number" in Postgres) -- vendorId (mapped to "vendor_id") -- backgroundCheckStatus (mapped to "background_check_status") -- hubLocation (mapped to "hub_location") - -Meaning: - -- In the database (PostgreSQL) names remain snake_case. -- In DataConnect and the SDK they are exposed as camelCase. - -### Problem - -The frontend still expects/reads fields like contact_number, but the SDK returns contactNumber. -A similar issue happens when the frontend sends payloads in snake_case: - -- The GraphQL schema does not recognize contact_number. -- It only accepts contactNumber. - -### Impact - -- UI fails to show data because it reads keys that don’t exist (snake_case). -- Mutations fail or ignore fields due to mismatched names. -- Filters with snake_case are invalid in GraphQL. - -### Recommendation - -- Agree that **all communication with DataConnect (frontend + SDK) uses camelCase**. -- Keep snake_case only at PostgreSQL level using @col, for example: - - employeeName: String @col(name: "employee_name") - -Thus: - -- Frontend / SDK / GraphQL → camelCase (employeeName) -- PostgreSQL → snake_case (employee_name) - -### Suggestion for Base44 AI - -- Adjust generated frontend code so it uses camelCase when consuming the new backend. -- If Supabase or another backend is still used, document all mappings clearly. - ---- - -## 4ï¸âƒ£ Fields used by the frontend but not listed in API Spec v3 - -### Observation - -During integration we found that Base44 frontend uses fields not defined in the official document: - -Reference file: -docs/03-backend-api-specification-v3.md - -Examples in the Staff entity: - -The frontend sends and displays fields like: - -- notes -- rate - -But these fields were not defined in the original v3 specification for Staff. - -### Problem - -- The frontend assumes these fields exist because the old database had them. -- The DataConnect schema does not include them. -- Sending these values in mutations causes validation errors. - -### Impact - -- Inconsistency between what the UI shows/edits and what is actually persisted. -- Risk of losing data the user believes is being saved. -- Hard to maintain a 1:1 mapping between the previous Base44 model and the new backend. - -### Recommendation - -- Validate which fields should truly exist for each entity (e.g., Staff). -- Align these three items: - 1. API Spec v3 - 2. DataConnect Schema - 3. Base44 Frontend - -- If a field is no longer needed, remove it from the frontend. -- If important, add it formally to the API Spec and to the DataConnect schema. - ---- - -## 5ï¸âƒ£ DataConnect vs Front – Observed behavior - -1. DataConnect: - - Always exposes fields in camelCase. - - Enforces enum restrictions exactly as defined (UPPERCASE, no dashes). - - Allows mapping to Postgres column names using @col, but GraphQL names remain camelCase. - -2. Base44 Frontend: - - Uses snake_case in many areas. - - Uses enums in mixed formats (uppercase, camelCase, with dashes). - - Contains extra fields not included in API Spec v3. - ---- - -## 6ï¸âƒ£ Suggested fixes (personal criteria) - -1. Enums - - Standardize to UPPERCASE_SNAKE_CASE for all enum values. - - Apply a normalization layer in the frontend to convert any format into the official one before hitting the backend. - -2. Field names - - Migrate the frontend to camelCase for any interaction with DataConnect. - - Keep snake_case only at the database layer using @col. - -3. Extra fields - - Review all fields the frontend sends and compare with API Spec v3. - - Remove or add fields depending on what becomes the “source of truth†(Spec v3). - -4. Documentation - - Keep this file updated as the Base44 → DataConnect migration reference. - - Add valid payload examples for each entity (Staff, Vendor, Invoice, etc.). - ---- - -## 7ï¸âƒ£ Summary - -- Always generate: - - Enums: UPPERCASE_SNAKE_CASE (e.g., FULL_TIME, CUSTOMER_SERVICE). - - Fields: camelCase (e.g., contactNumber, hubLocation, backgroundCheckStatus). - -- Avoid: - - Dashes “-†in enum values. - - Spaces in enum values. - ---- - -This document captures the current findings and serves as a guide to fully align the Base44 frontend with the backend based on Firebase Data Connect + PostgreSQL. diff --git a/dataconnect/connector/activityLog/mutations.gql b/dataconnect/connector/activityLog/mutations.gql deleted file mode 100644 index 85e6f795..00000000 --- a/dataconnect/connector/activityLog/mutations.gql +++ /dev/null @@ -1,51 +0,0 @@ -mutation CreateActivityLog( - $title: String!, - $description: String!, - $activityType: ActivityType!, - $userId: String!, - $isRead: Boolean, - $iconType: String, - $iconColor: String -) @auth(level: USER) { - activityLog_insert( - data: { - title: $title - description: $description - activityType: $activityType - userId: $userId - isRead: $isRead - iconType: $iconType - iconColor: $iconColor - } - ) -} - -mutation UpdateActivityLog( - $id: UUID!, - $title: String, - $description: String, - $activityType: ActivityType, - $userId: String, - $isRead: Boolean, - $iconType: String, - $iconColor: String -) @auth(level: USER) { - activityLog_update( - id: $id, - data: { - title: $title - description: $description - activityType: $activityType - userId: $userId - isRead: $isRead - iconType: $iconType - iconColor: $iconColor - } - ) -} - -mutation DeleteActivityLog( - $id: UUID! -) @auth(level: USER) { - activityLog_delete(id: $id) -} diff --git a/dataconnect/connector/activityLog/queries.gql b/dataconnect/connector/activityLog/queries.gql deleted file mode 100644 index d48bb119..00000000 --- a/dataconnect/connector/activityLog/queries.gql +++ /dev/null @@ -1,50 +0,0 @@ -query listActivityLog @auth(level: USER) { - activityLogs { - id - title - description - activityType - userId - isRead - iconType - iconColor - } -} - -query getActivityLogById( - $id: UUID! -) @auth(level: USER) { - activityLog(id: $id) { - id - title - description - activityType - userId - isRead - iconType - iconColor - } -} - -query filterActivityLog( - $userId: String, - $activityType: ActivityType, - $isRead: Boolean -) @auth(level: USER) { - activityLogs( - where: { - userId: { eq: $userId } - activityType: { eq: $activityType } - isRead: { eq: $isRead } - } - ) { - id - title - description - activityType - userId - isRead - iconType - iconColor - } -} diff --git a/dataconnect/connector/assignment/mutations.gql b/dataconnect/connector/assignment/mutations.gql deleted file mode 100644 index b91cb417..00000000 --- a/dataconnect/connector/assignment/mutations.gql +++ /dev/null @@ -1,51 +0,0 @@ -mutation CreateAssignment( - $assignmentNumber: String, - $orderId: UUID!, - $workforceId: UUID!, - $vendorId: UUID!, - $role: String!, - $assignmentStatus: AssignmentStatus!, - $scheduledStart: Timestamp! -) @auth(level: USER) { - assignment_insert( - data: { - assignmentNumber: $assignmentNumber - orderId: $orderId - workforceId: $workforceId - vendorId: $vendorId - role: $role - assignmentStatus: $assignmentStatus - scheduledStart: $scheduledStart - } - ) -} - -mutation UpdateAssignment( - $id: UUID!, - $assignmentNumber: String, - $orderId: UUID, - $workforceId: UUID, - $vendorId: UUID, - $role: String, - $assignmentStatus: AssignmentStatus, - $scheduledStart: Timestamp -) @auth(level: USER) { - assignment_update( - id: $id, - data: { - assignmentNumber: $assignmentNumber - orderId: $orderId - workforceId: $workforceId - vendorId: $vendorId - role: $role - assignmentStatus: $assignmentStatus - scheduledStart: $scheduledStart - } - ) -} - -mutation DeleteAssignment( - $id: UUID! -) @auth(level: USER) { - assignment_delete(id: $id) -} diff --git a/dataconnect/connector/assignment/queries.gql b/dataconnect/connector/assignment/queries.gql deleted file mode 100644 index 06c16ba4..00000000 --- a/dataconnect/connector/assignment/queries.gql +++ /dev/null @@ -1,56 +0,0 @@ -# dataconnect/connector/assignment/queries.gql - -query listAssignment @auth(level: USER) { - assignments { - id - assignmentNumber - orderId - workforceId - vendorId - role - assignmentStatus - scheduledStart - } -} - -query getAssignmentById( - $id: UUID! -) @auth(level: USER) { - assignment(id: $id) { - id - assignmentNumber - orderId - workforceId - vendorId - role - assignmentStatus - scheduledStart - } -} - -query filterAssignment( - $assignmentNumber: String, - $orderId: UUID, - $workforceId: UUID, - $vendorId: UUID, - $assignmentStatus: AssignmentStatus -) @auth(level: USER) { - assignments( - where: { - assignmentNumber: { eq: $assignmentNumber } - orderId: { eq: $orderId } - workforceId: { eq: $workforceId } - vendorId: { eq: $vendorId } - assignmentStatus: { eq: $assignmentStatus } - } - ) { - id - assignmentNumber - orderId - workforceId - vendorId - role - assignmentStatus - scheduledStart - } -} diff --git a/dataconnect/connector/business/mutations.gql b/dataconnect/connector/business/mutations.gql deleted file mode 100644 index 9be33782..00000000 --- a/dataconnect/connector/business/mutations.gql +++ /dev/null @@ -1,47 +0,0 @@ -mutation CreateBusiness( - $businessName: String!, - $contactName: String!, - $email: String, - $sector: BusinessSector, - $rateGroup: BusinessRateGroup!, - $status: BusinessStatus -) @auth(level: USER) { - business_insert( - data: { - businessName: $businessName - contactName: $contactName - email: $email - sector: $sector - rateGroup: $rateGroup - status: $status - } - ) -} - -mutation UpdateBusiness( - $id: UUID!, - $businessName: String, - $contactName: String, - $email: String, - $sector: BusinessSector, - $rateGroup: BusinessRateGroup, - $status: BusinessStatus -) @auth(level: USER) { - business_update( - id: $id, - data: { - businessName: $businessName - contactName: $contactName - email: $email - sector: $sector - rateGroup: $rateGroup - status: $status - } - ) -} - -mutation DeleteBusiness( - $id: UUID! -) @auth(level: USER) { - business_delete(id: $id) -} diff --git a/dataconnect/connector/business/queries.gql b/dataconnect/connector/business/queries.gql deleted file mode 100644 index 4eeceead..00000000 --- a/dataconnect/connector/business/queries.gql +++ /dev/null @@ -1,51 +0,0 @@ -query listBusiness @auth(level: USER) { - businesses { - id - businessName - contactName - email - sector - rateGroup - status - } -} - -query getBusinessById( - $id: UUID! -) @auth(level: USER) { - business(id: $id) { - id - businessName - contactName - email - sector - rateGroup - status - } -} - -query filterBusiness( - $businessName: String, - $contactName: String, - $sector: BusinessSector, - $rateGroup: BusinessRateGroup, - $status: BusinessStatus -) @auth(level: USER) { - businesses( - where: { - businessName: { eq: $businessName } - contactName: { eq: $contactName } - sector: { eq: $sector } - rateGroup: { eq: $rateGroup } - status: { eq: $status } - } - ) { - id - businessName - contactName - email - sector - rateGroup - status - } -} diff --git a/dataconnect/connector/certification/mutations.gql b/dataconnect/connector/certification/mutations.gql deleted file mode 100644 index b38f5296..00000000 --- a/dataconnect/connector/certification/mutations.gql +++ /dev/null @@ -1,47 +0,0 @@ -mutation CreateCertification( - $employeeName: String!, - $certificationName: String!, - $certificationType: CertificationType, - $status: CertificationStatus, - $expiryDate: String!, - $validationStatus: CertificationValidationStatus -) @auth(level: USER) { - certification_insert( - data: { - employeeName: $employeeName - certificationName: $certificationName - certificationType: $certificationType - status: $status - expiryDate: $expiryDate - validationStatus: $validationStatus - } - ) -} - -mutation UpdateCertification( - $id: UUID!, - $employeeName: String, - $certificationName: String, - $certificationType: CertificationType, - $status: CertificationStatus, - $expiryDate: String, - $validationStatus: CertificationValidationStatus -) @auth(level: USER) { - certification_update( - id: $id, - data: { - employeeName: $employeeName - certificationName: $certificationName - certificationType: $certificationType - status: $status - expiryDate: $expiryDate - validationStatus: $validationStatus - } - ) -} - -mutation DeleteCertification( - $id: UUID! -) @auth(level: USER) { - certification_delete(id: $id) -} diff --git a/dataconnect/connector/certification/queries.gql b/dataconnect/connector/certification/queries.gql deleted file mode 100644 index 888e6127..00000000 --- a/dataconnect/connector/certification/queries.gql +++ /dev/null @@ -1,54 +0,0 @@ -query listCertification @auth(level: USER) { - certifications { - id - employeeName - certificationName - certificationType - status - expiryDate - validationStatus - } -} - -query getCertificationById( - $id: UUID! -) @auth(level: USER) { - certification(id: $id) { - id - employeeName - certificationName - certificationType - status - expiryDate - validationStatus - createdDate - updatedDate - createdBy - } -} - -query filterCertification( - $employeeName: String, - $certificationName: String, - $certificationType: CertificationType, - $status: CertificationStatus, - $validationStatus: CertificationValidationStatus -) @auth(level: USER) { - certifications( - where: { - employeeName: { eq: $employeeName } - certificationName: { eq: $certificationName } - certificationType: { eq: $certificationType } - status: { eq: $status } - validationStatus: { eq: $validationStatus } - } - ) { - id - employeeName - certificationName - certificationType - status - expiryDate - validationStatus - } -} diff --git a/dataconnect/connector/connector.yaml b/dataconnect/connector/connector.yaml deleted file mode 100644 index c516c6ba..00000000 --- a/dataconnect/connector/connector.yaml +++ /dev/null @@ -1,18 +0,0 @@ -connectorId: krow-connector -generate: - javascriptSdk: - - outputDir: ../../frontend-web/src/dataconnect-generated - package: "@dataconnect/generated" - packageJsonDir: ../../frontend-web - react: true - angular: false - - outputDir: ../../internal-api-harness/src/dataconnect-generated - package: "@dataconnect/generated" - packageJsonDir: ../../internal-api-harness - react: true - angular: false - - outputDir: ../../frontend-web-free/src/dataconnect-generated - package: "@dataconnect/generated" - packageJsonDir: ../../frontend-web-free - react: true - angular: false diff --git a/dataconnect/connector/conversation/mutations.gql b/dataconnect/connector/conversation/mutations.gql deleted file mode 100644 index 22619f63..00000000 --- a/dataconnect/connector/conversation/mutations.gql +++ /dev/null @@ -1,39 +0,0 @@ -mutation CreateConversation( - $participants: String!, - $conversationType: ConversationType!, - $relatedTo: UUID!, - $status: ConversationStatus -) @auth(level: USER) { - conversation_insert( - data: { - participants: $participants - conversationType: $conversationType - relatedTo: $relatedTo - status: $status - } - ) -} - -mutation UpdateConversation( - $id: UUID!, - $participants: String, - $conversationType: ConversationType, - $relatedTo: UUID, - $status: ConversationStatus -) @auth(level: USER) { - conversation_update( - id: $id, - data: { - participants: $participants - conversationType: $conversationType - relatedTo: $relatedTo - status: $status - } - ) -} - -mutation DeleteConversation( - $id: UUID! -) @auth(level: USER) { - conversation_delete(id: $id) -} diff --git a/dataconnect/connector/conversation/queries.gql b/dataconnect/connector/conversation/queries.gql deleted file mode 100644 index db6f2526..00000000 --- a/dataconnect/connector/conversation/queries.gql +++ /dev/null @@ -1,43 +0,0 @@ -# dataconnect/connector/conversation/queries.gql - -query listConversation @auth(level: USER) { - conversations { - id - participants - conversationType - relatedTo - status - } -} - -query getConversationById( - $id: UUID! -) @auth(level: USER) { - conversation(id: $id) { - id - participants - conversationType - relatedTo - status - } -} - -query filterConversation( - $conversationType: ConversationType, - $status: ConversationStatus, - $relatedTo: UUID -) @auth(level: USER) { - conversations( - where: { - conversationType: { eq: $conversationType } - status: { eq: $status } - relatedTo: { eq: $relatedTo } - } - ) { - id - participants - conversationType - relatedTo - status - } -} diff --git a/dataconnect/connector/enterprise/mutations.gql b/dataconnect/connector/enterprise/mutations.gql deleted file mode 100644 index f079bebe..00000000 --- a/dataconnect/connector/enterprise/mutations.gql +++ /dev/null @@ -1,35 +0,0 @@ -mutation CreateEnterprise( - $enterpriseNumber: String!, - $enterpriseName: String!, - $enterpriseCode: String! -) @auth(level: USER) { - enterprise_insert( - data: { - enterpriseNumber: $enterpriseNumber - enterpriseName: $enterpriseName - enterpriseCode: $enterpriseCode - } - ) -} - -mutation UpdateEnterprise( - $id: UUID!, - $enterpriseNumber: String, - $enterpriseName: String, - $enterpriseCode: String -) @auth(level: USER) { - enterprise_update( - id: $id, - data: { - enterpriseNumber: $enterpriseNumber - enterpriseName: $enterpriseName - enterpriseCode: $enterpriseCode - } - ) -} - -mutation DeleteEnterprise( - $id: UUID! -) @auth(level: USER) { - enterprise_delete(id: $id) -} diff --git a/dataconnect/connector/enterprise/queries.gql b/dataconnect/connector/enterprise/queries.gql deleted file mode 100644 index 5c81baf4..00000000 --- a/dataconnect/connector/enterprise/queries.gql +++ /dev/null @@ -1,38 +0,0 @@ -query listEnterprise @auth(level: USER) { - enterprises { - id - enterpriseNumber - enterpriseName - enterpriseCode - } -} - -query getEnterpriseById( - $id: UUID! -) @auth(level: USER) { - enterprise(id: $id) { - id - enterpriseNumber - enterpriseName - enterpriseCode - } -} - -query filterEnterprise( - $enterpriseNumber: String, - $enterpriseName: String, - $enterpriseCode: String -) @auth(level: USER) { - enterprises( - where: { - enterpriseNumber: { eq: $enterpriseNumber } - enterpriseName: { eq: $enterpriseName } - enterpriseCode: { eq: $enterpriseCode } - } - ) { - id - enterpriseNumber - enterpriseName - enterpriseCode - } -} diff --git a/dataconnect/connector/event/mutations.gql b/dataconnect/connector/event/mutations.gql deleted file mode 100644 index c04425ee..00000000 --- a/dataconnect/connector/event/mutations.gql +++ /dev/null @@ -1,208 +0,0 @@ -mutation CreateEvent( - $eventName: String!, - $isRapid: Boolean, - $isRecurring: Boolean, - $isMultiDay: Boolean, - $recurrenceType: RecurrenceType, - $recurrenceStartDate: Timestamp, - $recurrenceEndDate: Timestamp, - $scatterDates: Any, - $multiDayStartDate: Timestamp, - $multiDayEndDate: Timestamp, - $bufferTimeBefore: Float, - $bufferTimeAfter: Float, - $conflictDetectionEnabled: Boolean, - $detectedConflicts: Any, - $businessId: UUID!, - $businessName: String, - $vendorId: String, - $vendorName: String, - $hub: String, - $eventLocation: String, - $contractType: ContractType, - $poReference: String, - $status: EventStatus!, - $date: String!, - $shifts: Any, - $addons: Any, - $total: Float, - $clientName: String, - $clientEmail: String, - $clientPhone: String, - $invoiceId: UUID, - $notes: String, - $requested: Int, - $assignedStaff: Any, - $department: String, - $createdBy: String, - $orderType: String, - $recurringStartDate: String, - $recurringEndDate: String, - $recurringDays: Any, - $permanentStartDate: String, - $permanentDays: Any, - $includeBackup: Boolean, - $backupStaffCount: Int, - $recurringTime: String, - $permanentTime: String -) @auth(level: USER) { - event_insert( - data: { - eventName: $eventName - isRapid: $isRapid - isRecurring: $isRecurring - isMultiDay: $isMultiDay - recurrenceType: $recurrenceType - recurrenceStartDate: $recurrenceStartDate - recurrenceEndDate: $recurrenceEndDate - scatterDates: $scatterDates - multiDayStartDate: $multiDayStartDate - multiDayEndDate: $multiDayEndDate - bufferTimeBefore: $bufferTimeBefore - bufferTimeAfter: $bufferTimeAfter - conflictDetectionEnabled: $conflictDetectionEnabled - detectedConflicts: $detectedConflicts - businessId: $businessId - businessName: $businessName - vendorId: $vendorId - vendorName: $vendorName - hub: $hub - eventLocation: $eventLocation - contractType: $contractType - poReference: $poReference - status: $status - date: $date - shifts: $shifts - addons: $addons - total: $total - clientName: $clientName - clientEmail: $clientEmail - clientPhone: $clientPhone - invoiceId: $invoiceId - notes: $notes - orderType: $orderType - requested: $requested - assignedStaff: $assignedStaff - department: $department - createdBy: $createdBy - recurringStartDate: $recurringStartDate - recurringEndDate: $recurringEndDate - recurringDays: $recurringDays - permanentStartDate: $permanentStartDate - permanentDays: $permanentDays - includeBackup: $includeBackup - backupStaffCount: $backupStaffCount - recurringTime: $recurringTime - permanentTime: $permanentTime - } - ) -} - - -mutation UpdateEvent( - $id: UUID!, - $eventName: String, - $isRapid: Boolean, - $isRecurring: Boolean, - $isMultiDay: Boolean, - $recurrenceType: RecurrenceType, - $recurrenceStartDate: Timestamp, - $recurrenceEndDate: Timestamp, - $scatterDates: Any, - $multiDayStartDate: Timestamp, - $multiDayEndDate: Timestamp, - $bufferTimeBefore: Float, - $bufferTimeAfter: Float, - $conflictDetectionEnabled: Boolean, - $detectedConflicts: Any, - $businessId: UUID, - $businessName: String, - $vendorId: String, - $vendorName: String, - $hub: String, - $eventLocation: String, - $contractType: ContractType, - $poReference: String, - $status: EventStatus, - $date: String, - $shifts: Any, - $addons: Any, - $total: Float, - $clientName: String, - $clientEmail: String, - $clientPhone: String, - $invoiceId: UUID, - $notes: String, - $requested: Int, - $orderType: String, - $department: String, - $assignedStaff: Any, - $createdBy: String, - $recurringStartDate: String, - $recurringEndDate: String, - $recurringDays: Any, - $permanentStartDate: String, - $permanentDays: Any, - $includeBackup: Boolean, - $backupStaffCount: Int, - $recurringTime: String, - $permanentTime: String -) @auth(level: USER) { - event_update( - id: $id, - data: { - eventName: $eventName - isRapid: $isRapid - isRecurring: $isRecurring - isMultiDay: $isMultiDay - recurrenceType: $recurrenceType - recurrenceStartDate: $recurrenceStartDate - recurrenceEndDate: $recurrenceEndDate - scatterDates: $scatterDates - multiDayStartDate: $multiDayStartDate - multiDayEndDate: $multiDayEndDate - bufferTimeBefore: $bufferTimeBefore - bufferTimeAfter: $bufferTimeAfter - conflictDetectionEnabled: $conflictDetectionEnabled - detectedConflicts: $detectedConflicts - businessId: $businessId - businessName: $businessName - vendorId: $vendorId - vendorName: $vendorName - hub: $hub - eventLocation: $eventLocation - contractType: $contractType - poReference: $poReference - status: $status - date: $date - shifts: $shifts - addons: $addons - total: $total - clientName: $clientName - clientEmail: $clientEmail - clientPhone: $clientPhone - invoiceId: $invoiceId - notes: $notes - orderType: $orderType - requested: $requested - assignedStaff: $assignedStaff - department: $department - createdBy: $createdBy - recurringStartDate: $recurringStartDate - recurringEndDate: $recurringEndDate - recurringDays: $recurringDays - permanentStartDate: $permanentStartDate - permanentDays: $permanentDays - includeBackup: $includeBackup - backupStaffCount: $backupStaffCount - recurringTime: $recurringTime - permanentTime: $permanentTime - } - ) -} - -mutation DeleteEvent( - $id: UUID! -) @auth(level: USER) { - event_delete(id: $id) -} diff --git a/dataconnect/connector/event/queries.gql b/dataconnect/connector/event/queries.gql deleted file mode 100644 index 2a4a5996..00000000 --- a/dataconnect/connector/event/queries.gql +++ /dev/null @@ -1,193 +0,0 @@ -query listEvents ( - $orderByDate: OrderDirection - $orderByCreatedDate: OrderDirection, - $limit: Int -) @auth(level: USER) { - events( - orderBy: [ - { date: $orderByDate } - { createdDate: $orderByCreatedDate } - ] - limit: $limit - ) { - id - eventName - status - date - isRapid - isRecurring - isMultiDay - recurrenceType - recurrenceStartDate - recurrenceEndDate - scatterDates - multiDayStartDate - multiDayEndDate - bufferTimeBefore - bufferTimeAfter - conflictDetectionEnabled - detectedConflicts - businessId - businessName - vendorId - vendorName - hub - eventLocation - contractType - poReference - shifts - addons - total - clientName - clientEmail - clientPhone - invoiceId - notes - requested - assignedStaff - orderType - department - createdBy - recurringStartDate - recurringEndDate - recurringDays - permanentStartDate - permanentDays - includeBackup - backupStaffCount - recurringTime - permanentTime - } -} - -query getEventById( - $id: UUID! -) @auth(level: USER) { - event(id: $id) { - id - eventName - status - date - isRapid - isRecurring - isMultiDay - recurrenceType - recurrenceStartDate - recurrenceEndDate - scatterDates - multiDayStartDate - multiDayEndDate - bufferTimeBefore - bufferTimeAfter - conflictDetectionEnabled - detectedConflicts - businessId - businessName - vendorId - vendorName - hub - eventLocation - contractType - poReference - shifts - addons - total - clientName - clientEmail - clientPhone - invoiceId - notes - requested - orderType - department - assignedStaff - recurringStartDate - recurringEndDate - recurringDays - permanentStartDate - permanentDays - includeBackup - backupStaffCount - recurringTime - permanentTime - } -} - -query filterEvents( - $status: EventStatus, - $businessId: UUID, - $vendorId: String, - $isRecurring: Boolean, - $isRapid: Boolean, - $isMultiDay: Boolean, - $recurrenceType: RecurrenceType, - $date: String, - $hub: String, - $eventLocation: String, - $contractType: ContractType, - $clientEmail: String -) @auth(level: USER) { - events( - where: { - status: { eq: $status } - businessId: { eq: $businessId } - vendorId: { eq: $vendorId } - isRecurring: { eq: $isRecurring } - isRapid: { eq: $isRapid } - isMultiDay: { eq: $isMultiDay } - recurrenceType: { eq: $recurrenceType } - date: { eq: $date } - hub: { eq: $hub } - eventLocation: { eq: $eventLocation } - contractType: { eq: $contractType } - clientEmail: { eq: $clientEmail } - }) { - id - eventName - status - date - isRapid - isRecurring - isMultiDay - recurrenceType - recurrenceStartDate - recurrenceEndDate - scatterDates - multiDayStartDate - multiDayEndDate - bufferTimeBefore - bufferTimeAfter - conflictDetectionEnabled - detectedConflicts - businessId - businessName - vendorId - vendorName - hub - eventLocation - contractType - poReference - shifts - addons - total - clientName - clientEmail - clientPhone - invoiceId - notes - requested - assignedStaff - orderType - department - createdBy - recurringStartDate - recurringEndDate - recurringDays - permanentStartDate - permanentDays - includeBackup - backupStaffCount - recurringTime - permanentTime - } -} diff --git a/dataconnect/connector/invoice/mutations.gql b/dataconnect/connector/invoice/mutations.gql deleted file mode 100644 index 0fabc96d..00000000 --- a/dataconnect/connector/invoice/mutations.gql +++ /dev/null @@ -1,51 +0,0 @@ -mutation CreateInvoice( - $invoiceNumber: String!, - $amount: Float!, - $status: InvoiceStatus!, - $issueDate: Timestamp!, - $dueDate: Timestamp!, - $disputedItems: String, - $isAutoGenerated: Boolean -) @auth(level: USER) { - invoice_insert( - data: { - invoiceNumber: $invoiceNumber - amount: $amount - status: $status - issueDate: $issueDate - dueDate: $dueDate - disputedItems: $disputedItems - isAutoGenerated: $isAutoGenerated - } - ) -} - -mutation UpdateInvoice( - $id: UUID!, - $invoiceNumber: String, - $amount: Float, - $status: InvoiceStatus, - $issueDate: Timestamp, - $dueDate: Timestamp, - $disputedItems: String, - $isAutoGenerated: Boolean -) @auth(level: USER) { - invoice_update( - id: $id, - data: { - invoiceNumber: $invoiceNumber - amount: $amount - status: $status - issueDate: $issueDate - dueDate: $dueDate - disputedItems: $disputedItems - isAutoGenerated: $isAutoGenerated - } - ) -} - -mutation DeleteInvoice( - $id: UUID! -) @auth(level: USER) { - invoice_delete(id: $id) -} diff --git a/dataconnect/connector/invoice/queries.gql b/dataconnect/connector/invoice/queries.gql deleted file mode 100644 index d4a68fc6..00000000 --- a/dataconnect/connector/invoice/queries.gql +++ /dev/null @@ -1,51 +0,0 @@ -query listInvoice @auth(level: USER) { - invoices { - id - invoiceNumber - amount - status - issueDate - dueDate - disputedItems - isAutoGenerated - } -} - -query getInvoiceById( - $id: UUID! -) @auth(level: USER) { - invoice(id: $id) { - id - invoiceNumber - amount - status - issueDate - dueDate - disputedItems - isAutoGenerated - } -} - -query filterInvoices( - $invoiceNumber: String, - $status: InvoiceStatus, - $isAutoGenerated: Boolean, - $amount: Float -) @auth(level: USER) { - invoices( - where: { - invoiceNumber: { eq: $invoiceNumber } - status: { eq: $status } - isAutoGenerated: { eq: $isAutoGenerated } - amount: { eq: $amount } - } - ) { - id - invoiceNumber - amount - status - issueDate - dueDate - isAutoGenerated - } -} diff --git a/dataconnect/connector/message/mutations.gql b/dataconnect/connector/message/mutations.gql deleted file mode 100644 index ea03b0b2..00000000 --- a/dataconnect/connector/message/mutations.gql +++ /dev/null @@ -1,39 +0,0 @@ -mutation CreateMessage( - $conversationId: UUID!, - $senderName: String!, - $content: String!, - $readBy: String -) @auth(level: USER) { - message_insert( - data: { - conversationId: $conversationId - senderName: $senderName - content: $content - readBy: $readBy - } - ) -} - -mutation UpdateMessage( - $id: UUID!, - $conversationId: UUID, - $senderName: String, - $content: String, - $readBy: String -) @auth(level: USER) { - message_update( - id: $id, - data: { - conversationId: $conversationId - senderName: $senderName - content: $content - readBy: $readBy - } - ) -} - -mutation DeleteMessage( - $id: UUID! -) @auth(level: USER) { - message_delete(id: $id) -} diff --git a/dataconnect/connector/message/queries.gql b/dataconnect/connector/message/queries.gql deleted file mode 100644 index a999f19d..00000000 --- a/dataconnect/connector/message/queries.gql +++ /dev/null @@ -1,39 +0,0 @@ -query listMessage @auth(level: USER) { - messages { - id - conversationId - senderName - content - readBy - } -} - -query getMessageById( - $id: UUID! -) @auth(level: USER) { - message(id: $id) { - id - conversationId - senderName - content - readBy - } -} - -query filterMessage( - $conversationId: UUID, - $senderName: String -) @auth(level: USER) { - messages( - where: { - conversationId: { eq: $conversationId } - senderName: { eq: $senderName } - } - ) { - id - conversationId - senderName - content - readBy - } -} diff --git a/dataconnect/connector/order/mutations.gql b/dataconnect/connector/order/mutations.gql deleted file mode 100644 index 5d4e8143..00000000 --- a/dataconnect/connector/order/mutations.gql +++ /dev/null @@ -1,39 +0,0 @@ -mutation CreateOrder( - $orderNumber: String!, - $partnerId: UUID!, - $orderType: OrderType, - $orderStatus: OrderStatus -) @auth(level: USER) { - order_insert( - data: { - orderNumber: $orderNumber - partnerId: $partnerId - orderType: $orderType - orderStatus: $orderStatus - } - ) -} - -mutation UpdateOrder( - $id: UUID!, - $orderNumber: String, - $partnerId: UUID, - $orderType: OrderType, - $orderStatus: OrderStatus -) @auth(level: USER) { - order_update( - id: $id, - data: { - orderNumber: $orderNumber - partnerId: $partnerId - orderType: $orderType - orderStatus: $orderStatus - } - ) -} - -mutation DeleteOrder( - $id: UUID! -) @auth(level: USER) { - order_delete(id: $id) -} diff --git a/dataconnect/connector/order/queries.gql b/dataconnect/connector/order/queries.gql deleted file mode 100644 index 1f924089..00000000 --- a/dataconnect/connector/order/queries.gql +++ /dev/null @@ -1,43 +0,0 @@ -query listOrder @auth(level: USER) { - orders { - id - orderNumber - partnerId - orderType - orderStatus - } -} - -query getOrderById( - $id: UUID! -) @auth(level: USER) { - order(id: $id) { - id - orderNumber - partnerId - orderType - orderStatus - } -} - -query filterOrder( - $orderNumber: String, - $partnerId: UUID, - $orderType: OrderType, - $orderStatus: OrderStatus -) @auth(level: USER) { - orders( - where: { - orderNumber: { eq: $orderNumber } - partnerId: { eq: $partnerId } - orderType: { eq: $orderType } - orderStatus: { eq: $orderStatus } - } - ) { - id - orderNumber - partnerId - orderType - orderStatus - } -} diff --git a/dataconnect/connector/partner/mutations.gql b/dataconnect/connector/partner/mutations.gql deleted file mode 100644 index 790ec7f7..00000000 --- a/dataconnect/connector/partner/mutations.gql +++ /dev/null @@ -1,35 +0,0 @@ -mutation CreatePartner( - $partnerName: String!, - $partnerNumber: String!, - $partnerType: PartnerType -) @auth(level: USER) { - partner_insert( - data: { - partnerName: $partnerName - partnerNumber: $partnerNumber - partnerType: $partnerType - } - ) -} - -mutation UpdatePartner( - $id: UUID!, - $partnerName: String, - $partnerNumber: String, - $partnerType: PartnerType -) @auth(level: USER) { - partner_update( - id: $id, - data: { - partnerName: $partnerName - partnerNumber: $partnerNumber - partnerType: $partnerType - } - ) -} - -mutation DeletePartner( - $id: UUID! -) @auth(level: USER) { - partner_delete(id: $id) -} diff --git a/dataconnect/connector/partner/queries.gql b/dataconnect/connector/partner/queries.gql deleted file mode 100644 index bac247c3..00000000 --- a/dataconnect/connector/partner/queries.gql +++ /dev/null @@ -1,40 +0,0 @@ -# dataconnect/connector/partner/queries.gql - -query listPartner @auth(level: USER) { - partners { - id - partnerName - partnerNumber - partnerType - } -} - -query getPartnerById( - $id: UUID! -) @auth(level: USER) { - partner(id: $id) { - id - partnerName - partnerNumber - partnerType - } -} - -query filterPartner( - $partnerName: String, - $partnerNumber: String, - $partnerType: PartnerType -) @auth(level: USER) { - partners( - where: { - partnerName: { eq: $partnerName } - partnerNumber: { eq: $partnerNumber } - partnerType: { eq: $partnerType } - } - ) { - id - partnerName - partnerNumber - partnerType - } -} diff --git a/dataconnect/connector/sector/mutations.gql b/dataconnect/connector/sector/mutations.gql deleted file mode 100644 index 785fb9fa..00000000 --- a/dataconnect/connector/sector/mutations.gql +++ /dev/null @@ -1,35 +0,0 @@ -mutation CreateSector( - $sectorNumber: String!, - $sectorName: String!, - $sectorType: SectorType -) @auth(level: USER) { - sector_insert( - data: { - sectorNumber: $sectorNumber - sectorName: $sectorName - sectorType: $sectorType - } - ) -} - -mutation UpdateSector( - $id: UUID!, - $sectorNumber: String, - $sectorName: String, - $sectorType: SectorType -) @auth(level: USER) { - sector_update( - id: $id, - data: { - sectorNumber: $sectorNumber - sectorName: $sectorName - sectorType: $sectorType - } - ) -} - -mutation DeleteSector( - $id: UUID! -) @auth(level: USER) { - sector_delete(id: $id) -} diff --git a/dataconnect/connector/sector/queries.gql b/dataconnect/connector/sector/queries.gql deleted file mode 100644 index 26297f81..00000000 --- a/dataconnect/connector/sector/queries.gql +++ /dev/null @@ -1,38 +0,0 @@ -query listSector @auth(level: USER) { - sectors { - id - sectorNumber - sectorName - sectorType - } -} - -query getSectorById( - $id: UUID! -) @auth(level: USER) { - sector(id: $id) { - id - sectorNumber - sectorName - sectorType - } -} - -query filterSector( - $sectorNumber: String, - $sectorName: String, - $sectorType: SectorType -) @auth(level: USER) { - sectors( - where: { - sectorNumber: { eq: $sectorNumber } - sectorName: { eq: $sectorName } - sectorType: { eq: $sectorType } - } - ) { - id - sectorNumber - sectorName - sectorType - } -} diff --git a/dataconnect/connector/shift/mutations.gql b/dataconnect/connector/shift/mutations.gql deleted file mode 100644 index a98f7302..00000000 --- a/dataconnect/connector/shift/mutations.gql +++ /dev/null @@ -1,39 +0,0 @@ -mutation CreateShift( - $shiftName: String!, - $startDate: Timestamp!, - $endDate: Timestamp, - $assignedStaff: String -) @auth(level: USER) { - shift_insert( - data: { - shiftName: $shiftName - startDate: $startDate - endDate: $endDate - assignedStaff: $assignedStaff - } - ) -} - -mutation UpdateShift( - $id: UUID!, - $shiftName: String, - $startDate: Timestamp, - $endDate: Timestamp, - $assignedStaff: String -) @auth(level: USER) { - shift_update( - id: $id, - data: { - shiftName: $shiftName - startDate: $startDate - endDate: $endDate - assignedStaff: $assignedStaff - } - ) -} - -mutation DeleteShift( - $id: UUID! -) @auth(level: USER) { - shift_delete(id: $id) -} diff --git a/dataconnect/connector/shift/queries.gql b/dataconnect/connector/shift/queries.gql deleted file mode 100644 index 2e9811a5..00000000 --- a/dataconnect/connector/shift/queries.gql +++ /dev/null @@ -1,44 +0,0 @@ -query listShift @auth(level: USER) { - shifts { - id - shiftName - startDate - endDate - assignedStaff - } -} - -query getShiftById( - $id: UUID! -) @auth(level: USER) { - shift(id: $id) { - id - shiftName - startDate - endDate - assignedStaff - createdDate - updatedDate - createdBy - } -} - -query filterShift( - $shiftName: String, - $startDate: Timestamp, - $endDate: Timestamp -) @auth(level: USER) { - shifts( - where: { - shiftName: { eq: $shiftName } - startDate: { eq: $startDate } - endDate: { eq: $endDate } - } - ) { - id - shiftName - startDate - endDate - assignedStaff - } -} diff --git a/dataconnect/connector/staff/mutations.gql b/dataconnect/connector/staff/mutations.gql deleted file mode 100644 index 6bc3d3fa..00000000 --- a/dataconnect/connector/staff/mutations.gql +++ /dev/null @@ -1,171 +0,0 @@ -mutation CreateStaff( - $employeeName: String!, - $vendorId: String, - $vendorName: String, - $manager: String, - $contactNumber: String, - $phone:String # nuevo, - $email: String, - $department: StaffDepartment, - $hubLocation: String, - $eventLocation:String, # nuevo - $address:String, # nuevo - $city:String, # nuevo - $track: String, - $position: String, - $position2:String, # nuevo - $initial:String, # nuevo - $profileType: ProfileType, - $employmentType: EmploymentType, - $english: EnglishLevel, - $rate: Float, - $rating: Float, - $reliabilityScore: Int, - $backgroundCheckStatus: BackgroundCheckStatus, - $notes: String, - $accountingComments:String, # nuevo - $shiftCoveragePercentage:Int, # nuevo - $cancellationCount:Int, # nuevo - $noShowCount:Int, # nuevo - $totalShifts:Int, # nuevo - $invoiced:Boolean, # nuevo - $englishRequired:Boolean, # nuevo - $checkIn:String, # nuevo - $scheduleDays:String, # nuevo - $replacedBy:String, # nuevo - $action:String, # nuevo - $ro:String, # nuevo - $mon:String, # nuevo -) @auth(level: USER) { - staff_insert( - data: { - employeeName: $employeeName - vendorId: $vendorId - vendorName: $vendorName - manager: $manager - contactNumber: $contactNumber - phone:$phone - email: $email - department: $department - hubLocation: $hubLocation - eventLocation:$eventLocation - address:$address - city:$city - track: $track - position: $position - position2:$position2 - initial:$initial - profileType: $profileType - employmentType: $employmentType - english: $english - rate: $rate - rating: $rating - reliabilityScore: $reliabilityScore - backgroundCheckStatus: $backgroundCheckStatus - notes: $notes - accountingComments:$accountingComments - shiftCoveragePercentage:$shiftCoveragePercentage - cancellationCount:$cancellationCount - noShowCount:$noShowCount - totalShifts:$totalShifts - invoiced:$invoiced - englishRequired:$englishRequired - checkIn:$checkIn - scheduleDays:$scheduleDays - replacedBy:$replacedBy - action:$action - ro:$ro - mon:$mon - } - ) -} - -mutation UpdateStaff( - $id: UUID!, - $employeeName: String, - $vendorId: String, - $vendorName: String, - $manager: String, - $contactNumber: String, - $phone: String, - $email: String, - $department: StaffDepartment, - $hubLocation: String, - $eventLocation: String, - $address: String, - $city: String, - $track: String, - $position: String, - $position2:String, - $initial:String, - $profileType: ProfileType, - $employmentType: EmploymentType, - $english: EnglishLevel, - $englishRequired:Boolean # nuevo - $rate: Float, - $rating: Float, - $reliabilityScore: Int, - $backgroundCheckStatus: BackgroundCheckStatus, - $notes: String, - $accountingComments:String, - $shiftCoveragePercentage:Int, - $cancellationCount:Int, - $noShowCount:Int, - $totalShifts:Int, - $invoiced:Boolean, - $checkIn:String, - $scheduleDays:String, - $replacedBy:String, - $action:String, - $ro:String, - $mon:String, -) @auth(level: USER) { - staff_update( - id: $id, - data: { - employeeName: $employeeName - vendorId: $vendorId - vendorName: $vendorName - manager: $manager - contactNumber: $contactNumber - phone:$phone # nuevo - email: $email - department: $department - hubLocation: $hubLocation - eventLocation:$eventLocation # nuevo - address:$address # nuevo - city:$city # nuevo - track: $track - position: $position - position2:$position2 # nuevo - initial:$initial # nuevo - profileType: $profileType - employmentType: $employmentType - english: $english - englishRequired:$englishRequired # nuevo - rate: $rate - rating: $rating - reliabilityScore: $reliabilityScore - backgroundCheckStatus: $backgroundCheckStatus - notes: $notes - accountingComments:$accountingComments # nuevo - shiftCoveragePercentage:$shiftCoveragePercentage # nuevo - cancellationCount:$cancellationCount # nuevo - noShowCount:$noShowCount # nuevo - totalShifts:$totalShifts # nuevo - invoiced:$invoiced # nuevo - checkIn:$checkIn # nuevo - scheduleDays:$scheduleDays # nuevo - replacedBy:$replacedBy # nuevo - action:$action # nuevo - ro:$ro # nuevo - mon:$mon # nuevo - } - ) -} - -mutation DeleteStaff( - $id: UUID! -) @auth(level: USER) { - staff_delete(id: $id) -} diff --git a/dataconnect/connector/staff/queries.gql b/dataconnect/connector/staff/queries.gql deleted file mode 100644 index eebe2d73..00000000 --- a/dataconnect/connector/staff/queries.gql +++ /dev/null @@ -1,125 +0,0 @@ -query listStaff @auth(level: USER) { - staffs { - id - employeeName - vendorId - vendorName - manager - contactNumber - phone # nuevo - email - department - hubLocation - eventLocation # nuevo - address # nuevo - city # nuevo - track - position - position2 - initial # nuevo - profileType - employmentType - english - englishRequired # nuevo - rate - rating - reliabilityScore - backgroundCheckStatus - notes - accountingComments # nuevo - shiftCoveragePercentage # nuevo - cancellationCount # nuevo - noShowCount # nuevo - totalShifts # nuevo - invoiced # nuevo - checkIn # nuevo - scheduleDays # nuevo - replacedBy # nuevo - action # nuevo - ro # nuevo - mon # nuevo - } -} - -query getStaffById( - $id: UUID! -) @auth(level: USER) { - staff(id: $id) { - id - employeeName - vendorId - vendorName - manager - contactNumber - phone # nuevo - email - department - hubLocation - eventLocation # nuevo - address # nuevo - city # nuevo - track - position - position2 # nuevo - initial # nuevo - profileType - employmentType - english - rate - rating - reliabilityScore - backgroundCheckStatus - notes - accountingComments # nuevo - shiftCoveragePercentage # nuevo - cancellationCount # nuevo - noShowCount # nuevo - totalShifts # nuevo - invoiced # nuevo - englishRequired # nuevo - checkIn # nuevo - scheduleDays # nuevo - replacedBy # nuevo - action # nuevo - ro # nuevo - mon # nuevo - } -} - -query filterStaff( - $employeeName: String, - $vendorId: String, - $department: StaffDepartment, - $employmentType: EmploymentType, - $english: EnglishLevel, - $backgroundCheckStatus: BackgroundCheckStatus -) @auth(level: USER) { - staffs( - where: { - employeeName: { eq: $employeeName } - vendorId: { eq: $vendorId } - department: { eq: $department } - employmentType: { eq: $employmentType } - english: { eq: $english } - backgroundCheckStatus: { eq: $backgroundCheckStatus } - } - ) { - id - employeeName - vendorId - vendorName - department - hubLocation - eventLocation # nuevo - position - position2 - employmentType - english - rate - rating - reliabilityScore - backgroundCheckStatus - notes - invoiced # nuevo - } -} diff --git a/dataconnect/connector/team/mutations.gql b/dataconnect/connector/team/mutations.gql deleted file mode 100644 index 2fab4bd8..00000000 --- a/dataconnect/connector/team/mutations.gql +++ /dev/null @@ -1,47 +0,0 @@ -mutation CreateTeam( - $teamName: String!, - $ownerId: String!, - $ownerName: String!, - $ownerRole: TeamOwnerRole!, - $favoriteStaff: String, - $blockedStaff: String -) @auth(level: USER) { - team_insert( - data: { - teamName: $teamName - ownerId: $ownerId - ownerName: $ownerName - ownerRole: $ownerRole - favoriteStaff: $favoriteStaff - blockedStaff: $blockedStaff - } - ) -} - -mutation UpdateTeam( - $id: UUID!, - $teamName: String, - $ownerId: String, - $ownerName: String, - $ownerRole: TeamOwnerRole, - $favoriteStaff: String, - $blockedStaff: String -) @auth(level: USER) { - team_update( - id: $id, - data: { - teamName: $teamName - ownerId: $ownerId - ownerName: $ownerName - ownerRole: $ownerRole - favoriteStaff: $favoriteStaff - blockedStaff: $blockedStaff - } - ) -} - -mutation DeleteTeam( - $id: UUID! -) @auth(level: USER) { - team_delete(id: $id) -} diff --git a/dataconnect/connector/team/queries.gql b/dataconnect/connector/team/queries.gql deleted file mode 100644 index c5a96d3a..00000000 --- a/dataconnect/connector/team/queries.gql +++ /dev/null @@ -1,53 +0,0 @@ -query listTeam ( - $orderByCreatedDate: OrderDirection - $limit: Int - ) @auth(level: USER) { - teams( - orderBy: { createdDate: $orderByCreatedDate } - limit: $limit - ) { - id - teamName - ownerId - ownerName - ownerRole - favoriteStaff - blockedStaff - } -} - -query getTeamById( - $id: UUID! -) @auth(level: USER) { - team(id: $id) { - id - teamName - ownerId - ownerName - ownerRole - favoriteStaff - blockedStaff - } -} - -query filterTeam( - $teamName: String, - $ownerId: String, - $ownerRole: TeamOwnerRole -) @auth(level: USER) { - teams( - where: { - teamName: { eq: $teamName } - ownerId: { eq: $ownerId } - ownerRole: { eq: $ownerRole } - } - ) { - id - teamName - ownerId - ownerName - ownerRole - favoriteStaff - blockedStaff - } -} diff --git a/dataconnect/connector/teamHub/mutations.gql b/dataconnect/connector/teamHub/mutations.gql deleted file mode 100644 index eeee0ce5..00000000 --- a/dataconnect/connector/teamHub/mutations.gql +++ /dev/null @@ -1,35 +0,0 @@ -mutation CreateTeamHub( - $teamId: UUID!, - $hubName: String!, - $departments: String -) @auth(level: USER) { - teamHub_insert( - data: { - teamId: $teamId - hubName: $hubName - departments: $departments - } - ) -} - -mutation UpdateTeamHub( - $id: UUID!, - $teamId: UUID, - $hubName: String, - $departments: String -) @auth(level: USER) { - teamHub_update( - id: $id, - data: { - teamId: $teamId - hubName: $hubName - departments: $departments - } - ) -} - -mutation DeleteTeamHub( - $id: UUID! -) @auth(level: USER) { - teamHub_delete(id: $id) -} diff --git a/dataconnect/connector/teamHub/queries.gql b/dataconnect/connector/teamHub/queries.gql deleted file mode 100644 index 93564956..00000000 --- a/dataconnect/connector/teamHub/queries.gql +++ /dev/null @@ -1,36 +0,0 @@ -query listTeamHub @auth(level: USER) { - teamHubs { - id - teamId - hubName - departments - } -} - -query getTeamHubById( - $id: UUID! -) @auth(level: USER) { - teamHub(id: $id) { - id - teamId - hubName - departments - } -} - -query filterTeamHub( - $teamId: UUID, - $hubName: String -) @auth(level: USER) { - teamHubs( - where: { - teamId: { eq: $teamId } - hubName: { eq: $hubName } - } - ) { - id - teamId - hubName - departments - } -} diff --git a/dataconnect/connector/teamMember/mutations.gql b/dataconnect/connector/teamMember/mutations.gql deleted file mode 100644 index e8ebfcc7..00000000 --- a/dataconnect/connector/teamMember/mutations.gql +++ /dev/null @@ -1,43 +0,0 @@ -mutation CreateTeamMember( - $teamId: UUID!, - $memberName: String!, - $email: String!, - $role: TeamMemberRole, - $isActive: Boolean -) @auth(level: USER) { - teamMember_insert( - data: { - teamId: $teamId - memberName: $memberName - email: $email - role: $role - isActive: $isActive - } - ) -} - -mutation UpdateTeamMember( - $id: UUID!, - $teamId: UUID, - $memberName: String, - $email: String, - $role: TeamMemberRole, - $isActive: Boolean -) @auth(level: USER) { - teamMember_update( - id: $id, - data: { - teamId: $teamId - memberName: $memberName - email: $email - role: $role - isActive: $isActive - } - ) -} - -mutation DeleteTeamMember( - $id: UUID! -) @auth(level: USER) { - teamMember_delete(id: $id) -} diff --git a/dataconnect/connector/teamMember/queries.gql b/dataconnect/connector/teamMember/queries.gql deleted file mode 100644 index 913b7c01..00000000 --- a/dataconnect/connector/teamMember/queries.gql +++ /dev/null @@ -1,48 +0,0 @@ -query listTeamMember @auth(level: USER) { - teamMembers { - id - teamId - memberName - email - role - isActive - } -} - -query getTeamMemberById( - $id: UUID! -) @auth(level: USER) { - teamMember(id: $id) { - id - teamId - memberName - email - role - isActive - } -} - -query filterTeamMember( - $teamId: UUID, - $memberName: String, - $email: String, - $role: TeamMemberRole, - $isActive: Boolean -) @auth(level: USER) { - teamMembers( - where: { - teamId: { eq: $teamId } - memberName: { eq: $memberName } - email: { eq: $email } - role: { eq: $role } - isActive: { eq: $isActive } - } - ) { - id - teamId - memberName - email - role - isActive - } -} diff --git a/dataconnect/connector/teamMemberInvite/mutations.gql b/dataconnect/connector/teamMemberInvite/mutations.gql deleted file mode 100644 index 54929422..00000000 --- a/dataconnect/connector/teamMemberInvite/mutations.gql +++ /dev/null @@ -1,36 +0,0 @@ -mutation CreateTeamMemberInvite( - $teamId: UUID!, - $email: String!, - $inviteStatus: TeamMemberInviteStatus! -) @auth(level: USER) { - teamMemberInvite_insert( - data: { - teamId: $teamId - email: $email - inviteStatus: $inviteStatus - # inviteCode se genera por default con uuidV4() - } - ) -} - -mutation UpdateTeamMemberInvite( - $id: UUID!, - $teamId: UUID, - $email: String, - $inviteStatus: TeamMemberInviteStatus -) @auth(level: USER) { - teamMemberInvite_update( - id: $id, - data: { - teamId: $teamId - email: $email - inviteStatus: $inviteStatus - } - ) -} - -mutation DeleteTeamMemberInvite( - $id: UUID! -) @auth(level: USER) { - teamMemberInvite_delete(id: $id) -} diff --git a/dataconnect/connector/teamMemberInvite/queries.gql b/dataconnect/connector/teamMemberInvite/queries.gql deleted file mode 100644 index 6314b8fd..00000000 --- a/dataconnect/connector/teamMemberInvite/queries.gql +++ /dev/null @@ -1,41 +0,0 @@ -query listTeamMemberInvite @auth(level: USER) { - teamMemberInvites { - id - teamId - inviteCode - email - inviteStatus - } -} - -query getTeamMemberInviteById( - $id: UUID! -) @auth(level: USER) { - teamMemberInvite(id: $id) { - id - teamId - inviteCode - email - inviteStatus - } -} - -query filterTeamMemberInvite( - $teamId: UUID, - $email: String, - $inviteStatus: TeamMemberInviteStatus -) @auth(level: USER) { - teamMemberInvites( - where: { - teamId: { eq: $teamId } - email: { eq: $email } - inviteStatus: { eq: $inviteStatus } - } - ) { - id - teamId - inviteCode - email - inviteStatus - } -} diff --git a/dataconnect/connector/user/mutations.gql b/dataconnect/connector/user/mutations.gql deleted file mode 100644 index 80fdbd8d..00000000 --- a/dataconnect/connector/user/mutations.gql +++ /dev/null @@ -1,45 +0,0 @@ -mutation CreateUser( - $id: String!, # Firebase UID - $email: String!, - $fullName: String!, - $role: UserBaseRole!, - $userRole: String, - $photoUrl: String -) @auth(level: USER) { - user_insert( - data: { - id: $id - email: $email - fullName: $fullName - role: $role - userRole: $userRole - photoUrl: $photoUrl - } - ) -} - -mutation UpdateUser( - $id: String!, - $email: String, - $fullName: String, - $role: UserBaseRole, - $userRole: String, - $photoUrl: String -) @auth(level: USER) { - user_update( - id: $id, - data: { - email: $email - fullName: $fullName - role: $role - userRole: $userRole - photoUrl: $photoUrl - } - ) -} - -mutation DeleteUser( - $id: String! -) @auth(level: USER) { - user_delete(id: $id) -} diff --git a/dataconnect/connector/user/queries.gql b/dataconnect/connector/user/queries.gql deleted file mode 100644 index 044abebf..00000000 --- a/dataconnect/connector/user/queries.gql +++ /dev/null @@ -1,48 +0,0 @@ -query listUsers @auth(level: USER) { - users { - id - email - fullName - role - userRole - photoUrl - createdDate - updatedDate - } -} - -query getUserById( - $id: String! -) @auth(level: USER) { - user(id: $id) { - id - email - fullName - role - userRole - photoUrl - } -} - -query filterUsers( - $id: String, - $email: String, - $role: UserBaseRole, - $userRole: String -) @auth(level: USER) { - users( - where: { - id: { eq: $id } - email: { eq: $email } - role: { eq: $role } - userRole: { eq: $userRole } - } - ) { - id - email - fullName - role - userRole - photoUrl - } -} diff --git a/dataconnect/connector/vendor/mutations.gql b/dataconnect/connector/vendor/mutations.gql deleted file mode 100644 index c40b1119..00000000 --- a/dataconnect/connector/vendor/mutations.gql +++ /dev/null @@ -1,52 +0,0 @@ -mutation CreateVendor( - $vendorNumber: String!, - $legalName: String!, - $region: VendorRegion!, - $platformType: VendorPlatformType!, - $primaryContactEmail: String!, - $approvalStatus: VendorApprovalStatus!, - $isActive: Boolean -) @auth(level: USER) { - vendor_insert( - data: { - vendorNumber: $vendorNumber - legalName: $legalName - region: $region - platformType: $platformType - primaryContactEmail: $primaryContactEmail - approvalStatus: $approvalStatus - isActive: $isActive - } - ) -} - -mutation UpdateVendor( - $id: UUID!, - $vendorNumber: String, - $legalName: String, - $region: VendorRegion, - $platformType: VendorPlatformType, - $primaryContactEmail: String, - $approvalStatus: VendorApprovalStatus, - $isActive: Boolean -) @auth(level: USER) { - vendor_update( - id: $id, - data: { - vendorNumber: $vendorNumber - legalName: $legalName - region: $region - platformType: $platformType - primaryContactEmail: $primaryContactEmail - approvalStatus: $approvalStatus - isActive: $isActive - } - ) -} - -mutation DeleteVendor( - $id: UUID! -) @auth(level: USER) { - vendor_delete(id: $id) -} - diff --git a/dataconnect/connector/vendor/queries.gql b/dataconnect/connector/vendor/queries.gql deleted file mode 100644 index c1d0e700..00000000 --- a/dataconnect/connector/vendor/queries.gql +++ /dev/null @@ -1,57 +0,0 @@ -query listVendor @auth(level: USER) { - vendors { - id - vendorNumber - legalName - region - platformType - primaryContactEmail - approvalStatus - isActive - } -} - -query getVendorById( - $id: UUID! -) @auth(level: USER) { - vendor(id: $id) { - id - vendorNumber - legalName - region - platformType - primaryContactEmail - approvalStatus - isActive - } -} - -query filterVendors( - $region: VendorRegion, - $approvalStatus: VendorApprovalStatus, - $isActive: Boolean, - $vendorNumber:String, - $primaryContactEmail:String, - $legalName: String, - $platformType: VendorPlatformType -) @auth(level: USER) { - vendors(where:{ - region: { eq: $region } - approvalStatus: { eq: $approvalStatus } - isActive: { eq: $isActive } - vendorNumber: { eq: $vendorNumber } - primaryContactEmail: { eq: $primaryContactEmail } - legalName: { eq: $legalName } - platformType: { eq: $platformType } - - }) { - id - vendorNumber - legalName - region - platformType - primaryContactEmail - approvalStatus - isActive - } -} \ No newline at end of file diff --git a/dataconnect/connector/vendorDefaultSettings/mutations.gql b/dataconnect/connector/vendorDefaultSettings/mutations.gql deleted file mode 100644 index 79289ede..00000000 --- a/dataconnect/connector/vendorDefaultSettings/mutations.gql +++ /dev/null @@ -1,35 +0,0 @@ -mutation CreateVendorDefaultSetting( - $vendorName: String!, - $defaultMarkupPercentage: Float!, - $defaultVendorFeePercentage: Float! -) @auth(level: USER) { - vendorDefaultSetting_insert( - data: { - vendorName: $vendorName - defaultMarkupPercentage: $defaultMarkupPercentage - defaultVendorFeePercentage: $defaultVendorFeePercentage - } - ) -} - -mutation UpdateVendorDefaultSetting( - $id: UUID!, - $vendorName: String, - $defaultMarkupPercentage: Float, - $defaultVendorFeePercentage: Float -) @auth(level: USER) { - vendorDefaultSetting_update( - id: $id, - data: { - vendorName: $vendorName - defaultMarkupPercentage: $defaultMarkupPercentage - defaultVendorFeePercentage: $defaultVendorFeePercentage - } - ) -} - -mutation DeleteVendorDefaultSetting( - $id: UUID! -) @auth(level: USER) { - vendorDefaultSetting_delete(id: $id) -} diff --git a/dataconnect/connector/vendorDefaultSettings/queries.gql b/dataconnect/connector/vendorDefaultSettings/queries.gql deleted file mode 100644 index 7407d306..00000000 --- a/dataconnect/connector/vendorDefaultSettings/queries.gql +++ /dev/null @@ -1,38 +0,0 @@ -query listVendorDefaultSettings @auth(level: USER) { - vendorDefaultSettings { - id - vendorName - defaultMarkupPercentage - defaultVendorFeePercentage - } -} - -query getVendorDefaultSettingById( - $id: UUID! -) @auth(level: USER) { - vendorDefaultSetting(id: $id) { - id - vendorName - defaultMarkupPercentage - defaultVendorFeePercentage - } -} - -query filterVendorDefaultSettings( - $vendorName: String, - $defaultMarkupPercentage: Float, - $defaultVendorFeePercentage: Float -) @auth(level: USER) { - vendorDefaultSettings( - where: { - vendorName: { eq: $vendorName } - defaultMarkupPercentage: { eq: $defaultMarkupPercentage } - defaultVendorFeePercentage: { eq: $defaultVendorFeePercentage } - } - ) { - id - vendorName - defaultMarkupPercentage - defaultVendorFeePercentage - } -} diff --git a/dataconnect/connector/vendorRate/mutations.gql b/dataconnect/connector/vendorRate/mutations.gql deleted file mode 100644 index b4f2092b..00000000 --- a/dataconnect/connector/vendorRate/mutations.gql +++ /dev/null @@ -1,51 +0,0 @@ -mutation CreateVendorRate( - $vendorName: String!, - $category: VendorRateCategory!, - $roleName: String!, - $employeeWage: Float!, - $markupPercentage: Float, - $vendorFeePercentage: Float, - $clientRate: Float! -) @auth(level: USER) { - vendorRate_insert( - data: { - vendorName: $vendorName - category: $category - roleName: $roleName - employeeWage: $employeeWage - markupPercentage: $markupPercentage - vendorFeePercentage: $vendorFeePercentage - clientRate: $clientRate - } - ) -} - -mutation UpdateVendorRate( - $id: UUID!, - $vendorName: String, - $category: VendorRateCategory, - $roleName: String, - $employeeWage: Float, - $markupPercentage: Float, - $vendorFeePercentage: Float, - $clientRate: Float -) @auth(level: USER) { - vendorRate_update( - id: $id, - data: { - vendorName: $vendorName - category: $category - roleName: $roleName - employeeWage: $employeeWage - markupPercentage: $markupPercentage - vendorFeePercentage: $vendorFeePercentage - clientRate: $clientRate - } - ) -} - -mutation DeleteVendorRate( - $id: UUID! -) @auth(level: USER) { - vendorRate_delete(id: $id) -} diff --git a/dataconnect/connector/vendorRate/queries.gql b/dataconnect/connector/vendorRate/queries.gql deleted file mode 100644 index 2f1dcac2..00000000 --- a/dataconnect/connector/vendorRate/queries.gql +++ /dev/null @@ -1,56 +0,0 @@ -query listVendorRate @auth(level: USER) { - vendorRates { - id - vendorName - category - roleName - employeeWage - markupPercentage - vendorFeePercentage - clientRate - } -} - -query getVendorRateById( - $id: UUID! -) @auth(level: USER) { - vendorRate(id: $id) { - id - vendorName - category - roleName - employeeWage - markupPercentage - vendorFeePercentage - clientRate - createdDate - updatedDate - createdBy - } -} - -query filterVendorRates( - $vendorName: String, - $category: VendorRateCategory, - $roleName: String, - $minClientRate: Float, - $maxClientRate: Float -) @auth(level: USER) { - vendorRates( - where: { - vendorName: { eq: $vendorName } - category: { eq: $category } - roleName: { eq: $roleName } - clientRate: { ge: $minClientRate, le: $maxClientRate } - } - ) { - id - vendorName - category - roleName - employeeWage - markupPercentage - vendorFeePercentage - clientRate - } -} diff --git a/dataconnect/connector/workforce/mutations.gql b/dataconnect/connector/workforce/mutations.gql deleted file mode 100644 index 5cf76640..00000000 --- a/dataconnect/connector/workforce/mutations.gql +++ /dev/null @@ -1,43 +0,0 @@ -mutation CreateWorkforce( - $workforceNumber: String!, - $vendorId: UUID!, - $firstName: String!, - $lastName: String!, - $employmentType: WorkforceEmploymentType -) @auth(level: USER) { - workforce_insert( - data: { - workforceNumber: $workforceNumber - vendorId: $vendorId - firstName: $firstName - lastName: $lastName - employmentType: $employmentType - } - ) -} - -mutation UpdateWorkforce( - $id: UUID!, - $workforceNumber: String, - $vendorId: UUID, - $firstName: String, - $lastName: String, - $employmentType: WorkforceEmploymentType -) @auth(level: USER) { - workforce_update( - id: $id, - data: { - workforceNumber: $workforceNumber - vendorId: $vendorId - firstName: $firstName - lastName: $lastName - employmentType: $employmentType - } - ) -} - -mutation DeleteWorkforce( - $id: UUID! -) @auth(level: USER) { - workforce_delete(id: $id) -} diff --git a/dataconnect/connector/workforce/queries.gql b/dataconnect/connector/workforce/queries.gql deleted file mode 100644 index ee7e20ad..00000000 --- a/dataconnect/connector/workforce/queries.gql +++ /dev/null @@ -1,48 +0,0 @@ -query listWorkforce @auth(level: USER) { - workforces { - id - workforceNumber - vendorId - firstName - lastName - employmentType - } -} - -query getWorkforceById( - $id: UUID! -) @auth(level: USER) { - workforce(id: $id) { - id - workforceNumber - vendorId - firstName - lastName - employmentType - } -} - -query filterWorkforce( - $workforceNumber: String, - $vendorId: UUID, - $firstName: String, - $lastName: String, - $employmentType: WorkforceEmploymentType -) @auth(level: USER) { - workforces( - where: { - workforceNumber: { eq: $workforceNumber } - vendorId: { eq: $vendorId } - firstName: { eq: $firstName } - lastName: { eq: $lastName } - employmentType: { eq: $employmentType } - } - ) { - id - workforceNumber - vendorId - firstName - lastName - employmentType - } -} diff --git a/dataconnect/dataconnect.yaml b/dataconnect/dataconnect.yaml deleted file mode 100644 index 39e01fdb..00000000 --- a/dataconnect/dataconnect.yaml +++ /dev/null @@ -1,13 +0,0 @@ -specVersion: "v1" -serviceId: "krow-workforce-db" -location: "us-central1" -schema: - source: "./schema" - datasource: - postgresql: - database: "krow_db" - cloudSql: - instanceId: "krow-sql" - # schemaValidation: "STRICT" # STRICT mode makes Postgres schema match Data Connect exactly. - # schemaValidation: "COMPATIBLE" # COMPATIBLE mode makes Postgres schema compatible with Data Connect. -connectorDirs: ["./connector"] diff --git a/dataconnect/example/connector.yaml b/dataconnect/example/connector.yaml deleted file mode 100644 index 638ba927..00000000 --- a/dataconnect/example/connector.yaml +++ /dev/null @@ -1,8 +0,0 @@ -connectorId: example -generate: - javascriptSdk: - - outputDir: ../../frontend-web/src/dataconnect-generated - package: "@dataconnect/generated" - packageJsonDir: ../../frontend-web - react: true - angular: false diff --git a/dataconnect/example/mutations.gql b/dataconnect/example/mutations.gql deleted file mode 100644 index 1ae8a192..00000000 --- a/dataconnect/example/mutations.gql +++ /dev/null @@ -1,33 +0,0 @@ -# Example mutations for a simple movie app - -# Create a movie based on user input -mutation CreateMovie($title: String!, $genre: String!, $imageUrl: String!) -@auth(level: USER_EMAIL_VERIFIED, insecureReason: "Any email verified users can create a new movie.") { - movie_insert(data: { title: $title, genre: $genre, imageUrl: $imageUrl }) -} - -# Upsert (update or insert) a user's username based on their auth.uid -mutation UpsertUser($username: String!) @auth(level: USER) { - # The "auth.uid" server value ensures that users can only register their own user. - user_upsert(data: { id_expr: "auth.uid", username: $username }) -} - -# Add a review for a movie -mutation AddReview($movieId: UUID!, $rating: Int!, $reviewText: String!) -@auth(level: USER) { - review_upsert( - data: { - userId_expr: "auth.uid" - movieId: $movieId - rating: $rating - reviewText: $reviewText - # reviewDate defaults to today in the schema. No need to set it manually. - } - ) -} - -# Logged in user can delete their review for a movie -mutation DeleteReview($movieId: UUID!) @auth(level: USER) { - # The "auth.uid" server value ensures that users can only delete their own reviews. - review_delete(key: { userId_expr: "auth.uid", movieId: $movieId }) -} diff --git a/dataconnect/example/queries.gql b/dataconnect/example/queries.gql deleted file mode 100644 index df14db09..00000000 --- a/dataconnect/example/queries.gql +++ /dev/null @@ -1,78 +0,0 @@ -# Example queries for a simple movie app. - -# @auth() directives control who can call each operation. -# Anyone should be able to list all movies, so the auth level is set to PUBLIC -query ListMovies @auth(level: PUBLIC, insecureReason: "Anyone can list all movies.") { - movies { - id - title - imageUrl - genre - } -} - -# List all users, only admins should be able to list all users, so we use NO_ACCESS -query ListUsers @auth(level: NO_ACCESS) { - users { - id - username - } -} - -# Logged in users can list all their reviews and movie titles associated with the review -# Since the query uses the uid of the current authenticated user, we set auth level to USER -query ListUserReviews @auth(level: USER) { - user(key: { id_expr: "auth.uid" }) { - id - username - # _on_ makes it easy to grab info from another table - # Here, we use it to grab all the reviews written by the user. - reviews: reviews_on_user { - rating - reviewDate - reviewText - movie { - id - title - } - } - } -} - -# Get movie by id -query GetMovieById($id: UUID!) @auth(level: PUBLIC, insecureReason: "Anyone can get a movie by id.") { - movie(id: $id) { - id - title - imageUrl - genre - metadata: movieMetadata_on_movie { - rating - releaseYear - description - } - reviews: reviews_on_movie { - reviewText - reviewDate - rating - user { - id - username - } - } - } -} - -# Search for movies, actors, and reviews -query SearchMovie($titleInput: String, $genre: String) @auth(level: PUBLIC, insecureReason: "Anyone can search for movies.") { - movies( - where: { - _and: [{ genre: { eq: $genre } }, { title: { contains: $titleInput } }] - } - ) { - id - title - genre - imageUrl - } -} diff --git a/dataconnect/example/schema.gql b/dataconnect/example/schema.gql deleted file mode 100644 index 9ceb0373..00000000 --- a/dataconnect/example/schema.gql +++ /dev/null @@ -1,52 +0,0 @@ -# Example schema for simple movie review app - -# User table is keyed by Firebase Auth UID. -type User @table { - # `@default(expr: "auth.uid")` sets it to Firebase Auth UID during insert and upsert. - id: String! @default(expr: "auth.uid") - username: String! @col(dataType: "varchar(50)") - # The `user: User!` field in the Review table generates the following one-to-many query field. - # reviews_on_user: [Review!]! - # The `Review` join table the following many-to-many query field. - # movies_via_Review: [Movie!]! -} - -# Movie is keyed by a randomly generated UUID. -type Movie @table { - # If you do not pass a 'key' to `@table`, Data Connect automatically adds the following 'id' column. - # Feel free to uncomment and customize it. - # id: UUID! @default(expr: "uuidV4()") - title: String! - imageUrl: String! - genre: String -} - -# MovieMetadata is a metadata attached to a Movie. -# Movie <-> MovieMetadata is a one-to-one relationship -type MovieMetadata @table { - # @unique ensures each Movie can only one MovieMetadata. - movie: Movie! @unique - # The movie field adds the following foreign key field. Feel free to uncomment and customize it. - # movieId: UUID! - rating: Float - releaseYear: Int - description: String -} - -# Reviews is a join table between User and Movie. -# It has a composite primary keys `userUid` and `movieId`. -# A user can leave reviews for many movies. A movie can have reviews from many users. -# User <-> Review is a one-to-many relationship -# Movie <-> Review is a one-to-many relationship -# Movie <-> User is a many-to-many relationship -type Review @table(name: "Reviews", key: ["movie", "user"]) { - user: User! - # The user field adds the following foreign key field. Feel free to uncomment and customize it. - # userUid: String! - movie: Movie! - # The movie field adds the following foreign key field. Feel free to uncomment and customize it. - # movieId: UUID! - rating: Int - reviewText: String - reviewDate: Date! @default(expr: "request.time") -} diff --git a/dataconnect/schema/VendorRate.gql b/dataconnect/schema/VendorRate.gql deleted file mode 100644 index 3f1de48f..00000000 --- a/dataconnect/schema/VendorRate.gql +++ /dev/null @@ -1,25 +0,0 @@ -enum VendorRateCategory { - KITCHEN_AND_CULINARY - CONCESSIONS - FACILITIES - BARTENDING - SECURITY - EVENT_STAFF - MANAGEMENT - TECHNICAL - OTHER -} - -type VendorRate @table(name: "vendor_rates") { - id: UUID! @default(expr: "uuidV4()") - vendorName: String! - category: VendorRateCategory! - roleName: String! - employeeWage: Float! - markupPercentage: Float - vendorFeePercentage: Float - clientRate: Float! - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/activityLog.gql b/dataconnect/schema/activityLog.gql deleted file mode 100644 index 985fa8af..00000000 --- a/dataconnect/schema/activityLog.gql +++ /dev/null @@ -1,23 +0,0 @@ -enum ActivityType { - EVENT_CREATED - EVENT_UPDATED - STAFF_ASSIGNED - INVOICE_PAID - INVOICE_CREATED - VENDOR_APPROVED - MESSAGE_RECEIVED -} - -type ActivityLog @table(name: "activity_logs") { - id: UUID! @default(expr: "uuidV4()") - title: String! - description: String! - activityType: ActivityType! - userId: String! # user_id (FK lógica a User.id) - isRead: Boolean @default(expr: "false") - iconType: String - iconColor: String - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} \ No newline at end of file diff --git a/dataconnect/schema/assignment.gql b/dataconnect/schema/assignment.gql deleted file mode 100644 index 0f791604..00000000 --- a/dataconnect/schema/assignment.gql +++ /dev/null @@ -1,23 +0,0 @@ -enum AssignmentStatus { - PENDING - CONFIRMED - CHECKED_IN - IN_PROGRESS - COMPLETED - CANCELLED - NO_SHOW -} - -type Assignment @table(name: "assignments") { - id: UUID! @default(expr: "uuidV4()") - assignmentNumber: String - orderId: UUID! # order_id (FK lógica a Order.id) - workforceId: UUID! # workforce_id (FK lógica a Workforce.id) - vendorId: UUID! # vendor_id (FK lógica a Vendor.id) - role: String! - assignmentStatus: AssignmentStatus! - scheduledStart: Timestamp! - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/business.gql b/dataconnect/schema/business.gql deleted file mode 100644 index b517aaf6..00000000 --- a/dataconnect/schema/business.gql +++ /dev/null @@ -1,34 +0,0 @@ -enum BusinessSector { - BON_APPETIT - EUREST - ARAMARK - EPICUREAN_GROUP - CHARTWELLS - OTHER -} - -enum BusinessRateGroup { - STANDARD - PREMIUM - ENTERPRISE - CUSTOM -} - -enum BusinessStatus { - ACTIVE - INACTIVE - PENDING -} - -type Business @table(name: "business") { - id: UUID! @default(expr: "uuidV4()") - businessName: String! - contactName: String! - email: String - sector: BusinessSector - rateGroup: BusinessRateGroup! - status: BusinessStatus - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/certification.gql b/dataconnect/schema/certification.gql deleted file mode 100644 index b755ffc1..00000000 --- a/dataconnect/schema/certification.gql +++ /dev/null @@ -1,37 +0,0 @@ -enum CertificationType { - LEGAL - OPERATIONAL - SAFETY - TRAINING - LICENSE - OTHER -} - -enum CertificationStatus { - CURRENT - EXPIRING_SOON - EXPIRED - PENDING_VALIDATION -} - -enum CertificationValidationStatus { - APPROVED - PENDING_EXPERT_REVIEW - REJECTED - AI_VERIFIED - AI_FLAGGED - MANUAL_REVIEW_NEEDED -} - -type Certification @table(name: "certification") { - id: UUID! @default(expr: "uuidV4()") - employeeName: String! - certificationName: String! - certificationType: CertificationType - status: CertificationStatus - expiryDate: String! - validationStatus: CertificationValidationStatus - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/conversation.gql b/dataconnect/schema/conversation.gql deleted file mode 100644 index 45114f19..00000000 --- a/dataconnect/schema/conversation.gql +++ /dev/null @@ -1,26 +0,0 @@ -enum ConversationType { - CLIENT_VENDOR - STAFF_CLIENT - STAFF_ADMIN - VENDOR_ADMIN - CLIENT_ADMIN - GROUP_STAFF - GROUP_EVENT_STAFF -} - -enum ConversationStatus { - ACTIVE - ARCHIVED - CLOSED -} - -type Conversation @table(name: "conversations") { - id: UUID! @default(expr: "uuidV4()") - participants: String! # participants (jsonb -> String, required array of strings) - conversationType: ConversationType! - relatedTo: UUID! # related_to (generic FK as string) - status: ConversationStatus - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/enterprise.gql b/dataconnect/schema/enterprise.gql deleted file mode 100644 index ad3d52dd..00000000 --- a/dataconnect/schema/enterprise.gql +++ /dev/null @@ -1,9 +0,0 @@ -type Enterprise @table(name: "enterprise") { - id: UUID! @default(expr: "uuidV4()") - enterpriseNumber: String! - enterpriseName: String! - enterpriseCode: String! - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/event.gql b/dataconnect/schema/event.gql deleted file mode 100644 index d1de38ea..00000000 --- a/dataconnect/schema/event.gql +++ /dev/null @@ -1,84 +0,0 @@ - -enum EventStatus { - DRAFT - ACTIVE - PENDING - ASSIGNED - CONFIRMED - COMPLETED - CANCELED - PARTIAL - PARTIAL_STAFFED - FULLY_STAFFED - EVENT_CREATED -} - -enum RecurrenceType { - SINGLE - DATE_RANGE - SCATTER -} - -#enums cant start by a number, reason of C1099 -enum ContractType { - W2 - C1099 - TEMP - CONTRACT -} - -type Event @table(name: "events") { - - id: UUID! @default(expr: "uuidV4()") - eventName: String! - isRapid: Boolean @default(expr: "false") - isRecurring: Boolean @default(expr: "false") - isMultiDay: Boolean @default(expr: "false") - recurrenceType: RecurrenceType - recurrenceStartDate: Timestamp - recurrenceEndDate: Timestamp - scatterDates: Any - multiDayStartDate: Timestamp - multiDayEndDate: Timestamp - bufferTimeBefore: Float @default(expr: "0") - bufferTimeAfter: Float @default(expr: "0") - conflictDetectionEnabled: Boolean @default(expr: "true") - detectedConflicts: Any - businessId: UUID! - businessName: String - vendorId: String @default(expr: "auth.uid") - vendorName: String - hub: String - eventLocation: String - contractType: ContractType - poReference: String - status: EventStatus! - date: String! - shifts: Any - addons: Any - total: Float - clientName: String - clientEmail: String - clientPhone: String - invoiceId: UUID - notes: String - requested: Int @default(expr: "0") - assignedStaff: Any - orderType: String - department: String - recurringStartDate: String - recurringEndDate: String - recurringDays: Any - permanentStartDate: String - permanentDays: Any - includeBackup: Boolean - backupStaffCount: Int - recurringTime: String - permanentTime: String - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") - -} - - diff --git a/dataconnect/schema/invoice.gql b/dataconnect/schema/invoice.gql deleted file mode 100644 index a391d417..00000000 --- a/dataconnect/schema/invoice.gql +++ /dev/null @@ -1,26 +0,0 @@ -enum InvoiceStatus { - DRAFT - PENDING_REVIEW - APPROVED - DISPUTED - UNDER_REVIEW - RESOLVED - OVERDUE - PAID - RECONCILED - CANCELLED -} - -type Invoice @table(name: "invoices") { - id: UUID! @default(expr: "uuidV4()") - invoiceNumber: String! - amount: Float! - status: InvoiceStatus! - issueDate: Timestamp! - dueDate: Timestamp! - disputedItems: String - isAutoGenerated: Boolean @default(expr: "false") # is_auto_generated - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/message.gql b/dataconnect/schema/message.gql deleted file mode 100644 index bbdd322c..00000000 --- a/dataconnect/schema/message.gql +++ /dev/null @@ -1,10 +0,0 @@ -type Message @table(name: "messages") { - id: UUID! @default(expr: "uuidV4()") - conversationId: UUID! # conversation_id (FK lógica a Conversation.id) - senderName: String! - content: String! - readBy: String # read_by (jsonb -> String, array de user IDs) - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/order.gql b/dataconnect/schema/order.gql deleted file mode 100644 index 7d216f34..00000000 --- a/dataconnect/schema/order.gql +++ /dev/null @@ -1,26 +0,0 @@ -enum OrderType { - STANDARD - LAST_MINUTE - EMERGENCY - RECURRING -} - -enum OrderStatus { - DRAFT - SUBMITTED - CONFIRMED - IN_PROGRESS - COMPLETED - CANCELLED -} - -type Order @table(name: "orders") { - id: UUID! @default(expr: "uuidV4()") - orderNumber: String! - partnerId: UUID! - orderType: OrderType - orderStatus: OrderStatus - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/partner.gql b/dataconnect/schema/partner.gql deleted file mode 100644 index 07047155..00000000 --- a/dataconnect/schema/partner.gql +++ /dev/null @@ -1,17 +0,0 @@ -enum PartnerType { - CORPORATE - EDUCATION - HEALTHCARE - SPORTS_ENTERTAINMENT - GOVERNMENT -} - -type Partner @table(name: "partner") { - id: UUID! @default(expr: "uuidV4()") - partnerName: String! - partnerNumber: String! - partnerType: PartnerType # partner_type - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/sector.gql b/dataconnect/schema/sector.gql deleted file mode 100644 index 61255652..00000000 --- a/dataconnect/schema/sector.gql +++ /dev/null @@ -1,18 +0,0 @@ -enum SectorType { - FOOD_SERVICE - FACILITIES - HEALTHCARE - EDUCATION - CORPORATE - SPORTS_ENTERTAINMENT -} - -type Sector @table(name: "sector") { - id: UUID! @default(expr: "uuidV4()") - sectorNumber: String! - sectorName: String! - sectorType: SectorType - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/shift.gql b/dataconnect/schema/shift.gql deleted file mode 100644 index 8affd9ca..00000000 --- a/dataconnect/schema/shift.gql +++ /dev/null @@ -1,10 +0,0 @@ -type Shift @table(name: "shifts") { - id: UUID! @default(expr: "uuidV4()") - shiftName: String! - startDate: Timestamp! - endDate: Timestamp - assignedStaff: String # assigned_staff (jsonb -> String, array de objects) - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/staff.gql b/dataconnect/schema/staff.gql deleted file mode 100644 index 3c2cffb4..00000000 --- a/dataconnect/schema/staff.gql +++ /dev/null @@ -1,85 +0,0 @@ -enum EmploymentType { - FULL_TIME - PART_TIME - ON_CALL - WEEKENDS - SPECIFIC_DAYS - SEASONAL - MEDICAL_LEAVE -} - -enum StaffDepartment { - OPERATIONS - SALES - HR - FINANCE - IT - MARKETING - CUSTOMER_SERVICE - LOGISTICS -} - -enum ProfileType { - SKILLED - BEGINNER - CROSS_TRAINED -} - -enum EnglishLevel { - FLUENT - INTERMEDIATE - BASIC - NONE -} - -enum BackgroundCheckStatus { - PENDING - CLEARED - FAILED - EXPIRED - NOT_REQUIRED -} - -type Staff @table(name: "staffs") { - id: UUID! @default(expr: "uuidV4()") - employeeName: String! @col(name: "employee_name") - initial:String@col(name:"initial") # nuevo - vendorId: String @default(expr: "auth.uid")#String @col(name: "vendor_id") # vendor_id (FK lógica a Vendor.id) - vendorName: String @col(name: "vendor_name") - manager: String - contactNumber: String @col(name: "contact_number") - phone: String @col(name:"phone") # nuevo - email: String - department: StaffDepartment - hubLocation: String @col(name: "hub_location") - eventLocation:String@col(name:"event_location") # nuevo - address:String@col(name:"address") # nuevo - city:String@col(name:"city") # nuevo - track: String - position: String - position2: String @col(name:"position_2") # nuevo - profileType: ProfileType @col(name: "profile_type") - employmentType: EmploymentType @col(name: "employment_type") - english: EnglishLevel - rate: Float - rating: Float - reliabilityScore: Int @col(name: "reliability_score") - backgroundCheckStatus: BackgroundCheckStatus @col(name: "background_check_status") - notes: String - accountingComments: String @col(name:"accounting_comments") # nuevo - shiftCoveragePercentage: Int @col(name:"shift_coverage_percentage") # nuevo - cancellationCount: Int @col(name:"cancellation_count") # nuevo - noShowCount: Int @col(name:"no_show_count") # nuevo - totalShifts: Int @col(name:"total_shifts") # nuevo - invoiced: Boolean @default(expr:"false") # nuevo - englishRequired: Boolean @col(name:"english_required")@default(expr:"false") # nuevo - checkIn: String @col(name:"check_in") # nuevo - scheduleDays: String @col(name:"schedule_days") # nuevo - replacedBy: String @col(name:"replaced_by") # nuevo - action: String # nuevo - ro: String # nuevo - mon: String # nuevo - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/team.gql b/dataconnect/schema/team.gql deleted file mode 100644 index 73cc76c7..00000000 --- a/dataconnect/schema/team.gql +++ /dev/null @@ -1,22 +0,0 @@ -enum TeamOwnerRole { - ADMIN - PROCUREMENT - OPERATOR - SECTOR - CLIENT - VENDOR - WORKFORCE -} - -type Team @table(name: "team") { - id: UUID! @default(expr: "uuidV4()") - teamName: String! - ownerId: String! - ownerName: String! - ownerRole: TeamOwnerRole! - favoriteStaff: String - blockedStaff: String - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/teamHub.gql b/dataconnect/schema/teamHub.gql deleted file mode 100644 index f299c999..00000000 --- a/dataconnect/schema/teamHub.gql +++ /dev/null @@ -1,9 +0,0 @@ -type TeamHub @table(name: "team_hubs") { - id: UUID! @default(expr: "uuidV4()") - teamId: UUID! - hubName: String! - departments: String - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/teamMember.gql b/dataconnect/schema/teamMember.gql deleted file mode 100644 index f58eaeec..00000000 --- a/dataconnect/schema/teamMember.gql +++ /dev/null @@ -1,18 +0,0 @@ -enum TeamMemberRole { - ADMIN - MANAGER - MEMBER - VIEWER -} - -type TeamMember @table(name: "team_members") { - id: UUID! @default(expr: "uuidV4()") - teamId: UUID! - memberName: String! - email: String! - role: TeamMemberRole - isActive: Boolean @default(expr: "true") - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/teamMemberInvite.gql b/dataconnect/schema/teamMemberInvite.gql deleted file mode 100644 index afdee310..00000000 --- a/dataconnect/schema/teamMemberInvite.gql +++ /dev/null @@ -1,17 +0,0 @@ -enum TeamMemberInviteStatus { - PENDING - ACCEPTED - EXPIRED - CANCELLED -} - -type TeamMemberInvite @table(name: "team_member_invites") { - id: UUID! @default(expr: "uuidV4()") - teamId: UUID! - inviteCode: String! @default(expr: "uuidV4()") - email: String! - inviteStatus: TeamMemberInviteStatus! - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/user.gql b/dataconnect/schema/user.gql deleted file mode 100644 index 0d216676..00000000 --- a/dataconnect/schema/user.gql +++ /dev/null @@ -1,16 +0,0 @@ -enum UserBaseRole { - ADMIN - USER -} - -type User @table(name: "users") { - id: String! # user_id / uid de Firebase - email: String! - fullName: String! - role: UserBaseRole! - userRole: String - photoUrl: String - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/vendor.gql b/dataconnect/schema/vendor.gql deleted file mode 100644 index 29d57ea5..00000000 --- a/dataconnect/schema/vendor.gql +++ /dev/null @@ -1,38 +0,0 @@ -enum VendorRegion { - NATIONAL - BAY_AREA - SOUTHERN_CALIFORNIA - NORTHERN_CALIFORNIA - WEST - EAST - MIDWEST - SOUTH -} - -enum VendorPlatformType { - FULL_PLATFORM - BUILDING_PLATFORM - PARTIAL_TECH - TRADITIONAL -} - -enum VendorApprovalStatus { - PENDING - APPROVED - SUSPENDED - TERMINATED -} - -type Vendor @table(name: "vendors") { - id: UUID! @default(expr: "uuidV4()") - vendorNumber: String! - legalName: String! - region: VendorRegion! - platformType: VendorPlatformType! - primaryContactEmail: String! - approvalStatus: VendorApprovalStatus! - isActive: Boolean @default(value: true) - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/vendorDefaultSettings.gql b/dataconnect/schema/vendorDefaultSettings.gql deleted file mode 100644 index 3ced1140..00000000 --- a/dataconnect/schema/vendorDefaultSettings.gql +++ /dev/null @@ -1,9 +0,0 @@ -type VendorDefaultSetting @table(name: "vendor_default_settings") { - id: UUID! @default(expr: "uuidV4()") - vendorName: String! - defaultMarkupPercentage: Float! - defaultVendorFeePercentage: Float! - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/schema/workforce.gql b/dataconnect/schema/workforce.gql deleted file mode 100644 index 4962aa92..00000000 --- a/dataconnect/schema/workforce.gql +++ /dev/null @@ -1,19 +0,0 @@ -# enums cant start by a number, reason of W1099 -enum WorkforceEmploymentType { - W2 - W1099 - TEMPORARY - CONTRACT -} - -type Workforce @table(name: "workforce") { - id: UUID! @default(expr: "uuidV4()") - workforceNumber: String! - vendorId: UUID! # vendor_id (FK lógica a Vendor.id) - firstName: String! - lastName: String! - employmentType: WorkforceEmploymentType # employment_type - createdDate: Timestamp @default(expr: "request.time") - updatedDate: Timestamp @default(expr: "request.time") - createdBy: String @default(expr: "auth.uid") -} diff --git a/dataconnect/seed_data.gql b/dataconnect/seed_data.gql deleted file mode 100644 index 76b2bc8c..00000000 --- a/dataconnect/seed_data.gql +++ /dev/null @@ -1,279 +0,0 @@ -mutation @transaction { - movie_insertMany( - data: [ - { - id: "550e8400-e29b-41d4-a716-446655440000", - title: "Quantum Paradox", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fquantum_paradox.jpeg?alt=media&token=4142e2a1-bf43-43b5-b7cf-6616be3fd4e3", - genre: "sci-fi" - }, - { - id: "550e8400-e29b-41d4-a716-446655440001", - title: "The Lone Outlaw", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Flone_outlaw.jpeg?alt=media&token=15525ffc-208f-4b59-b506-ae8348e06e85", - genre: "western" - }, - { - id: "550e8400-e29b-41d4-a716-446655440002", - title: "Celestial Harmony", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fcelestial_harmony.jpeg?alt=media&token=3edf1cf9-c2f5-4c75-9819-36ff6a734c9a", - genre: "romance" - }, - { - id: "550e8400-e29b-41d4-a716-446655440003", - title: "Noir Mystique", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fnoir_mystique.jpeg?alt=media&token=3299adba-cb98-4302-8b23-aeb679a4f913", - genre: "mystery" - }, - { - id: "550e8400-e29b-41d4-a716-446655440004", - title: "The Forgotten Island", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fforgotten_island.jpeg?alt=media&token=bc2b16e1-caed-4649-952c-73b6113f205c", - genre: "adventure" - }, - { - id: "550e8400-e29b-41d4-a716-446655440005", - title: "Digital Nightmare", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fdigital_nightmare.jpeg?alt=media&token=335ec842-1ca4-4b09-abd1-e96d9f5c0c2f", - genre: "horror" - }, - { - id: "550e8400-e29b-41d4-a716-446655440006", - title: "Eclipse of Destiny", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Feclipse_destiny.jpeg?alt=media&token=346649b3-cb5c-4d7e-b0d4-6f02e3df5959", - genre: "fantasy" - }, - { - id: "550e8400-e29b-41d4-a716-446655440007", - title: "Heart of Steel", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fheart_steel.jpeg?alt=media&token=17883d71-329b-415a-86f8-dd4d9e941d7f", - genre: "sci-fi" - }, - { - id: "550e8400-e29b-41d4-a716-446655440008", - title: "Rise of the Crimson Empire", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Frise_crimson_empire.jpeg?alt=media&token=6faa73ad-7504-4146-8f3a-50b90f607f33", - genre: "action" - }, - { - id: "550e8400-e29b-41d4-a716-446655440009", - title: "Silent Waves", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fsilent_waves.jpeg?alt=media&token=bd626bf1-ec60-4e57-aa07-87ba14e35bb7", - genre: "drama" - }, - { - id: "550e8400-e29b-41d4-a716-446655440010", - title: "Echoes of the Past", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fecho_of_past.jpeg?alt=media&token=d866aa27-8534-4d72-8988-9da4a1b9e452", - genre: "historical" - }, - { - id: "550e8400-e29b-41d4-a716-446655440011", - title: "Beyond the Horizon", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fbeyond_horizon.jpeg?alt=media&token=31493973-0692-4e6e-8b88-afb1aaea17ee", - genre: "sci-fi" - }, - { - id: "550e8400-e29b-41d4-a716-446655440012", - title: "Shadows and Lies", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fshadows_lies.jpeg?alt=media&token=01afb80d-caee-47f8-a00e-aea8b9e459a2", - genre: "crime" - }, - { - id: "550e8400-e29b-41d4-a716-446655440013", - title: "The Last Symphony", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Flast_symphony.jpeg?alt=media&token=f9bf80cd-3d8e-4e24-8503-7feb11f4e397", - genre: "drama" - }, - { - id: "550e8400-e29b-41d4-a716-446655440014", - title: "Moonlit Crusade", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fmoonlit_crusade.jpeg?alt=media&token=b13241f5-d7d0-4370-b651-07847ad99dc2", - genre: "fantasy" - }, - { - id: "550e8400-e29b-41d4-a716-446655440015", - title: "Abyss of the Deep", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fabyss_deep.jpeg?alt=media&token=2417321d-2451-4ec0-9ed6-6297042170e6", - genre: "horror" - }, - { - id: "550e8400-e29b-41d4-a716-446655440017", - title: "The Infinite Knot", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Finfinite_knot.jpeg?alt=media&token=93d54d93-d933-4663-a6fe-26b707ef823e", - genre: "romance" - }, - { - id: "550e8400-e29b-41d4-a716-446655440019", - title: "Veil of Illusion", - imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-web-quickstart.appspot.com/o/movie%2Fveil_illusion.jpeg?alt=media&token=7bf09a3c-c531-478a-9d02-5d99fca9393b", - genre: "mystery" - } - ] - ) - movieMetadata_insertMany( - data: [ - { - movieId: "550e8400-e29b-41d4-a716-446655440000", - rating: 7.9, - releaseYear: 2025, - description: "A group of scientists accidentally open a portal to a parallel universe, causing a rift in time. As the team races to close the portal, they encounter alternate versions of themselves, leading to shocking revelations." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440001", - rating: 8.2, - releaseYear: 2023, - description: "In the lawless Wild West, a mysterious gunslinger with a hidden past takes on a corrupt sheriff and his band of outlaws to bring justice to a small town." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440002", - rating: 7.5, - releaseYear: 2024, - description: "Two astronauts, stationed on a remote space station, fall in love amidst the isolation of deep space. But when a mysterious signal disrupts their communication, they must find a way to reconnect and survive." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440003", - rating: 8.0, - releaseYear: 2022, - description: "A private detective gets caught up in a web of lies, deception, and betrayal while investigating the disappearance of a famous actress in 1940s Hollywood." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440004", - rating: 7.6, - releaseYear: 2025, - description: "An explorer leads an expedition to a remote island rumored to be home to mythical creatures. As the team ventures deeper into the island, they uncover secrets that change the course of history." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440005", - rating: 6.9, - releaseYear: 2024, - description: "A tech-savvy teenager discovers a cursed app that brings nightmares to life. As the horrors of the digital world cross into reality, she must find a way to break the curse before it's too late." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440006", - rating: 8.1, - releaseYear: 2026, - description: "In a kingdom on the brink of war, a prophecy speaks of an eclipse that will grant power to the rightful ruler. As factions vie for control, a young warrior must decide where his true loyalty lies." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440007", - rating: 7.7, - releaseYear: 2023, - description: "A brilliant scientist creates a robot with a human heart. As the robot struggles to understand emotions, it becomes entangled in a plot that could change the fate of humanity." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440008", - rating: 8.4, - releaseYear: 2025, - description: "A legendary warrior rises to challenge the tyrannical rule of a powerful empire. As rebellion brews, the warrior must unite different factions to lead an uprising." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440009", - rating: 8.2, - releaseYear: 2024, - description: "A talented pianist, who loses his hearing in a tragic accident, must rediscover his passion for music with the help of a young music teacher who believes in him." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440010", - rating: 7.8, - releaseYear: 2023, - description: "A historian stumbles upon an ancient artifact that reveals hidden truths about an empire long forgotten. As she deciphers the clues, a shadowy organization tries to stop her from unearthing the past." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440011", - rating: 8.5, - releaseYear: 2026, - description: "In the future, Earth's best pilots are sent on a mission to explore a mysterious planet beyond the solar system. What they find changes humanity's understanding of the universe forever." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440012", - rating: 7.9, - releaseYear: 2022, - description: "A young detective with a dark past investigates a series of mysterious murders in a city plagued by corruption. As she digs deeper, she realizes nothing is as it seems." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440013", - rating: 8.0, - releaseYear: 2024, - description: "An aging composer struggling with memory loss attempts to complete his final symphony. With the help of a young prodigy, he embarks on an emotional journey through his memories and legacy." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440014", - rating: 8.3, - releaseYear: 2025, - description: "A knight is chosen by an ancient order to embark on a quest under the light of the full moon. Facing mythical beasts and treacherous landscapes, he seeks a relic that could save his kingdom." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440015", - rating: 7.2, - releaseYear: 2023, - description: "When a group of marine biologists descends into the unexplored depths of the ocean, they encounter a terrifying and ancient force. Now, they must survive as the abyss comes alive." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440017", - rating: 7.4, - releaseYear: 2026, - description: "Two souls destined to meet across multiple lifetimes struggle to find each other in a chaotic world. With each incarnation, they get closer, but time itself becomes their greatest obstacle." - }, - { - movieId: "550e8400-e29b-41d4-a716-446655440019", - rating: 7.8, - releaseYear: 2022, - description: "A magician-turned-detective uses his skills in illusion to solve crimes. When a series of murders leaves the city in fear, he must reveal the truth hidden behind a veil of deceit." - } - ] - ) - user_insertMany( - data: [ - { id: "SnLgOC3lN4hcIl69s53cW0Q8R1T2", username: "sherlock_h" }, - { id: "fep4fXpGWsaRpuphq9CIrBIXQ0S2", username: "hercule_p" }, - { id: "TBedjwCX0Jf955Uuoxk6k74sY0l1", username: "jane_d" } - ] - ) - review_insertMany( - data: [ - { - userId: "SnLgOC3lN4hcIl69s53cW0Q8R1T2", - movieId: "550e8400-e29b-41d4-a716-446655440000", - rating: 5, - reviewText: "An incredible movie with a mind-blowing plot!", - reviewDate: "2025-10-01" - }, - { - userId: "fep4fXpGWsaRpuphq9CIrBIXQ0S2", - movieId: "550e8400-e29b-41d4-a716-446655440001", - rating: 5, - reviewText: "A revolutionary film that changed cinema forever.", - reviewDate: "2025-10-01" - }, - { - userId: "TBedjwCX0Jf955Uuoxk6k74sY0l1", - movieId: "550e8400-e29b-41d4-a716-446655440002", - rating: 5, - reviewText: "A visually stunning and emotionally impactful movie.", - reviewDate: "2025-10-01" - }, - { - userId: "SnLgOC3lN4hcIl69s53cW0Q8R1T2", - movieId: "550e8400-e29b-41d4-a716-446655440003", - rating: 4, - reviewText: "A fantastic superhero film with great performances.", - reviewDate: "2025-10-01" - }, - { - userId: "fep4fXpGWsaRpuphq9CIrBIXQ0S2", - movieId: "550e8400-e29b-41d4-a716-446655440004", - rating: 5, - reviewText: "An amazing film that keeps you on the edge of your seat.", - reviewDate: "2025-10-01" - }, - { - userId: "TBedjwCX0Jf955Uuoxk6k74sY0l1", - movieId: "550e8400-e29b-41d4-a716-446655440005", - rating: 5, - reviewText: "An absolute classic with unforgettable dialogue.", - reviewDate: "2025-10-01" - } - ] - ) -} diff --git a/docs/03-backend-api-specification-v3.md b/docs/01-backend-api-specification.md similarity index 98% rename from docs/03-backend-api-specification-v3.md rename to docs/01-backend-api-specification.md index 14b0d493..57800e82 100644 --- a/docs/03-backend-api-specification-v3.md +++ b/docs/01-backend-api-specification.md @@ -1,7 +1,13 @@ -# KROW Workforce API Specification (GCP Migration) - Version 3.0 +# KROW Workforce API Specification (Legacy Reference) -**Version:** 3.0 -**Date:** 2025-11-20 +> [!WARNING] +> **Status: LEGACY / ARCHIVED REFERENCE** +> This document is based on a historical export from the Base44 platform. +> It is maintained in this repository solely for reference purposes during the rebuild and is **not** to be considered the definitive or active API specification for the production system. +> The actual data schemas and operations are now defined directly within `backend/dataconnect/`. + +**Original Version:** 3.0 +**Original Date:** 2025-11-20 **Objective:** This document defines the backend API to be built on the Firebase/GCP ecosystem, replacing the Base44 backend. It is based on the comprehensive Base44 API documentation (v3.0) and will guide the development of the new backend using Firebase Data Connect and Cloud Functions. --- diff --git a/docs/01-product-functional-roadmap.md b/docs/01-product-functional-roadmap.md deleted file mode 100644 index 3f58a76b..00000000 --- a/docs/01-product-functional-roadmap.md +++ /dev/null @@ -1,84 +0,0 @@ -# Product Roadmap: KROW Platform Foundation (3-Month Plan) - -**Project Name:** KROW - New Platform Foundation - -**Context:** We are leveraging the validated visual prototype from Base44 to rebuild the KROW platform on a modern, scalable, and proprietary technical infrastructure. This ensures a smooth transition and provides clear visibility on delivered features. - -**3-Month Goal:** To have a functional and autonomous first version of the KROW platform, including a web dashboard for event management and a mobile app for staff, all running on our new Google Cloud infrastructure. - ---- - -### **Detailed Product Roadmap (Client/CEO View)** - -#### **Phase 1: From Vision to Technical Foundation** - -**Goal of the Phase (for the client):** "We will transform your prototype into a concrete action plan. By the end of this phase, we will have a first version of the dashboard deployed where you can track our progress, and we will be fully independent to build and deploy future applications." - -**Visible Features Delivered at the End of Phase 1:** - -1. **A Preview Web Dashboard (React):** - * **Description:** A first version of the dashboard (based on the Base44 export) will be accessible via a private URL. Initially, the data will be static, but the visual interface will be live. - * **What this means for the client:** You will see the design and navigation of your dashboard come to life outside of Base44, on our own infrastructure. - -2. **A Foundation for the New Mobile Apps:** - * **Description:** The skeletons of the new Flutter apps (Staff and Client) will be created, with a functional login system. - * **What this means for the client:** The foundations for the future apps will be ready, and we will have validated our ability to deploy them automatically to the app stores (TestFlight for Apple, Internal Testing for Google). - -3. **A Documented V1 API Contract:** - * **Description:** A clear document that precisely describes how the frontend (web and mobile) will communicate with the backend. This is the "blueprint" of our system. - * **What this means for the client:** This guarantees that all parts of the KROW ecosystem (web, mobile, backend) will speak the same language, ensuring consistency and speed for future developments. - -**Technical Work Behind the Scenes (for the team):** -* Analysis of the Base44 code. -* Setup of the infrastructure on Google Cloud (Cloud SQL, Firebase Auth, Data Connect). -* Configuration of CI/CD pipelines for web (e.g., GitHub Actions) and mobile (e.g., CodeMagic). - ---- - -#### **Phase 2: The First Features Come to Life** - -**Goal of the Phase (for the client):** "You will start seeing your own data (events, staff) appear in the new dashboard. The staff mobile app will no longer be an empty shell but will display actual shifts. We are establishing a workflow that will allow you to continue prototyping in parallel with our development." - -**Visible Features Delivered at the End of Phase 2:** - -1. **An Event Management Dashboard (Read-only):** - * **Description:** The web dashboard will display the list of your events, hubs, and staff, reading the data directly from our new database. Create/edit functionalities will not be active yet. - * **What this means for the client:** You will be able to view your real operational data on the new interface, validating that our backend is correctly connected. - -2. **The Staff Mobile App (v2) Displays Real Shifts:** - * **Description:** A staff member will be able to log into the new app and see the list of shifts they are assigned to, with basic details (date, location, role). - * **What this means for the client:** The synergy between the backend and the mobile app is proven. The foundation is ready to add interactive features. - -3. **An Established Design-to-Development Iteration Workflow:** - * **Description:** We will have a clear process to "freeze" a version of the Base44 design for development, while giving you the freedom to work on the next version. - * **What this means for the client:** You can continue to innovate and prototype on Base44 without fear of disrupting the development team's work. - -**Technical Work Behind the Scenes:** -* Development of Data Connect queries to read data (`listEvents`, `listStaff`, etc.). -* Integration of TanStack Query in the dashboard for data management. -* Implementation of the service layer in the Flutter app to call the Data Connect SDK. - ---- - -#### **Phase 3: The First Complete Business Flow** - -**Goal of the Phase (for the client):** "By the end of this quarter, you will be able to perform a complete business action on the new platform: create a complex event on the web dashboard and instantly see the corresponding shifts appear on the staff mobile app." - -**Visible Features Delivered at the End of Phase 3:** - -1. **A Complete Event Creation and Modification Flow on the Web Dashboard:** - * **Description:** The event creation form will be fully functional. You will be able to create an event, add shifts, define positions with roles and rates, and assign contacts. - * **What this means for the client:** **You are now autonomous in managing the core of your operations on the new platform.** The Base44 prototype has been transformed into a functional production tool. - -2. **Synchronization Between Web and Mobile:** - * **Description:** A shift created or modified on the web dashboard will be immediately (or almost immediately) visible and updated on the mobile app of the concerned staff member. - * **What this means for the client:** The vision of a unified and reactive ecosystem is now a tangible reality. - -3. **A Stabilized Platform Ready for Growth:** - * **Description:** The technical foundation will have been tested, documented, and secured. - * **What this means for the client:** We have a solid foundation on which we can confidently build the more advanced features of your vision (KROW University, predictive AI, etc.). - -**Technical Work Behind the Scenes:** -* Development of complex Data Connect mutations for create/edit logic. -* Implementation of unit tests and security reviews. -* Finalization of the V1 API documentation. \ No newline at end of file diff --git a/docs/02-architecture-overview.md b/docs/02-architecture-overview.md deleted file mode 100644 index b2113d20..00000000 --- a/docs/02-architecture-overview.md +++ /dev/null @@ -1,95 +0,0 @@ -# KROW Project Workflows - -This document contains diagrams describing the technical architecture and collaboration processes for the project. - -## 1. Web App Migration Architecture - -This diagram illustrates the migration workflow for the web application. It shows how the UI is exported from the Base44 environment and then connected to our new, unified backend built on Firebase services. - -```mermaid -graph LR - subgraph Base44 Environment - direction TB - Client[Client] -- Modifies --> B44_UI[Base44 Visual Builder
Features:
- Event Management
- Staff Directory] - B44_UI --> B44_Backend[Base44 Backend
Provides Schemas & SDK] - end - - subgraph Firebase Ecosystem - GCP - direction TB - KROW_FE[KROW Web Frontend
Vite/React + TanStack Query] - - subgraph Firebase Services - direction TB - Auth[Firebase Authentication] - DataConnect[Firebase Data Connect
GraphQL API] - SQL_DB[Cloud SQL for PostgreSQL] - end - - KROW_FE -- "Uses" --> Auth - KROW_FE -- "Calls API via SDK" --> DataConnect - DataConnect -- "Manages & Queries" --> SQL_DB - end - - B44_UI -- "UI Code Export" --> KROW_FE - - style Client fill:#f9f,stroke:#333,stroke-width:2px - style B44_UI fill:#ffe,stroke:#333,stroke-width:2px - style KROW_FE fill:#eef,stroke:#333,stroke-width:2px -``` - -## 2. Mobile App Architecture - -This diagram shows how the native mobile applications (Client and Staff) connect to the centralized Firebase backend. This backend is the same one used by the web application. - -```mermaid -graph TD - subgraph KROW Mobile Applications - direction LR - Mobile_Client[Mobile Client App
Flutter] - Mobile_Staff[Mobile Staff App
Flutter] - end - - subgraph Firebase Backend Services - GCP - direction TB - Auth[Firebase Authentication] - DataConnect[Firebase Data Connect
GraphQL API &
Generated SDKs] - SQL_DB[Cloud SQL for PostgreSQL
Managed by Data Connect] - end - - Mobile_Client -- "Authenticates with" --> Auth - Mobile_Client -- "Calls API via generated SDK" --> DataConnect - - Mobile_Staff -- "Authenticates with" --> Auth - Mobile_Staff -- "Calls API via generated SDK" --> DataConnect - - DataConnect -- "Manages & Queries" --> SQL_DB - - style Mobile_Client fill:#eef,stroke:#333,stroke-width:2px - style Mobile_Staff fill:#eef,stroke:#333,stroke-width:2px -``` - -## 3. Collaboration Workflow for Modifications - -This diagram formalizes the process to follow for any modifications initiated by the client on the Base44 platform. The objective is to control the pace of changes and evaluate their impact on our backend before integration. - -```mermaid -flowchart TD - A[Client identifies a need
for modification] --> B{Define functionality
and scope}; - - B --> C{Does the modification impact
only the UI or also
logic/data?}; - - C -- "UI Only" --> D[Client makes modifications
on Base44]; - C -- "Logic/Data" --> E[Team-Client Coordination
to assess impact on GCP backend]; - - D --> F[Planned export of the
new UI version]; - E --> F; - - F --> G["Developer runs the automation
1. `make integrate-export`
2. `make prepare-export`"]; - - G --> H[Development & Testing
- Adapt GCP backend if needed
- Validate locally]; - - H --> I[✅ Integration complete]; - - style A fill:#f9f,stroke:#333,stroke-width:2px - style D fill:#f9f,stroke:#333,stroke-width:2px -``` \ No newline at end of file diff --git a/codemagic-env-vars.md b/docs/02-codemagic-env-vars.md similarity index 100% rename from codemagic-env-vars.md rename to docs/02-codemagic-env-vars.md diff --git a/docs/03-backend-api-specification.md b/docs/03-backend-api-specification.md deleted file mode 100644 index 53cf90c1..00000000 --- a/docs/03-backend-api-specification.md +++ /dev/null @@ -1,131 +0,0 @@ -# KROW Workforce API Specification (GCP Migration) - -**Version:** 2.0 -**Date:** 2025-11-11 -**Objective:** This document defines the backend API to be built on the Firebase/GCP ecosystem, replacing the Base44 backend. It is based on the comprehensive Base44 API documentation (v2.0) and will guide the development of the new backend using Firebase Data Connect and Cloud Functions. - ---- - -## General Conventions - -- **API Layer:** The backend will be composed of two main parts: - - **Firebase Data Connect:** A GraphQL API for all data-centric (CRUD) operations. - - **Cloud Functions:** A set of RESTful endpoints for all service-centric operations (e.g., sending emails, processing files). -- **Authentication:** Every request must include an `Authorization: Bearer ` header, managed and validated by Firebase. -- **Data Format:** All requests and responses will be in `application/json` format. -- **Error Responses:** Errors will use standard HTTP status codes (400, 401, 403, 404, 500) and include a JSON response body of the form `{ "error": "Problem description" }`. -- **Common Fields:** Each entity will have the following fields, automatically managed by the backend: - - `id`: `string` (UUID, Primary Key) - - `created_date`: `string` (ISO 8601 Timestamp) - - `updated_date`: `string` (ISO 8601 Timestamp) - - `created_by`: `string` (Email of the creating user) - ---- - -## 1. Authentication (Firebase Auth) - -Authentication will be handled entirely by Firebase Authentication. The client applications (web and mobile) are responsible for the sign-up and sign-in flows using the Firebase SDK. The backend will use the provided auth token to identify the user for all subsequent requests. - -### `User` Entity (Managed by Firebase Auth & Data Connect) - -| Field | Type | Description | -| ----------- | -------- | ----------------------------------------- | -| `id` | `string` | Firebase User ID (UID) | -| `email` | `string` | User's email (non-modifiable) | -| `full_name` | `string` | Full name | -| `user_role` | `string` | Custom application role (`admin`, `procurement`, `client`...) | -| `...other` | `any` | Other custom fields can be added. | - ---- - -## 2. Data API (Firebase Data Connect) - -All entities below will be managed via a GraphQL API powered by Firebase Data Connect. For each entity, standard `query` (list, get by ID) and `mutation` (create, update, delete) operations will be defined in the `firebase/dataconnect/` directory. - -### 2.1. Event - -**Description:** Manages events and workforce orders. - -| Field | Type | Description | -| ----------------------- | --------- | ------------------------------------------------ | -| `event_name` | `string` | Name of the event (required) | -| `is_recurring` | `boolean` | Indicates if the event is recurring | -| `recurrence_type` | `string` | `single`, `date_range`, `scatter` | -| `business_id` | `string` | ID of the client (`Business`) | -| `vendor_id` | `string` | ID of the provider (`Vendor`) | -| `status` | `string` | `Draft`, `Active`, `Pending`, `Assigned`, `Confirmed`, `Completed`, `Canceled` | -| `date` | `string` | Event date (ISO 8601) | -| `shifts` | `jsonb` | Array of `Shift` objects | -| `total` | `number` | Total cost | -| `requested` | `number` | Total number of staff requested | -| `assigned_staff` | `jsonb` | Array of assigned staff objects | - -### 2.2. Staff - -**Description:** Manages staff members. - -| Field | Type | Description | -| ------------------------- | --------- | ----------------------------------------- | -| `employee_name` | `string` | Full name (required) | -| `vendor_id` | `string` | ID of the provider (`Vendor`) | -| `email` | `string` | Email address | -| `position` | `string` | Primary job position/skill | -| `employment_type` | `string` | `Full Time`, `Part Time`, `On call`, etc. | -| `rating` | `number` | Performance rating (0-5) | -| `reliability_score` | `number` | Reliability score (0-100) | -| `background_check_status` | `string` | `pending`, `cleared`, `failed`, `expired` | -| `certifications` | `jsonb` | List of certifications | - -### 2.3. Vendor - -**Description:** Manages providers and their onboarding. - -| Field | Type | Description | -| ----------------------- | --------- | ----------------------------------------- | -| `vendor_number` | `string` | Vendor number (e.g., `VN-####`) | -| `legal_name` | `string` | Legal company name (required) | -| `primary_contact_email` | `string` | Primary contact email (required) | -| `approval_status` | `string` | `pending`, `approved`, `suspended`, `terminated` | -| `is_active` | `boolean` | Active status | -| `w9_document` | `string` | URL or URI of the W9 document | -| `coi_document` | `string` | URL or URI of the Certificate of Insurance| - ---- - -*Note: For brevity, only the most critical entities have been detailed. The same structure (Schema defined in GraphQL) must be applied for all other entities: `VendorRate`, `Invoice`, `Business`, `Certification`, `Team`, `Conversation`, `Message`, `ActivityLog`, `Enterprise`, `Sector`, `Partner`, `Order`, and `Shift`, based on the `07-reference-base44-api-export.md` document.* - ---- - -## 3. Services API (Cloud Functions) - -These endpoints are not for CRUD operations but for specific, service-oriented tasks. They will be implemented as individual HTTP-triggered Cloud Functions. - -### `POST /sendEmail` -- **Description:** Sends an email. -- **Original SDK:** `base44.integrations.Core.SendEmail(params)` -- **Body:** `{ "to": "...", "subject": "...", "body": "..." }` -- **Response (200 OK):** `{ "status": "sent" }` - -### `POST /invokeLLM` -- **Description:** Calls a large language model (Vertex AI). -- **Original SDK:** `base44.integrations.Core.InvokeLLM(params)` -- **Body:** `{ "prompt": "...", "response_json_schema": {...}, "file_urls": [...] }` -- **Response (200 OK):** `{ "result": "..." }` - -### `POST /uploadFile` -- **Description:** Handles the upload of public files to Google Cloud Storage and returns a public URL. -- **Original SDK:** `base44.integrations.Core.UploadFile({ file })` -- **Request:** `multipart/form-data`. -- **Response (200 OK):** `{ "file_url": "https://..." }` - -### `POST /uploadPrivateFile` -- **Description:** Handles the upload of private files to Google Cloud Storage and returns a secure URI. -- **Original SDK:** `base44.integrations.Core.UploadPrivateFile({ file })` -- **Request:** `multipart/form-data`. -- **Response (200 OK):** `{ "file_uri": "gs://..." }` - -### `POST /createSignedUrl` -- **Description:** Creates a temporary access URL for a private file. -- **Original SDK:** `base44.integrations.Core.CreateFileSignedUrl(params)` -- **Body:** `{ "file_uri": "...", "expires_in": 3600 }` -- **Response (200 OK):** `{ "signed_url": "https://..." }` diff --git a/CONTRIBUTING.md b/docs/03-contributing.md similarity index 52% rename from CONTRIBUTING.md rename to docs/03-contributing.md index 78ab3ebc..06a4c787 100644 --- a/CONTRIBUTING.md +++ b/docs/03-contributing.md @@ -17,50 +17,65 @@ Follow these steps to set up your development environment and gain access to all 3. **Install & Configure Gemini CLI:** * Install the Gemini CLI on your local machine. - * Familiarize yourself with its usage, especially for documentation updates (refer to `docs/06-maintenance-guide.md`). + * Familiarize yourself with its usage for code assistance and documentation. 4. **Install & Configure Enpass:** * Install Enpass (our team's shared password manager). * Ensure you have access to the shared KROW vault for all project credentials (API keys, service accounts, etc.). -5. **Install Recommended Development Tools:** - * **IDE:** We recommend **VS Code** or **Vim/Neovim** for development. - * **Diagramming:** Use **MermaidChart.com** for creating and editing diagrams (Mermaid syntax). +5. **Install Required Development Tools:** + + Before running the project, ensure you have the following installed: + + * **Node.js (v20+):** We recommend using **[nvm](https://github.com/nvm-sh/nvm)** (Node Version Manager) to install and manage Node versions. + * **pnpm:** Our preferred package manager for JavaScript projects. (`npm install -g pnpm`) + * **Flutter Version Management (FVM):** We use **[FVM](https://fvm.app/)** to manage Flutter SDK versions per project. Install it via Homebrew (`brew install fvm`) or Dart (`dart pub global activate fvm`). + * **Firebase CLI:** Required for emulation and deployment. (`npm install -g firebase-tools`) + * **Google Cloud CLI (gcloud):** Required for backend authentication and resource management. + + **Recommended IDE:** + * **[Google Project IDX (Antigravity)](https://idx.google.com/)** or **VS Code**. + * **Essential Extensions:** + * Flutter & Dart + * Firebase + * Tailwind CSS IntelliSense + * ESLint & Prettier + + **Diagramming:** + * Use **MermaidChart.com** for creating and editing diagrams (Mermaid syntax). 6. **Local Development Environment Setup:** * Clone the monorepo: `git clone git@github.com:Oloodi/krow-workforce.git` * Navigate to the project root: `cd krow-workforce` * Install web frontend dependencies: `make install` - * *(Mobile app dependencies will be installed within their respective directories later.)* - **Install Git Hooks:** - Run `make install-git-hooks` to set up local safeguards that prevent direct pushes to protected branches (`main` and `dev`). **This is a mandatory step.** -7. **Firebase Project Access Validation (CTO will provide access):** +7. **Firebase Project Access Validation:** * Confirm you have access to the `dev` Firebase/GCP project. * Verify you can run `firebase login` and `gcloud auth login` successfully. 8. **Understand the Monorepo Structure:** - * Familiarize yourself with the project layout as described in the main `README.md`. + * Familiarize yourself with the project layout (`apps/`, `backend/`, `internal/`) as described in the main `README.md`. --- ## 💡 Development Guidelines 1. **Branching Strategy:** - * We adopt a **feature branch workflow**. All code modifications must be done on a new branch, linked to a GitHub Issue. + * We adopt a **feature branch workflow**. All code modifications must be done on a new branch. * The `main` and `dev` branches are protected. 2. **Commit Messages:** - * Use **Open Commit** for intelligent and standardized Git commit messages. + * Use clear and descriptive commit messages (standardized via Open Commit if available). 3. **Code Standards:** * Adhere to existing code style, formatting, and architectural patterns found in the codebase. * Run linters and formatters before committing. 4. **Documentation:** - * Refer to the **[Documentation Overview](./README.md#documentation-overview)** in the main `README.md` for all project documentation. - * For Base44 integration specifics, see **[06-maintenance-guide.md](./docs/06-maintenance-guide.md)**. + * Keep documentation up to date in the `docs/` directory. 5. **Diagrams:** * All diagrams should be created using **Mermaid syntax** and stored in Markdown files. @@ -69,7 +84,8 @@ Follow these steps to set up your development environment and gain access to all ## 🔗 Useful Links -- **KROW Internal Launchpad:** *(Link will be provided after deployment to Firebase Hosting)* -- **Project Vision:** [docs/00-vision.md](./docs/00-vision.md) -- **Technical Roadmap:** [docs/04-strategy-technical-roadmap.md](./docs/04-strategy-technical-roadmap.md) -- **Project Plan:** [docs/05-project-plan.md](./docs/05-project-plan.md) +- **KROW Internal Launchpad:** [https://launchpad.krowwithus.com](https://launchpad.krowwithus.com) +- **Project Vision:** [docs/00-vision.md](./00-vision.md) +- **Backend Specification:** [docs/01-backend-api-specification.md](./01-backend-api-specification.md) +- **Codemagic Env Vars:** [docs/02-codemagic-env-vars.md](./02-codemagic-env-vars.md) + diff --git a/docs/04-strategy-technical-roadmap.md b/docs/04-strategy-technical-roadmap.md deleted file mode 100644 index 31be19b2..00000000 --- a/docs/04-strategy-technical-roadmap.md +++ /dev/null @@ -1,41 +0,0 @@ -# KROW Technical Roadmap - -This document outlines the technical strategy for building the new, autonomous KROW platform. It is structured in phases rather than fixed dates to maintain agility. - -```mermaid -gantt - title KROW Platform Build Roadmap - dateFormat W - axisFormat Week %W - - section Phase 1: Foundation & Dev Environment Setup - Infrastructure Setup : 1, 1w - GraphQL Schema Definition : 1, 1w - Data Connect Deployment (Dev): 2, 1w - SDK Generation & Web/Mobile PoC : 3, 1w - - section Phase 2: Core Feature Implementation - Backend Logic (All Entities): 4, 4w - Web App Re-wiring : 4, 4w - Mobile Apps Re-wiring : 5, 4w - - section Phase 3: Production Readiness & Go-Live - CI/CD Pipelines Setup : 9, 2w - Staging Env Deployment & E2E Testing : 10, 2w - Production Deployment & Data Import : 12, 1w - Monitoring & Security : 12, 1w -``` - ---- - -## Phase 1: Foundation & Dev Environment Setup (~3-4 Weeks) -* **Goal:** To have a fully functional, shared `dev` environment in the cloud. All developers can connect to it from their local machines. -* **Key Milestone:** The web app and a mobile app screen can successfully authenticate and fetch live data from the `dev` Firebase/GCP project. - -## Phase 2: Core Feature Implementation (~5-6 Weeks) -* **Goal:** To achieve functional parity with the Base44 prototype across all three platforms, all powered by our shared `dev` backend. -* **Key Milestone:** The full lifecycle of core features (Event, Staff, Vendor management) is functional on all apps. - -## Phase 3: Production Readiness & Go-Live (~4 Weeks) -* **Goal:** To automate, secure, and deploy the entire platform to production. -* **Key Milestone:** The KROW platform is live on production infrastructure. The team has a repeatable, automated process for future deployments. diff --git a/docs/04-sync-prototypes.md b/docs/04-sync-prototypes.md new file mode 100644 index 00000000..31d50cdd --- /dev/null +++ b/docs/04-sync-prototypes.md @@ -0,0 +1,58 @@ +# Synchronization of Prototypes + +This document explains how to synchronize visual prototypes and POCs (Proof of Concept) into this monorepo. + +## Overview + +Prototypes are developed in separate repositories (e.g., `client-krow-poc`). To keep this main repository clean and focused on production code, we do not commit the build artifacts of these prototypes. Instead, we use a synchronization script to bring them in locally. + +**Key benefits:** +1. **AI Context:** Once synced, AI tools (like Gemini) can read the prototype code to understand the intended UI/UX and logic. +2. **Local Preview:** You can view the prototypes directly through the **DevOps Launchpad**. +3. **Local Deployment:** Allows you to deploy the latest prototypes to Firebase Hosting from your machine. + +## Prerequisites + +The synchronization script assumes that the prototype repository is cloned **adjacent** to this project directory. + +```bash +# Navigate to your workspace root +cd .. +# Clone the POC repository +git clone git@github.com:Oloodi/client-krow-poc.git +``` + +Your folder structure should look like this: +``` +/workspace + ├── krow-workforce-web (This repo) + └── client-krow-poc (POC repo) +``` + +## How to Synchronize + +Run the following command from the root of this repository: + +```bash +make sync-prototypes +``` + +**What this command does:** +1. Navigates to the adjacent `client-krow-poc` repository. +2. Installs dependencies (via `pnpm`). +3. Builds the web application (`pnpm run build`). +4. Copies the resulting `dist/` folder into `internal/launchpad/prototypes/web/`. + +## Git & AI Behavior + +* **Git:** The contents of the `prototypes/` directories are defined in `.gitignore`. They will **not** be committed to this repository. +* **Gemini/AI:** These files are **not** ignored in `.geminiignore`. Once you run the sync script, the AI will be able to "see" the code and use it as a reference for your tasks. + +## Deployment to Hosting + +If you want to make these prototypes available on the live DevOps Launchpad (`launchpad.krowwithus.com`), you must: +1. Run `make sync-prototypes` on your local machine. +2. Run `make deploy-launchpad-hosting`. + +--- +*Note: As we add mobile prototypes (Flutter), this guide and the script will be updated to include the `flutter build web` steps.* diff --git a/docs/05-project-plan.md b/docs/05-project-plan.md deleted file mode 100644 index f58ee329..00000000 --- a/docs/05-project-plan.md +++ /dev/null @@ -1,95 +0,0 @@ -# KROW Project Plan & Task Breakdown - -This document breaks down the technical roadmap into actionable tasks, assigned by role, ready to be converted into GitHub Issues. - ---- - -## Milestone 1: Foundation & Dev Environment Setup - -*Goal: Establish a fully functional, shared `dev` environment on GCP/Firebase and validate that all core components (Web, Mobile, Backend) can be built, deployed, and connected.* - -### Infrastructure & Tooling (Primarily CTO) -- **Issue:** `[Infra] Setup Enpass for Team Credential Management` - - **Description:** Configure the team's Enpass vault and establish the process for sharing secrets and service account keys. -- **Issue:** `[Infra] Create GCP/Firebase Projects (dev, staging, prod)` - - **Description:** Set up the three distinct Google Cloud projects and associated Firebase projects. Enable required APIs (Auth, Cloud SQL, Data Connect). -- **Issue:** `[Infra] Create Multi-Env Makefile` - - **Description:** Create the main `Makefile` to handle environment switching (`ENV=dev/staging`) and orchestrate all build/deploy tasks. -- **Issue:** `[Infra] Setup Shared Dev Database` - - **Description:** Provision the initial Cloud SQL for PostgreSQL instance for the `dev` environment. - -### Backend & Web (Dev 1) -- **Epic:** `[Onboarding] End-to-End Flow Validation with 'Event' Entity` - - **Issue:** `[Backend] Define and Deploy 'Event' Schema` - - **Description:** Translate the `Event` schema from the API specification into `.gql` files. Define the basic `listEvents` query and `createEvent` mutation. Use the `Makefile` to deploy this to the `dev` environment and validate that the `events` table is created in Cloud SQL. - - **Issue:** `[Web] Generate TypeScript SDK for Dev Env` - - **Description:** Configure and run the SDK generation command to create the TypeScript SDK pointing to the `dev` environment. - - **Issue:** `[Web] Connect 'Events' Page to Dev Backend (PoC)` - - **Description:** Modify the main web application's `Events.jsx` page. Replace the existing mock/Base44 data fetching with the new TanStack Query hooks from the generated SDK to display a list of events from our own `dev` backend. This validates the full end-to-end workflow on a real feature. - -- **Epic:** `[Backend] KROW Schema Implementation` - - **Issue:** `[Backend] Define GraphQL Schema for Remaining Core Entities` - - **Description:** Translate `Staff`, `Vendor`, `User`, and other core schemas from the API specification into `.gql` files and deploy them. - -### Mobile (Dev 2) -- **Epic:** `[Mobile] Analysis & Documentation` - - **Issue:** `[Mobile-Doc] Analyze & Document Existing App Logic` - - **Description:** Review the legacy Flutter codebases to identify and document key business logic and user flows. - - **Issue:** `[Mobile-Doc] Create & Update Workflow Diagrams` - - **Description:** Based on the analysis, create or update Mermaid diagrams for critical workflows and add them to the internal launchpad. - -- **Epic:** `[Mobile] CI/CD & Skeleton App Setup` - - **Issue:** `[Mobile-CI/CD] Configure CodeMagic & Firebase App Distribution` - - **Description:** Set up CodeMagic and configure build workflows for iOS/Android with automated deployment to Firebase App Distribution. - - **Issue:** `[Mobile-CI/CD] Initialize Skeleton Apps in Monorepo` - - **Description:** Create new, clean Flutter projects for `client-app` and `staff-app` within the `mobile-apps` directory. - - **Issue:** `[Mobile-CI/CD] Implement Initial CI/CD Pipeline` - - **Description:** Create a "Hello World" version of the Staff app and validate that it can be automatically built and deployed to App Distribution. - -- **Epic:** `[Mobile] Backend Integration Validation` - - **Issue:** `[Mobile-Auth] Implement Firebase Auth Flow in Skeleton App` - - **Description:** Add Firebase Authentication to the skeleton Staff app and ensure users can sign up/log in against the `dev` project. - - **Issue:** `[Mobile-Backend] Generate Flutter SDK for Dev Env` - - **Description:** Configure and run the SDK generation command to create the Flutter SDK for the `dev` environment. - - **Issue:** `[Mobile-Backend] Create Proof-of-Concept Screen` - - **Description:** Build a simple screen in the skeleton Staff app that, after login, fetches and displays a list of events from the `dev` backend using the new SDK. - ---- - -## Milestone 2: Core Feature Implementation - -*Goal: Achieve functional parity with the Base44 prototype across all platforms, using the shared `dev` backend.* - -### Backend (Dev 1) -- **Epic:** `[Backend] Implement Full API Logic` - - **Description:** Create all necessary GraphQL queries and mutations in Data Connect for all entities. Deploy them continuously to the `dev` environment. - -### Web (Dev 1, with support from Dev 2) -- **Epic:** `[Web] Full Application Re-wiring` - - **Description:** Systematically replace all data-fetching logic in the web app to use the TanStack Query hooks from the generated Data Connect SDK. - -### Mobile (Dev 2) -- **Epic:** `[Mobile] Port Features to New Apps` - - **Description:** Systematically port the features and UI from the legacy apps into the new, clean skeleton apps, connecting them to the Data Connect backend via the generated SDK. - ---- - -## Milestone 3: Production Readiness & Go-Live - -*Goal: Automate, secure, and deploy the entire platform to production.* - -### Infrastructure & DevOps (CTO & Team) -- **Issue:** `[CI/CD] Configure Web App Deployment Pipeline` - - **Description:** Set up a GitHub Actions pipeline to build and deploy the web app to Firebase Hosting (`staging` and `prod`). -- **Issue:** `[CI/CD] Finalize Production Mobile Deployment` - - **Description:** Finalize the CodeMagic pipelines for deployment to TestFlight/Play Store production tracks. -- **Issue:** `[CI/CD] Configure Backend Deployment Pipeline` - - **Description:** Automate the deployment of the Data Connect schema and operations. -- **Issue:** `[Data] Create & Test Initial Data Import Scripts` - - **Description:** Write scripts to populate the production database with any necessary initial data. -- **Issue:** `[QA] Deploy to Staging & Perform E2E Testing` - - **Description:** Use the `Makefile` (`make deploy ENV=staging`) to deploy the entire stack to the staging environment for full end-to-end testing. -- **Issue:** `[Ops] Final Production Deployment` - - **Description:** Run the production deployment (`make deploy ENV=prod`) and execute data import scripts. -- **Issue:** `[Ops] Setup Monitoring & Alerting` - - **Description:** Configure monitoring dashboards in Google Cloud for the database, API, and application performance. diff --git a/docs/06-maintenance-guide.md b/docs/06-maintenance-guide.md deleted file mode 100644 index 2e73c0c1..00000000 --- a/docs/06-maintenance-guide.md +++ /dev/null @@ -1,55 +0,0 @@ -# API Documentation Maintenance Guide - -This document describes the procedure for updating the API documentation and our backend's technical specification after major changes are made on the Base44 platform. - -Following this process is **essential** to ensure that our custom backend on GCP remains synchronized with the frontend's features. - -## When to Follow This Procedure - -You should follow this guide after each significant development cycle on the Base44 platform, especially after: -- Adding new entities or data fields. -- Modifying existing business logic. -- Integrating major new features into the user interface. - ---- - -## Update Procedure - -### Step 1: Obtain Updated Documentation from Base44 - -1. **Open the `docs/08-reference-base44-prompts.md` file**. -2. Copy the content of the **"Main Prompt"**. -3. Paste this prompt into the Base44 AI chat to request the latest documentation. -4. **Verification:** The AI should return the full content of the `base44-api-export.md` file. If it only returns a summary, use the following simple prompt to request the full content: - ```text - Thank you for the summary. Please provide the entire, updated content of the API documentation file now. - ``` - -### Step 2: Update the Local Documentation File (with Gemini CLI) - -To ensure clean and consistent formatting, it is recommended to use the Gemini CLI for this step. - -1. **Copy the raw content** provided by the Base44 AI. -2. **Provide this content to the Gemini CLI** with a simple prompt, for example: - > "Here is the new Base44 API documentation. Can you reformat this content and update the `docs/07-reference-base44-api-export.md` file?" -3. **Let the Gemini CLI** handle the file creation or update. It will ensure that tables, code blocks, and headers are correctly formatted. - -### Step 3: Update the GCP API Specification (with Gemini CLI) - -This is the most critical step. Instead of a tedious manual comparison, we will rely on the AI to synchronize our migration plan. - -1. **Ensure Step 2 is complete** and that `docs/07-reference-base44-api-export.md` is up-to-date. -2. **Ask the Gemini CLI** to update the specification for you. Use a clear prompt, for example: - > "Now that `docs/07-reference-base44-api-export.md` is updated, can you analyze the changes and comprehensively update the `docs/03-backend-api-specification.md` file to match?" -3. **Let the Gemini CLI** perform the comparative analysis and apply the necessary changes (adding fields, entities, integrations, etc.) to the specification file. - -### Step 4: Validate and Commit the Changes - -1. Give the changes in `03-backend-api-specification.md` a final review to ensure they are consistent. -2. Commit the updated files to Git with a clear and descriptive message. - ```bash - git add docs/ - git commit -m "docs: Update API documentation and specification from Base44 export" - ``` - ---- \ No newline at end of file diff --git a/docs/07-reference-base44-api-export-v3.md b/docs/07-reference-base44-api-export-v3.md deleted file mode 100644 index ec0196d2..00000000 --- a/docs/07-reference-base44-api-export-v3.md +++ /dev/null @@ -1,705 +0,0 @@ -# KROW Workforce Platform - API Documentation - -**Version:** 3.0 (Auto-Updated) -**Last Updated:** 2025-11-20 -**Project:** KROW Workforce Control Tower - ---- - -## Table of Contents -1. [Overview](#overview) -2. [Authentication](#authentication) -3. [Entity Schemas](#entity-schemas) -4. [SDK Operations](#sdk-operations) -5. [Core Integrations](#core-integrations) -6. [Data Models Reference](#data-models-reference) -7. [Code Examples](#code-examples) -8. [Best Practices](#best-practices) -9. [Security Considerations](#security-considerations) -10. [Rate Limits & Quotas](#rate-limits--quotas) -11. [Changelog](#changelog) -12. [Support & Resources](#support--resources) - ---- - -## 1. Overview -KROW Workforce is a comprehensive workforce management platform built on Base44. This documentation provides complete API specifications for all entities, SDK methods, and integration endpoints. - -### Base44 Client Import -```javascript -import { base44 } from "@/api/base44Client"; -``` - ---- - -## 2. Authentication - -### User Authentication Methods - -```javascript -// Get current authenticated user -const user = await base44.auth.me(); - -// Update current user -await base44.auth.updateMe({ - full_name: "John Doe", - custom_field: "value" -}); - -// Logout -base44.auth.logout(redirectUrl?: string); - -// Redirect to login -base44.auth.redirectToLogin(nextUrl?: string); - -// Check authentication status -const isAuthenticated = await base44.auth.isAuthenticated(); -``` - -### User Object Structure -```json -{ - "id": "string", - "email": "string", - "full_name": "string", - "role": "admin | user", - "user_role": "string", - "created_date": "timestamp", - "updated_date": "timestamp" -} -``` - ---- - -## 3. Entity Schemas - -### 1. User Entity (Built-in) -**Description:** Core user entity with authentication and role management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique user identifier | Auto-generated, unique | -| `email` | string | User email address | Required, unique, email format | -| `full_name` | string | User's full name | Required | -| `role` | string | Base role | Enum: "admin", "user" | -| `user_role` | string | Custom application role | Optional, custom values | -| `created_date` | timestamp | Account creation date | Auto-generated | -| `updated_date` | timestamp | Last update timestamp | Auto-updated | - -**Security Rules:** -* Only admin users can list, update, or delete other users. -* Regular users can only view and update their own user record. - -### 2. Event Entity -**Description:** Core event/order management entity for workforce scheduling. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique event identifier | Auto-generated | -| `event_name` | string | Name of the event | Required | -| `is_rapid` | boolean | RAPID/urgent order flag | Default: false | -| `is_recurring` | boolean | Whether event recurs | Default: false | -| `is_multi_day` | boolean | Multi-day event flag | Default: false | -| `recurrence_type` | string | Type of recurrence | Enum: "single", "date_range", "scatter" | -| `recurrence_start_date`| date | Start date for recurring events | Optional | -| `recurrence_end_date` | date | End date for recurring events | Optional | -| `scatter_dates` | array | Specific dates for scatter recurring | Array of date strings | -| `multi_day_start_date` | date | Multi-day start date | Optional | -| `multi_day_end_date` | date | Multi-day end date | Optional | -| `buffer_time_before` | number | Buffer time before (minutes) | Default: 0 | -| `buffer_time_after` | number | Buffer time after (minutes) | Default: 0 | -| `conflict_detection_enabled`| boolean | Enable conflict detection | Default: true | -| `detected_conflicts` | array | Array of detected conflicts | Array of conflict objects | -| `business_id` | string | Associated business ID | Optional | -| `business_name` | string | Business name | Optional | -| `vendor_id` | string | Vendor ID if created by vendor | Optional | -| `vendor_name` | string | Vendor name | Optional | -| `hub` | string | Hub location | Optional | -| `event_location` | string | Event location address | Optional | -| `contract_type` | string | Contract type | Enum: "W2", "1099", "Temp", "Contract" | -| `po_reference` | string | Purchase order reference | Optional | -| `status` | string | Event status | Enum: "Draft", "Active", "Pending", "Assigned", "Confirmed", "Completed", "Canceled" | -| `date` | date | Event date | Optional | -| `shifts` | array | Array of shift objects | Optional | -| `addons` | object | Additional services/features | Optional | -| `total` | number | Total cost | Optional | -| `client_name` | string | Client contact name | Optional | -| `client_email` | string | Client email | Optional | -| `client_phone` | string | Client phone | Optional | -| `invoice_id` | string | Associated invoice ID | Optional | -| `notes` | string | Additional notes | Optional | -| `requested` | number | Total staff requested | Default: 0 | -| `assigned_staff` | array | Array of assigned staff | Optional | - -**Detected Conflicts Structure:** -```json -{ - "conflict_type": "staff_overlap" | "venue_overlap" | "time_buffer", - "severity": "low" | "medium" | "high" | "critical", - "description": "string", - "conflicting_event_id": "string", - "staff_id": "string", - "detected_at": "timestamp" -} -``` - -### 3. Staff Entity -**Description:** Employee/workforce member management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique staff identifier | Auto-generated | -| `employee_name` | string | Full name | Required | -| `vendor_id` | string | Associated vendor ID | Optional | -| `vendor_name` | string | Vendor company name | Optional | -| `manager` | string | Manager's name | Optional | -| `contact_number` | string | Primary contact number | Optional | -| `email` | string | Email address | Email format | -| `department` | string | Department | Enum: "Operations", "Sales", "HR", "Finance", "IT", "Marketing", "Customer Service", "Logistics" | -| `hub_location` | string | Hub/office location | Optional | -| `track` | string | Track information | Optional | -| `position` | string | Primary job position/skill | Optional | -| `profile_type` | string | Skill profile level | Enum: "Skilled", "Beginner", "Cross-Trained" | -| `employment_type` | string | Employment type | Enum: "Full Time", "Part Time", "On call", "Weekends", "Specific Days", "Seasonal", "Medical Leave" | -| `english` | string | English proficiency | Enum: "Fluent", "Intermediate", "Basic", "None" | -| `rating` | number | Staff performance rating (0-5 stars) | Min: 0, Max: 5 | -| `reliability_score` | number | Overall reliability score (0-100) | Min: 0, Max: 100 | -| `background_check_status`| string | Background check status | Enum: "pending", "cleared", "failed", "expired", "not_required" | - -### 4. Vendor Entity -**Description:** Vendor/supplier management and onboarding. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique vendor identifier | Auto-generated | -| `vendor_number` | string | Vendor Number (VN-####) | Required, Pattern: `^VN-[0-9]{4}$` | -| `legal_name` | string | Legal business name | Required | -| `region` | string | Geographic region | Enum: "National", "Bay Area", "Southern California", "Northern California", "West", "East", "Midwest", "South" | -| `platform_type` | string | Technology integration level | Enum: "Full Platform", "Building platform (KROW)", "Partial Tech", "Traditional" | -| `primary_contact_email` | string | Primary email | Required, Email format | -| `approval_status` | string | Vendor approval status | Enum: "pending", "approved", "suspended", "terminated" | -| `is_active` | boolean | Is vendor currently active | Default: true | - -### 5. VendorRate Entity -**Description:** Vendor pricing and rate management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique rate identifier | Auto-generated | -| `vendor_name` | string | Vendor name | Required | -| `category` | string | Service category | Enum: "Kitchen and Culinary", "Concessions", "Facilities", "Bartending", "Security", "Event Staff", "Management", "Technical", "Other" | -| `role_name` | string | Role/position name | Required | -| `employee_wage` | number | Employee base wage/hour | Required, Min: 0 | -| `markup_percentage` | number | Markup percentage | Min: 0, Max: 100 | -| `vendor_fee_percentage` | number | Vendor fee percentage | Min: 0, Max: 100 | -| `client_rate` | number | Final rate to client | Required, Min: 0 | - -### 6. VendorDefaultSettings Entity -**Description:** Default markup and fee settings for vendors. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique settings identifier | Auto-generated | -| `vendor_name` | string | Name of the vendor | Required | -| `default_markup_percentage`| number | Default markup percentage | Required, Min: 0, Max: 100 | -| `default_vendor_fee_percentage`| number | Default vendor fee percentage | Required, Min: 0, Max: 100 | - -### 7. Invoice Entity -**Description:** Invoice and billing management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique invoice identifier | Auto-generated | -| `invoice_number` | string | Unique invoice number | Required | -| `amount` | number | Grand total invoice amount | Required, Min: 0 | -| `status` | string | Current invoice status | Enum: "Draft", "Pending Review", "Approved", "Disputed", "Under Review", "Resolved", "Overdue", "Paid", "Reconciled", "Cancelled" | -| `issue_date` | date | Invoice issue date | Required | -| `due_date` | date | Payment due date | Required | -| `disputed_items` | array | List of disputed staff entry indices | Optional | -| `is_auto_generated` | boolean | Whether invoice was auto-generated | Default: false | - -### 8. Business Entity -**Description:** Client business/company management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique business identifier | Auto-generated | -| `business_name` | string | Business/client company name | Required | -| `contact_name` | string | Primary contact person | Required | -| `email` | string | Business email | Email format | -| `sector` | string | Sector/industry | Enum: "Bon Appétit", "Eurest", "Aramark", "Epicurean Group", "Chartwells", "Other" | -| `rate_group` | string | Pricing tier | Required, Enum: "Standard", "Premium", "Enterprise", "Custom" | -| `status` | string | Business status | Enum: "Active", "Inactive", "Pending" | - -### 9. Certification Entity -**Description:** Employee certification and compliance tracking. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique certification ID | Auto-generated | -| `employee_name` | string | Staff member name | Required | -| `certification_name` | string | Certification name | Required | -| `certification_type` | string | Type of certification | Enum: "Legal", "Operational", "Safety", "Training", "License", "Other" | -| `status` | string | Current status | Enum: "current", "expiring_soon", "expired", "pending_validation" | -| `expiry_date` | date | Expiration date | Required | -| `validation_status` | string | Validation status | Enum: "approved", "pending_expert_review", "rejected", "ai_verified", "ai_flagged", "manual_review_needed" | - -### 10. Team Entity -**Description:** Team and organization management with role-based isolation. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique team identifier | Auto-generated | -| `team_name` | string | Name of the team | Required | -| `owner_id` | string | Team owner user ID | Required | -| `owner_name` | string | Team owner name | Required | -| `owner_role` | string | Role of team owner | Required, Enum: "admin", "procurement", "operator", "sector", "client", "vendor", "workforce" | -| `favorite_staff` | array | Array of favorite staff | Array of objects | -| `blocked_staff` | array | Array of blocked staff | Array of objects | - -### 11. TeamMember Entity -**Description:** Team member management within teams. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique member identifier | Auto-generated | -| `team_id` | string | ID of the team this member belongs to | Required | -| `member_name` | string | Name of the team member | Required | -| `email` | string | Member email | Required, Email format | -| `role` | string | Role in the team | Enum: "admin", "manager", "member", "viewer" | -| `is_active` | boolean | Whether the member is active | Default: true | - -### 12. TeamHub Entity -**Description:** Team hub/location management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique hub identifier | Auto-generated | -| `team_id` | string | ID of the team | Required | -| `hub_name` | string | Name of the hub/location | Required | -| `departments` | array | Departments within this hub | Array of objects with `department_name`, `cost_center` | - -### 13. TeamMemberInvite Entity -**Description:** Team member invitation management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique invite identifier | Auto-generated | -| `team_id` | string | Team ID | Required | -| `invite_code` | string | Unique invite code | Required | -| `email` | string | Invitee email | Required, Email format | -| `invite_status` | string | Invite status | Enum: "pending", "accepted", "expired", "cancelled" | - -### 14. Conversation Entity -**Description:** Messaging and communication management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique conversation ID | Auto-generated | -| `participants` | array | Array of participant IDs/emails | Required | -| `conversation_type` | string | Type of conversation | Required, Enum: "client-vendor", "staff-client", "staff-admin", "vendor-admin", "client-admin", "group-staff", "group-event-staff" | -| `related_to` | string | ID of related entity | Optional | -| `status` | string | Conversation status | Enum: "active", "archived", "closed" | - -### 15. Message Entity -**Description:** Individual messages within conversations. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique message identifier | Auto-generated | -| `conversation_id` | string | ID of the conversation | Required | -| `sender_name` | string | Name of the sender | Required | -| `content` | string | Message content | Required | -| `read_by` | array | Array of user IDs who have read the message | Array of strings | - -### 16. ActivityLog Entity -**Description:** Activity and notification tracking. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique activity identifier | Auto-generated | -| `title` | string | Notification title | Required | -| `description` | string | Detailed description | Required | -| `activity_type` | string | Type of activity | Required, Enum: "event_created", "event_updated", "staff_assigned", "invoice_paid", etc. | -| `user_id` | string | ID of the user this notification is for | Required | -| `is_read` | boolean | Whether the notification has been read | Default: false | - -### 17. Enterprise Entity -**Description:** Enterprise organization management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique enterprise ID | Auto-generated | -| `enterprise_number`| string | Enterprise Number format EN-#### | Required, Pattern: `^EN-[0-9]{4}$` | -| `enterprise_name` | string | Enterprise name (e.g., Compass) | Required | -| `enterprise_code` | string | Short code identifier | Required | - -### 18. Sector Entity -**Description:** Sector/branch management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique sector identifier | Auto-generated | -| `sector_number` | string | Sector Number format SN-#### | Required, Pattern: `^SN-[0-9]{4}$` | -| `sector_name` | string | Sector/brand name (e.g., Bon Appétit) | Required | -| `sector_type` | string | Sector business type | Enum: "Food Service", "Facilities", "Healthcare", "Education", "Corporate", "Sports & Entertainment" | - -### 19. Partner Entity -**Description:** Partner/client organization management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique partner identifier | Auto-generated | -| `partner_name` | string | Partner/client name | Required | -| `partner_number` | string | Partner Number format PN-#### | Required, Pattern: `^PN-[0-9]{4}$` | -| `partner_type` | string | Partner type | Enum: "Corporate", "Education", "Healthcare", "Sports & Entertainment", "Government" | - -### 20. Order Entity -**Description:** Order management system. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique order identifier | Auto-generated | -| `order_number` | string | Order Number format ORD-#### | Required, Pattern: `^ORD-[0-9]{4,6}$` | -| `partner_id` | string | Partner/Client ID | Required | -| `order_type` | string | Type of order | Enum: "Standard", "Last Minute", "Emergency", "Recurring" | -| `order_status` | string | Order status | Enum: "Draft", "Submitted", "Confirmed", "In Progress", "Completed", "Cancelled" | - -### 21. Shift Entity -**Description:** Shift scheduling and management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique shift identifier | Auto-generated | -| `shift_name` | string | Name of the shift | Required | -| `start_date` | timestamp | Shift start date/time | Required | -| `end_date` | timestamp | Shift end date/time | Optional | -| `assigned_staff` | array | List of assigned staff | Array of objects | - -### 22. Assignment Entity -**Description:** Worker assignment and tracking. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique assignment identifier | Auto-generated | -| `assignment_number` | string | Assignment Number format ASN-#### | Pattern: `^ASN-[0-9]{4,6}$` | -| `order_id` | string | Associated order ID | Required | -| `workforce_id` | string | Assigned worker ID | Required | -| `vendor_id` | string | Vendor providing the worker | Required | -| `role` | string | Role assigned | Required | -| `assignment_status` | string | Assignment status | Enum: "Pending", "Confirmed", "Checked In", "In Progress", "Completed", "Cancelled", "No Show" | -| `scheduled_start` | timestamp | Scheduled start time | Required | - -### 23. Workforce Entity -**Description:** Worker/contractor management. - -| Field Name | Type | Description | Validation | -| :--- | :--- | :--- | :--- | -| `id` | string | Unique workforce identifier | Auto-generated | -| `workforce_number` | string | Worker Number format WF-#### | Required, Pattern: `^WF-[0-9]{4,6}$` | -| `vendor_id` | string | Vendor who manages this worker | Required | -| `first_name` | string | Worker first name | Required | -| `last_name` | string | Worker last name | Required | -| `employment_type` | string | Employment classification | Enum: "W2", "1099", "Temporary", "Contract" | - ---- - -## 4. SDK Operations - -All entities support the following base operations. Replace `EntityName` with the specific entity (e.g., `Event`, `Staff`, `Invoice`). - -### List & Filter -```javascript -// List all records (default limit: 50) -const records = await base44.entities.EntityName.list(); - -// List with sorting (descending by created_date) -const records = await base44.entities.EntityName.list('-created_date'); - -// Filter with multiple conditions -const records = await base44.entities.EntityName.filter({ - status: 'Active', - created_by: user.email -}); - -// Filter with operators ($gte, $lte, $in, $contains) -const records = await base44.entities.EntityName.filter({ - rating: { $gte: 4.5 }, - total: { $lte: 1000 } -}); -``` - -### CRUD Operations -```javascript -// Create -const newRecord = await base44.entities.EntityName.create({ - field1: 'value1', - field2: 'value2' -}); - -// Bulk Create -const newRecords = await base44.entities.EntityName.bulkCreate([ - { field1: 'value1' }, - { field1: 'value2' } -]); - -// Update -const updatedRecord = await base44.entities.EntityName.update(recordId, { - field1: 'new value' -}); - -// Delete -await base44.entities.EntityName.delete(recordId); - -// Get Schema -const schema = await base44.entities.EntityName.schema(); -``` - ---- - -## 5. Core Integrations - -### InvokeLLM -Generates a response from an LLM with a prompt. - -| Parameter | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| `prompt` | string | Yes | The prompt to send to the LLM | -| `add_context_from_internet` | boolean | No | Fetch context from Google Search/Maps/News | -| `response_json_schema` | object | No | JSON schema for structured output | -| `file_urls` | string[] | No | Array of file URLs for context | - -```javascript -const data = await base44.integrations.Core.InvokeLLM({ - prompt: "Give me data on Apple", - add_context_from_internet: true, - response_json_schema: { - type: "object", - properties: { - stock_price: { type: "number" }, - ceo: { type: "string" } - } - } -}); -``` - -### SendEmail -Send an email to a user. - -| Parameter | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| `to` | string | Yes | Recipient email address | -| `subject` | string | Yes | Email subject line | -| `body` | string | Yes | Email body (supports HTML) | -| `from_name` | string | No | Sender name | - -### File Operations - -* **UploadFile:** Upload a file to public storage. -* **UploadPrivateFile:** Upload a file to private storage (requires signed URL). -* **CreateFileSignedUrl:** Create a temporary signed URL for accessing a private file. - -```javascript -// Upload private document -const { file_uri } = await base44.integrations.Core.UploadPrivateFile({ - file: sensitiveDocument -}); - -// Create signed URL -const { signed_url } = await base44.integrations.Core.CreateFileSignedUrl({ - file_uri: file_uri, - expires_in: 3600 -}); -``` - -### ExtractDataFromUploadedFile -Extract structured data from uploaded files (CSV, PDF, images). - -```javascript -const result = await base44.integrations.Core.ExtractDataFromUploadedFile({ - file_url: file_url, - json_schema: { - type: "array", - items: { - type: "object", - properties: { - employee_name: { type: "string" }, - email: { type: "string" } - } - } - } -}); -``` - ---- - -## 6. Data Models Reference - -### Complete Event Object Example -```json -{ - "id": "evt_1234567890", - "event_name": "Google Campus Lunch Service", - "is_recurring": true, - "status": "Active", - "date": "2025-01-15", - "shifts": [ - { - "shift_name": "Lunch Shift", - "roles": [ - { - "role": "Server", - "count": 10, - "hours": 4, - "cost_per_hour": 25, - "total_value": 1000 - } - ] - } - ], - "assigned_staff": [ - { - "staff_id": "stf_111", - "staff_name": "Maria Garcia", - "confirmed": true - } - ] -} -``` - ---- - -## 7. Code Examples - -### Example: Create Event with Staff Assignment -```javascript -import { base44 } from "@/api/base44Client"; - -async function createEventAndAssignStaff() { - const user = await base44.auth.me(); - - // 1. Create Event - const event = await base44.entities.Event.create({ - event_name: "Corporate Holiday Party", - date: "2025-12-20", - status: "Draft", - requested: 20, - shifts: [{ - shift_name: "Evening Service", - roles: [{ role: "Server", count: 15, cost_per_hour: 28 }] - }], - client_email: user.email - }); - - // 2. Find Staff - const availableStaff = await base44.entities.Staff.filter({ - position: "Server", - rating: { $gte: 4.5 } - }, '-rating', 15); - - // 3. Assign Staff - const assignedStaff = availableStaff.map(staff => ({ - staff_id: staff.id, - staff_name: staff.employee_name, - role: "Server", - confirmed: false - })); - - await base44.entities.Event.update(event.id, { - assigned_staff: assignedStaff, - status: "Pending" - }); - - return event; -} -``` - -### Example: AI-Powered Staff Recommendation -```javascript -import { base44 } from "@/api/base44Client"; - -async function getStaffRecommendations(eventId) { - const events = await base44.entities.Event.filter({ id: eventId }); - const event = events[0]; - const allStaff = await base44.entities.Staff.list(); - - const recommendations = await base44.integrations.Core.InvokeLLM({ - prompt: `Analyze this event (${event.event_name}) and recommend staff based on rating and reliability.`, - response_json_schema: { - type: "object", - properties: { - recommendations: { - type: "array", - items: { - type: "object", - properties: { - staff_id: { type: "string" }, - score: { type: "number" }, - reasoning: { type: "string" } - } - } - } - } - } - }); - - return recommendations; -} -``` - ---- - -## 8. Best Practices - -1. **Error Handling:** Always wrap calls in `try/catch` blocks and provide user-friendly error messages. -2. **Query Optimization:** Filter data at the database level (using `.filter()`) rather than fetching all records and filtering in memory. -3. **Pagination:** Use the `limit` and `offset` parameters in `.list()` for large datasets to improve performance. -4. **Caching:** Use libraries like React Query to cache SDK responses and reduce API calls. -5. **Batch Operations:** Prefer `bulkCreate` over looping through single create calls. -6. **Team Isolation:** Rely on the built-in `owner_id` filtering. Do not attempt to bypass cross-layer visibility rules (e.g., Vendors should not see Procurement teams). - ---- - -## 9. Security Considerations - -* **User Entity Access Control:** Built-in rules enforce that only admins can modify other users. Regular users are restricted to their own records. -* **Team Isolation:** Complete data isolation across organizational layers (Vendor, Procurement, Operator, Client) is enforced via `owner_id`. -* **Private Files:** Always use `UploadPrivateFile` for sensitive documents (W9, Insurance, etc.) and generate temporary signed URLs for access. -* **Input Validation:** While the API performs validation, always validate email formats and required fields on the client side before making requests. - ---- - -## 10. Rate Limits & Quotas - -| Operation | Limit | -| :--- | :--- | -| **Entity Operations** | 1000 requests/minute | -| **LLM Invocations** | 100 requests/minute | -| **File Uploads** | 100 MB per file | -| **Email Sending** | 1000 emails/day | - -*Tip: Implement exponential backoff for retries if you hit these limits.* - ---- - -## 11. Changelog - -**Version 3.0 (2025-11-20)** -* Added Team, TeamMember, TeamHub, TeamMemberInvite entities. -* Added Assignment and Workforce entities. -* Enhanced Invoice entity with dispute tracking. -* Updated Event entity (Conflict detection, Multi-day). - -**Version 2.0 (2025-01-11)** -* Complete entity schema documentation. -* Core integration specifications. - ---- - -## 12. Support & Resources - -* **Platform Docs:** [https://docs.base44.com](https://docs.base44.com) -* **API Reference:** [https://api.base44.com/docs](https://api.base44.com/docs) -* **Technical Support:** support@krow.com - -© 2025 KROW Workforce. All rights reserved. \ No newline at end of file diff --git a/docs/07-reference-base44-api-export.md b/docs/07-reference-base44-api-export.md deleted file mode 100644 index 02ff9b2a..00000000 --- a/docs/07-reference-base44-api-export.md +++ /dev/null @@ -1,1732 +0,0 @@ -# KROW Workforce Platform - API Documentation - -**Version:** 2.0 -**Last Updated:** 2025-11-11 -**Project:** KROW Workforce Control Tower - -## Table of Contents -1. [Overview](#overview) -2. [Authentication](#authentication) -3. [Entity Schemas](#entity-schemas) -4. [SDK Operations](#sdk-operations) -5. [Core Integrations](#core-integrations) -6. [Data Models Reference](#data-models-reference) -7. [Code Examples](#code-examples) -8. [Best Practices](#best-practices) -9. [Security Considerations](#security-considerations) -10. [Rate Limits & Quotas](#rate-limits--quotas) -11. [Changelog](#changelog) -12. [Support & Resources](#support--resources) - ---- - -## Overview -KROW Workforce is a comprehensive workforce management platform built on Base44. This documentation provides complete API specifications for all entities, SDK methods, and integration endpoints. - -### Base44 Client Import -```javascript -import { base44 } from "@/api/base44Client"; -``` - ---- - -## Authentication - -### User Authentication Methods -```javascript -// Get current authenticated user -const user = await base44.auth.me(); - -// Update current user -await base44.auth.updateMe({ - full_name: "John Doe", - custom_field: "value" -}); - -// Logout -base44.auth.logout(redirectUrl?: string); - -// Redirect to login -base44.auth.redirectToLogin(nextUrl?: string); - -// Check authentication status -const isAuthenticated = await base44.auth.isAuthenticated(); -``` - -### User Object Structure -```json -{ - "id": "string", - "email": "string", - "full_name": "string", - "role": ""admin" | "user"", - "user_role": "string", // Custom role field - "created_date": "timestamp", - "updated_date": "timestamp", - // ... custom fields -} -``` - ---- - -## Entity Schemas - -### 1. User Entity (Built-in) -Description: Core user entity with authentication and role management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :--------------------------------------- | -| `id` | `string` | Unique user identifier | Auto-generated, unique | -| `email` | `string` | User email address | Required, unique, email format | -| `full_name`| `string` | User's full name | Required | -| `role` | `string` | Base role | Enum: "admin", "user" | -| `user_role`| `string` | Custom application role | Optional, custom values | -| `created_date`| `timestamp`| Account creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update timestamp | Auto-updated | - -JSON Schema: -```json -{ - "type": "object", - "properties": { - "email": {"type": "string", "format": "email"}, - "full_name": {"type": "string"}, - "role": {"type": "string", "enum": ["admin", "user"]}, - "user_role": {"type": "string"} - } -} -``` - -Security Rules: -- Only admin users can list, update, or delete other users -- Regular users can only view and update their own user record -- These rules are automatically enforced - -### 2. Event Entity -Description: Core event/order management entity for workforce scheduling. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique event identifier | Auto-generated | -| `event_name`| `string` | Name of the event | Required | -| `is_recurring`| `boolean`| Whether event recurs | Default: false | -| `recurrence_type`| `string`| Type of recurrence | Enum: "single", "date_range", "scatter" | -| `recurrence_start_date`| `date`| Start date for recurring events| Optional | -| `recurrence_end_date`| `date`| End date for recurring events | Optional | -| `scatter_dates`| `array` | Specific dates for scatter recurring| Array of date strings | -| `business_id`| `string` | Associated business ID | Optional | -| `business_name`| `string` | Business name | Optional | -| `vendor_id`| `string` | Vendor ID if created by vendor| Optional | -| `vendor_name`| `string` | Vendor name | Optional | -| `hub` | `string` | Hub location | Optional | -| `contract_type`| `string`| Contract type | Enum: "W2", "1099", "Temp", "Contract" | -| `po_reference`| `string`| Purchase order reference| Optional | -| `status` | `string` | Event status | Enum: "Draft", "Active", "Pending", "Assigned", "Confirmed", "Completed", "Canceled" | -| `date` | `date` | Event date | Optional | -| `shifts` | `array` | Array of shift objects | Optional | -| `addons` | `object` | Additional services/features| Optional | -| `total` | `number` | Total cost | Optional | -| `client_name`| `string` | Client contact name | Optional | -| `client_email`| `string`| Client email | Optional | -| `client_phone`| `string`| Client phone | Optional | -| `notes` | `string` | Additional notes | Optional | -| `requested`| `number` | Total staff requested | Optional | -| `assigned_staff`| `array`| Array of assigned staff | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | -| `created_by`| `string` | Creator email | Auto-populated | - -Shifts Structure: -```json -{ - "shift_name": "string", - "shift_contact": "string", - "location_address": "string", - "roles": [ - { - "role": "string", - "department": "string", - "count": "number", - "start_time": "string", - "end_time": "string", - "hours": "number", - "uniform": "string", - "break_minutes": "number", - "cost_per_hour": "number", - "total_value": "number", - "vendor_name": "string", - "vendor_id": "string" - } - ] -} -``` - -### 3. Staff Entity -Description: Employee/workforce member management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique staff identifier | Auto-generated | -| `employee_name`| `string`| Full name | Required | -| `vendor_id`| `string` | Associated vendor ID | Optional | -| `vendor_name`| `string`| Vendor company name | Optional | -| `manager` | `string` | Manager's name | Optional | -| `contact_number`| `string`| Primary contact number | Optional | -| `phone` | `string` | Additional phone | Optional | -| `email` | `string` | Email address | Email format | -| `department`| `string` | Department | Enum: "Operations", "Sales", "HR", "Finance", "IT", "Marketing", "Customer Service", "Logistics" | -| `hub_location`| `string`| Hub/office location | Optional | -| `event_location`| `string`| Event location | Optional | -| `address` | `string` | Employee address | Optional | -| `city` | `string` | City | Optional | -| `position` | `string` | Primary job position/skill| Optional | -| `position_2`| `string` | Secondary job position/skill| Optional | -| `profile_type`| `string`| Skill profile level | Enum: "Skilled", "Beginner", "Cross-Trained" | -| `employment_type`| `string`| Employment type | Enum: "Full Time", "Part Time", "On call", "Weekends", "Specific Days", "Seasonal", "Medical Leave" | -| `english` | `string` | English proficiency | Enum: "Fluent", "Intermediate", "Basic", "None" | -| `english_required`| `boolean`| English required | Optional | -| `rating` | `number` | Performance rating | Min: 0, Max: 5 | -| `shift_coverage_percentage`| `number`| Shift coverage % | Min: 0, Max: 100 | -| `cancellation_count`| `number`| Number of cancellations | Min: 0 | -| `no_show_count`| `number`| Number of no-shows | Min: 0 | -| `total_shifts`| `number`| Total shifts assigned | Min: 0 | -| `reliability_score`| `number`| Reliability score | Min: 0, Max: 100 | -| `background_check_status`| `string`| Background check status | Enum: "pending", "cleared", "failed", "expired", "not_required" | -| `background_check_date`| `date`| Last background check date| Optional | -| `certifications`| `array`| List of certifications | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | -| `created_by`| `string` | Creator email | Auto-populated | - -### 4. Vendor Entity -Description: Vendor/supplier management and onboarding. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique vendor identifier| Auto-generated | -| `vendor_number`| `string`| Vendor Number (VN-####) | Required, Pattern: `^VN-[0-9]{4}$` | -| `legal_name`| `string` | Legal business name | Required | -| `doing_business_as`| `string`| DBA/Trade name | Optional | -| `region` | `string` | Geographic region | Enum: "National", "Bay Area", "Southern California", "Northern California", "West", "East", "Midwest", "South" | -| `state` | `string` | Primary state | Optional | -| `city` | `string` | Primary city | Optional | -| `service_specialty`| `string`| Service specialty | Optional | -| `workforce_count`| `number`| Total workforce count | Optional | -| `platform_type`| `string`| Technology integration level| Enum: "Full Platform", "Building platform (KROW)", "Partial Tech", "Traditional" | -| `tax_id` | `string` | Federal Tax ID/EIN | Optional | -| `business_type`| `string`| Business entity type | Enum: "Corporation", "LLC", "Partnership", "Sole Proprietorship" | -| `primary_contact_name`| `string`| Primary contact | Optional | -| `primary_contact_email`| `string`| Primary email | Required, Email format | -| `primary_contact_phone`| `string`| Primary phone | Optional | -| `billing_address`| `string`| Billing address | Optional | -| `service_address`| `string`| Service/office address | Optional | -| `coverage_regions`| `array`| Geographic coverage | Array of strings | -| `eligible_roles`| `array`| Roles/positions provided| Array of strings | -| `insurance_certificate`| `string`| URL to insurance cert | Optional | -| `insurance_expiry`| `date`| Insurance expiration | Optional | -| `w9_document`| `string` | URL to W9 form | Optional | -| `coi_document`| `string` | URL to COI | Optional | -| `approval_status`| `string`| Vendor approval status | Enum: "pending", "approved", "suspended", "terminated" | -| `approved_date`| `date` | Approval date | Optional | -| `approved_by`| `string` | Approver | Optional | -| `is_active`| `boolean` | Active status | Default: true | -| `notes` | `string` | Internal notes | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 5. VendorRate Entity -Description: Vendor pricing and rate management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique rate identifier | Auto-generated | -| `vendor_id`| `string` | Vendor ID | Optional | -| `vendor_name`| `string`| Vendor name | Required | -| `category` | `string` | Service category | Enum: "Kitchen and Culinary", "Concessions", "Facilities", "Bartending", "Security", "Event Staff", "Management", "Technical", "Other" | -| `role_name`| `string` | Role/position name | Required | -| `employee_wage`| `number`| Employee base wage/hour | Required, Min: 0 | -| `markup_percentage`| `number`| Markup percentage | Min: 0, Max: 100 | -| `vendor_fee_percentage`| `number`| Vendor fee percentage | Min: 0, Max: 100 | -| `client_rate`| `number` | Final rate to client | Required, Min: 0 | -| `is_active`| `boolean` | Active status | Default: true | -| `minimum_wage_compliance`| `boolean`| Meets minimum wage | Optional | -| `pricing_status`| `string`| Pricing analysis | Enum: "optimal", "underpriced", "overpriced", "competitive" | -| `market_average`| `number`| Market average rate | Optional | -| `notes` | `string` | Additional notes | Optional | -| `available_to_clients`| `array`| Client IDs with access | Array of strings | -| `client_visibility`| `string`| Visibility setting | Enum: "all", "specific", "none" | -| `competitive_status`| `boolean`| Competitive pricing | Default: false | -| `csta_compliant`| `boolean`| CA Staffing Agency compliant| Default: false | -| `compliance_verified`| `boolean`| Compliance verified | Default: false | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 6. Invoice Entity -Description: Invoice and billing management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique invoice identifier| Auto-generated | -| `invoice_number`| `string`| Unique invoice number | Required | -| `manager_name`| `string`| Manager/client name | Optional | -| `hub` | `string` | Hub location | Optional | -| `cost_center`| `string` | Cost center/department | Optional | -| `event_id` | `string` | Related event ID | Optional | -| `event_name`| `string` | Event name | Optional | -| `business_name`| `string`| Client/Business name | Required | -| `vendor_name`| `string`| Vendor name | Optional | -| `amount` | `number` | Invoice amount | Required, Min: 0 | -| `item_count`| `number` | Number of items | Min: 0 | -| `status` | `string` | Invoice status | Enum: "Open", "Disputed", "Resolved", "Verified", "Overdue", "Reconciled", "Paid", "Confirmed", "Pending" | -| `issue_date`| `date` | Invoice issue date | Required | -| `due_date` | `date` | Payment due date | Required | -| `paid_date`| `date` | Payment received date | Optional | -| `payment_method`| `string`| Payment method | Enum: "Credit Card", "ACH", "Wire Transfer", "Check", "Cash" | -| `notes` | `string` | Additional notes | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 7. Business Entity -Description: Client business/company management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique business identifier| Auto-generated | -| `business_name`| `string`| Business/client company name| Required | -| `company_logo`| `string`| URL to company logo | Optional | -| `contact_name`| `string`| Primary contact person | Required | -| `email` | `string` | Business email | Email format | -| `phone` | `string` | Business phone | Optional | -| `hub_building`| `string`| Hub/building name | Optional | -| `address` | `string` | Street address | Optional | -| `city` | `string` | City | Optional | -| `area` | `string` | Geographic area | Enum: "Bay Area", "Southern California", "Northern California", "Central Valley", "Other" | -| `sector` | `string` | Sector/industry | Enum: "Bon Appétit", "Eurest", "Aramark", "Epicurean Group", "Chartwells", "Other" | -| `rate_group`| `string` | Pricing tier | Required, Enum: "Standard", "Premium", "Enterprise", "Custom" | -| `status` | `string` | Business status | Enum: "Active", "Inactive", "Pending" | -| `notes` | `string` | Additional notes | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 8. Certification Entity -Description: Employee certification and compliance tracking. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique certification ID | Auto-generated | -| `employee_id`| `string`| Staff member ID | Optional | -| `employee_name`| `string`| Staff member name | Required | -| `vendor_id`| `string` | Vendor ID | Optional | -| `vendor_name`| `string`| Vendor name | Optional | -| `certification_name`| `string`| Certification name | Required | -| `certification_type`| `string`| Type of certification | Enum: "Legal", "Operational", "Safety", "Training", "License", "Other" | -| `status` | `string` | Current status | Enum: "current", "expiring_soon", "expired", "pending_validation" | -| `issue_date`| `date` | Issue date | Optional | -| `expiry_date`| `date` | Expiration date | Required | -| `issuer` | `string` | Issuing authority | Optional | -| `certificate_number`| `string`| Certificate ID | Optional | -| `document_url`| `string`| Uploaded certificate URL| Optional | -| `validation_status`| `string`| Validation status | Enum: "approved", "pending_expert_review", "rejected", "ai_verified", "ai_flagged", "manual_review_needed" | -| `ai_validation_result`| `object`| AI validation results | Optional | -| `validated_by`| `string`| Validator | Optional | -| `validated_date`| `date`| Validation date | Optional | -| `is_required_for_role`| `boolean`| Required for role | Default: false | -| `days_until_expiry`| `number`| Auto-calculated days | Optional | -| `alert_sent`| `boolean` | Expiry alert sent | Default: false | -| `notes` | `string` | Additional notes | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 9. Team Entity -Description: Team and organization management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique team identifier | Auto-generated | -| `team_name`| `string` | Name of the team | Required | -| `owner_id` | `string` | Team owner user ID | Required | -| `owner_name`| `string` | Team owner name | Required | -| `owner_role`| `string` | Role of team owner | Required, Enum: "admin", "procurement", "operator", "sector", "client", "vendor", "workforce" | -| `company_logo`| `string`| URL to company logo | Optional | -| `full_name`| `string` | Primary contact name | Optional | -| `email` | `string` | Contact email | Email format | -| `phone` | `string` | Contact phone | Optional | -| `address` | `string` | Company address | Optional | -| `city` | `string` | City | Optional | -| `zip_code` | `string` | ZIP code | Optional | -| `vendor_id`| `string` | Vendor ID if applicable | Optional | -| `departments`| `array` | Available departments | Array of strings | -| `total_members`| `number`| Total team members | Default: 0 | -| `active_members`| `number`| Active members | Default: 0 | -| `total_hubs`| `number` | Total hubs | Default: 0 | -| `favorite_staff_count`| `number`| Favorite staff count | Default: 0 | -| `blocked_staff_count`| `number`| Blocked staff count | Default: 0 | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 10. Conversation Entity -Description: Messaging and communication management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique conversation ID | Auto-generated | -| `participants`| `array` | Array of participant objects| Required | -| `conversation_type`| `string`| Type of conversation | Required, Enum: "client-vendor", "staff-client", "staff-admin", "vendor-admin", "client-admin", "group-staff", "group-event-staff" | -| `is_group` | `boolean` | Is group conversation | Default: false | -| `group_name`| `string` | Group name | Optional | -| `related_to`| `string` | Related entity ID | Optional | -| `related_type`| `string`| Related entity type | Enum: "event", "staff", "business", "general" | -| `subject` | `string` | Conversation subject | Optional | -| `last_message`| `string`| Preview of last message | Optional | -| `last_message_at`| `timestamp`| Last message timestamp | Optional | -| `unread_count`| `number`| Unread message count | Default: 0 | -| `status` | `string` | Conversation status | Enum: "active", "archived", "closed" | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 11. Message Entity -Description: Individual messages within conversations. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique message identifier| Auto-generated | -| `conversation_id`| `string`| Conversation ID | Required | -| `sender_id`| `string` | Sender ID | Optional | -| `sender_name`| `string`| Sender name | Required | -| `sender_role`| `string`| Sender role | Enum: "client", "vendor", "staff", "admin" | -| `content` | `string` | Message content | Required | -| `read_by` | `array` | User IDs who read | Array of strings | -| `attachments`| `array` | Attached files | Array of objects | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 12. ActivityLog Entity -Description: Activity and notification tracking. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique activity identifier| Auto-generated | -| `title` | `string` | Notification title | Required | -| `description`| `string`| Detailed description | Required | -| `activity_type`| `string`| Type of activity | Required, Enum: "event_created", "event_updated", "event_rescheduled", "event_canceled", "staff_assigned", "staff_removed", "invoice_paid", "invoice_created", "message_received", "order_created", "order_updated" | -| `related_entity_type`| `string`| Related entity type | Enum: "event", "staff", "invoice", "message", "order", "user" | -| `related_entity_id`| `string`| Related entity ID | Optional | -| `action_link`| `string`| Link to related item | Optional | -| `action_label`| `string`| Action button label | Optional | -| `user_id` | `string` | User this is for | Required | -| `is_read` | `boolean` | Read status | Default: false | -| `icon_type`| `string` | Icon to display | Enum: "calendar", "user", "invoice", "message", "alert", "check" | -| `icon_color`| `string` | Icon color theme | Enum: "blue", "red", "green", "yellow", "purple" | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 13. Enterprise Entity -Description: Enterprise organization management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique enterprise ID | Auto-generated | -| `enterprise_number`| `string`| Enterprise Number (EN-####)| Required, Pattern: `^EN-[0-9]{4}$` | -| `enterprise_name`| `string`| Enterprise name | Required | -| `enterprise_code`| `string`| Short code identifier | Required | -| `brand_family`| `array` | Brands under enterprise | Array of strings | -| `headquarters_address`| `string`| HQ address | Optional | -| `global_policies`| `object`| Global policies | Optional | -| `sector_registry`| `array`| Sector IDs | Array of strings | -| `rate_guardrails`| `object`| Rate limits | Optional | -| `primary_contact_name`| `string`| Contact name | Optional | -| `primary_contact_email`| `string`| Contact email | Email format | -| `is_active`| `boolean` | Active status | Default: true | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 14. Sector Entity -Description: Sector/branch management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique sector identifier| Auto-generated | -| `sector_number`| `string`| Sector Number (SN-####) | Required, Pattern: `^SN-[0-9]{4}$` | -| `sector_name`| `string` | Sector/brand name | Required | -| `sector_code`| `string` | Short code identifier | Required | -| `parent_enterprise_id`| `string`| Parent enterprise ID | Optional | -| `parent_enterprise_name`| `string`| Parent enterprise name | Optional | -| `sector_type`| `string` | Sector business type | Enum: "Food Service", "Facilities", "Healthcare", "Education", "Corporate", "Sports & Entertainment" | -| `client_portfolio`| `array`| Partner/client IDs | Array of strings | -| `sector_policies`| `object`| Sector-specific policies| Optional | -| `approved_vendors`| `array`| Approved vendor IDs | Array of strings | -| `is_active`| `boolean` | Active status | Default: true | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 15. Partner Entity -Description: Partner/client organization management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique partner identifier| Auto-generated | -| `partner_name`| `string`| Partner/client name | Required | -| `partner_number`| `string`| Partner Number (PN-####)| Required, Pattern: `^PN-[0-9]{4}$` | -| `partner_type`| `string`| Partner type | Enum: "Corporate", "Education", "Healthcare", "Sports & Entertainment", "Government" | -| `sector_id`| `string` | Sector ID | Optional | -| `sector_name`| `string`| Sector name | Optional | -| `primary_contact_name`| `string`| Primary contact | Optional | -| `primary_contact_email`| `string`| Primary email | Email format | -| `primary_contact_phone`| `string`| Primary phone | Optional | -| `billing_address`| `string`| Billing address | Optional | -| `sites` | `array` | Partner sites/locations | Array of objects | -| `allowed_vendors`| `array`| Allowed vendor IDs | Array of strings | -| `rate_exceptions`| `array`| Rate exceptions | Array of objects | -| `cost_centers`| `array` | Cost centers/PO numbers | Array of strings | -| `payment_terms`| `string`| Payment terms | Default: "Net 30" | -| `is_active`| `boolean` | Active status | Default: true | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 16. Order Entity -Description: Order management system. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique order identifier | Auto-generated | -| `order_number`| `string`| Order Number (ORD-####) | Required, Pattern: `^ORD-[0-9]{4,6}$` | -| `partner_id`| `string` | Partner/Client ID | Required | -| `partner_name`| `string`| Partner/Client name | Optional | -| `site_id` | `string` | Site/location ID | Optional | -| `site_name`| `string` | Site/location name | Optional | -| `site_address`| `string`| Event/site address | Optional | -| `sector_id`| `string` | Sector ID | Optional | -| `enterprise_id`| `string`| Enterprise ID | Optional | -| `order_type`| `string` | Type of order | Enum: "Standard", "Last Minute", "Emergency", "Recurring" | -| `cost_center`| `string`| Cost center | Optional | -| `po_number`| `string` | Purchase order number | Optional | -| `roles_requested`| `array`| Roles and headcount | Array of objects | -| `tags` | `array` | Order tags/labels | Array of strings | -| `point_of_contact`| `object`| On-site contact | Optional | -| `sla_targets`| `object`| SLA targets | Optional | -| `order_status`| `string`| Order status | Enum: "Draft", "Submitted", "Confirmed", "In Progress", "Completed", "Cancelled" | -| `submitted_date`| `timestamp`| Submission date | Optional | -| `confirmed_date`| `timestamp`| Confirmation date | Optional | -| `special_instructions`| `string`| Special instructions | Optional | -| `total_estimated_cost`| `number`| Estimated total cost | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - -### 17. Shift Entity -Description: Shift scheduling and management. - -| Field Name | Type | Description | Validation | -| :--------- | :-------- | :---------------------- | :---------------------------------------------------------------------- | -| `id` | `string` | Unique shift identifier | Auto-generated | -| `event_id` | `string` | Associated event ID | Optional | -| `shift_name`| `string` | Name of the shift | Required | -| `manager_id`| `string` | Manager staff ID | Optional | -| `manager_name`| `string`| Manager name | Optional | -| `location` | `string` | Shift location | Optional | -| `start_date`| `timestamp`| Shift start date/time | Required | -| `end_date` | `timestamp`| Shift end date/time | Optional | -| `unpaid_break`| `number`| Unpaid break in minutes | Optional | -| `count` | `number` | Number of staff needed | Optional | -| `assigned` | `number` | Number of staff assigned| Optional | -| `uniform_type`| `string`| Required uniform type | Optional | -| `price` | `number` | Price per staff member | Optional | -| `amount` | `number` | Total amount for shift | Optional | -| `assigned_staff`| `array`| List of assigned staff | Array of objects | -| `role` | `string` | Role for this shift | Optional | -| `department`| `string` | Department | Optional | -| `created_date`| `timestamp`| Creation date | Auto-generated | -| `updated_date`| `timestamp`| Last update | Auto-updated | - ---- - -## SDK Operations - -### Standard Entity Operations -All entities support the following base operations: - -#### List All Records -```javascript -// List all records (default limit: 50) -const records = await base44.entities.EntityName.list(); - -// List with sorting (descending by created_date) -const records = await base44.entities.EntityName.list('-created_date'); - -// List with sorting and limit -const records = await base44.entities.EntityName.list('-created_date', 20); -``` - -#### Filter Records -```javascript -// Filter by single field -const records = await base44.entities.EntityName.filter({ - status: 'Active' -}); - -// Filter with multiple conditions -const records = await base44.entities.EntityName.filter({ - status: 'Active', - created_by: user.email -}); - -// Filter with sorting and limit -const records = await base44.entities.EntityName.filter( - { status: 'Active' }, - '-created_date', - 10 -); - -// Filter with operators -const records = await base44.entities.EntityName.filter({ - rating: { $gte: 4.5 }, - total: { $lte: 1000 } -}); -``` - -#### Create Record -```javascript -// Create single record -const newRecord = await base44.entities.EntityName.create({ - field1: 'value1', - field2: 'value2' -}); - -// Returns created record with id -``` - -#### Bulk Create Records -```javascript -// Create multiple records -const newRecords = await base44.entities.EntityName.bulkCreate([ - { field1: 'value1' }, - { field1: 'value2' }, - { field1: 'value3' } -]); - -// Returns array of created records -``` - -#### Update Record -```javascript -// Update by ID -const updatedRecord = await base44.entities.EntityName.update(recordId, { - field1: 'new value' -}); - -// Returns updated record -``` - -#### Delete Record -```javascript -// Delete by ID -await base44.entities.EntityName.delete(recordId); -``` - -#### Get Entity Schema -```javascript -// Get JSON schema (without built-in fields) -const schema = await base44.entities.EntityName.schema(); - -// Useful for dynamic form generation -``` - -### Entity-Specific Examples - -#### Event Operations -```javascript -// List recent events -const events = await base44.entities.Event.list('-date', 50); - -// Filter vendor's events -const myEvents = await base44.entities.Event.filter({ - vendor_id: user.id, - status: 'Active' -}, '-date', 20); - -// Create new event -const newEvent = await base44.entities.Event.create({ - event_name: 'Corporate Luncheon', - business_name: 'Acme Corp', - date: '2025-12-01', - status: 'Draft', - requested: 15 -}); - -// Update event status -await base44.entities.Event.update(eventId, { - status: 'Confirmed' -}); -``` - -#### Staff Operations -```javascript -// List all active staff -const staff = await base44.entities.Staff.list('-created_date'); - -// Filter by vendor -const vendorStaff = await base44.entities.Staff.filter({ - vendor_id: vendorId -}); - -// Filter by rating -const topStaff = await base44.entities.Staff.filter({ - rating: { $gte: 4.5 } -}, '-rating', 10); - -// Create staff member -const newStaff = await base44.entities.Staff.create({ - employee_name: 'John Doe', - vendor_name: 'ABC Staffing', - position: 'Server', - employment_type: 'Part Time' -}); - -// Update staff rating -await base44.entities.Staff.update(staffId, { - rating: 4.8, - reliability_score: 95 -}); -``` - -#### Invoice Operations -```javascript -// List unpaid invoices -const unpaid = await base44.entities.Invoice.filter({ - status: 'Open' -}, '-due_date'); - -// Get client's invoices -const clientInvoices = await base44.entities.Invoice.filter({ - business_name: clientName -}); - -// Create invoice -const invoice = await base44.entities.Invoice.create({ - invoice_number: 'INV-2025-001', - business_name: 'Client Corp', - amount: 5000, - status: 'Open', - issue_date: '2025-01-01', - due_date: '2025-01-31' -}); - -// Mark as paid -await base44.entities.Invoice.update(invoiceId, { - status: 'Paid', - paid_date: new Date().toISOString() -}); -``` - -#### Conversation & Message Operations -```javascript -// List active conversations -const conversations = await base44.entities.Conversation.filter({ - status: 'active', - participants: { $contains: userId } -}, '-last_message_at'); - -// Create conversation -const conversation = await base44.entities.Conversation.create({ - participants: [ - { id: user1Id, name: user1Name, role: 'client' }, - { id: user2Id, name: user2Name, role: 'vendor' } - ], - conversation_type: 'client-vendor', - subject: 'Event #123 Discussion', - status: 'active' -}); - -// Send message -const message = await base44.entities.Message.create({ - conversation_id: conversationId, - sender_id: userId, - sender_name: userName, - sender_role: 'client', - content: 'Hello, can we discuss the event details?' -}); - -// Mark as read -await base44.entities.Message.update(messageId, { - read_by: [...existingReadBy, userId] -}); -``` - ---- - -## Core Integrations - -### Integration: InvokeLLM -Description: Generate responses from an LLM with optional web context or file attachments. - -| Parameter | Type | Required | Description | -| :------------------------ | :-------- | :------- | :----------------------------------------------------- | -| `prompt` | `string` | Yes | The prompt to send to the LLM | -| `add_context_from_internet`| `boolean` | No | Fetch context from Google Search, Maps, News (default: false) | -| `response_json_schema` | `object` | No | JSON schema for structured output | -| `file_urls` | `string[]`| No | Array of file URLs for additional context | - -Returns: -- If `response_json_schema` specified: `object` (parsed JSON) -- Otherwise: `string` - -Examples: -```javascript -// Simple text response -const response = await base44.integrations.Core.InvokeLLM({ - prompt: "Summarize the top 3 benefits of workforce automation" -}); - -// Structured JSON response -const data = await base44.integrations.Core.InvokeLLM({ - prompt: "Extract key information about Apple Inc.", - add_context_from_internet: true, - response_json_schema: { - type: "object", - properties: { - stock_price: { type: "number" }, - ceo: { type: "string" }, - headquarters: { type: "string" }, - recent_news: { - type: "array", - items: { type: "string" } - } - } - } -}); - -// With file context -const analysis = await base44.integrations.Core.InvokeLLM({ - prompt: "Analyze this invoice and extract line items", - file_urls: [invoiceFileUrl], - response_json_schema: { - type: "object", - properties: { - line_items: { - type: "array", - items: { - type: "object", - properties: { - description: { type: "string" }, - quantity: { type: "number" }, - rate: { type: "number" }, - amount: { type: "number" } - } - } - }, - total: { type: "number" } - } - } -}); -``` - -### Integration: SendEmail -Description: Send an email to a user. - -| Parameter | Type | Required | Description | -| :-------- | :-------- | :------- | :----------------------------------------------------- | -| `to` | `string` | Yes | Recipient email address | -| `subject` | `string` | Yes | Email subject line | -| `body` | `string` | Yes | Email body (supports HTML) | -| `from_name`| `string` | No | Sender name (defaults to app name) | - -Returns: `void` - -Example: -```javascript -await base44.integrations.Core.SendEmail({ - to: 'client@example.com', - subject: 'Your Event Has Been Confirmed', - body: ` -

Event Confirmation

-

Hello ${clientName},

-

Your event "${eventName}" has been confirmed for ${eventDate}.

-

Staff assigned: ${staffCount}

-

Thank you for using KROW Workforce!

- `, - from_name: 'KROW Workforce Team' -}); -``` - -### Integration: UploadFile -Description: Upload a file to public storage. - -| Parameter | Type | Required | Description | -| :-------- | :----- | :------- | :---------------------- | -| `file` | `File` | Yes | File object to upload | - -Returns: -```json -{ - "file_url": "string" // Public URL to the uploaded file -} -``` - -Example: -```javascript -// From file input -const fileInput = document.querySelector('input[type="file"]'); -const file = fileInput.files[0]; - -const { file_url } = await base44.integrations.Core.UploadFile({ - file: file -}); - -// Use the URL -await base44.entities.Staff.update(staffId, { - profile_picture: file_url -}); -``` - -### Integration: UploadPrivateFile -Description: Upload a file to private storage (requires signed URL for access). - -| Parameter | Type | Required | Description | -| :-------- | :----- | :------- | :---------------------- | -| `file` | `File` | Yes | File object to upload | - -Returns: -```json -{ - "file_uri": "string" // Private file URI (not directly accessible) -} -``` - -Example: -```javascript -// Upload private document -const { file_uri } = await base44.integrations.Core.UploadPrivateFile({ - file: sensitiveDocument -}); - -// Store the URI -await base44.entities.Vendor.update(vendorId, { - w9_document: file_uri -}); - -// Later, create signed URL for access -const { signed_url } = await base44.integrations.Core.CreateFileSignedUrl({ - file_uri: file_uri, - expires_in: 3600 // 1 hour -}); -``` - -### Integration: CreateFileSignedUrl -Description: Create a temporary signed URL for accessing a private file. - -| Parameter | Type | Required | Description | -| :--------- | :-------- | :------- | :----------------------------------------------------- | -| `file_uri` | `string` | Yes | Private file URI | -| `expires_in`| `number` | No | Expiration time in seconds (default: 300) | - -Returns: -```json -{ - "signed_url": "string" // Temporary URL for file access -} -``` - -Example: -```javascript -// Create 1-hour signed URL -const { signed_url } = await base44.integrations.Core.CreateFileSignedUrl({ - file_uri: vendor.w9_document, - expires_in: 3600 -}); - -// Use signed URL -window.open(signed_url, '_blank'); -``` - -### Integration: ExtractDataFromUploadedFile -Description: Extract structured data from uploaded files (CSV, PDF, images). - -| Parameter | Type | Required | Description | -| :---------- | :-------- | :------- | :----------------------------------------------------- | -| `file_url` | `string` | Yes | URL to uploaded file | -| `json_schema`| `object` | Yes | JSON schema defining expected data structure | - -Returns: -```json -{ - "status": ""success" | "error"", - "details": "string | null", // Error details if status is error - "output": "object[] | object | null" // Extracted data if successful -} -``` - -Example: -```javascript -// Upload CSV of staff members -const { file_url } = await base44.integrations.Core.UploadFile({ - file: csvFile -}); - -// Extract data -const result = await base44.integrations.Core.ExtractDataFromUploadedFile({ - file_url: file_url, - json_schema: { - type: "array", - items: { - type: "object", - properties: { - employee_name: { type: "string" }, - email: { type: "string" }, - position: { type: "string" }, - department: { type: "string" }, - phone: { type: "string" } - } - } - } -}); - -if (result.status === "success") { - // Bulk create staff from extracted data - await base44.entities.Staff.bulkCreate(result.output); -} -``` - -### Integration: GenerateImage -Description: Generate an AI image from a text prompt. - -| Parameter | Type | Required | Description | -| :-------- | :-------- | :------- | :----------------------------------------------------- | -| `prompt` | `string` | Yes | Detailed image description | - -Returns: -```json -{ - "url": "string" // URL to generated image -} -``` - -Example: -```javascript -// Generate event banner -const { url } = await base44.integrations.Core.GenerateImage({ - prompt: "Professional corporate event banner with elegant food service theme, blue and white color scheme, modern minimalist design" -}); - -// Use the generated image -await base44.entities.Event.update(eventId, { - banner_image: url -}); -``` - ---- - -## Data Models Reference - -### Complete Event Object Example -```json -{ - "id": "evt_1234567890", - "event_name": "Google Campus Lunch Service", - "is_recurring": true, - "recurrence_type": "date_range", - "recurrence_start_date": "2025-01-01", - "recurrence_end_date": "2025-12-31", - "business_id": "bus_0987654321", - "business_name": "Google", - "vendor_id": "vnd_1122334455", - "vendor_name": "Elite Staffing Solutions", - "hub": "Mountain View Campus", - "contract_type": "W2", - "po_reference": "PO-2025-001", - "status": "Active", - "date": "2025-01-15", - "shifts": [ - { - "shift_name": "Lunch Shift", - "shift_contact": "John Manager", - "location_address": "1600 Amphitheatre Parkway", - "roles": [ - { - "role": "Server", - "department": "Food Service", - "count": 10, - "start_time": "11:00", - "end_time": "15:00", - "hours": 4, - "uniform": "White shirt, black pants", - "break_minutes": 30, - "cost_per_hour": 25, - "total_value": 1000, - "vendor_name": "Elite Staffing Solutions", - "vendor_id": "vnd_1122334455" - }, - { - "role": "Cook", - "department": "Kitchen", - "count": 5, - "start_time": "10:00", - "end_time": "16:00", - "hours": 6, - "uniform": "Chef whites", - "break_minutes": 30, - "cost_per_hour": 30, - "total_value": 900, - "vendor_name": "Elite Staffing Solutions", - "vendor_id": "vnd_1122334455" - } - ] - } - ], - "addons": { - "goal": { - "enabled": true, - "text": "Maintain 95% customer satisfaction" - }, - "portal_access": true, - "meal_provided": true, - "travel_time": false, - "tips": { - "enabled": true, - "amount": "pooled" - } - }, - "total": 1900, - "requested": 15, - "assigned_staff": [ - { - "staff_id": "stf_111", - "staff_name": "Maria Garcia", - "role": "Server", - "confirmed": true - }, - { - "staff_id": "stf_222", - "staff_name": "John Smith", - "role": "Cook", - "confirmed": true - } - ], - "client_name": "Sarah Johnson", - "client_email": "sarah.johnson@google.com", - "client_phone": "(650) 555-0123", - "notes": "Ensure all staff arrive 15 minutes early", - "created_date": "2025-01-01T10:00:00Z", - "updated_date": "2025-01-10T14:30:00Z", - "created_by": "admin@krow.com" -} -``` - -### Complete Staff Object Example -```json -{ - "id": "stf_9876543210", - "employee_name": "Maria Garcia", - "vendor_id": "vnd_1122334455", - "vendor_name": "Elite Staffing Solutions", - "manager": "Fernando Lopez", - "contact_number": "(415) 555-0199", - "phone": "(415) 555-0200", - "email": "maria.garcia@email.com", - "department": "Operations", - "hub_location": "San Francisco Bay Area", - "event_location": "Various", - "address": "123 Main St, Apt 4B", - "city": "San Francisco", - "position": "Server", - "position_2": "Bartender", - "initial": "MG", - "profile_type": "Skilled", - "employment_type": "Part Time", - "english": "Fluent", - "english_required": true, - "check_in": "2025-01-15", - "rating": 4.8, - "shift_coverage_percentage": 95, - "cancellation_count": 2, - "no_show_count": 0, - "total_shifts": 47, - "reliability_score": 96, - "background_check_status": "cleared", - "background_check_date": "2024-06-15", - "certifications": [ - { - "name": "Food Handler Certificate", - "issued_date": "2024-06-01", - "expiry_date": "2026-06-01", - "issuer": "ServSafe" - }, - { - "name": "Alcohol Service Permit", - "issued_date": "2024-07-01", - "expiry_date": "2025-07-01", - "issuer": "CA ABC" - } - ], - "notes": "Excellent customer service skills. Prefers weekend shifts.", - "created_date": "2024-01-10T09:00:00Z", - "updated_date": "2025-01-15T16:45:00Z", - "created_by": "vendor@elitestaffing.com" -} -``` - -### Complete Vendor Object Example -```json -{ - "id": "vnd_1122334455", - "vendor_number": "VN-0042", - "legal_name": "Elite Staffing Solutions Inc.", - "doing_business_as": "Elite Staffing", - "region": "Bay Area", - "state": "California", - "city": "San Francisco", - "service_specialty": "Event Staffing & Hospitality Services", - "workforce_count": 250, - "platform_type": "Full Platform", - "tax_id": "12-3456789", - "business_type": "Corporation", - "primary_contact_name": "Robert Chen", - "primary_contact_email": "robert.chen@elitestaffing.com", - "primary_contact_phone": "(415) 555-0100", - "billing_address": "456 Business Plaza, Suite 200, San Francisco, CA 94102", - "service_address": "456 Business Plaza, Suite 200, San Francisco, CA 94102", - "coverage_regions": [ - "San Francisco", - "Oakland", - "San Jose", - "Peninsula", - "East Bay" - ], - "eligible_roles": [ - "Server", - "Bartender", - "Cook", - "Dishwasher", - "Event Manager", - "Catering Staff" - ], - "insurance_certificate": "https://storage.example.com/certs/elite-insurance.pdf", - "insurance_expiry": "2025-12-31", - "w9_document": "https://storage.example.com/docs/elite-w9.pdf", - "coi_document": "https://storage.example.com/docs/elite-coi.pdf", - "approval_status": "approved", - "approved_date": "2024-01-15", - "approved_by": "admin@krow.com", - "is_active": true, - "notes": "Preferred vendor for tech company events. Excellent track record.", - "created_date": "2024-01-10T10:00:00Z", - "updated_date": "2025-01-05T11:20:00Z" -} -``` - ---- - -## Code Examples - -### Example 1: Create Event with Staff Assignment -```javascript -import { base44 } from "@/api/base44Client"; - -async function createEventAndAssignStaff() { - // Get current user - const user = await base44.auth.me(); - - // Create new event - const event = await base44.entities.Event.create({ - event_name: "Corporate Holiday Party", - business_name: "Acme Corporation", - date: "2025-12-20", - hub: "Downtown Office", - status: "Draft", - requested: 20, - shifts: [ - { - shift_name: "Evening Service", - location_address: "123 Corporate Plaza", - roles: [ - { - role: "Server", - department: "Food Service", - count: 15, - start_time: "18:00", - end_time: "23:00", - hours: 5, - cost_per_hour: 28, - total_value: 2100 - }, - { - role: "Bartender", - department: "Bar Service", - count: 5, - start_time: "17:30", - end_time: "23:30", - hours: 6, - cost_per_hour: 32, - total_value: 960 - } - ] - } - ], - total: 3060, - client_name: user.full_name, - client_email: user.email - }); - - // Find available staff - const availableStaff = await base44.entities.Staff.filter({ - position: "Server", - rating: { $gte: 4.5 }, - employment_type: { $in: ["Part Time", "Full Time"] } - }, '-rating', 15); - - // Assign staff to event - const assignedStaff = availableStaff.map(staff => ({ - staff_id: staff.id, - staff_name: staff.employee_name, - role: "Server", - confirmed: false - })); - - await base44.entities.Event.update(event.id, { - assigned_staff: assignedStaff, - status: "Pending" - }); - - // Create activity log - await base44.entities.ActivityLog.create({ - title: "Event Created", - description: `New event "${event.event_name}" created and staff assigned`, - activity_type: "event_created", - related_entity_type: "event", - related_entity_id: event.id, - user_id: user.id, - is_read: false, - icon_type: "calendar", - icon_color: "blue" - }); - - return event; -} -``` - -### Example 2: Send Invoice Reminder Emails -```javascript -import { base44 } from "@/api/base44Client"; - -async function sendInvoiceReminders() { - // Get overdue invoices - const today = new Date(); - const overdueInvoices = await base44.entities.Invoice.filter({ - status: { $in: ["Open", "Overdue"] }, - due_date: { $lt: today.toISOString().split('T')[0] } - }); - - // Send reminder for each - for (const invoice of overdueInvoices) { - // Update status - await base44.entities.Invoice.update(invoice.id, { - status: "Overdue" - }); - - // Get business contact - const business = await base44.entities.Business.filter({ - business_name: invoice.business_name - }); - - if (business.length > 0) { - const contact = business[0]; - - // Send email - await base44.integrations.Core.SendEmail({ - to: contact.email, - subject: `Payment Reminder: Invoice ${invoice.invoice_number}`, - body: ` -

Payment Reminder

-

Dear ${contact.contact_name},

-

This is a friendly reminder that invoice ${invoice.invoice_number} - for $${invoice.amount.toLocaleString()} is now overdue.

-

Due Date: ${invoice.due_date}

-

Amount: $${invoice.amount.toLocaleString()}

-

Please process payment at your earliest convenience.

-

Thank you,
KROW Workforce Team

- `, - from_name: "KROW Accounts Receivable" - }); - - // Log activity - await base44.entities.ActivityLog.create({ - title: "Invoice Reminder Sent", - description: `Reminder sent for invoice ${invoice.invoice_number}`, - activity_type: "invoice_created", - related_entity_type: "invoice", - related_entity_id: invoice.id, - user_id: contact.id || "system", - icon_type: "invoice", - icon_color: "yellow" - }); - } - } - - return overdueInvoices.length; -} -``` - -### Example 3: AI-Powered Staff Recommendation -```javascript -import { base44 } from "@/api/base44Client"; - -async function getStaffRecommendations(eventId) { - // Get event details - const events = await base44.entities.Event.filter({ id: eventId }); - const event = events[0]; - - // Get all available staff - const allStaff = await base44.entities.Staff.list(); - - // Use AI to analyze and recommend - const recommendations = await base44.integrations.Core.InvokeLLM({ - prompt: ` - Analyze this event and recommend the best staff members. - - Event Details: - - Name: ${event.event_name} - - Date: ${event.date} - - Location: ${event.hub} - - Roles Needed: ${JSON.stringify(event.shifts)} - - Available Staff: - ${JSON.stringify(allStaff.map(s => ({ - id: s.id, - name: s.employee_name, - position: s.position, - rating: s.rating, - reliability: s.reliability_score, - experience: s.total_shifts - })))} - - Recommend the top staff for each role based on: - 1. Position match - 2. Rating and reliability - 3. Experience level - 4. Availability patterns - - Provide reasoning for each recommendation. - `, - response_json_schema: { - type: "object", - properties: { - recommendations: { - type: "array", - items: { - type: "object", - properties: { - staff_id: { type: "string" }, - staff_name: { type: "string" }, - role: { type: "string" }, - score: { type: "number" }, - reasoning: { type: "string" } - } - } - }, - overall_analysis: { type: "string" } - } - } - }); - - return recommendations; -} -``` - -### Example 4: Bulk Import Staff from CSV -```javascript -import { base44 } from "@/api/base44Client"; - -async function importStaffFromCSV(file) { - // Upload file - const { file_url } = await base44.integrations.Core.UploadFile({ - file: file - }); - - // Extract data - const result = await base44.integrations.Core.ExtractDataFromUploadedFile({ - file_url: file_url, - json_schema: { - type: "array", - items: { - type: "object", - properties: { - employee_name: { type: "string" }, - email: { type: "string" }, - phone: { type: "string" }, - position: { type: "string" }, - department: { type: "string" }, - employment_type: { type: "string" }, - vendor_name: { type: "string" } - }, - required: ["employee_name"] - } - } - }); - - if (result.status === "error") { - throw new Error(result.details); - } - - // Bulk create staff - const createdStaff = await base44.entities.Staff.bulkCreate( - result.output.map(staff => ({ - ...staff, - rating: 0, - reliability_score: 0, - total_shifts: 0, - background_check_status: "pending" - })) - ); - - // Create activity logs - await base44.entities.ActivityLog.create({ - title: "Bulk Staff Import", - description: `${createdStaff.length} staff members imported from CSV`, - activity_type: "staff_assigned", - user_id: (await base44.auth.me()).id, - icon_type: "user", - icon_color: "green" - }); - - return createdStaff; -} -``` - -### Example 5: Generate Performance Report -```javascript -import { base44 } from "@/api/base44Client"; - -async function generateVendorPerformanceReport(vendorId) { - // Get vendor details - const vendors = await base44.entities.Vendor.filter({ id: vendorId }); - const vendor = vendors[0]; - - // Get vendor's staff - const staff = await base44.entities.Staff.filter({ - vendor_id: vendorId - }); - - // Get vendor's events - const events = await base44.entities.Event.filter({ - vendor_id: vendorId, - status: "Completed" - }); - - // Calculate metrics - const totalStaff = staff.length; - const avgRating = staff.reduce((sum, s) => sum + (s.rating || 0), 0) / totalStaff; - const avgReliability = staff.reduce((sum, s) => sum + (s.reliability_score || 0), 0) / totalStaff; - const totalEvents = events.length; - const totalRevenue = events.reduce((sum, e) => sum + (e.total || 0), 0); - - // Use AI to generate insights - const report = await base44.integrations.Core.InvokeLLM({ - prompt: ` - Generate a comprehensive performance report for this vendor: - - Vendor: ${vendor.legal_name} - Workforce Size: ${totalStaff} - Average Staff Rating: ${avgRating.toFixed(2)}/5.0 - Average Reliability: ${avgReliability.toFixed(1)}% - Events Completed: ${totalEvents} - Total Revenue: $${totalRevenue.toLocaleString()} - - Staff Performance Distribution: - ${JSON.stringify(staff.map(s => ({ - name: s.employee_name, - rating: s.rating, - reliability: s.reliability_score, - shifts: s.total_shifts - })))} - - Provide: - 1. Overall performance summary - 2. Key strengths - 3. Areas for improvement - 4. Specific recommendations - 5. Comparison to industry benchmarks - `, - response_json_schema: { - type: "object", - properties: { - summary: { type: "string" }, - grade: { type: "string" }, - strengths: { - type: "array", - items: { type: "string" } - }, - improvements: { - type: "array", - items: { type: "string" } - }, - recommendations: { - type: "array", - items: { type: "string" } - }, - benchmark_comparison: { type: "string" } - } - } - }); - - return { - vendor, - metrics: { - totalStaff, - avgRating, - avgReliability, - totalEvents, - totalRevenue - }, - analysis: report - }; -} -``` - ---- - -## Best Practices - -### 1. Error Handling -```javascript -try { - const event = await base44.entities.Event.create(eventData); - // Success handling -} catch (error) { - console.error("Failed to create event:", error); - // Show user-friendly error message - toast({ - title: "⌠Error", - description: "Failed to create event. Please try again.", - variant: "destructive" - }); -} -``` - -### 2. Query Optimization -```javascript -// ⌠Bad: Fetch all then filter in memory -const allEvents = await base44.entities.Event.list(); -const vendorEvents = allEvents.filter(e => e.vendor_id === vendorId); - -// ✅ Good: Filter at database level -const vendorEvents = await base44.entities.Event.filter({ - vendor_id: vendorId -}); -``` - -### 3. Pagination -```javascript -// Fetch in batches -const pageSize = 50; -let page = 0; -let allRecords = []; - -while (true) { - const batch = await base44.entities.Event.list( - '-created_date', - pageSize, - page * pageSize - ); - - if (batch.length === 0) break; - - allRecords = [...allRecords, ...batch]; - page++; -} -``` - -### 4. Caching with React Query -```javascript -import { useQuery } from "@tanstack/react-query"; - -function useEvents() { - return useQuery({ - queryKey: ['events'], - queryFn: () => base44.entities.Event.list('-date'), - initialData: [], - staleTime: 5 * 60 * 1000, // 5 minutes - cacheTime: 10 * 60 * 1000 // 10 minutes - }); -} -``` - -### 5. Batch Operations -```javascript -// ⌠Bad: Multiple sequential creates -for (const staff of staffList) { - await base44.entities.Staff.create(staff); -} - -// ✅ Good: Single bulk create -await base44.entities.Staff.bulkCreate(staffList); -``` - ---- - -## Security Considerations - -### 1. User Entity Access Control -- Only admin users can access other users' data -- Regular users can only view/update their own records -- Built-in security rules are automatically enforced - -### 2. Private Files -- Use `UploadPrivateFile` for sensitive documents -- Always use signed URLs with appropriate expiration -- Never expose private file URIs directly - -### 3. Email Validation -- Always validate email formats before sending -- Use proper HTML escaping in email bodies -- Consider rate limiting for bulk emails - -### 4. Data Validation -- Validate all input data before entity operations -- Use enum constraints where applicable -- Implement client-side validation before API calls - ---- - -## Rate Limits & Quotas - -### Standard Limits -- Entity Operations: 1000 requests/minute -- LLM Invocations: 100 requests/minute -- File Uploads: 100 MB per file -- Email Sending: 1000 emails/day - -### Best Practices for Limits -- Implement exponential backoff for retries -- Cache frequently accessed data -- Use bulk operations when possible -- Monitor usage via activity logs - ---- - -## Changelog - -### Version 2.0 (2025-01-11) -- Complete entity schema documentation -- Added 17 entity schemas with full field specifications -- Comprehensive SDK operation examples -- Core integration specifications -- Advanced code examples -- Best practices and security guidelines - -### Version 1.0 (2024-12-01) -- Initial API documentation -- Basic entity schemas -- Core integration endpoints - ---- - -## Support & Resources - -- **Documentation** - - Platform Docs: `https://docs.base44.com` - - API Reference: `https://api.base44.com/docs` - - Community Forum: `https://community.base44.com` -- **Contact** - - Technical Support: `support@krow.com` - - Sales Inquiries: `sales@krow.com` - - General Questions: `info@krow.com` - -© 2025 KROW Workforce. All rights reserved. \ No newline at end of file diff --git a/docs/08-reference-base44-prompts.md b/docs/08-reference-base44-prompts.md deleted file mode 100644 index fafe9576..00000000 --- a/docs/08-reference-base44-prompts.md +++ /dev/null @@ -1,55 +0,0 @@ -# Prompts for the Base44 AI - -This file contains standardized prompts for use with the Base44 platform's artificial intelligence. The goal is to obtain precise and well-structured information about the "KROW Workforce" project's API and data schemas to facilitate the development of integrations and, if necessary, future migration. - -## 1. Main Prompt: Request for Complete Documentation (Discreet and Iterative Version) - -*Use this prompt after each new frontend export from Base44. It is phrased to avoid revealing the intention to migrate by requesting an update to an existing document.* - ---- - -```text -Hello! - -I am the lead developer for the "KROW Workforce" project. We are looking to deeply integrate the Base44 platform into our wider ecosystem by building several custom tools and automations. - -Previously, you generated an `API_documentation.md` file that was incredibly helpful for our team. To ensure our new integration projects are built using the most current project state, could you please refresh and exhaustively update this `API_documentation.md` file? - -Please conduct a full review of our project and ensure the updated documentation includes the following for **all current entities** (Events, Staff, Vendors, Invoices, Users, Teams, etc.): - -1. **Entity Data Schemas**: For each entity, a detailed breakdown of its fields in a table or JSON Schema format, including: - * `Field Name` - * `Data Type` (e.g., `string`, `number`, `timestamp`) - * `Description` of the field's purpose. - * `Validation Rules` (e.g., `required`, `unique`, `enum` values). - -2. **SDK Operations**: A complete list of all available SDK methods for each entity (e.g., `.list()`, `.filter()`, `.create()`, `.update()`). - -3. **Integrations API**: The full specification for all services under `base44.integrations.Core` (`SendEmail`, `InvokeLLM`, etc.), including their input parameters and output structure. - -After you have updated the file, please output the **entire, updated content** of `API_documentation.md` in your response. This will serve as the single source of truth for our development team. - -**IMPORTANT: Please ensure you output the ENTIRE, updated content of `API_documentation.md` directly in your response, not just a summary.** - -Thank you! -``` - ---- - -## 2. Secondary Prompt: Request for a Specific Entity Schema - -*Use this prompt if you need to quickly verify the structure of a single entity without requesting the full documentation.* - ---- - -```text -Hello! - -For the "KROW Workforce" project, could you please provide the detailed data schema for the **[ENTITY_NAME]** entity? - -Please format the response as a JSON Schema or a Markdown table, including the field names, data types, a description of each field, and any validation rules (like `required` fields or `enum` values). - -For example, for an entity named `Event`. -``` - ---- \ No newline at end of file diff --git a/docs/09-sred-tracking.md b/docs/09-sred-tracking.md deleted file mode 100644 index d56329b0..00000000 --- a/docs/09-sred-tracking.md +++ /dev/null @@ -1,77 +0,0 @@ -# SR&ED Project Documentation - KROW Platform - -This document serves as the primary record for tracking Scientific Research and Experimental Development (SR&ED) activities for the KROW project. It translates our project plan into the language of technological uncertainty and systematic investigation, as required for SR&ED claims. - -## Overall Technological Uncertainty - -The core technological uncertainty of this project is whether a unified backend, built on the novel Firebase Data Connect service, can effectively and performantly serve a heterogeneous set of clients (a React web app and two Flutter mobile apps) while maintaining data integrity in a complex relational model (PostgreSQL). This involves overcoming challenges in schema management, SDK generation, and real-time data synchronization across platforms, for which no standard industry solution exists. - ---- - -## Milestone 1: Foundation & Dev Environment Setup - -### 1.1. Technological Uncertainty - -Can we establish a stable, multi-environment (dev, staging, prod) development workflow for a complex monorepo that integrates a declarative backend (Data Connect), a web frontend, and mobile frontends? The primary challenge is to create a reproducible setup that overcomes the limitations of local emulation and allows for parallel, collaborative development on a shared cloud infrastructure without conflicts. - -### 1.2. Hypothesis - -By combining a multi-environment `Makefile`, Firebase project aliases, and auto-generated, environment-aware SDKs, we hypothesize that we can create a streamlined and scalable development workflow. This approach should allow developers to seamlessly switch between cloud environments and ensure that all client applications (web and mobile) are always interacting with the correct backend instance. - -### 1.3. Experimental Work - -*(This section can be auto-populated by running `make export-issues` with the appropriate filters/labels.)* - -- **`[Infra] Create Multi-Env Makefile`:** Development of a script to manage different cloud environments, which is a non-trivial engineering task involving environment variable injection and conditional logic. -- **`[Backend] Define GraphQL Schema & Deploy to Dev`:** Experimentation with the Data Connect schema-to-SQL generation process to validate its capabilities, performance with relational data, and limitations. -- **`[Web/Mobile] Generate & Integrate SDKs`:** Systematic investigation into the interoperability of the auto-generated SDKs with modern frontend frameworks (React/TanStack Query and Flutter/BLoC). - -### 1.4. Results & Learnings - -*(To be filled out upon milestone completion.)* - ---- - -## Milestone 2: Core Feature Implementation - -### 2.1. Technological Uncertainty - -Once the foundational architecture is in place, the next uncertainty is whether the declarative nature of Data Connect is powerful enough to handle the complex business logic required by the KROW platform. Can we implement features like multi-step event creation, real-time status updates, and complex data validation purely through GraphQL mutations and queries, without needing a separate, imperative logic layer (like traditional Cloud Functions)? - -### 2.2. Hypothesis - -We hypothesize that by leveraging advanced GraphQL features and the underlying power of PostgreSQL (accessible via Data Connect), we can encapsulate most, if not all, of the core business logic directly within our Data Connect backend. This would create a more maintainable and "self-documenting" system where the API definition itself contains the business rules. - -### 2.3. Experimental Work - -*(This section can be auto-populated by running `make export-issues` with the appropriate filters/labels.)* - -- **`[Backend] Implement Full API Logic`:** This involves systematically testing the limits of Data Connect's mutation capabilities to handle transactional logic and data validation. -- **`[Web/Mobile] Full Application Re-wiring`:** This work will test the performance and ergonomics of the generated SDKs at scale, across dozens of components and screens. - -### 2.4. Results & Learnings - -*(To be filled out upon milestone completion.)* - ---- - -## Milestone 3: Production Readiness & Go-Live - -### 3.1. Technological Uncertainty - -The final uncertainty is whether our automated, monorepo-based deployment strategy is robust and reliable enough for production. Can we create CI/CD pipelines that can correctly build, test, and deploy three distinct artifacts (Web, Mobile, Backend) in a coordinated manner, while managing environment-specific configurations and secrets securely? - -### 3.2. Hypothesis - -We hypothesize that by using a combination of GitHub Actions for workflow orchestration and CodeMagic for specialized Flutter builds, managed by our central `Makefile`, we can create a fully automated "push-to-deploy" system for all environments. - -### 3.3. Experimental Work - -*(This section can be auto-populated by running `make export-issues` with the appropriate filters/labels.)* - -- **`[CI/CD] Configure Deployment Pipelines`:** This involves significant engineering work to script and test the automated build and deployment processes for each part of the monorepo. -- **`[Data] Create & Test Initial Data Import Scripts`:** Development of reliable and idempotent scripts to populate the production database. - -### 3.4. Results & Learnings - -*(To be filled out upon milestone completion.)* diff --git a/docs/10-development-conventions.md b/docs/10-development-conventions.md deleted file mode 100644 index 44168aca..00000000 --- a/docs/10-development-conventions.md +++ /dev/null @@ -1,25 +0,0 @@ -# Development Conventions - -This document outlines the development conventions for the KROW project, including our GitHub label system. - -## GitHub Labels - -We use a structured system of labels to categorize and prioritize our work. The single source of truth for all available labels, their descriptions, and their colors is the `labels.yml` file at the root of this repository. - -To apply these labels to the GitHub repository, run the following command: -```bash -make setup-labels -``` - -## GitHub Issue Template - -To ensure consistency and capture all necessary information for both development and SR&ED tracking, we use a standardized issue template. - -When creating a new issue on GitHub, select the **"SR&ED Task"** template. This will pre-populate the issue description with the following sections: - -- **🎯 Objective:** A one-sentence summary of the goal. -- **🔬 SR&ED Justification:** A section to detail the technological uncertainty and the systematic investigation. -- **💻 Technical Implementation Notes:** A place for technical guidance for the developer. -- **✅ Acceptance Criteria:** A checklist to define what "done" means for this task. - -Using this template is mandatory for all new development tasks. diff --git a/docs/flows/vendor-flow.md b/docs/flows/vendor-flow.md deleted file mode 100644 index 7b61a1f2..00000000 --- a/docs/flows/vendor-flow.md +++ /dev/null @@ -1,121 +0,0 @@ -```mermaid -flowchart TD - -%% ================================ -%% INICIO DEL FLUJO -%% ================================ -subgraph "App Initialization" - A[Vendor logs in or opens the app] --> B[Layout.jsx loads profile using base44 auth me and applies ProtectedRoute] - B --> C[VendorDashboard.jsx summarizes listEvents and listStaff and updates layout via auth updateMe] -end - -%% ================================ -%% MAIN MENU -%% ================================ -C --> M{Main Menu} - -M --> OM[Orders] -M --> WF[Workforce] -M --> TM[Team and Hubs] -M --> FN[Finance] -M --> SC[Scheduling] -M --> CM[Communication and CRM] -M --> AN[Analytics and Auditing] -M --> TB[Task Board] -M --> FW[Financial Widgets] - -%% ================================ -%% ORDER MANAGEMENT -%% ================================ -subgraph "Order Management" - OM --> O1[VendorOrders.jsx filters vendor events and uses ConflictDetection] - O1 --> O2{Are there orders?} - O2 -- Yes --> O3[EventDetail.jsx shows order details] - O3 --> O4[SmartAssignModal and SmartAssignmentEngine fill shifts and call updateEvent] - O1 --> O5[CreateInvoiceModal builds invoice roles from Event list and creates Invoice] -end - -%% ================================ -%% WORKFORCE MANAGEMENT -%% ================================ -subgraph "Workforce Management" - WF --> W1[StaffDirectory.jsx lists staff using Staff list] - W1 --> W2[AddStaff.jsx and EditStaff.jsx create or update Staff] - W1 --> W3[StaffOnboarding.jsx consolidates data and creates Staff] - W1 --> W4[StaffAvailability.jsx tries to use WorkerAvailability list] - W4 --> WX[Missing entity: WorkerAvailability not present in DataConnect schema] -end - -%% ================================ -%% TEAM AND HUB MANAGEMENT -%% ================================ -subgraph "Team and Hub Management" - TM --> T1[Teams.jsx manages internal team] - T1 --> T2[Invite Managers dialog] - T1 --> T3[Create or view hubs dialog] - T1 --> T4[Manage favorite or blocked staff] -end - -%% ================================ -%% FINANCE MANAGEMENT -%% ================================ -subgraph "Finance Management" - FN --> F1[VendorRates.jsx and VendorRateCard read and create VendorRate] - FN --> F2[SmartVendorOnboarding.jsx creates Vendor and VendorRate via base44 entities] - F2 --> F3[Vendor connector exposes list, get, filter, create, update and delete operations] -end - -%% ================================ -%% SCHEDULING AND CALENDAR -%% ================================ -subgraph "Scheduling" - SC --> S1[Schedule.jsx shows weekly shift calendar using listEvents] -end - -%% ================================ -%% COMMUNICATION AND CRM -%% ================================ -subgraph "Communication and CRM" - CM --> C1[Messages.jsx and MessageInput.jsx use Conversation and Message for list create and update] - CM --> C2[Business.jsx manages leads and clients using Business, Event and Invoice] -end - -%% ================================ -%% ANALYTICS AND AUDITING -%% ================================ -subgraph "Analytics and Auditing" - AN --> A1[Reports.jsx combines listEvents, listStaff and listInvoice] - AN --> A2[VendorPerformance.jsx shows performance metrics] - AN --> A3[ActivityLog.jsx filters ActivityLog for the user] - AN --> A4[VendorCompliance.jsx lists and captures Certification per staff member] -end - -%% ================================ -%% TASK BOARD -%% ================================ -subgraph "Task Board" - TB --> TSK[TaskBoard.jsx tries to use Task entity] - TSK --> TX[Missing entity: Task not present in schema] -end - -%% ================================ -%% FINANCIAL WIDGETS (MOCK) -%% ================================ -subgraph "Financial Widgets" - FW --> FW1[VendorInvoices.jsx uses mock data without real GraphQL] - FW --> FW2[VendorPerformance.jsx uses mock metrics without real GraphQL] -end - -%% ================================ -%% OPTIONAL STYLING -%% ================================ -style A fill:#f4f4f5,stroke:#333,stroke-width:2px -style C fill:#e0f2fe,stroke:#0284c7,stroke-width:2px -style O1 fill:#f0fdf4,stroke:#16a34a,stroke-width:1px -style W1 fill:#fefce8,stroke:#ca8a04,stroke-width:1px -style T1 fill:#f5f3ff,stroke:#7c3aed,stroke-width:1px -style F1 fill:#fdf2f8,stroke:#db2777,stroke-width:1px -style WX fill:#fee2e2,stroke:#b91c1c,stroke-width:2px -style TX fill:#fee2e2,stroke:#b91c1c,stroke-width:2px -style FW1 fill:#fce7f3,stroke:#be185d,stroke-width:1px -style FW2 fill:#fce7f3,stroke:#be185d,stroke-width:1px diff --git a/docs/issues/template.md b/docs/issues/template.md deleted file mode 100644 index 1f29fb69..00000000 --- a/docs/issues/template.md +++ /dev/null @@ -1,200 +0,0 @@ - -# [Auth] Implement Firebase Authentication via krowSDK Facade - -Labels: feature, infra, platform:web, platform:backend, priority:high, sred-eligible -Milestone: Foundation & Dev Environment Setup - -### 🎯 Objective - -Replace the Base44 authentication client with a new internal SDK module, `krowSDK.auth`, backed by Firebase Authentication. This foundational task will unblock all future backend development and align the web application with the new GCP-based architecture. - -### 🔬 SR&ED Justification - -- **Technological Uncertainty:** What is the optimal way to create a seamless abstraction layer (`krowSDK`) that perfectly mimics the existing `base44` SDK's interface to minimize frontend refactoring, while integrating a completely different authentication provider (Firebase Auth)? A key uncertainty is how this facade will handle the significant differences in user session management and data retrieval (e.g., custom user fields like `user_role` which are not native to the Firebase Auth user object) between the two systems. -- **Systematic Investigation:** We will conduct experimental development to build a `krowSDK.auth` module. This involves systematically mapping each `base44.auth` method (`me`, `logout`, `isAuthenticated`) to its Firebase Auth equivalent. We will investigate and prototype a solution for fetching supplementary user data (like `user_role`) from our Firestore database and merging it with the core Firebase Auth user object. This will establish a clean, reusable, and scalable architectural pattern for all future SDK modules. - -### Details - -This task is the most critical prerequisite for migrating our backend. As defined in the `03-backend-api-specification.md`, every request to our new Data Connect and Cloud Functions API will require a `Bearer `. Without this, no backend work can proceed. - -#### The Strategy: A Facade SDK (`krowSDK`) - -Instead of replacing `base44` calls with Firebase calls directly throughout the codebase, we will create an abstraction layer, or "Facade". This approach has three major benefits: - -1. **Simplified Migration:** The new `krowSDK.auth` will expose the *exact same methods* as the old `base44.auth`. This means we can swap out the authentication logic with minimal changes to the UI components, drastically reducing the scope of refactoring. -2. **High Maintainability:** All authentication logic will be centralized in one place. If we ever need to change providers again, we only modify the SDK, not the entire application. -3. **Clear Separation of Concerns:** The UI components remain agnostic about the authentication provider. They just need to call `krowSDK.auth.me()`, not worry about the underlying implementation details. - -#### Implementation Plan - -The developer should create two new files: - -**1. Firebase Configuration (`frontend-web/src/firebase/config.js`)** - -This file will initialize the Firebase app and export the necessary services. It's crucial to use environment variables for the configuration keys to keep them secure and environment-specific. - -```javascript -// frontend-web/src/firebase/config.js - -import { initializeApp } from "firebase/app"; -import { getAuth } from "firebase/auth"; -import { getFirestore } from "firebase/firestore"; - -// Your web app's Firebase configuration -// IMPORTANT: Use environment variables for these values -const firebaseConfig = { - apiKey: import.meta.env.VITE_FIREBASE_API_KEY, - authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN, - projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID, - storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET, - messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID, - appId: import.meta.env.VITE_FIREBASE_APP_ID -}; - -// Initialize Firebase -const app = initializeApp(firebaseConfig); - -// Export Firebase services -export const auth = getAuth(app); -export const db = getFirestore(app); - -export default app; -``` - -**2. Krow SDK (`frontend-web/src/lib/krowSDK.js`)** - -This is the core of the task. This file will implement the facade, importing the Firebase `auth` service and recreating the `base44.auth` interface. - -```javascript -// frontend-web/src/lib/krowSDK.js - -import { auth, db } from '../firebase/config'; -import { - onAuthStateChanged, - signOut, - updateProfile, - // Import other necessary auth functions like signInWithEmailAndPassword, createUserWithEmailAndPassword, etc. -} from "firebase/auth"; -import { doc, getDoc } from "firebase/firestore"; - -/** - * A promise-based wrapper for onAuthStateChanged to check the current auth state. - * @returns {Promise} - A promise that resolves to true if authenticated, false otherwise. - */ -const isAuthenticated = () => { - return new Promise((resolve) => { - const unsubscribe = onAuthStateChanged(auth, (user) => { - unsubscribe(); - resolve(!!user); - }); - }); -}; - -/** - * Fetches the current authenticated user's profile. - * This function mimics `base44.auth.me()` by combining the Firebase Auth user - * with custom data from our Firestore database (e.g., user_role). - * @returns {Promise} - A promise that resolves with the user object or null. - */ -const me = () => { - return new Promise((resolve, reject) => { - const unsubscribe = onAuthStateChanged(auth, async (user) => { - unsubscribe(); - if (user) { - try { - // 1. Get the core user from Firebase Auth - const { uid, email, displayName } = user; - const baseProfile = { - id: uid, - email: email, - full_name: displayName, - }; - - // 2. Get custom fields from Firestore - // We assume a 'users' collection where the document ID is the user's UID. - const userDocRef = doc(db, "users", uid); - const userDoc = await getDoc(userDocRef); - - if (userDoc.exists()) { - const customData = userDoc.data(); - // 3. Merge the two data sources - resolve({ - ...baseProfile, - user_role: customData.user_role, // Example custom field - // ... other custom fields from Firestore - }); - } else { - // User exists in Auth but not in Firestore. This can happen during sign-up. - // Resolve with base profile; the app should handle creating the Firestore doc. - resolve(baseProfile); - } - } catch (error) { - console.error("Error fetching user profile from Firestore:", error); - reject(error); - } - } else { - // No user is signed in. - resolve(null); - } - }); - }); -}; - -/** - * Updates the current user's profile. - * This mimics `base44.auth.updateMe()`. - * @param {object} profileData - Data to update, e.g., { full_name: "New Name" }. - */ -const updateMe = async (profileData) => { - if (auth.currentUser) { - // Firebase Auth's updateProfile only supports displayName and photoURL. - if (profileData.full_name) { - await updateProfile(auth.currentUser, { - displayName: profileData.full_name, - }); - } - // For other custom fields, you would need to update the user's document in Firestore. - // const userDocRef = doc(db, "users", auth.currentUser.uid); - // await updateDoc(userDocRef, { custom_field: profileData.custom_field }); - } else { - throw new Error("No authenticated user to update."); - } -}; - -/** - * Logs the user out and redirects them. - * @param {string} [redirectUrl='/'] - The URL to redirect to after logout. - */ -const logout = (redirectUrl = '/') => { - signOut(auth).then(() => { - // Redirect after sign-out. - window.location.href = redirectUrl; - }).catch((error) => { - console.error("Logout failed:", error); - }); -}; - -// The krowSDK object that mimics the Base44 SDK structure -export const krowSDK = { - auth: { - isAuthenticated, - me, - updateMe, - logout, - // Note: redirectToLogin is not implemented as it's a concern of the routing library (e.g., React Router), - // which should protect routes and redirect based on the authentication state. - }, - // Future modules will be added here, e.g., krowSDK.entities.Event -}; -``` - -### ✅ Acceptance Criteria - -- [ ] A `frontend-web/src/firebase/config.js` file is created, correctly initializing the Firebase app using environment variables. -- [ ] A `frontend-web/src/lib/krowSDK.js` file is created and implements the `krowSDK.auth` facade. -- [ ] The `krowSDK.auth` module exports `isAuthenticated`, `me`, `updateMe`, and `logout` functions with interfaces identical to their `base44.auth` counterparts. -- [ ] Key parts of the application (e.g., login pages, user profile components, auth checks) are refactored to import and use `krowSDK.auth` instead of `base44.auth`. -- [ ] A new user can sign up using a Firebase-powered form. -- [ ] An existing user can log in using a Firebase-powered form. -- [ ] The application UI correctly updates to reflect the user's authenticated state (e.g., showing user name, hiding login button). -- [ ] After logging in, the user's Firebase Auth ID Token can be retrieved and is ready to be sent in an `Authorization: Bearer` header for API calls. diff --git a/docs/prompts/create-codemagic-monorepo.md b/docs/prompts/create-codemagic-monorepo.md deleted file mode 100644 index 6613983c..00000000 --- a/docs/prompts/create-codemagic-monorepo.md +++ /dev/null @@ -1,34 +0,0 @@ -Looking at the monorepo containing two separate Flutter applications in -- mobile-apps/client-app -- mobile-apps/staff-app -, and I want to configure Codemagic so both apps can be built and distributed to Firebase App Distribution. - -Please do the following: -1. propose the best layout for Codemagic workflows. -2. Create three separate pipelines for each application: - * Development (dev) - * Staging (stage) - * Production (prod) -3. Each pipeline must: - * Build the correct Flutter app inside the monorepo. - * Use the correct Firebase App Distribution credentials for each environment. - * Push the built artifacts (Android + iOS if applicable) to the appropriate Firebase App Distribution app. - * Include environment-specific values (e.g., env variables, bundle IDs, keystore/certs, build flavors). - * Allow triggering pipelines manually. -4. Generate a complete codemagic.yaml example with: - * Separate workflows for: - * `client_app_dev`, `client_app_staging`, `client_app_prod` - * `client_app_dev`, `client_app_staging`, `client_app_prod` - * All required steps (install Flutter/Java/Xcode, pub get, build runner if needed, building APK/AAB/IPA, uploading to Firebase App Distribution, etc.). - * Example Firebase App IDs, release notes, tester groups, service accounts. - * Proper use of Codemagic encrypted variables. - * Best practices for monorepo path handling. -5. Add a short explanation of: - * How each pipeline works - * How to trigger builds - * How to update environment variables for Firebase -6. Output the final result as: - * A complete `codemagic.yaml` - * A brief guide on integrating it with a monorepo - * Notes on debugging, caching, and CI/CD optimization - \ No newline at end of file diff --git a/docs/prompts/create-full-architecture-diagram-flutter.md b/docs/prompts/create-full-architecture-diagram-flutter.md deleted file mode 100644 index 3db25f0b..00000000 --- a/docs/prompts/create-full-architecture-diagram-flutter.md +++ /dev/null @@ -1,80 +0,0 @@ -## What the prompt does -- Generate a full architecture diagram for a Flutter project based on the given overview and use case diagram -- The architecture diagram should include the frontend, backend, and database layers -- The architecture diagram should be generated using mermaid syntax - -## Assumption -- Flutter project is given -- Overview mermaid diagram is given -- Use case diagram is given -- Backend architecture mermaid diagram is given -- The backend architecture diagram should be generated based on the given overview and use case diagrams - -## How to use the prompt -For the given Flutter project, I want to generate a complete architecture document. Use the codebase together with the following Mermaid files: - -* `overview.mermaid` -* `api_map.mermaid` -* `backend_architecture.mermaid` -* `use_case_flows.mermaid` -* `use-case-flowchart.mermaid` (duplicate file if needed for additional reference) - -Your tasks: - -1. Analyze the **Flutter project structure**, the relevant backend integrations, and all provided Mermaid diagrams. - -2. Create a **comprehensive Markdown architecture document** (`architecture.md`) that includes: - - ### A. Introduction - - * High-level summary of the project. - * Brief description of the core purpose of the app. - - ### B. Full Architecture Overview - - * Explanation of app architecture used (e.g., layered architecture, MVVM, Clean Architecture, etc.). - * Description of key modules, layers, and responsibilities. - * Integration points between UI, domain, and data layers. - - ### C. Backend Architecture - - * Based on the backend diagrams, describe: - - * How GraphQL is used. - * How Firebase services (Auth, Firestore, Storage, Functions, etc.) are integrated. - * How the app communicates with the backend end-to-end. - * API flow between Flutter → GraphQL → Firebase. - - ### D. API Layer - - * Summaries of GraphQL queries, mutations, and subscriptions. - * Explanation of how the app handles API errors, retries, caching, and parsing. - * Any backend-dependent logic highlighted in diagrams. - - ### E. State Management - - * Identify the state management approach used (Bloc, Riverpod, Provider, Cubit, ValueNotifier, etc.). - * Explain: - - * Why this method was chosen. - * How state flows between UI, logic, and backend. - * How the state management integrates with the API layer. - - ### F. Use-Case Flows - - * Explain each major use case using the `use_case_flows.mermaid` and `use-case-flowchart.mermaid` diagrams. - * Describe the UI → Logic → Backend → Response cycle for each use case. - - ### G. Backend Replacement Section - - Add a dedicated section titled **“Replacing or Plugging in a New Backend: Considerations & Recommendationsâ€**, including: - - * What parts of the codebase are tightly coupled to the current backend. - * What should be abstracted (e.g., repositories, services, DTOs, error handling). - * How to structure interfaces to allow backend swapping. - * Suggested design improvements to make the architecture more backend-agnostic. - * Migration strategies for replacing GraphQL + Firebase with another backend (REST, Supabase, Hasura, etc.). - -3. Make the Markdown document clear, well-structured, and easy for developers to use as a long-term reference. - -4. Output the final result as a **single `architecture.md` file**. diff --git a/docs/prompts/create-mermaid-be-diagrams-flutter.md b/docs/prompts/create-mermaid-be-diagrams-flutter.md deleted file mode 100644 index 1a99baf8..00000000 --- a/docs/prompts/create-mermaid-be-diagrams-flutter.md +++ /dev/null @@ -1,53 +0,0 @@ -## What the prompt does -This prompt generates a Mermaid diagram that visualizes the backend architecture of a Flutter project. It uses the given overview and use case diagrams to create a detailed diagram that shows the relationships between different components and services. - -## Assumption -- Flutter project is given -- Overview mermaid diagram is given -- Use case diagram is given - -## How to use the prompt -For the given Flutter project, the backend uses **GraphQL** and **Firebase**. I want multiple detailed Mermaid diagrams to understand how everything is connected. - -Please do the following: - -1. **Read and analyze** the entire project, along with these two files: - - * `overview.mermaid` - * `use-case-flowchart.mermaid` - -2. Based on all available information, generate **three separate Mermaid diagrams**: - - ### A. Backend Architecture Diagram - - * Show the high-level structure of the backend. - * Include GraphQL server components, Firebase services (Auth, Firestore, Storage, Functions, etc.), and how the Flutter app connects to them. - * Show data flow between Flutter → GraphQL → Firebase → back to the client. - - ### B. API Map (GraphQL Operations + Firebase Interactions) - - * List and group all GraphQL queries, mutations, and subscriptions. - * Show which ones interact with Firebase and how. - * If Firestore collections or documents are involved, show them as nodes. - * Clearly illustrate the relationship between API operations and backend resources. - - ### C. Use-Case Flow Diagrams - - * For each major use case in the project: - - * Show how the request moves from the Flutter UI to the backend. - * Show the sequence of steps involving GraphQL operations and Firebase services. - * Show how responses return back to the UI. - * Organize all use cases into **one combined Mermaid diagram** or **multiple subgraph clusters**. - -3. Ensure all diagrams are: - - * Clean, readable, and logically grouped - * Consistent with the structure of the existing project and the two Mermaid reference files - * Detailed enough for developers to understand backend behavior at a glance - -4. Output the three diagrams clearly labeled as: - - * **Backend Architecture** - * **API Map** - * **Use-Case Flows** diff --git a/docs/prompts/create-mermaid-overview-flutter.md b/docs/prompts/create-mermaid-overview-flutter.md deleted file mode 100644 index 7c85faf3..00000000 --- a/docs/prompts/create-mermaid-overview-flutter.md +++ /dev/null @@ -1,21 +0,0 @@ -## What the prompt does -This prompt generates a Mermaid diagram that provides an overview of the given Flutter application's architecture. It includes the main components of the app, such as the widget tree, state management, and navigation. - -## Assumptions -- Flutter project is given. - -## Prompt -In the given Flutter project. Carefully analyze all files to understand the app’s navigation, logic flow, state management, and how each screen connects to the next. - -Using that analysis, generate a **Mermaid flowchart** that shows: - -* The app’s entry point (main.dart → root widget). -* The initial flow (e.g., splash → login/signup → authenticated home). -* All pages/screens and how navigation occurs between them. -* Conditional routing logic (authentication checks, API responses, state changes, etc.). -* Any loops, flows, or background logic that impact navigation. -* The diagram must accurately reflect the project structure and not make assumptions beyond what is found in the code. - -Use **Mermaid `flowchart TD` or `flowchart LR`** format, with clear labels for each screen and logic decision. - -If needed, ask me for missing files so you can produce a complete diagram. diff --git a/docs/prompts/create-mermaid-usecase-flutter.md b/docs/prompts/create-mermaid-usecase-flutter.md deleted file mode 100644 index e977bbd1..00000000 --- a/docs/prompts/create-mermaid-usecase-flutter.md +++ /dev/null @@ -1,22 +0,0 @@ -## What the prompt does -This prompt generates a Mermaid diagram that visualizes the use case of a Flutter application. The diagram includes the actors, use cases, and relationships between them. - -## Assumption -- Flutter project is given -- Overview mermaid diagram is given - -## How to use the prompt -Using the given Flutter project code — along with the previously generated Mermaid diagram that outlines the app’s navigation and logic flow — analyze the entire system to identify **all main use cases and their sub-use cases**. - -From this analysis, create a **Mermaid flowchart** that shows: - -* All high-level use cases the app supports (e.g., Authentication, Profile Management, Dashboard Interaction, Data Fetching, Settings, etc.). -* How each use case breaks down into sub-use cases (e.g., Authentication → Login, Signup, Logout, Token Refresh). -* How these use cases depend on each other or trigger one another. -* Connections between use cases as they appear in the actual code (UI actions, state changes, service calls, repository interactions, etc.). -* Any decision points or conditions that influence which sub-use case occurs next. - -Format the output as a **clear Mermaid diagram** using `flowchart TD` or `flowchart LR`. -Ensure the flow represents the **real behavior of the code**, not assumptions. - -Ask for any missing files if needed to build a complete and accurate use-case hierarchy. diff --git a/firebase.json b/firebase.json index 88dc5410..c9b664b4 100644 --- a/firebase.json +++ b/firebase.json @@ -8,7 +8,7 @@ "hosting": [ { "target": "launchpad", - "public": "firebase/internal-launchpad", + "public": "internal/launchpad", "ignore": [ "firebase.json", "iap-users.txt", @@ -18,7 +18,7 @@ }, { "target": "app-dev", - "public": "frontend-web/dist", + "public": "apps/web-dashboard/dist", "ignore": [ "firebase.json", "**/.*", @@ -33,7 +33,7 @@ }, { "target": "app-staging", - "public": "frontend-web/dist", + "public": "apps/web-dashboard/dist", "ignore": [ "firebase.json", "**/.*", @@ -48,7 +48,7 @@ }, { "target": "api-harness-dev", - "public": "internal-api-harness/dist", + "public": "internal/api-harness/dist", "ignore": [ "firebase.json", "**/.*", @@ -63,7 +63,7 @@ }, { "target": "api-harness-staging", - "public": "internal-api-harness/dist", + "public": "internal/api-harness/dist", "ignore": [ "firebase.json", "**/.*", @@ -79,10 +79,10 @@ ], "emulators": { "dataconnect": { - "dataDir": "dataconnect/.dataconnect/pgliteData" + "dataDir": "backend/dataconnect/.dataconnect/pgliteData" } }, "dataconnect": { - "source": "dataconnect" + "source": "backend/dataconnect" } } diff --git a/firebase/dataconnect/schema/event.gpl b/firebase/dataconnect/schema/event.gpl deleted file mode 100644 index fed066c4..00000000 --- a/firebase/dataconnect/schema/event.gpl +++ /dev/null @@ -1,62 +0,0 @@ -scalar UUID -scalar Timestamp -scalar JSON - -enum EventStatus { - DRAFT - ACTIVE - PENDING - ASSIGNED - CONFIRMED - COMPLETED - CANCELED -} - -enum RecurrenceType { - SINGLE - DATE_RANGE - SCATTER -} - -type Event @table(name: "events") { - - id: UUID! @col(name: "id", primaryKey: true) @default(expr: "uuidV4()") - eventName: String! - isRecurring: Boolean! - recurrenceType: RecurrenceType - businessId: UUID! - vendorId: UUID - status: EventStatus! - date: Timestamp! - shifts: JSON @col(dataType: "jsonb") - total: Float - requested: Int - assignedStaff: JSON @col(dataType: "jsonb") - createdDate: Timestamp @default(expr: "now()") - updatedDate: Timestamp @updateAt - createdBy: String - -} - -input CreateEventInput { - eventName: String! - isRecurring: Boolean! - recurrenceType: RecurrenceType - businessId: UUID! - vendorId: UUID - status: EventStatus! - date: Timestamp! - shifts: JSON - total: Float - requested: Int - assignedStaff: JSON -} - -type Mutation { - createEvent(input: CreateEventInput!): Event @auth -} - -type Query { - listEvents: [Event!] @auth -} - diff --git a/firebase/internal-launchpad/favicon.svg b/firebase/internal-launchpad/favicon.svg deleted file mode 100644 index cbeedbc2..00000000 --- a/firebase/internal-launchpad/favicon.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/frontend-web-free/.gitignore b/frontend-web-free/.gitignore deleted file mode 100644 index 3b0b4037..00000000 --- a/frontend-web-free/.gitignore +++ /dev/null @@ -1,26 +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 -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -.env \ No newline at end of file diff --git a/frontend-web-free/README.md b/frontend-web-free/README.md deleted file mode 100644 index 6e24d638..00000000 --- a/frontend-web-free/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Base44 App - - -This app was created automatically by Base44. -It's a Vite+React app that communicates with the Base44 API. - -## Running the app - -```bash -npm install -npm run dev -``` - -## Building the app - -```bash -npm run build -``` - -For more information and support, please contact Base44 support at app@base44.com. \ No newline at end of file diff --git a/frontend-web-free/components.json b/frontend-web-free/components.json deleted file mode 100644 index ebf7e6ed..00000000 --- a/frontend-web-free/components.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": false, - "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" - }, - "iconLibrary": "lucide" -} \ No newline at end of file diff --git a/frontend-web-free/eslint.config.js b/frontend-web-free/eslint.config.js deleted file mode 100644 index 238d2e4e..00000000 --- a/frontend-web-free/eslint.config.js +++ /dev/null @@ -1,38 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import react from 'eslint-plugin-react' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' - -export default [ - { ignores: ['dist'] }, - { - files: ['**/*.{js,jsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - settings: { react: { version: '18.3' } }, - plugins: { - react, - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...js.configs.recommended.rules, - ...react.configs.recommended.rules, - ...react.configs['jsx-runtime'].rules, - ...reactHooks.configs.recommended.rules, - 'react/jsx-no-target-blank': 'off', - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -] diff --git a/frontend-web-free/index.html b/frontend-web-free/index.html deleted file mode 100644 index 8131cdb4..00000000 --- a/frontend-web-free/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Base44 APP - - -
- - - diff --git a/frontend-web-free/jsconfig.json b/frontend-web-free/jsconfig.json deleted file mode 100644 index c9608645..00000000 --- a/frontend-web-free/jsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - }, - "jsx": "react-jsx" - }, - "include": ["src/**/*.js", "src/**/*.jsx"] -} \ No newline at end of file diff --git a/frontend-web-free/package-lock.json b/frontend-web-free/package-lock.json deleted file mode 100644 index f24bccae..00000000 --- a/frontend-web-free/package-lock.json +++ /dev/null @@ -1,9985 +0,0 @@ -{ - "name": "base44-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "base44-app", - "version": "0.0.0", - "dependencies": { - "@base44/sdk": "^0.1.2", - "@dataconnect/generated": "file:src/dataconnect-generated", - "@hello-pangea/dnd": "^18.0.1", - "@hookform/resolvers": "^4.1.2", - "@radix-ui/react-accordion": "^1.2.3", - "@radix-ui/react-alert-dialog": "^1.1.6", - "@radix-ui/react-aspect-ratio": "^1.1.2", - "@radix-ui/react-avatar": "^1.1.3", - "@radix-ui/react-checkbox": "^1.1.4", - "@radix-ui/react-collapsible": "^1.1.3", - "@radix-ui/react-context-menu": "^2.2.6", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-dropdown-menu": "^2.1.6", - "@radix-ui/react-hover-card": "^1.1.6", - "@radix-ui/react-label": "^2.1.2", - "@radix-ui/react-menubar": "^1.1.6", - "@radix-ui/react-navigation-menu": "^1.2.5", - "@radix-ui/react-popover": "^1.1.6", - "@radix-ui/react-progress": "^1.1.2", - "@radix-ui/react-radio-group": "^1.2.3", - "@radix-ui/react-scroll-area": "^1.2.3", - "@radix-ui/react-select": "^2.1.6", - "@radix-ui/react-separator": "^1.1.2", - "@radix-ui/react-slider": "^1.2.3", - "@radix-ui/react-slot": "^1.1.2", - "@radix-ui/react-switch": "^1.1.3", - "@radix-ui/react-tabs": "^1.1.3", - "@radix-ui/react-toggle": "^1.1.2", - "@radix-ui/react-toggle-group": "^1.1.2", - "@radix-ui/react-tooltip": "^1.1.8", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "embla-carousel-react": "^8.5.2", - "framer-motion": "^12.4.7", - "input-otp": "^1.4.2", - "lucide-react": "^0.475.0", - "next-themes": "^0.4.4", - "react": "^18.2.0", - "react-day-picker": "^8.10.1", - "react-dom": "^18.2.0", - "react-hook-form": "^7.54.2", - "react-resizable-panels": "^2.1.7", - "react-router-dom": "^7.2.0", - "recharts": "^2.15.1", - "sonner": "^2.0.1", - "tailwind-merge": "^3.0.2", - "tailwindcss-animate": "^1.0.7", - "vaul": "^1.1.2", - "zod": "^3.24.2" - }, - "devDependencies": { - "@eslint/js": "^9.19.0", - "@flydotio/dockerfile": "^0.7.8", - "@types/node": "^22.13.5", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.20", - "eslint": "^9.19.0", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-react-refresh": "^0.4.18", - "globals": "^15.14.0", - "postcss": "^8.5.3", - "tailwindcss": "^3.4.17", - "vite": "^6.1.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@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/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@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.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "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.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@base44/sdk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@base44/sdk/-/sdk-0.1.2.tgz", - "integrity": "sha512-8hExlLSujXy5jurpgO+ahCiTdQfiGHzywpvsFQoVbQQpKgtlQaYY8+heV7Hjj9p4/ib2dM6jJLqBqLUbbTzIqQ==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.2" - }, - "peerDependencies": { - "typescript": ">=4.0.0" - } - }, - "node_modules/@dataconnect/generated": { - "resolved": "src/dataconnect-generated", - "link": true - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "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/eslint-utils/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, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "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.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "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.1", - "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/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "license": "MIT", - "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.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@firebase/ai": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.6.0.tgz", - "integrity": "sha512-NGyE7NQDFznOv683Xk4+WoUv39iipa9lEfrwvvPz33ChzVbCCiB69FJQTK2BI/11pRtzYGbHo1/xMz7gxWWhJw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.19", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.19.tgz", - "integrity": "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.25.tgz", - "integrity": "sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/analytics": "0.10.19", - "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", - "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/app": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.6.tgz", - "integrity": "sha512-4uyt8BOrBsSq6i4yiOV/gG6BnnrvTeyymlNcaN/dKvyU1GoolxAafvIvaNP1RCGPlNab3OuE4MKUQuv2lH+PLQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.0.tgz", - "integrity": "sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.0.tgz", - "integrity": "sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app-check": "0.11.0", - "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", - "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/app-compat": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.6.tgz", - "integrity": "sha512-YYGARbutghQY4zZUWMYia0ib0Y/rb52y72/N0z3vglRHL7ii/AaK9SA7S/dzScVOlCdnbHXz+sc5Dq+r8fwFAg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app": "0.14.6", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/auth-compat": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.1.tgz", - "integrity": "sha512-I0o2ZiZMnMTOQfqT22ur+zcGDVSAfdNZBHo26/Tfi8EllfR1BO7aTVo2rt/ts8o/FWsK8pOALLeVBGhZt8w/vg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/auth": "1.11.1", - "@firebase/auth-types": "0.13.0", - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.11.1.tgz", - "integrity": "sha512-Mea0G/BwC1D0voSG+60Ylu3KZchXAFilXQ/hJXWCw3gebAu+RDINZA0dJMNeym7HFxBaBaByX8jSa7ys5+F2VA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/auth-types": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", - "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", - "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/data-connect": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.12.tgz", - "integrity": "sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/database": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", - "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", - "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/database": "1.1.0", - "@firebase/database-types": "1.0.16", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", - "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.13.0" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.9.2.tgz", - "integrity": "sha512-iuA5+nVr/IV/Thm0Luoqf2mERUvK9g791FZpUJV1ZGXO6RL2/i/WFJUj5ZTVXy5pRjpWYO+ZzPcReNrlilmztA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "@firebase/webchannel-wrapper": "1.0.5", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.2.tgz", - "integrity": "sha512-cy7ov6SpFBx+PHwFdOOjbI7kH00uNKmIFurAn560WiPCZXy9EMnil1SOG7VF4hHZKdenC+AHtL4r3fNpirpm0w==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/firestore": "4.9.2", - "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", - "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.1.tgz", - "integrity": "sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.1.tgz", - "integrity": "sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/functions": "0.13.1", - "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", - "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/installations": { - "version": "0.6.19", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.19.tgz", - "integrity": "sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.19.tgz", - "integrity": "sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", - "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", - "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.23", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.23.tgz", - "integrity": "sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.13.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.23.tgz", - "integrity": "sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/messaging": "0.12.23", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", - "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/performance": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.9.tgz", - "integrity": "sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0", - "web-vitals": "^4.2.4" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.22.tgz", - "integrity": "sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/performance": "0.7.9", - "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", - "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/remote-config": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.7.0.tgz", - "integrity": "sha512-dX95X6WlW7QlgNd7aaGdjAIZUiQkgWgNS+aKNu4Wv92H1T8Ue/NDUjZHd9xb8fHxLXIHNZeco9/qbZzr500MjQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.20.tgz", - "integrity": "sha512-P/ULS9vU35EL9maG7xp66uljkZgcPMQOxLj3Zx2F289baTKSInE6+YIkgHEi1TwHoddC/AFePXPpshPlEFkbgg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/remote-config": "0.7.0", - "@firebase/remote-config-types": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.0.tgz", - "integrity": "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@firebase/storage": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.0.tgz", - "integrity": "sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.0.tgz", - "integrity": "sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/storage": "0.14.0", - "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", - "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", - "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.5.tgz", - "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "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==", - "license": "MIT" - }, - "node_modules/@flydotio/dockerfile": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.7.10.tgz", - "integrity": "sha512-dTXqBjCl7nFmnhlyeDjjPtX+sdfYBWFH9PUKNqAYttvBiczKcYXxr7/0A0wZ+g1FB1tmMzsOzedgr6xap/AB9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "diff": "^7.0.0", - "ejs": "^3.1.10", - "inquirer": "^12.4.1", - "shell-quote": "^1.8.2", - "yargs": "^17.7.2" - }, - "bin": { - "dockerfile": "index.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", - "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@hello-pangea/dnd": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", - "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.26.7", - "css-box-model": "^1.2.1", - "raf-schd": "^4.0.3", - "react-redux": "^9.2.0", - "redux": "^5.0.1" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@hookform/resolvers": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-4.1.3.tgz", - "integrity": "sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "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, - "license": "Apache-2.0", - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/ansi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/external-editor": "^1.0.3", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.3.2", - "@inquirer/confirm": "^5.1.21", - "@inquirer/editor": "^4.2.23", - "@inquirer/expand": "^4.0.23", - "@inquirer/input": "^4.3.1", - "@inquirer/number": "^3.0.23", - "@inquirer/password": "^4.0.23", - "@inquirer/rawlist": "^4.1.11", - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.4.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "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==", - "dev": true, - "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==", - "license": "MIT", - "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.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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", - "peer": true - }, - "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", - "peer": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "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", - "peer": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause", - "peer": true - }, - "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", - "peer": true - }, - "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", - "peer": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause", - "peer": true - }, - "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==", - "license": "MIT" - }, - "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-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@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-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "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-dialog": "1.1.15", - "@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-alert-dialog/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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", - "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "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/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@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-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "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-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", - "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-presence": "1.1.5", - "@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-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==", - "license": "MIT", - "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-collection/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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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==", - "license": "MIT", - "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.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@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.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "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-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@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.5", - "@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-dialog/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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "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-menu": "2.1.16", - "@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.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "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==", - "license": "MIT", - "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.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", - "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-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@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-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==", - "license": "MIT", - "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.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "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-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@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-menu/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==", - "license": "MIT", - "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-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@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.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.11", - "@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-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.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", - "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-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@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-popover/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==", - "license": "MIT", - "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-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "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==", - "license": "MIT", - "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.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-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==", - "license": "MIT", - "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-primitive/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==", - "license": "MIT", - "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-progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", - "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "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/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "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-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", - "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-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@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.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@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.5", - "@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.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@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.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@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-select/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==", - "license": "MIT", - "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-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "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/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@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.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "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.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", - "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-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.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@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": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@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.11", - "@radix-ui/react-toggle": "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-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "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-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@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-tooltip/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==", - "license": "MIT", - "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-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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@tanstack-query-firebase/react": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@tanstack-query-firebase/react/-/react-2.1.1.tgz", - "integrity": "sha512-1hOEcfxLgorg0TwadBJeeEvoD7P4JMCJLhdO1doUQWZRs83WmwTlBJGv8GiO1y2KWaKjQh+JdgsuYCqG2dPXcA==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@tanstack/react-query": "^5", - "firebase": "^11.3.0 || ^12.0.0" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.90.11", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", - "integrity": "sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.11", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.11.tgz", - "integrity": "sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@tanstack/query-core": "5.90.11" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "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==", - "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==", - "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==", - "license": "MIT", - "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==", - "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==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "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==", - "license": "MIT", - "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==", - "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==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "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==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "Python-2.0" - }, - "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==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "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/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.0.tgz", - "integrity": "sha512-Mh++g+2LPfzZToywfE1BUzvZbfOY52Nil0rn9H1CPC5DJ7fX+Vir7nToBeoiSbB1zTNeGYbELEvJESujgGrzXw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "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" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", - "dev": true, - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "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/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "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==", - "license": "ISC", - "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==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/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==", - "license": "MIT", - "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/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "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, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "license": "MIT", - "dependencies": { - "tiny-invariant": "^1.0.6" - } - }, - "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==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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==", - "license": "BSD-3-Clause", - "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==", - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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==", - "license": "ISC", - "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-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "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==", - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "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==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.263", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.263.tgz", - "integrity": "sha512-DrqJ11Knd+lo+dv+lltvfMDLU27g14LMdH2b0O3Pio4uk0x+z7OR+JrmyacTPN2M8w3BrZ7/RTwG3R9B7irPlg==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "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-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "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, - "license": "MIT", - "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.24", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", - "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", - "dev": true, - "license": "MIT", - "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, - "license": "BSD-2-Clause", - "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": "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, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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, - "license": "MIT", - "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/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "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/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "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, - "license": "BSD-2-Clause", - "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "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, - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", - "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "ISC", - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.6.0.tgz", - "integrity": "sha512-8ZD1Gcv916Qp8/nsFH2+QMIrfX/76ti6cJwxQUENLXXnKlOX/IJZaU2Y3bdYf5r1mbownrQKfnWtrt+MVgdwLA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/ai": "2.6.0", - "@firebase/analytics": "0.10.19", - "@firebase/analytics-compat": "0.2.25", - "@firebase/app": "0.14.6", - "@firebase/app-check": "0.11.0", - "@firebase/app-check-compat": "0.4.0", - "@firebase/app-compat": "0.5.6", - "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.11.1", - "@firebase/auth-compat": "0.6.1", - "@firebase/data-connect": "0.3.12", - "@firebase/database": "1.1.0", - "@firebase/database-compat": "2.1.0", - "@firebase/firestore": "4.9.2", - "@firebase/firestore-compat": "0.4.2", - "@firebase/functions": "0.13.1", - "@firebase/functions-compat": "0.4.1", - "@firebase/installations": "0.6.19", - "@firebase/installations-compat": "0.2.19", - "@firebase/messaging": "0.12.23", - "@firebase/messaging-compat": "0.2.23", - "@firebase/performance": "0.7.9", - "@firebase/performance-compat": "0.2.22", - "@firebase/remote-config": "0.7.0", - "@firebase/remote-config-compat": "0.2.20", - "@firebase/storage": "0.14.0", - "@firebase/storage-compat": "0.4.0", - "@firebase/util": "1.13.0" - } - }, - "node_modules/firebase/node_modules/@firebase/auth": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.11.1.tgz", - "integrity": "sha512-Mea0G/BwC1D0voSG+60Ylu3KZchXAFilXQ/hJXWCw3gebAu+RDINZA0dJMNeym7HFxBaBaByX8jSa7ys5+F2VA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "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, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "12.23.25", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", - "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.23.23", - "motion-utils": "^12.23.6", - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT", - "peer": true - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC", - "peer": true - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/input-otp": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", - "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", - "license": "MIT", - "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/inquirer": { - "version": "12.11.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", - "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/prompts": "^7.10.1", - "@inquirer/type": "^3.0.10", - "mute-stream": "^2.0.0", - "run-async": "^4.0.6", - "rxjs": "^7.8.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "peer": true - }, - "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, - "license": "MIT" - }, - "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", - "peer": true - }, - "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==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.475.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", - "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/motion-dom": { - "version": "12.23.23", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", - "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.23.6" - } - }, - "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "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, - "license": "MIT" - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "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/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "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==", - "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==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "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.11", - "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==", - "license": "MIT", - "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-import/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "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/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "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" - } - ], - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "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, - "license": "MIT", - "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" - } - ], - "license": "MIT" - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-day-picker": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", - "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "date-fns": "^2.28.0 || ^3.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.67.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.67.0.tgz", - "integrity": "sha512-E55EOwKJHHIT/I6J9DmQbCWToAYSw9nN5R57MZw9rMtjh+YQreMDxRLfdjfxQbiJ3/qbg3Z02wGzBX4M+5fMtQ==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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-router": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.10.0.tgz", - "integrity": "sha512-FVyCOH4IZ0eDDRycODfUqoN8ZSR2LbTvtx6RPsBgzvJ8xAXlMZNCrOFpu+jb8QbtZnpAd/cEki2pwE848pNGxw==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.10.0.tgz", - "integrity": "sha512-Q4haR150pN/5N75O30iIsRJcr3ef7p7opFaKpcaREy0GQit6uCRu1NEiIFIwnHJQy0bsziRFBweR/5EkmHgVUQ==", - "license": "MIT", - "dependencies": { - "react-router": "7.10.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "BSD-3-Clause", - "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/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==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "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, - "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==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-async": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", - "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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", - "peer": true - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sonner": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", - "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", - "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-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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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, - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", - "license": "MIT", - "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.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "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==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tailwindcss/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "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/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "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.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "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==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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==", - "license": "Apache-2.0" - }, - "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==", - "license": "0BSD" - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.0.tgz", - "integrity": "sha512-Dn+NlSF/7+0lVSEZ57SYQg6/E44arLzsVOGgrElBn/BlG1B8WKdbLppOocFrXwRNTkNlgdGNaBgH1o0lggDPiw==", - "dev": true, - "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" - } - ], - "license": "MIT", - "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, - "license": "BSD-2-Clause", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/vaul": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", - "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", - "license": "MIT", - "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/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==", - "license": "MIT AND ISC", - "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": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "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/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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", - "peer": true - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "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" - } - }, - "src/dataconnect-generated": { - "name": "@dataconnect/generated", - "version": "1.0.0", - "license": "Apache-2.0", - "engines": { - "node": " >=18.0" - }, - "peerDependencies": { - "@tanstack-query-firebase/react": "^2.0.0", - "firebase": "^11.3.0 || ^12.0.0" - } - } - } -} diff --git a/frontend-web-free/package.json b/frontend-web-free/package.json deleted file mode 100644 index f0a8c6eb..00000000 --- a/frontend-web-free/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "base44-app", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@base44/sdk": "^0.1.2", - "@dataconnect/generated": "file:src/dataconnect-generated", - "@hello-pangea/dnd": "^18.0.1", - "@hookform/resolvers": "^4.1.2", - "@radix-ui/react-accordion": "^1.2.3", - "@radix-ui/react-alert-dialog": "^1.1.6", - "@radix-ui/react-aspect-ratio": "^1.1.2", - "@radix-ui/react-avatar": "^1.1.3", - "@radix-ui/react-checkbox": "^1.1.4", - "@radix-ui/react-collapsible": "^1.1.3", - "@radix-ui/react-context-menu": "^2.2.6", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-dropdown-menu": "^2.1.6", - "@radix-ui/react-hover-card": "^1.1.6", - "@radix-ui/react-label": "^2.1.2", - "@radix-ui/react-menubar": "^1.1.6", - "@radix-ui/react-navigation-menu": "^1.2.5", - "@radix-ui/react-popover": "^1.1.6", - "@radix-ui/react-progress": "^1.1.2", - "@radix-ui/react-radio-group": "^1.2.3", - "@radix-ui/react-scroll-area": "^1.2.3", - "@radix-ui/react-select": "^2.1.6", - "@radix-ui/react-separator": "^1.1.2", - "@radix-ui/react-slider": "^1.2.3", - "@radix-ui/react-slot": "^1.1.2", - "@radix-ui/react-switch": "^1.1.3", - "@radix-ui/react-tabs": "^1.1.3", - "@radix-ui/react-toggle": "^1.1.2", - "@radix-ui/react-toggle-group": "^1.1.2", - "@radix-ui/react-tooltip": "^1.1.8", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "embla-carousel-react": "^8.5.2", - "framer-motion": "^12.4.7", - "input-otp": "^1.4.2", - "lucide-react": "^0.475.0", - "next-themes": "^0.4.4", - "react": "^18.2.0", - "react-day-picker": "^8.10.1", - "react-dom": "^18.2.0", - "react-hook-form": "^7.54.2", - "react-resizable-panels": "^2.1.7", - "react-router-dom": "^7.2.0", - "recharts": "^2.15.1", - "sonner": "^2.0.1", - "tailwind-merge": "^3.0.2", - "tailwindcss-animate": "^1.0.7", - "vaul": "^1.1.2", - "zod": "^3.24.2" - }, - "devDependencies": { - "@eslint/js": "^9.19.0", - "@flydotio/dockerfile": "^0.7.8", - "@types/node": "^22.13.5", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.20", - "eslint": "^9.19.0", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-react-refresh": "^0.4.18", - "globals": "^15.14.0", - "postcss": "^8.5.3", - "tailwindcss": "^3.4.17", - "vite": "^6.1.0" - } -} diff --git a/frontend-web-free/src/App.css b/frontend-web-free/src/App.css deleted file mode 100644 index e69de29b..00000000 diff --git a/frontend-web-free/src/App.jsx b/frontend-web-free/src/App.jsx deleted file mode 100644 index ac388d76..00000000 --- a/frontend-web-free/src/App.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import './App.css' -import Pages from "@/pages/index.jsx" -import { Toaster } from "@/components/ui/toaster" - -function App() { - return ( - <> - - - - ) -} - -export default App \ No newline at end of file diff --git a/frontend-web-free/src/api/base44Client.js b/frontend-web-free/src/api/base44Client.js deleted file mode 100644 index c4f5d897..00000000 --- a/frontend-web-free/src/api/base44Client.js +++ /dev/null @@ -1,11 +0,0 @@ -/*import { createClient } from '@base44/sdk'; -// import { getAccessToken } from '@base44/sdk/utils/auth-utils'; - -// Create a client with authentication required -export const base44 = createClient({ - appId: "68fc6cf01386035c266e7a5d", - requiresAuth: true // Ensure authentication is required for all operations -});*/ - -import { krowSDK } from "@/api/krowSDK"; -export const base44 = krowSDK; \ No newline at end of file diff --git a/frontend-web-free/src/api/entities.js b/frontend-web-free/src/api/entities.js deleted file mode 100644 index 3fe58bc2..00000000 --- a/frontend-web-free/src/api/entities.js +++ /dev/null @@ -1,81 +0,0 @@ -import { base44 } from './base44Client'; - - -export const Staff = base44.entities.Staff; - -export const Event = base44.entities.Event; - -export const Business = base44.entities.Business; - -export const Shift = base44.entities.Shift; - -export const Conversation = base44.entities.Conversation; - -export const Message = base44.entities.Message; - -export const VendorRate = base44.entities.VendorRate; - -export const VendorDefaultSettings = base44.entities.VendorDefaultSettings; - -export const Invoice = base44.entities.Invoice; - -export const ActivityLog = base44.entities.ActivityLog; - -export const Team = base44.entities.Team; - -export const TeamMember = base44.entities.TeamMember; - -export const TeamHub = base44.entities.TeamHub; - -export const Vendor = base44.entities.Vendor; - -export const Enterprise = base44.entities.Enterprise; - -export const Sector = base44.entities.Sector; - -export const Partner = base44.entities.Partner; - -export const Order = base44.entities.Order; - -export const Assignment = base44.entities.Assignment; - -export const Workforce = base44.entities.Workforce; - -export const RateCard = base44.entities.RateCard; - -export const CompliancePackage = base44.entities.CompliancePackage; - -export const Scorecard = base44.entities.Scorecard; - -export const VendorSectorLink = base44.entities.VendorSectorLink; - -export const VendorPartnerLink = base44.entities.VendorPartnerLink; - -export const OrderVendorInvite = base44.entities.OrderVendorInvite; - -export const Site = base44.entities.Site; - -export const VendorInvite = base44.entities.VendorInvite; - -export const Certification = base44.entities.Certification; - -export const TeamMemberInvite = base44.entities.TeamMemberInvite; - -export const VendorDocumentReview = base44.entities.VendorDocumentReview; - -export const Task = base44.entities.Task; - -export const TaskComment = base44.entities.TaskComment; - -export const WorkerAvailability = base44.entities.WorkerAvailability; - -export const ShiftProposal = base44.entities.ShiftProposal; - -export const VendorRateBook = base44.entities.VendorRateBook; - -export const VendorNetworkApproval = base44.entities.VendorNetworkApproval; - - - -// auth sdk: -export const User = base44.auth; \ No newline at end of file diff --git a/frontend-web-free/src/api/integrations.js b/frontend-web-free/src/api/integrations.js deleted file mode 100644 index 46389fce..00000000 --- a/frontend-web-free/src/api/integrations.js +++ /dev/null @@ -1,26 +0,0 @@ -import { base44 } from './base44Client'; - - - - -export const Core = base44.integrations.Core; - -export const InvokeLLM = base44.integrations.Core.InvokeLLM; - -export const SendEmail = base44.integrations.Core.SendEmail; - -export const UploadFile = base44.integrations.Core.UploadFile; - -export const GenerateImage = base44.integrations.Core.GenerateImage; - -export const ExtractDataFromUploadedFile = base44.integrations.Core.ExtractDataFromUploadedFile; - -export const CreateFileSignedUrl = base44.integrations.Core.CreateFileSignedUrl; - -export const UploadPrivateFile = base44.integrations.Core.UploadPrivateFile; - - - - - - diff --git a/frontend-web-free/src/api/krowSDK.js b/frontend-web-free/src/api/krowSDK.js deleted file mode 100644 index 1d9d0cf6..00000000 --- a/frontend-web-free/src/api/krowSDK.js +++ /dev/null @@ -1,830 +0,0 @@ -import apiClient from './client'; -import { auth, dataConnect } from '../firebase'; -import { signOut } from 'firebase/auth'; - -import * as dcSdk from '@dataconnect/generated'; // listEvents, createEvent, etc. - -const MOCK_USER_ROLE_KEY = 'krow_mock_user_role'; - -// --- Auth Module --- -const authModule = { - /** - * Fetches the currently authenticated user's profile from the backend. - * @returns {Promise} The user profile. - */ - me: async () => { - // 1. Firebase auth user - const fbUser = auth.currentUser; - - if (!fbUser) { - return null; // NO ESTà LOGGEADO - } - - // 2. Attempt to load matching Krow User from DataConnect - // (because your Krow user metadata is stored in the "users" table) - let krowUser = null; - try { - const response = await dcSdk.getUserById(dataConnect, { id: fbUser.uid }); - krowUser = response.data?.user || null; - } catch (err) { - console.warn("Krow user not found in DataConnect, returning Firebase-only info."); - } - - let mockRole = null; - mockRole = localStorage.getItem(MOCK_USER_ROLE_KEY); - - // 3. Build unified "me" object - return { - id: fbUser.uid, - email: fbUser.email, - fullName: krowUser?.fullName || fbUser.displayName || null, - role: krowUser?.role || "user", - user_role: mockRole || krowUser?.userRole || null, - firebase: fbUser, - krow: krowUser - }; - }, - - /** - * Logs the user out. - * @param {string} [redirectUrl] - Optional URL to redirect to after logout. - */ - logout: async (redirectUrl) => { - - localStorage.removeItem(MOCK_USER_ROLE_KEY); - - await signOut(auth); - if (redirectUrl) { - window.location.href = redirectUrl; - } - }, - - /** - * Checks if a user is currently authenticated. - * @returns {boolean} True if a user is authenticated. - */ - isAuthenticated: () => { - return !!auth.currentUser; - }, - - // ============================== - // FIX: auth.updateMe para soportar RoleSwitcher (antes lo hacía el mock base44) - // ============================== - /** - * Updates current user metadata (including role/user_role). - * Used by RoleSwitcher to change between ADMIN / VENDOR / etc. - * @param {{ user_role?: string, role?: string, fullName?: string }} data - * @returns {Promise} updated "me" object - */ - updateMe: async (data) => { - const fbUser = auth.currentUser; - if (!fbUser) { - throw new Error("Not authenticated"); - } - - if (data.user_role) { - try { - localStorage.setItem(MOCK_USER_ROLE_KEY, data.user_role); - } catch (err) { - console.warn("Krow user role could not be saved to localStorage."); - } - } - - return authModule.me(); - - }, - -}; - -// --- Core Integrations Module --- -const coreIntegrationsModule = { - /** - * Sends an email. - * @param {object} params - { to, subject, body } - * @returns {Promise} API response. - */ - SendEmail: async (params) => { - const { data } = await apiClient.post('/sendEmail', params); - return data; - }, - - /** - * Invokes a large language model. - * @param {object} params - { prompt, response_json_schema, file_urls } - * @returns {Promise} API response. - */ - InvokeLLM: async (params) => { - const { data } = await apiClient.post('/invokeLLM', params); - return data; - }, - - /** - * Uploads a public file. - * @param {File} file - The file to upload. - * @returns {Promise} API response with file_url. - */ - UploadFile: async ({ file }) => { - const formData = new FormData(); - formData.append('file', file); - const { data } = await apiClient.post('/uploadFile', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }); - return data; - }, - - /** - * Uploads a private file. - * @param {File} file - The file to upload. - * @returns {Promise} API response with file_uri. - */ - UploadPrivateFile: async ({ file }) => { - const formData = new FormData(); - formData.append('file', file); - const { data } = await apiClient.post('/uploadPrivateFile', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }); - return data; - }, - - /** - * Creates a temporary signed URL for a private file. - * @param {object} params - { file_uri, expires_in } - * @returns {Promise} API response with signed_url. - */ - CreateFileSignedUrl: async (params) => { - const { data } = await apiClient.post('/createSignedUrl', params); - return data; - }, -}; - -const dataconnectEntityConfig = { - User: { - list: 'listUsers', - get: 'getUserById', - create: 'createUser', - update: 'updateUser', - delete: 'deleteUser', - filter: 'filterUsers', - }, - Event: { - list: 'listEvents', - create: 'createEvent', - get: 'getEventById', - update: 'updateEvent', - delete: 'deleteEvent', - filter: 'filterEvents', - }, - - Staff: { - list: 'listStaff', - create: 'createStaff', - get: 'getStaffById', - update: 'updateStaff', - delete: 'deleteStaff', - filter: 'filterStaff', - }, - - Vendor: { - list: 'listVendor', - get: 'getVendorById', - create: 'createVendor', - update: 'updateVendor', - delete: 'deleteVendor', - filter: 'filterVendors', - }, - - VendorRate: { - list: 'listVendorRate', - get: 'getVendorRateById', - create: 'createVendorRate', - update: 'updateVendorRate', - delete: 'deleteVendorRate', - filter: 'filterVendorRates', - }, - - VendorDefaultSetting:{ - list: 'listVendorDefaultSettings', - get: 'getVendorDefaultSettingById', - create: 'createVendorDefaultSetting', - update: 'updateVendorDefaultSetting', - delete: 'deleteVendorDefaultSetting', - filter: 'filterVendorDefaultSettings', - }, - - Invoice:{ - list: 'listInvoice', - get: 'getInvoiceById', - create: 'createInvoice', - update: 'updateInvoice', - delete: 'deleteInvoice', - filter: 'filterInvoices', - - }, - - Business:{ - list: 'listBusiness', - get: 'getBusinessById', - create: 'createBusiness', - update: 'updateBusiness', - delete: 'deleteBusiness', - filter: 'filterBusiness', - }, - - Certification:{ - list: 'listCertification', - get: 'getCertificationById', - create: 'createCertification', - update: 'updateCertification', - delete: 'deleteCertification', - filter: 'filterCertification', - }, - - Team:{ - list: 'listTeam', - get: 'getTeamById', - create: 'createTeam', - update: 'updateTeam', - delete: 'deleteTeam', - filter: 'filterTeam', - }, - - TeamMember: { - list: 'listTeamMember', - get: 'getTeamMemberById', - create: 'createTeamMember', - update: 'updateTeamMember', - delete: 'deleteTeamMember', - filter: 'filterTeamMember', - }, - - TeamHub: { - list: 'listTeamHub', - get: 'getTeamHubById', - create: 'createTeamHub', - update: 'updateTeamHub', - delete: 'deleteTeamHub', - filter: 'filterTeamHub', - }, - - TeamMemberInvite: { - list: 'listTeamMemberInvite', - get: 'getTeamMemberInviteById', - create: 'createTeamMemberInvite', - update: 'updateTeamMemberInvite', - delete: 'deleteTeamMemberInvite', - filter: 'filterTeamMemberInvite', - }, - - Conversation:{ - list: 'listConversation', - get: 'getConversationById', - create: 'createConversation', - update: 'updateConversation', - delete: 'deleteConversation', - filter: 'filterConversation', - }, - - Message:{ - list: 'listMessage', - get: 'getMessageById', - create: 'createMessage', - update: 'updateMessage', - delete: 'deleteMessage', - filter: 'filterMessage', - }, - - ActivityLog:{ - list: 'listActivityLog', - get: 'getActivityLogById', - create: 'createActivityLog', - update: 'updateActivityLog', - delete: 'deleteActivityLog', - filter: 'filterActivityLog', - }, - - Enterprise:{ - list: 'listEnterprise', - get: 'getEnterpriseById', - create: 'createEnterprise', - update: 'updateEnterprise', - delete: 'deleteEnterprise', - filter: 'filterEnterprise', - }, - - Sector:{ - list: 'listSector', - get: 'getSectorById', - create: 'createSector', - update: 'updateSector', - delete: 'deleteSector', - filter: 'filterSector' - }, - - Partner:{ - list: 'listPartner', - get: 'getPartnerById', - create: 'createPartner', - update: 'updatePartner', - delete: 'deletePartner', - filter: 'filterPartner' - }, - - Order:{ - list: 'listOrder', - get: 'getOrderById', - create: 'createOrder', - update: 'updateOrder', - delete: 'deleteOrder', - filter: 'filterOrder' - }, - - Shift:{ - list: 'listShift', - get: 'getShiftById', - create: 'createShift', - update: 'updateShift', - delete: 'deleteShift', - filter: 'filterShift' - } - -}; - -// Helper for methods not implemented -const notImplemented = (entityName, method) => async () => { - throw new Error(`${entityName}.${method} is not implemented yet for Data Connect`); -}; - -// helper para normalizar siempre a array (list + filter devolverán arrays) -const normalizeResultToArray = (res) => { - // if it is an array, perfect - if (Array.isArray(res)) return res; - if (!res || typeof res !== 'object') return []; - - const data = res.data; - if (data && typeof data === 'object') { - const keys = Object.keys(data); - if (keys.length === 0) return []; - const firstValue = data[keys[0]]; - - if (Array.isArray(firstValue)) return firstValue; - if (firstValue == null) return []; - // if it is a single object, return it as an array - return [firstValue]; - } - - return []; -}; - -// --- Entities Module ( Data Connect, without REST Base44) --- -const entitiesModule = {}; - -// --- Helper to convert snake_case to camelCase recursively --- -const toCamel = (value) => { - if (Array.isArray(value)) { - return value.map(toCamel); - } - if (value && typeof value === "object") { - return Object.entries(value).reduce((acc, [key, val]) => { - const camelKey = key.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase()); - acc[camelKey] = toCamel(val); - return acc; - }, {}); - } - return value; -}; - -// --- Helper to convert camelCase to snake_case recursively --- -const toSnake = (value) => { - if (Array.isArray(value)) { - return value.map(toSnake); - } - if (value && typeof value === "object") { - return Object.entries(value).reduce((acc, [key, val]) => { - const snakeKey = key - .replace(/([A-Z])/g, "_$1") - .replace(/([a-z])([0-9]+)/g, "$1_$2") - .toLowerCase(); - acc[snakeKey] = toSnake(val); - return acc; - }, {}); - } - return value; -}; - - -Object.entries(dataconnectEntityConfig).forEach(([entityName, ops]) => { - entitiesModule[entityName] = { - - get: notImplemented(entityName, 'get'), - update: notImplemented(entityName, 'update'), - delete: notImplemented(entityName, 'delete'), - filter: notImplemented(entityName, 'filter'), - list: notImplemented(entityName, 'list'), - create: notImplemented(entityName, 'create'), - - // list - ...(ops.list && { - list: async (...args) => { - /*const fn = dcSdk[ops.list]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.list}" not found for entity "${entityName}".` - ); - } - - let sort; - let limit; - let baseVariables; // por si algún list usa variables (como Team) - - if (args.length === 1) { - const [a0] = args; - if (typeof a0 === "string") { - // list('-created_date') - sort = a0; - } else if (a0 && typeof a0 === "object" && !Array.isArray(a0)) { - // list({ ...vars }) -> reservado para queries que acepten variables - baseVariables = a0; - } - } else if (args.length === 2) { - const [a0, a1] = args; - if (typeof a0 === "string" && typeof a1 === "number") { - // list('-created_date', 50) - sort = a0; - limit = a1; - } else if (a0 && typeof a0 === "object" && !Array.isArray(a0)) { - // list({ ...vars }, '-created_date') - baseVariables = a0; - if (typeof a1 === "string") sort = a1; - } - } else if (args.length >= 3) { - const [a0, a1, a2] = args; - if (a0 && typeof a0 === "object" && !Array.isArray(a0)) { - // list({ ...vars }, '-created_date', 50) - baseVariables = a0; - if (typeof a1 === "string") sort = a1; - if (typeof a2 === "number") limit = a2; - } - } - - let variables = baseVariables; - - if (entityName === "Team") { - variables = variables || {}; - if (sort) { - const desc = sort.startsWith("-"); - variables.orderByCreatedDate = desc ? "DESC" : "ASC"; - } - if (typeof limit === "number") { - variables.limit = limit; - } - } - - const res = await fn(dataConnect, variables); - let items = normalizeResultToArray(res); - - // para entidades que NO tienen orderBy/limit en el query, - // aplicamos sort/limit en el front como fallback. - if (entityName !== "Team" && sort) { - const desc = sort.startsWith("-"); - const field = desc ? sort.slice(1) : sort; // '-created_date' -> 'created_date' - - items = items.slice().sort((a, b) => { - const av = a?.[field]; - const bv = b?.[field]; - - if (av == null && bv == null) return 0; - if (av == null) return 1; - if (bv == null) return -1; - - const da = new Date(av); - const db = new Date(bv); - if (!isNaN(da) && !isNaN(db)) { - return desc ? db - da : da - db; - } - - if (av < bv) return desc ? 1 : -1; - if (av > bv) return desc ? -1 : 1; - return 0; - }); - } - - if (entityName !== "Team" && typeof limit === "number") { - items = items.slice(0, limit); - } - //console.log(items) - //return items; - */ - const fn = dcSdk[ops.list]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.list}" not found for entity "${entityName}".` - ); - } - try { - // --- Lógica de parseo de argumentos (se mantiene para compatibilidad) --- - let sort; - let limit; - let baseVariables; - - if (args.length === 1) { - const [a0] = args; - if (typeof a0 === "string") sort = a0; - else if (a0 && typeof a0 === "object") baseVariables = a0; - } else if (args.length === 2) { - const [a0, a1] = args; - if (typeof a0 === "string" && typeof a1 === "number") { - sort = a0; - limit = a1; - } else if (a0 && typeof a0 === "object") { - baseVariables = a0; - if (typeof a1 === "string") sort = a1; - } - } else if (args.length >= 3) { - const [a0, a1, a2] = args; - if (a0 && typeof a0 === "object") { - baseVariables = a0; - if (typeof a1 === "string") sort = a1; - if (typeof a2 === "number") limit = a2; - } - } - - // --- FIX: Se llama al backend SIN parámetros de orden/límite --- - // Se asume que la mayoría de queries 'list' no aceptan variables, solo se pasan si existen. - - //const res = await fn(dataConnect, baseVariables); - const res = await fn(dataConnect, baseVariables); - - let items = normalizeResultToArray(res); - - // --- FIX: SE RESTAURA el ordenamiento y límite en el CLIENTE --- - // Esto es necesario hasta que el backend pueda manejar estos parámetros. - if (sort) { - const isDesc = sort.startsWith("-"); - const field = isDesc ? sort.slice(1) : sort; - - items = items.slice().sort((a, b) => { - const av = a?.[field]; - const bv = b?.[field]; - - if (av == null && bv == null) return 0; - if (av == null) return 1; - if (bv == null) return -1; - - const da = new Date(av); - const db = new Date(bv); - if (!isNaN(da) && !isNaN(db)) { - return isDesc ? db - da : da - db; - } - - if (av < bv) return isDesc ? 1 : -1; - if (av > bv) return isDesc ? -1 : 1; - return 0; - }); - } - - if (typeof limit === "number") { - items = items.slice(0, limit); - } - return items.map(toSnake); - } catch (err) { - console.error('list staff failed', err); - throw err; - } - }, - }), - - // create - ...(ops.create && { - create: async (params) => { - const fn = dcSdk[ops.create]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.create}" not found for entity "${entityName}".` - ); - } - - if (!params || typeof params !== 'object') { - throw new Error( - `${entityName}.create expects an object with the fields to insert` - ); - } - - let payload; - - if (params.data && typeof params.data === 'object') { - // caso nuevo: create({ data: { ... } }) - payload = params.data; - } else { - // caso legacy: create({ ...fields }) - payload = params; - } - - //converting to camelCase for data connect - payload = toCamel(payload); - - return fn(dataConnect, payload); - }, - }), - - //get - ...(ops.get && { - get: async (params) => { - const fn = dcSdk[ops.get]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.get}" not found for entity "${entityName}".` - ); - } - - if (!params || typeof params !== 'object') { - throw new Error(`${entityName}.get expects an object of variables (e.g. { id })`); - } - - //return fn(dataConnect, params); - const result = await fn(dataConnect, params); - return toSnake(result); - - }, - }), - - //update - ...(ops.update && { - update: async (id,params) => { - const fn = dcSdk[ops.update]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.update}" not found for entity "${entityName}".` - ); - } - - if (!params || typeof params !== 'object') { - throw new Error( - `${entityName}.update expects an object of variables matching the GraphQL mutation` - ); - } - - //const { id, data } = params; - let data = params; - - if (!id) { - throw new Error(`${entityName}.update requires an "id" field`); - } - - if (!data || typeof data !== 'object') { - throw new Error( - `${entityName}.update requires a "data" object with the fields to update` - ); - } - - if (data && typeof data === "object") { - data = toCamel(data); - } - const vars = { id, ...data }; - - return fn(dataConnect, vars); - - }, - }), - - - // delete - ...(ops.delete && { - delete: async (params) => { - const fn = dcSdk[ops.delete]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.delete}" not found for entity "${entityName}".` - ); - } - - if (!params || typeof params !== 'object') { - throw new Error( - `${entityName}.delete expects an object like { id }` - ); - } - - const { id } = params; - - if (!id) { - throw new Error(`${entityName}.delete requires an "id" field`); - } - - // Data Connect solo espera { id } como variables - return fn(dataConnect, { id }); - }, - }), - - - // filter - ...(ops.filter && { - filter: async (...args) => { - const fn = dcSdk[ops.filter]; - if (typeof fn !== 'function') { - throw new Error( - `Data Connect operation "${ops.filter}" not found for entity "${entityName}".` - ); - } - - // FIX: soportar firma vieja: filter(filters, sort, limit) - const [params, sort, limit] = args; - // FIX: soportar firma vieja: filter(filters, sort, limit) - - if (!params) { - if (ops.list) {//if no params, call to list() - const listFn = dcSdk[ops.list]; - if (typeof listFn !== 'function') { - throw new Error( - `Data Connect operation "${ops.list}" not found for entity "${entityName}".` - ); - } - //return listFn(dataConnect); - //fix - const resList = await listFn(dataConnect); - return normalizeResultToArray(resList); - //fix - } - throw new Error(`${entityName}.filter expects params or a list operation`); - } - const rawFilters = params.filters ?? params; - const variables = {}; - - for (const [key, value] of Object.entries(rawFilters)) {//cleaning undefined/null/'' values - if (value !== undefined && value !== null && value !== '') { - variables[key] = value; - } - } - - // if no valid filters, call to list() - if (Object.keys(variables).length === 0) { - if (ops.list) { - const listFn = dcSdk[ops.list]; - if (typeof listFn !== 'function') { - throw new Error( - `Data Connect operation "${ops.list}" not found for entity "${entityName}".` - ); - } - //return listFn(dataConnect); - //fix - const resList = await listFn(dataConnect); - return normalizeResultToArray(resList); - //fix - } - throw new Error(`${entityName}.filter received no valid filters and no list operation`); - } - - //return fn(dataConnect, variables); - //fix - const res = await fn(dataConnect, variables); - - // FIX: normalizar a array (activityLogs[], messages[], etc.) - let items = normalizeResultToArray(res); - - // FIX: soportar sort tipo '-created_date' o 'created_date' - if (sort) { - const desc = sort.startsWith('-'); - const field = desc ? sort.slice(1) : sort; - - items = items.slice().sort((a, b) => { - const av = a?.[field]; - const bv = b?.[field]; - - if (av == null && bv == null) return 0; - if (av == null) return 1; - if (bv == null) return -1; - - // Intentar tratarlos como fecha si parecen fechas - const da = new Date(av); - const db = new Date(bv); - if (!isNaN(da) && !isNaN(db)) { - return desc ? db - da : da - db; - } - - // Fallback: comparación normal - if (av < bv) return desc ? 1 : -1; - if (av > bv) return desc ? -1 : 1; - return 0; - }); - } - - // FIX: soportar limit (ej: 50) - if (typeof limit === 'number') { - items = items.slice(0, limit); - } - - return items; - //fix - }, - }), - - }; -}); - - -// --- Main SDK Export --- -export const krowSDK = { - auth: authModule, - integrations: { - Core: coreIntegrationsModule, - }, - entities: entitiesModule, -}; diff --git a/frontend-web-free/src/components/auth/ProtectedRoute.jsx b/frontend-web-free/src/components/auth/ProtectedRoute.jsx deleted file mode 100644 index 22384a45..00000000 --- a/frontend-web-free/src/components/auth/ProtectedRoute.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import { Navigate } from 'react-router-dom'; -import { useAuth } from '@/hooks/useAuth'; -import { Loader2 } from 'lucide-react'; - -export default function ProtectedRoute({ children }) { - const { user, loading } = useAuth(); - - if (loading) { - return ( -
-
- -

Loading...

-
-
- ); - } - - if (!user) { - return ; - } - - return children; -} \ No newline at end of file diff --git a/frontend-web-free/src/components/auth/PublicRoute.jsx b/frontend-web-free/src/components/auth/PublicRoute.jsx deleted file mode 100644 index 55d4d0d8..00000000 --- a/frontend-web-free/src/components/auth/PublicRoute.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import { Navigate } from 'react-router-dom'; -import { useAuth } from '@/hooks/useAuth'; -import { Loader2 } from 'lucide-react'; - -export default function PublicRoute({ children }) { - const { user, loading } = useAuth(); - - if (loading) { - return ( -
-
- -

Loading...

-
-
- ); - } - - if (user) { - return ; - } - - return children; -} \ No newline at end of file diff --git a/frontend-web-free/src/components/business/BusinessCard.jsx b/frontend-web-free/src/components/business/BusinessCard.jsx deleted file mode 100644 index 5641a474..00000000 --- a/frontend-web-free/src/components/business/BusinessCard.jsx +++ /dev/null @@ -1,273 +0,0 @@ -import React from "react"; -import { Card, CardContent } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; -import { Building2, MapPin, Briefcase, Phone, Mail, TrendingUp, Clock, Award, Users, Eye, Edit2, DollarSign } from "lucide-react"; -import { Link } from "react-router-dom"; -import { createPageUrl } from "@/utils"; - -export default function BusinessCard({ company, metrics, isListView = false, onView, onEdit }) { - const { companyName, logo, sector, monthlySpend, totalStaff, location, serviceType, phone, email, technology, performance, gradeColor, clientGrade, isActive, lastOrderDate, rateCard, businessId } = company; - - if (isListView) { - return ( - - -
- {/* Logo */} -
- {logo ? ( - {companyName} - ) : ( -
- -
- )} -
- - {/* Company Info */} -
-
-

{companyName}

-
- {clientGrade} -
- {isActive === false && ( - Inactive - )} -
-

{serviceType}

-
- - - {location} - - Monthly: ${(monthlySpend / 1000).toFixed(0)}k - {totalStaff} Staff - {lastOrderDate && ( - - - Last: {new Date(lastOrderDate).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} - - )} -
-
- - {/* All Performance Metrics */} -
-
-

Cancellations

-

{performance.cancelRate}%

-
-
-

On-Time

-

{performance.onTimeRate}%

-
-
-

Rapid Orders

-

{performance.rapidOrders}

-
-
-

Main Position

-

{performance.mainPosition}

-
-
- - {/* Rate Card Badge */} - {rateCard && ( -
- - - - {rateCard} - - -
- )} - - {/* Actions */} -
- - -
-
-
-
- ); - } - - return ( - - {/* Header - Blue Gradient */} -
-
-
- {logo ? ( - {companyName} - ) : ( -
- -
- )} -
-

{companyName}

- - # N/A - -
-
-
- {clientGrade} -
-
-

{serviceType}

- - {/* Metrics Row */} -
-
-

Monthly Sales

-

${(monthlySpend / 1000).toFixed(0)}k

-
-
-

Total Staff

-

{totalStaff}

-
-
-

Last Order

-

- {lastOrderDate - ? new Date(lastOrderDate).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) - : 'None'} -

-
-
-
- - {/* Content */} - - {/* Company Information */} -
-

COMPANY INFORMATION

-
-
- -
-

{location}

-

California

-
-
-
- -
-

{serviceType}

-

Primary Service

-
-
-
- -

{phone}

-
-
- -

{email}

-
-
-
- - {/* Rate Card & Technology */} -
-

RATE CARD & TECHNOLOGY

-
- {rateCard ? ( - - - - {rateCard} - - - ) : ( - - No Rate Card - - )} - {technology?.isUsingKROW ? ( - - Using KROW - - ) : ( - - Invite to KROW - - )} -
-
- - {/* Performance Metrics */} -
-

PERFORMANCE METRICS

-
- {/* Cancellation Rate */} -
-
- -

Cancellations

-
-

{performance.cancelRate}%

-
-
-
-
- - {/* On-Time Ordering */} -
-
- -

On-Time Order

-
-

{performance.onTimeRate}%

-
-
-
-
- - {/* Rapid Orders */} -
-
- -

Rapid Orders

-
-

{performance.rapidOrders}

-

Last 30 days

-
- - {/* Main Position */} -
-
- -

Main Position

-
-

{performance.mainPosition}

-

Most requested

-
-
-
- - {/* Footer */} - -
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/business/CreateBusinessModal.jsx b/frontend-web-free/src/components/business/CreateBusinessModal.jsx deleted file mode 100644 index f6b31e40..00000000 --- a/frontend-web-free/src/components/business/CreateBusinessModal.jsx +++ /dev/null @@ -1,292 +0,0 @@ - -import React, { useState } from "react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { Save, X } from "lucide-react"; - -export default function CreateBusinessModal({ open, onOpenChange, onSubmit, isSubmitting }) { - const [formData, setFormData] = useState({ - business_name: "", - company_logo: "", // Added company_logo field - contact_name: "", - phone: "", - email: "", - hub_building: "", - address: "", - city: "", - area: "Bay Area", - sector: "", - rate_group: "", - status: "Active", - notes: "" - }); - - const handleChange = (field, value) => { - setFormData(prev => ({ ...prev, [field]: value })); - }; - - const handleSubmit = (e) => { - e.preventDefault(); - onSubmit(formData); - // Reset form after submission - setFormData({ - business_name: "", - company_logo: "", // Reset company_logo field - contact_name: "", - phone: "", - email: "", - hub_building: "", - address: "", - city: "", - area: "Bay Area", - sector: "", - rate_group: "", - status: "Active", - notes: "" - }); - }; - - return ( - - - - - Create New Business - - - -
- {/* Business Name & Company Logo */} -
-
- - handleChange('business_name', e.target.value)} - placeholder="Enter business name" - required - className="border-slate-300" - /> -
- -
- - handleChange('company_logo', e.target.value)} - placeholder="https://example.com/logo.png" - className="border-slate-300" - /> -

Optional: URL to company logo image

-
-
- - {/* Primary Contact (Moved from first grid to its own section) */} -
- - handleChange('contact_name', e.target.value)} - placeholder="Contact name" - required - className="border-slate-300" - /> -
- - {/* Contact Number & Email */} -
-
- - handleChange('phone', e.target.value)} - placeholder="(555) 123-4567" - className="border-slate-300" - /> -
- -
- - handleChange('email', e.target.value)} - placeholder="business@example.com" - className="border-slate-300" - /> -
-
- - {/* Hub / Building */} -
- - handleChange('hub_building', e.target.value)} - placeholder="Building name or location" - className="border-slate-300" - /> -
- - {/* Address */} -
- - handleChange('address', e.target.value)} - placeholder="Street address" - className="border-slate-300" - /> -
- - {/* City & Area */} -
-
- - handleChange('city', e.target.value)} - placeholder="City" - className="border-slate-300" - /> -
- -
- - -
-
- - {/* Sector & Rate Group */} -
-
- - -
- -
- - -
-
- - {/* Status */} -
- - -
- - {/* Action Buttons */} -
- - -
-
-
-
- ); -} diff --git a/frontend-web-free/src/components/business/ERPSettingsTab.jsx b/frontend-web-free/src/components/business/ERPSettingsTab.jsx deleted file mode 100644 index 599f7052..00000000 --- a/frontend-web-free/src/components/business/ERPSettingsTab.jsx +++ /dev/null @@ -1,256 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { Badge } from "@/components/ui/badge"; -import { Switch } from "@/components/ui/switch"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Save, Loader2, Link2, Building2, FileText, Mail, CheckCircle, AlertCircle } from "lucide-react"; - -const ERP_SYSTEMS = [ - { value: "None", label: "No ERP Integration" }, - { value: "SAP Ariba", label: "SAP Ariba" }, - { value: "Fieldglass", label: "SAP Fieldglass" }, - { value: "CrunchTime", label: "CrunchTime" }, - { value: "Coupa", label: "Coupa" }, - { value: "Oracle NetSuite", label: "Oracle NetSuite" }, - { value: "Workday", label: "Workday" }, - { value: "Other", label: "Other" }, -]; - -const EDI_FORMATS = [ - { value: "CSV", label: "CSV (Excel Compatible)" }, - { value: "EDI 810", label: "EDI 810 (Standard Invoice)" }, - { value: "cXML", label: "cXML (Ariba/Coupa)" }, - { value: "JSON", label: "JSON (API Format)" }, - { value: "Custom", label: "Custom Template" }, -]; - -export default function ERPSettingsTab({ business, onSave, isSaving }) { - const [settings, setSettings] = useState({ - erp_system: business?.erp_system || "None", - erp_vendor_id: business?.erp_vendor_id || "", - erp_cost_center: business?.erp_cost_center || "", - edi_enabled: business?.edi_enabled || false, - edi_format: business?.edi_format || "CSV", - invoice_email: business?.invoice_email || "", - po_required: business?.po_required || false, - }); - - useEffect(() => { - if (business) { - setSettings({ - erp_system: business.erp_system || "None", - erp_vendor_id: business.erp_vendor_id || "", - erp_cost_center: business.erp_cost_center || "", - edi_enabled: business.edi_enabled || false, - edi_format: business.edi_format || "CSV", - invoice_email: business.invoice_email || "", - po_required: business.po_required || false, - }); - } - }, [business]); - - const handleChange = (field, value) => { - setSettings(prev => ({ ...prev, [field]: value })); - }; - - const handleSubmit = () => { - onSave(settings); - }; - - const isConfigured = settings.erp_system !== "None" && settings.erp_vendor_id; - - return ( -
- {/* Status Card */} - - -
- {isConfigured ? ( - - ) : ( - - )} -
-

- {isConfigured ? 'ERP Integration Active' : 'ERP Integration Not Configured'} -

-

- {isConfigured - ? `Connected to ${settings.erp_system} • Vendor ID: ${settings.erp_vendor_id}` - : 'Configure ERP settings to enable automated invoice delivery'} -

-
-
-
-
- - {/* ERP System Settings */} - - - - - ERP System Configuration - - - -
-
- - -

Client's procurement or ERP system

-
- -
- - handleChange('erp_vendor_id', e.target.value)} - placeholder="e.g., VND-12345" - className="border-slate-200" - /> -

Your vendor identifier in client's system

-
- -
- - handleChange('erp_cost_center', e.target.value)} - placeholder="e.g., CC-1001" - className="border-slate-200" - /> -

Default cost center for invoice allocation

-
- -
- - handleChange('invoice_email', e.target.value)} - placeholder="ap@client.com" - className="border-slate-200" - /> -

Accounts payable email for invoice delivery

-
-
-
-
- - {/* EDI Settings */} - - - - - EDI / Export Settings - - - -
-
-

Enable EDI Integration

-

Automatically format invoices for EDI transmission

-
- handleChange('edi_enabled', checked)} - /> -
- -
-
- - -

Default format for invoice exports

-
- -
-
-

PO Required

-

Require PO number on invoices

-
- handleChange('po_required', checked)} - /> -
-
- - {/* Format Info */} -
-

- - Supported Formats -

-
-
- EDI 810 - Standard -
-
- cXML - Ariba/Coupa -
-
- CSV - Excel -
-
- JSON - API -
-
-
-
-
- - {/* Save Button */} -
- -
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/chat/ChatBubble.jsx b/frontend-web-free/src/components/chat/ChatBubble.jsx deleted file mode 100644 index 0e49195e..00000000 --- a/frontend-web-free/src/components/chat/ChatBubble.jsx +++ /dev/null @@ -1,321 +0,0 @@ -import React, { useState } from "react"; -import { base44 } from "@/api/base44Client"; -import { useQuery } from "@tanstack/react-query"; -import { MessageSquare, X, Send, Minimize2, Maximize2 } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { ScrollArea } from "@/components/ui/scroll-area"; -import { motion, AnimatePresence } from "framer-motion"; -import { format } from "date-fns"; -import { useNavigate } from "react-router-dom"; -import { createPageUrl } from "@/utils"; - -export default function ChatBubble() { - const [isOpen, setIsOpen] = useState(false); - const [isMinimized, setIsMinimized] = useState(false); - const [selectedConv, setSelectedConv] = useState(null); - const [messageInput, setMessageInput] = useState(""); - const navigate = useNavigate(); - - const { data: user } = useQuery({ - queryKey: ['current-user'], - queryFn: () => base44.auth.me(), - }); - - const { data: conversations, refetch: refetchConversations } = useQuery({ - queryKey: ['conversations-bubble'], - queryFn: () => base44.entities.Conversation.list('-last_message_at', 5), - initialData: [], - refetchInterval: 10000, // Refresh every 10 seconds - }); - - const { data: messages, refetch: refetchMessages } = useQuery({ - queryKey: ['messages-bubble', selectedConv?.id], - queryFn: () => base44.entities.Message.filter({ conversation_id: selectedConv?.id }), - initialData: [], - enabled: !!selectedConv?.id, - refetchInterval: 5000, // Refresh every 5 seconds when viewing - }); - - const totalUnread = conversations.reduce((sum, conv) => sum + (conv.unread_count || 0), 0); - - const handleSendMessage = async () => { - if (!messageInput.trim() || !selectedConv) return; - - await base44.entities.Message.create({ - conversation_id: selectedConv.id, - sender_id: user.id, - sender_name: user.full_name || user.email, - sender_role: user.role || "admin", - content: messageInput.trim(), - read_by: [user.id] - }); - - await base44.entities.Conversation.update(selectedConv.id, { - last_message: messageInput.trim().substring(0, 100), - last_message_at: new Date().toISOString() - }); - - setMessageInput(""); - refetchMessages(); - refetchConversations(); - }; - - const getRoleColor = (role) => { - const colors = { - client: "bg-purple-100 text-purple-700", - vendor: "bg-amber-100 text-amber-700", - staff: "bg-blue-100 text-blue-700", - admin: "bg-slate-100 text-slate-700" - }; - return colors[role] || "bg-slate-100 text-slate-700"; - }; - - return ( - <> - {/* Chat Bubble Button */} - - {!isOpen && ( - - - - )} - - - {/* Chat Window */} - - {isOpen && ( - - - {/* Header */} - -
-
-
- -
-
- - {selectedConv ? selectedConv.subject : 'Messages'} - - {selectedConv && ( -

- {selectedConv.is_group - ? `${selectedConv.participants?.length || 0} members` - : selectedConv.participants?.[1]?.name || 'Chat'} -

- )} - {!selectedConv && ( -

- {totalUnread > 0 ? `${totalUnread} unread` : 'Online'} -

- )} -
-
-
- {selectedConv && ( - - )} - - -
-
-
- - {!isMinimized && ( - - {!selectedConv ? ( - <> - {/* Conversations List */} - -
- {conversations.length === 0 ? ( -
- -

No conversations yet

- -
- ) : ( - conversations.map((conv) => { - const otherParticipant = conv.participants?.[1] || conv.participants?.[0] || {}; - return ( - setSelectedConv(conv)} - > - -
- - - {conv.is_group ? : otherParticipant.name?.charAt(0) || '?'} - - -
-
-

- {conv.is_group ? conv.group_name : (conv.subject || otherParticipant.name)} -

- {conv.unread_count > 0 && ( - - {conv.unread_count} - - )} -
-

- {conv.last_message || "No messages yet"} -

- {conv.last_message_at && ( -

- {format(new Date(conv.last_message_at), "MMM d, h:mm a")} -

- )} -
-
-
-
- ); - }) - )} -
-
- - {/* Quick Action */} -
- -
- - ) : ( - <> - {/* Messages Thread */} - -
- {messages.map((message) => { - const isOwnMessage = message.sender_id === user?.id || message.created_by === user?.id; - return ( -
-
- - - {message.sender_name?.charAt(0) || '?'} - - -
-
-

{message.content}

-
-

- {message.created_date && format(new Date(message.created_date), "h:mm a")} -

-
-
-
- ); - })} -
-
- - {/* Message Input */} -
-
- setMessageInput(e.target.value)} - onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} - className="flex-1" - /> - -
-
- - )} -
- )} -
-
- )} -
- - ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/common/DragDropFileUpload.jsx b/frontend-web-free/src/components/common/DragDropFileUpload.jsx deleted file mode 100644 index 2b27aedc..00000000 --- a/frontend-web-free/src/components/common/DragDropFileUpload.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, { useState } from "react"; -import { Upload, FileText, Loader2, CheckCircle2 } from "lucide-react"; -import { Input } from "@/components/ui/input"; - -export default function DragDropFileUpload({ - onFileSelect, - accept = ".pdf,.jpg,.jpeg,.png,.doc,.docx", - label, - hint, - uploading = false, - uploaded = false, - uploadedFileName = null, - disabled = false -}) { - const [isDragging, setIsDragging] = useState(false); - - const handleDragEnter = (e) => { - e.preventDefault(); - e.stopPropagation(); - if (!disabled) setIsDragging(true); - }; - - const handleDragLeave = (e) => { - e.preventDefault(); - e.stopPropagation(); - setIsDragging(false); - }; - - const handleDragOver = (e) => { - e.preventDefault(); - e.stopPropagation(); - }; - - const handleDrop = (e) => { - e.preventDefault(); - e.stopPropagation(); - setIsDragging(false); - - if (disabled) return; - - const files = e.dataTransfer.files; - if (files && files.length > 0) { - onFileSelect(files[0]); - } - }; - - const handleFileInput = (e) => { - const files = e.target.files; - if (files && files.length > 0) { - onFileSelect(files[0]); - } - }; - - return ( -
- {label && ( -
-

- - {label} -

- {hint &&

{hint}

} -
- )} - -
- {uploading ? ( -
- -

Uploading and validating...

-
- ) : uploaded ? ( -
- -
-

Document uploaded successfully

- {uploadedFileName && ( -

{uploadedFileName}

- )} -
- -
- ) : ( -
- -
-

- {isDragging ? 'Drop file here' : 'Drag and drop your file here'} -

-

or

- -

- Accepted: {accept.split(',').join(', ')} -

-
-
- )} -
- - -
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/common/GoogleAddressInput.jsx b/frontend-web-free/src/components/common/GoogleAddressInput.jsx deleted file mode 100644 index 5aa14161..00000000 --- a/frontend-web-free/src/components/common/GoogleAddressInput.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import React, { useRef, useEffect, useState } from "react"; -import { Input } from "@/components/ui/input"; -import { MapPin } from "lucide-react"; - -export default function GoogleAddressInput({ value, onChange, placeholder = "Enter address...", className = "" }) { - const inputRef = useRef(null); - const autocompleteRef = useRef(null); - const [isLoaded, setIsLoaded] = useState(false); - - useEffect(() => { - // Check if Google Maps is already loaded - if (window.google && window.google.maps && window.google.maps.places) { - setIsLoaded(true); - return; - } - - // Load Google Maps script - const script = document.createElement('script'); - script.src = `https://maps.googleapis.com/maps/api/js?key=AIzaSyBkP7xH4NvR6C6vZ8Y3J7qX2QW8Z9vN3Zc&libraries=places`; - script.async = true; - script.defer = true; - script.onload = () => setIsLoaded(true); - document.head.appendChild(script); - - return () => { - if (script.parentNode) { - script.parentNode.removeChild(script); - } - }; - }, []); - - useEffect(() => { - if (!isLoaded || !inputRef.current) return; - - try { - // Initialize Google Maps Autocomplete - autocompleteRef.current = new window.google.maps.places.Autocomplete(inputRef.current, { - types: ['address'], - componentRestrictions: { country: 'us' }, - }); - - // Handle place selection - autocompleteRef.current.addListener('place_changed', () => { - const place = autocompleteRef.current.getPlace(); - if (place.formatted_address) { - onChange(place.formatted_address); - } - }); - } catch (error) { - console.error('Error initializing Google Maps autocomplete:', error); - } - - return () => { - if (autocompleteRef.current) { - window.google.maps.event.clearInstanceListeners(autocompleteRef.current); - } - }; - }, [isLoaded, onChange]); - - return ( -
- - onChange(e.target.value)} - placeholder={placeholder} - className={`pl-10 ${className}`} - /> -
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/common/PageHeader.jsx b/frontend-web-free/src/components/common/PageHeader.jsx deleted file mode 100644 index e446b57b..00000000 --- a/frontend-web-free/src/components/common/PageHeader.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from "react"; -import { Link } from "react-router-dom"; -import { createPageUrl } from "@/utils"; -import { ArrowLeft } from "lucide-react"; -import { Button } from "@/components/ui/button"; - -export default function PageHeader({ - title, - subtitle, - actions = null, - backTo = null, - backButtonLabel = "Back" -}) { - return ( -
- {/* Back Button */} - {backTo && ( - - - - )} - - {/* Main Header */} -
-
-

- {title} -

- {subtitle && ( -

{subtitle}

- )} -
- - {/* Custom Actions (if provided) */} - {actions && ( -
- {actions} -
- )} -
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/dashboard/DashboardCustomizer.jsx b/frontend-web-free/src/components/dashboard/DashboardCustomizer.jsx deleted file mode 100644 index fc0cc12c..00000000 --- a/frontend-web-free/src/components/dashboard/DashboardCustomizer.jsx +++ /dev/null @@ -1,396 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { base44 } from "@/api/base44Client"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - Settings, - GripVertical, - X, - Plus, - Eye, - EyeOff, - Info, - Save, - RotateCcw, - Sparkles -} from "lucide-react"; -import { DragDropContext, Droppable, Draggable } from "@hello-pangea/dnd"; -import { useToast } from "@/components/ui/use-toast"; -import { motion, AnimatePresence } from "framer-motion"; - -export default function DashboardCustomizer({ - user, - availableWidgets = [], - currentLayout = [], - onLayoutChange, - dashboardType = "default" // admin, client, vendor, operator, etc -}) { - const [isOpen, setIsOpen] = useState(false); - const [showHowItWorks, setShowHowItWorks] = useState(false); - const [visibleWidgets, setVisibleWidgets] = useState([]); - const [hiddenWidgets, setHiddenWidgets] = useState([]); - const [hasChanges, setHasChanges] = useState(false); - const { toast } = useToast(); - const queryClient = useQueryClient(); - - // Initialize widgets from user's saved layout or defaults - useEffect(() => { - const layoutKey = `dashboard_layout_${dashboardType}`; - const savedLayout = user?.[layoutKey]; - - if (savedLayout?.widgets && savedLayout.widgets.length > 0) { - const savedVisible = savedLayout.widgets - .map(id => availableWidgets.find(w => w.id === id)) - .filter(Boolean); - setVisibleWidgets(savedVisible); - - const savedHidden = savedLayout.hidden_widgets || []; - const hiddenWidgetsList = availableWidgets.filter(w => - savedHidden.includes(w.id) - ); - setHiddenWidgets(hiddenWidgetsList); - } else { - // Default: all widgets visible in provided order - setVisibleWidgets(availableWidgets); - setHiddenWidgets([]); - } - }, [user, availableWidgets, isOpen, dashboardType]); - - // Save layout mutation - const saveLayoutMutation = useMutation({ - mutationFn: async (layoutData) => { - const layoutKey = `dashboard_layout_${dashboardType}`; - await base44.auth.updateMe({ - [layoutKey]: layoutData - }); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['current-user'] }); - queryClient.invalidateQueries({ queryKey: ['current-user-layout'] }); - queryClient.invalidateQueries({ queryKey: ['current-user-client'] }); - queryClient.invalidateQueries({ queryKey: ['current-user-vendor'] }); - queryClient.invalidateQueries({ queryKey: ['current-user-operator'] }); - toast({ - title: "✅ Layout Saved", - description: "Your dashboard layout has been updated", - }); - setHasChanges(false); - if (onLayoutChange) { - onLayoutChange(visibleWidgets); - } - setTimeout(() => { - setIsOpen(false); - }, 500); - }, - onError: () => { - toast({ - title: "⌠Save Failed", - description: "Could not save your layout. Please try again.", - variant: "destructive", - }); - } - }); - - const handleDragEnd = (result) => { - if (!result.destination) return; - - const { source, destination } = result; - - if (source.droppableId === "visible" && destination.droppableId === "visible") { - const items = Array.from(visibleWidgets); - const [reorderedItem] = items.splice(source.index, 1); - items.splice(destination.index, 0, reorderedItem); - setVisibleWidgets(items); - setHasChanges(true); - } - }; - - const handleHideWidget = (widget) => { - setVisibleWidgets(visibleWidgets.filter(w => w.id !== widget.id)); - setHiddenWidgets([...hiddenWidgets, widget]); - setHasChanges(true); - }; - - const handleShowWidget = (widget) => { - setHiddenWidgets(hiddenWidgets.filter(w => w.id !== widget.id)); - setVisibleWidgets([...visibleWidgets, widget]); - setHasChanges(true); - }; - - const handleSave = () => { - const layoutData = { - widgets: visibleWidgets.map(w => w.id), - hidden_widgets: hiddenWidgets.map(w => w.id), - layout_version: "2.0" - }; - saveLayoutMutation.mutate(layoutData); - }; - - const handleReset = () => { - setVisibleWidgets(availableWidgets); - setHiddenWidgets([]); - setHasChanges(true); - }; - - const handleOpenCustomizer = () => { - setIsOpen(true); - setShowHowItWorks(true); - setHasChanges(false); - }; - - const handleClose = () => { - if (hasChanges) { - if (window.confirm("You have unsaved changes. Are you sure you want to close?")) { - setIsOpen(false); - setHasChanges(false); - } - } else { - setIsOpen(false); - } - }; - - return ( - <> - {/* Customize Button */} - - - {/* Customizer Dialog */} - - - - - - Customize Your Dashboard - - - Personalize your workspace by adding, removing, and reordering widgets - - - - {/* How It Works Banner */} - - {showHowItWorks && ( - -
-
-
- -

How it works

-
-
-

- - Drag widgets to reorder them -

-

- - Hide widgets you don't need -

-

- - Show hidden widgets to bring them back -

-
-
- -
-
- )} -
- -
- {/* Visible Widgets */} -
-
-

- Visible Widgets ({visibleWidgets.length}) -

- -
- - - - {(provided, snapshot) => ( -
- {visibleWidgets.length === 0 ? ( -
- -

No visible widgets

-

Add widgets from the hidden section below!

-
- ) : ( - visibleWidgets.map((widget, index) => ( - - {(provided, snapshot) => ( -
-
-
- -
-
-

{widget.title}

-

{widget.description}

-
- - {widget.category} - - -
-
- )} -
- )) - )} - {provided.placeholder} -
- )} -
-
-
- - {/* Hidden Widgets */} - {hiddenWidgets.length > 0 && ( -
-

- Hidden Widgets ({hiddenWidgets.length}) - Click + to add -

-
- {hiddenWidgets.map((widget) => ( -
-
-
-

{widget.title}

-

{widget.description}

-
- -
-
- ))} -
-
- )} - - {/* All Hidden Message */} - {hiddenWidgets.length === 0 && visibleWidgets.length === availableWidgets.length && ( -
- -

- All widgets are visible on your dashboard! -

-
- )} -
- - {/* Actions */} -
-
- - {hasChanges && ( - - Unsaved Changes - - )} -
-
- - -
-
-
-
- - ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/dashboard/EcosystemWheel.jsx b/frontend-web-free/src/components/dashboard/EcosystemWheel.jsx deleted file mode 100644 index 2e277730..00000000 --- a/frontend-web-free/src/components/dashboard/EcosystemWheel.jsx +++ /dev/null @@ -1,316 +0,0 @@ - -import React, { useState } from "react"; -import { motion, AnimatePresence } from "framer-motion"; - -export default function EcosystemWheel({ layers, onLayerClick, selectedLayer, onLayerHover }) { - const [hoveredIndex, setHoveredIndex] = useState(null); - - const centerX = 300; - const centerY = 300; - - // Icon positions - precisely positioned in center of each puzzle piece - const iconPositions = [ - { x: 385, y: 160 }, // 30° - Buyer (top-right) - { x: 460, y: 300 }, // 60° - Enterprises (top-right) - { x: 380, y: 440 }, // 120° - Sectors (bottom-right) - { x: 220, y: 440 }, // 180° - Partner (bottom-center) - { x: 140, y: 300}, // 240° - Approved Vendor (bottom-left) - { x: 220, y: 160} // 300° - Workforce (top-left) - ]; - - // Create interlocking puzzle pieces - const createOuterPuzzle = (index, total) => { - const startAngle = index * 360 / total - 90; - const endAngle = (index + 1) * 360 / total - 90; - const midAngle = (startAngle + endAngle) / 2; - - const innerRadius = 110; - const outerRadius = 210; - const tabSize = 18; - - const toRad = (deg) => deg * Math.PI / 180; - - const startInner = { - x: centerX + innerRadius * Math.cos(toRad(startAngle)), - y: centerY + innerRadius * Math.sin(toRad(startAngle)) - }; - - const endInner = { - x: centerX + innerRadius * Math.cos(toRad(endAngle)), - y: centerY + innerRadius * Math.sin(toRad(endAngle)) - }; - - const startOuter = { - x: centerX + outerRadius * Math.cos(toRad(startAngle)), - y: centerY + outerRadius * Math.sin(toRad(startAngle)) - }; - - const endOuter = { - x: centerX + outerRadius * Math.cos(toRad(endAngle)), - y: centerY + outerRadius * Math.sin(toRad(endAngle)) - }; - - const innerTabAngle = startAngle + (endAngle - startAngle) * 0.5; - const outerTabAngle = startAngle + (endAngle - startAngle) * 0.5; - - const innerTabOut = { - x: centerX + (innerRadius - tabSize) * Math.cos(toRad(innerTabAngle)), - y: centerY + (innerRadius - tabSize) * Math.sin(toRad(innerTabAngle)) - }; - - const outerTabOut = { - x: centerX + (outerRadius + tabSize) * Math.cos(toRad(outerTabAngle)), - y: centerY + (outerRadius + tabSize) * Math.sin(toRad(outerTabAngle)) - }; - - let path = `M ${startInner.x} ${startInner.y}`; - - const innerArc1End = startAngle + (endAngle - startAngle) * 0.4; - const innerArc2Start = startAngle + (endAngle - startAngle) * 0.6; - - path += ` A ${innerRadius} ${innerRadius} 0 0 1 ${centerX + innerRadius * Math.cos(toRad(innerArc1End))} ${centerY + innerRadius * Math.sin(toRad(innerArc1End))}`; - path += ` Q ${innerTabOut.x} ${innerTabOut.y} ${centerX + innerRadius * Math.cos(toRad(innerArc2Start))} ${centerY + innerRadius * Math.sin(toRad(innerArc2Start))}`; - path += ` A ${innerRadius} ${innerRadius} 0 0 1 ${endInner.x} ${endInner.y}`; - - path += ` L ${endOuter.x} ${endOuter.y}`; - - const outerArc1End = endAngle - (endAngle - startAngle) * 0.4; - const outerArc2Start = endAngle - (endAngle - startAngle) * 0.6; - - path += ` A ${outerRadius} ${outerRadius} 0 0 0 ${centerX + outerRadius * Math.cos(toRad(outerArc1End))} ${centerY + outerRadius * Math.sin(toRad(outerArc1End))}`; - path += ` Q ${outerTabOut.x} ${outerTabOut.y} ${centerX + outerRadius * Math.cos(toRad(outerArc2Start))} ${centerY + outerRadius * Math.sin(toRad(outerArc2Start))}`; - path += ` A ${outerRadius} ${outerRadius} 0 0 0 ${startOuter.x} ${startOuter.y}`; - - path += ` L ${startInner.x} ${startInner.y}`; - path += " Z"; - - return path; - }; - - const createCenterPuzzle = () => { - const radius = 90; - const numTabs = layers.length; - let path = ""; - - for (let i = 0; i < numTabs; i++) { - const angle1 = i * 360 / numTabs - 90; - const angle2 = (i + 1) * 360 / numTabs - 90; - const midAngle = (angle1 + angle2) / 2; - const tabSize = 18; - - const toRad = (deg) => deg * Math.PI / 180; - - const start = { - x: centerX + radius * Math.cos(toRad(angle1)), - y: centerY + radius * Math.sin(toRad(angle1)) - }; - - const end = { - x: centerX + radius * Math.cos(toRad(angle2)), - y: centerY + radius * Math.sin(toRad(angle2)) - }; - - const tabIn = { - x: centerX + (radius + tabSize) * Math.cos(toRad(midAngle)), - y: centerY + (radius + tabSize) * Math.sin(toRad(midAngle)) - }; - - if (i === 0) { - path += `M ${start.x} ${start.y}`; - } - - const arc1End = angle1 + (angle2 - angle1) * 0.4; - const arc2Start = angle1 + (angle2 - angle1) * 0.6; - - path += ` A ${radius} ${radius} 0 0 1 ${centerX + radius * Math.cos(toRad(arc1End))} ${centerY + radius * Math.sin(toRad(arc1End))}`; - path += ` Q ${tabIn.x} ${tabIn.y} ${centerX + radius * Math.cos(toRad(arc2Start))} ${centerY + radius * Math.sin(toRad(arc2Start))}`; - path += ` A ${radius} ${radius} 0 0 1 ${end.x} ${end.y}`; - } - - path += " Z"; - return path; - }; - - return ( -
-
-

KROW Ecosystem

-

Hover over each piece to see details • Click to explore

-
- -
- - - - - - - - - - - - - - - - {/* Outer Puzzle Pieces */} - {layers.map((layer, index) => { - const angle = index * 360 / layers.length - 90; - const rad = angle * Math.PI / 180; - - // Use exact icon position from array - const iconX = iconPositions[index].x; - const iconY = iconPositions[index].y; - - // Label position - Outside puzzle - const labelRadius = 240; - const labelX = centerX + labelRadius * Math.cos(rad); - const labelY = centerY + labelRadius * Math.sin(rad); - - const isHovered = hoveredIndex === index; - const Icon = layer.icon; - - return ( - - {/* Puzzle Piece */} - { - setHoveredIndex(index); - onLayerHover?.(layer); - }} - onMouseLeave={() => { - setHoveredIndex(null); - onLayerHover?.(null); - }} - onClick={() => onLayerClick?.(layer)} - animate={{ - scale: isHovered ? 1.05 : 1 - }} - transition={{ duration: 0.3 }} - style={{ - transformOrigin: `${centerX}px ${centerY}px` - }} /> - - - {/* Icon - Exact positioned in puzzle piece */} - - - - -
- -
-
- - {/* Label - Outside puzzle */} - - -
-
-

- {layer.name} -

-
-
-
-
); - - })} - - {/* Center Puzzle Piece */} - - - - {/* Center Logo */} - - -
- KROW - -
-
-
- - {/* Centered Metrics Display */} - - {hoveredIndex !== null && - - -
-
-
- {React.createElement(layers[hoveredIndex].icon, { className: "w-6 h-6 text-white" })} -
-

{layers[hoveredIndex].name}

-
-
- {Object.entries(layers[hoveredIndex].metrics).map(([key, value]) => -
- - {key.replace(/([A-Z])/g, ' $1').trim()} - - - {value} - -
- )} -
-
-

Click to view full dashboard

-
-
-
- } -
-
-
); - -} diff --git a/frontend-web-free/src/components/dashboard/QuickMetrics.jsx b/frontend-web-free/src/components/dashboard/QuickMetrics.jsx deleted file mode 100644 index 5a86b828..00000000 --- a/frontend-web-free/src/components/dashboard/QuickMetrics.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from "react"; -import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { ArrowRight } from "lucide-react"; -import { useNavigate } from "react-router-dom"; -import { createPageUrl } from "@/utils"; - -export default function QuickMetrics({ title, description, icon: Icon, metrics, route, gradient }) { - const navigate = useNavigate(); - - return ( - - -
-
- - - {title} - -

{description}

-
-
-
- -
- {metrics.map((metric, index) => ( -
- {metric.label} - {metric.value} -
- ))} -
- -
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/dev/RoleSwitcher.jsx b/frontend-web-free/src/components/dev/RoleSwitcher.jsx deleted file mode 100644 index a3c0230e..00000000 --- a/frontend-web-free/src/components/dev/RoleSwitcher.jsx +++ /dev/null @@ -1,224 +0,0 @@ -import React, { useState } from "react"; -import { base44 } from "@/api/base44Client"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import { Settings, X, RefreshCw, Shield, Users, Package, Building2, UserCheck, Briefcase, HardHat } from "lucide-react"; -import { motion, AnimatePresence } from "framer-motion"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; - -const roles = [ - { value: "admin", label: "Administrator", icon: Shield, color: "from-red-500 to-red-700" }, - { value: "procurement", label: "Procurement", icon: Package, color: "from-purple-500 to-purple-700" }, - { value: "operator", label: "Operator", icon: Users, color: "from-blue-500 to-blue-700" }, - { value: "sector", label: "Sector Manager", icon: Building2, color: "from-cyan-500 to-cyan-700" }, - { value: "client", label: "Client", icon: Briefcase, color: "from-green-500 to-green-700" }, - { value: "vendor", label: "Vendor", icon: Package, color: "from-amber-500 to-amber-700" }, - { value: "workforce", label: "Workforce", icon: HardHat, color: "from-slate-500 to-slate-700" }, -]; - -export default function RoleSwitcher() { - const [isOpen, setIsOpen] = useState(false); - const [isMinimized, setIsMinimized] = useState(true); - const queryClient = useQueryClient(); - - const { data: user, refetch } = useQuery({ - queryKey: ['current-user'], - queryFn: () => base44.auth.me(), - }); - - const currentRole = user?.user_role || user?.role || "admin"; - const currentRoleData = roles.find(r => r.value === currentRole); - - const handleRoleChange = async (newRole) => { - try { - // Update the user's role - await base44.auth.updateMe({ - user_role: newRole, - }); - - // Invalidate all queries to refetch with new role - queryClient.invalidateQueries(); - - // Refetch user data - await refetch(); - - // Reload the page to apply new role completely - window.location.reload(); - } catch (error) { - console.error("Failed to switch role:", error); - } - }; - - return ( - <> - {/* Floating Toggle Button */} - - {!isOpen && ( - - - - )} - - - {/* Role Switcher Panel */} - - {isOpen && ( - - - {/* Header */} - -
-
- - Role Switcher - DEV -
-
- - -
-
-
- - - {/* Current Role Display */} -
-

Current Role

-
-
- {currentRoleData?.icon && } -
-
-

{currentRoleData?.label}

-

{user?.email}

-
-
-
- - {/* Role Selector */} -
- - -
- - {/* Quick Role Grid */} - {!isMinimized && ( -
-

Quick Switch

-
- {roles.map((role) => ( - - ))} -
-
- )} - - {/* Warning */} -
-

- âš ï¸ Development Tool: This switcher is for testing only. - Changes will persist until you switch again or log out. -

-
- - {/* Info Box */} - {!isMinimized && ( -
-
-
-

Admin: Full access to all features

-
-
-
-

Procurement: Vendor management & orders

-
-
-
-

Operator/Sector: Event & staff management

-
-
-
-

Client: Create orders, view invoices

-
-
-
-

Vendor: Manage own staff & orders

-
-
-
-

Workforce: View shifts & earnings

-
-
- )} - - - - )} - - - ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/events/AIOrderAssistant.jsx b/frontend-web-free/src/components/events/AIOrderAssistant.jsx deleted file mode 100644 index d2729e0c..00000000 --- a/frontend-web-free/src/components/events/AIOrderAssistant.jsx +++ /dev/null @@ -1,632 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import { base44 } from "@/api/base44Client"; -import { useQuery } from "@tanstack/react-query"; -import { Card, CardContent } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { - Sparkles, Send, Mic, MicOff, Upload, FileText, Clock, - MapPin, Users, Calendar, DollarSign, Zap, Brain, - TrendingUp, CheckCircle2, Loader2, Eye, MessageSquare, - Image as ImageIcon, Wand2, AlertCircle, ChevronRight -} from "lucide-react"; -import { motion, AnimatePresence } from "framer-motion"; -import { useToast } from "@/components/ui/use-toast"; -import { format } from "date-fns"; - -export default function AIOrderAssistant({ onOrderDataExtracted, onClose }) { - const [messages, setMessages] = useState([]); - const [input, setInput] = useState(""); - const [isListening, setIsListening] = useState(false); - const [isProcessing, setIsProcessing] = useState(false); - const [extractedData, setExtractedData] = useState(null); - const [showSuggestions, setShowSuggestions] = useState(true); - const [voiceEnabled, setVoiceEnabled] = useState(true); - const messagesEndRef = useRef(null); - const { toast } = useToast(); - - const { data: recentEvents } = useQuery({ - queryKey: ['recent-events-ai'], - queryFn: () => base44.entities.Event.list('-created_date', 5), - initialData: [], - }); - - const { data: businesses } = useQuery({ - queryKey: ['businesses-ai'], - queryFn: () => base44.entities.Business.list(), - initialData: [], - }); - - useEffect(() => { - const greeting = { - id: Date.now(), - role: "assistant", - content: "👋 **AI Order Assistant 2030**\n\nI'm your intelligent workforce ordering assistant. Just tell me what you need naturally - I understand context, history, and can create complete orders instantly.\n\n**Try saying:**\n• \"I need 5 servers for Friday night\"\n• \"Repeat last week's order but add 2 bartenders\"\n• \"Same as Event #1234 but different date\"\n\nYou can also upload files, speak naturally, or let me analyze your patterns.", - timestamp: new Date().toISOString(), - type: "greeting" - }; - setMessages([greeting]); - }, []); - - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [messages]); - - // Smart suggestions based on context - const smartSuggestions = [ - { - icon: RefreshCw, - label: "Repeat Last Order", - query: "Repeat my last order for next Friday", - color: "bg-purple-500" - }, - { - icon: TrendingUp, - label: "Based on History", - query: "Create order based on my usual Friday pattern", - color: "bg-blue-500" - }, - { - icon: Zap, - label: "Quick Template", - query: "I need 3 servers and 2 bartenders for Saturday 6pm-midnight", - color: "bg-green-500" - }, - { - icon: Brain, - label: "AI Predict", - query: "What staff will I need for a 200-person corporate event?", - color: "bg-orange-500" - } - ]; - - const handleSendMessage = async (text = input) => { - if (!text.trim() && !isListening) return; - - const userMessage = { - id: Date.now(), - role: "user", - content: text, - timestamp: new Date().toISOString() - }; - - setMessages(prev => [...prev, userMessage]); - setInput(""); - setIsProcessing(true); - setShowSuggestions(false); - - try { - // Simulate AI processing with intelligent response - await new Promise(resolve => setTimeout(resolve, 1500)); - - // Enhanced AI prompt with context awareness - const prompt = `You are an advanced AI workforce ordering assistant in 2030. Analyze this request and extract structured order data. - -User Request: "${text}" - -Recent Order History: -${recentEvents.slice(0, 3).map((e, idx) => `${idx + 1}. ${e.event_name} - ${e.business_name} - ${e.requested || 0} staff - ${format(new Date(e.date || Date.now()), 'MMM d, yyyy')}`).join('\n')} - -Available Businesses: ${businesses.slice(0, 5).map(b => b.business_name).join(', ')} - -Instructions: -- If user references "last order" or "repeat", use the most recent event data -- If user says "usual" or "typical", analyze patterns from history -- Be intelligent about inferring missing details (dates, times, quantities) -- Suggest optimal staff counts based on event type -- Return ONLY valid JSON in this exact format: - -{ - "event_name": "string", - "business_name": "string (from available businesses)", - "hub": "string", - "date": "YYYY-MM-DD", - "order_type": "one_time|rapid|recurring", - "shifts": [{ - "shift_name": "Shift 1", - "roles": [{ - "role": "string (Server, Bartender, Chef, etc)", - "count": number, - "start_time": "HH:MM", - "end_time": "HH:MM", - "break_minutes": 30 - }] - }], - "notes": "string with any additional context", - "ai_confidence": number (0-100), - "ai_reasoning": "string explaining the order creation logic" -}`; - - const response = await base44.integrations.Core.InvokeLLM({ - prompt: prompt, - add_context_from_internet: false, - response_json_schema: { - type: "object", - properties: { - event_name: { type: "string" }, - business_name: { type: "string" }, - hub: { type: "string" }, - date: { type: "string" }, - order_type: { type: "string" }, - shifts: { - type: "array", - items: { - type: "object", - properties: { - shift_name: { type: "string" }, - roles: { - type: "array", - items: { - type: "object", - properties: { - role: { type: "string" }, - count: { type: "number" }, - start_time: { type: "string" }, - end_time: { type: "string" }, - break_minutes: { type: "number" } - } - } - } - } - } - }, - notes: { type: "string" }, - ai_confidence: { type: "number" }, - ai_reasoning: { type: "string" } - } - } - }); - - const orderData = response; - setExtractedData(orderData); - - const assistantMessage = { - id: Date.now() + 1, - role: "assistant", - content: `✨ **Order Created Instantly**\n\n${orderData.ai_reasoning}\n\n**Confidence:** ${orderData.ai_confidence}%\n\nReview the order details below and click "Use This Order" to proceed.`, - timestamp: new Date().toISOString(), - type: "success", - data: orderData - }; - - setMessages(prev => [...prev, assistantMessage]); - - toast({ - title: "🎯 AI Order Generated", - description: `Created order with ${orderData.shifts?.[0]?.roles?.reduce((sum, r) => sum + (r.count || 0), 0) || 0} staff members`, - }); - - } catch (error) { - const errorMessage = { - id: Date.now() + 1, - role: "assistant", - content: `⌠I couldn't process that request. Please try rephrasing or providing more details.\n\nError: ${error.message}`, - timestamp: new Date().toISOString(), - type: "error" - }; - setMessages(prev => [...prev, errorMessage]); - } finally { - setIsProcessing(false); - } - }; - - const handleVoiceInput = () => { - if (!voiceEnabled) { - toast({ - title: "Voice Not Supported", - description: "Your browser doesn't support voice input", - variant: "destructive" - }); - return; - } - - if (isListening) { - setIsListening(false); - // Stop voice recognition - } else { - setIsListening(true); - // Start voice recognition - toast({ - title: "🎤 Listening...", - description: "Speak naturally - I understand context and nuance", - }); - - // Simulate voice input after 3 seconds - setTimeout(() => { - setIsListening(false); - const voiceText = "I need 5 servers and 3 bartenders for this Friday from 6pm to midnight at our downtown location"; - setInput(voiceText); - toast({ - title: "✅ Voice Captured", - description: "Processing your request...", - }); - }, 3000); - } - }; - - const handleFileUpload = async (e) => { - const file = e.target.files?.[0]; - if (!file) return; - - toast({ - title: "📄 Analyzing Document...", - description: "AI is extracting order details from your file", - }); - - try { - const { file_url } = await base44.integrations.Core.UploadFile({ file }); - - const extractResult = await base44.integrations.Core.ExtractDataFromUploadedFile({ - file_url: file_url, - json_schema: { - type: "object", - properties: { - event_name: { type: "string" }, - date: { type: "string" }, - location: { type: "string" }, - staff_needs: { - type: "array", - items: { - type: "object", - properties: { - role: { type: "string" }, - count: { type: "number" }, - hours: { type: "string" } - } - } - } - } - } - }); - - if (extractResult.status === "success") { - const message = { - id: Date.now(), - role: "assistant", - content: `📄 **Document Analyzed**\n\nI've extracted the following order details:\n\n${JSON.stringify(extractResult.output, null, 2)}\n\nShall I create an order based on this?`, - timestamp: new Date().toISOString(), - type: "file", - data: extractResult.output - }; - setMessages(prev => [...prev, message]); - } - } catch (error) { - toast({ - title: "Failed to Process File", - description: error.message, - variant: "destructive" - }); - } - }; - - const handleUseSuggestion = (query) => { - setInput(query); - handleSendMessage(query); - }; - - const handleUseOrder = () => { - if (extractedData) { - onOrderDataExtracted(extractedData); - toast({ - title: "✅ Order Data Applied", - description: "Review and edit the order details in the form", - }); - } - }; - - return ( -
- {/* Header */} -
-
-
-
-
- -
-
-

- AI Order Assistant 2030 - - - Neural - -

-

Instant workforce ordering powered by advanced AI

-
-
- -
- - {/* Real-time Stats Bar */} -
-
- - 3.2s avg response -
-
- - 98.7% accuracy -
-
- - 5.2x faster than forms -
-
-
- - {/* Smart Suggestions - Only show initially */} - - {showSuggestions && messages.length <= 1 && ( - -

- - INSTANT ACTIONS -

-
- {smartSuggestions.map((suggestion, idx) => ( - - ))} -
-
- )} -
- - {/* Messages Area */} -
- - {messages.map((message) => ( - - {message.role === 'assistant' && ( - - - - - - )} - -
-
-
- {message.content.split('\n').map((line, idx) => ( -

- {line} -

- ))} -
- - {/* Order Preview Card */} - {message.type === 'success' && message.data && ( -
-
-

- - Order Preview -

- - {message.data.ai_confidence}% Confidence - -
- -
-
- - {message.data.date || 'TBD'} -
-
- - - {message.data.shifts?.[0]?.roles?.reduce((sum, r) => sum + (r.count || 0), 0) || 0} Staff - -
-
- - {message.data.hub || message.data.business_name || 'Location TBD'} -
-
- - - {message.data.shifts?.[0]?.roles?.[0]?.start_time || '09:00'} - {message.data.shifts?.[0]?.roles?.[0]?.end_time || '17:00'} - -
-
- - -
- )} -
-

- {format(new Date(message.timestamp), 'h:mm a')} -

-
- - {message.role === 'user' && ( - - - U - - - )} -
- ))} -
- - {isProcessing && ( - - - - - - -
-
- - - AI is analyzing and creating your order... - -
-
-
- )} - -
-
- - {/* Input Area - Enhanced */} -
-
- setInput(e.target.value)} - onKeyPress={(e) => e.key === 'Enter' && !e.shiftKey && handleSendMessage()} - placeholder="Type, speak, or upload... AI understands natural language 🧠" - className="flex-1 border-2 border-indigo-200 focus:border-indigo-400 rounded-xl h-12 px-4 text-sm" - disabled={isProcessing} - /> - - {/* Voice Button */} - - - {/* File Upload */} - - - {/* Send Button */} - -
- - {/* Quick Examples */} -
- - Try: - - • - -
-
- - {/* AI Capabilities Footer */} -
-
-
-
- - Context-aware -
-
- - Natural language -
-
- - Instant generation -
-
- - Powered by Neural AI v3.0 - -
-
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/events/AssignedStaffManager.jsx b/frontend-web-free/src/components/events/AssignedStaffManager.jsx deleted file mode 100644 index 8296c5ff..00000000 --- a/frontend-web-free/src/components/events/AssignedStaffManager.jsx +++ /dev/null @@ -1,244 +0,0 @@ -import React, { useState } from "react"; -import { base44 } from "@/api/base44Client"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogFooter, -} from "@/components/ui/dialog"; -import { Label } from "@/components/ui/label"; -import { Input } from "@/components/ui/input"; -import { useToast } from "@/components/ui/use-toast"; -import { Edit2, Trash2, ArrowLeftRight, Clock, MapPin, Check, X } from "lucide-react"; -import { format } from "date-fns"; -import { calculateOrderStatus } from "../orders/OrderStatusUtils"; - -export default function AssignedStaffManager({ event, shift, role }) { - const { toast } = useToast(); - const queryClient = useQueryClient(); - const [editTarget, setEditTarget] = useState(null); - const [swapTarget, setSwapTarget] = useState(null); - const [editTimes, setEditTimes] = useState({ start: "", end: "" }); - - // Get assigned staff for this role - const assignedStaff = (event.assigned_staff || []).filter( - s => s.role === role?.role - ); - - // Remove staff mutation - const removeMutation = useMutation({ - mutationFn: async (staffId) => { - const updatedAssignedStaff = (event.assigned_staff || []).filter( - s => s.staff_id !== staffId || s.role !== role.role - ); - - const updatedShifts = (event.shifts || []).map(s => { - if (s.shift_name === shift.shift_name) { - const updatedRoles = (s.roles || []).map(r => { - if (r.role === role.role) { - return { - ...r, - assigned: Math.max((r.assigned || 0) - 1, 0), - }; - } - return r; - }); - return { ...s, roles: updatedRoles }; - } - return s; - }); - - const updatedEvent = { - assigned_staff: updatedAssignedStaff, - shifts: updatedShifts, - // NEVER MODIFY REQUESTED - it's set by client, not by staff assignment - }; - - // Auto-update status based on staffing level - updatedEvent.status = calculateOrderStatus({ - ...event, - ...updatedEvent - }); - - await base44.entities.Event.update(event.id, updatedEvent); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['events'] }); - toast({ - title: "✅ Staff Removed", - description: "Staff member has been removed from this assignment", - }); - }, - }); - - // Edit times mutation - const editMutation = useMutation({ - mutationFn: async () => { - const updatedShifts = (event.shifts || []).map(s => { - if (s.shift_name === shift.shift_name) { - const updatedRoles = (s.roles || []).map(r => { - if (r.role === role.role) { - return { - ...r, - start_time: editTimes.start, - end_time: editTimes.end, - }; - } - return r; - }); - return { ...s, roles: updatedRoles }; - } - return s; - }); - - await base44.entities.Event.update(event.id, { - shifts: updatedShifts, - }); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['events'] }); - toast({ - title: "✅ Times Updated", - description: "Assignment times have been updated", - }); - setEditTarget(null); - }, - }); - - const handleEdit = (staff) => { - setEditTarget(staff); - setEditTimes({ - start: role.start_time || "09:00", - end: role.end_time || "17:00", - }); - }; - - const handleSaveEdit = () => { - editMutation.mutate(); - }; - - const handleRemove = (staffId) => { - if (confirm("Are you sure you want to remove this staff member?")) { - removeMutation.mutate(staffId); - } - }; - - if (!assignedStaff.length) { - return ( -
- No staff assigned yet -
- ); - } - - return ( - <> -
- {assignedStaff.map((staff) => ( -
- - - {staff.staff_name?.charAt(0) || 'S'} - - - -
-

{staff.staff_name}

-
- - {staff.role} - - {role.start_time && role.end_time && ( - - - {role.start_time} - {role.end_time} - - )} -
-
- -
- - -
-
- ))} -
- - {/* Edit Times Dialog */} - setEditTarget(null)}> - - - Edit Assignment Times - - -
-
- -

{editTarget?.staff_name}

-
- -
-
- - setEditTimes({ ...editTimes, start: e.target.value })} - /> -
-
- - setEditTimes({ ...editTimes, end: e.target.value })} - /> -
-
-
- - - - - -
-
- - ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/events/EventAssignmentModal.jsx b/frontend-web-free/src/components/events/EventAssignmentModal.jsx deleted file mode 100644 index df769c5c..00000000 --- a/frontend-web-free/src/components/events/EventAssignmentModal.jsx +++ /dev/null @@ -1,837 +0,0 @@ -import React, { useState, useMemo } from "react"; -import { base44 } from "@/api/base44Client"; -import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Calendar, Users, Check, Plus, X, Clock, MapPin, ChevronLeft, ChevronRight, AlertTriangle, RefreshCw, Search } from "lucide-react"; -import { format, parseISO, isWithinInterval } from "date-fns"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Input } from "@/components/ui/input"; -import { useToast } from "@/components/ui/use-toast"; - -const convertTo12Hour = (time24) => { - if (!time24) return ''; - const [hours, minutes] = time24.split(':'); - const hour = parseInt(hours); - const ampm = hour >= 12 ? 'PM' : 'AM'; - const hour12 = hour % 12 || 12; - return `${hour12}:${minutes} ${ampm}`; -}; - -const getInitials = (name) => { - if (!name) return 'S'; - return name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2); -}; - -const avatarColors = [ - 'bg-blue-500', - 'bg-purple-500', - 'bg-green-500', - 'bg-orange-500', - 'bg-pink-500', - 'bg-indigo-500', - 'bg-teal-500', - 'bg-red-500', -]; - -// Helper to check if times overlap -const hasTimeConflict = (existingStart, existingEnd, newStart, newEnd, existingDate, newDate) => { - // If different dates, no conflict - if (existingDate !== newDate) return false; - - if (!existingStart || !existingEnd || !newStart || !newEnd) return false; - - const parseTime = (time) => { - const [hours, minutes] = time.split(':').map(Number); - return hours * 60 + minutes; - }; - - const existingStartMin = parseTime(existingStart); - const existingEndMin = parseTime(existingEnd); - const newStartMin = parseTime(newStart); - const newEndMin = parseTime(newEnd); - - return (newStartMin < existingEndMin && newEndMin > existingStartMin); -}; - -export default function EventAssignmentModal({ open, onClose, order, onUpdate, isRapid = false }) { - const [selectedShiftIndex, setSelectedShiftIndex] = useState(0); - const [selectedRoleIndex, setSelectedRoleIndex] = useState(0); - const [selectedStaffIds, setSelectedStaffIds] = useState([]); - const [searchTerm, setSearchTerm] = useState(""); - const [swapMode, setSwapMode] = useState(null); // { employeeId, assignmentIndex } - const queryClient = useQueryClient(); - const { toast } = useToast(); - - const { data: allStaff = [] } = useQuery({ - queryKey: ['staff-for-assignment'], - queryFn: () => base44.entities.Staff.list(), - enabled: open, - }); - - const { data: allOrders = [] } = useQuery({ - queryKey: ['orders-for-conflict-check'], - queryFn: () => base44.entities.Order.list(), - enabled: open, - }); - - const updateOrderMutation = useMutation({ - mutationFn: (updatedOrder) => base44.entities.Order.update(order.id, updatedOrder), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['orders'] }); - if (onUpdate) onUpdate(); - setSelectedStaffIds([]); - toast({ - title: "✅ Staff assigned successfully", - description: "The order has been updated with new assignments.", - }); - }, - }); - - if (!order || !order.shifts_data || order.shifts_data.length === 0) { - return null; - } - - const currentShift = order.shifts_data[selectedShiftIndex]; - const currentRole = currentShift?.roles[selectedRoleIndex]; - - if (!currentRole) return null; - - // Check for conflicts - const getStaffConflicts = (staffId) => { - const conflicts = []; - - allOrders.forEach(existingOrder => { - if (existingOrder.id === order.id) return; // Skip current order - if (!existingOrder.shifts_data) return; - - existingOrder.shifts_data.forEach(shift => { - shift.roles.forEach(role => { - if (!role.assignments) return; - - role.assignments.forEach(assignment => { - if (assignment.employee_id === staffId) { - const hasConflict = hasTimeConflict( - role.start_time, - role.end_time, - currentRole.start_time, - currentRole.end_time, - existingOrder.event_date, - order.event_date - ); - - if (hasConflict) { - conflicts.push({ - orderName: existingOrder.event_name, - role: role.service, - time: `${convertTo12Hour(role.start_time)} - ${convertTo12Hour(role.end_time)}`, - date: existingOrder.event_date - }); - } - } - }); - }); - }); - }); - - return conflicts; - }; - - // Role-based filtering - const roleKeywords = { - 'bartender': ['bartender', 'bar'], - 'cook': ['cook', 'chef', 'kitchen'], - 'server': ['server', 'waiter', 'waitress'], - 'cashier': ['cashier', 'register'], - 'host': ['host', 'hostess', 'greeter'], - 'busser': ['busser', 'bus'], - 'dishwasher': ['dishwasher', 'dish'], - 'manager': ['manager', 'supervisor'], - }; - - const getRoleCategory = (roleName) => { - const lowerRole = roleName.toLowerCase(); - for (const [category, keywords] of Object.entries(roleKeywords)) { - if (keywords.some(keyword => lowerRole.includes(keyword))) { - return category; - } - } - return null; - }; - - const matchesRole = (staffPosition, requiredRole) => { - const staffLower = (staffPosition || '').toLowerCase(); - const requiredLower = (requiredRole || '').toLowerCase(); - - // Direct match - if (staffLower.includes(requiredLower) || requiredLower.includes(staffLower)) { - return true; - } - - // Category match - const staffCategory = getRoleCategory(staffPosition || ''); - const requiredCategory = getRoleCategory(requiredRole); - - return staffCategory && requiredCategory && staffCategory === requiredCategory; - }; - - const handleBulkAssign = () => { - if (selectedStaffIds.length === 0) { - toast({ - title: "No staff selected", - description: "Please select staff members to assign.", - variant: "destructive", - }); - return; - } - - const updatedOrder = { ...order }; - const assignments = updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments || []; - - const needed = parseInt(currentRole.count) || 0; - const currentAssigned = assignments.length; - const remaining = needed - currentAssigned; - - // Strictly enforce the requested count - if (remaining <= 0) { - toast({ - title: "Assignment Limit Reached", - description: `This position requested exactly ${needed} staff. Cannot assign more.`, - variant: "destructive", - }); - return; - } - - // Check for conflicts - const conflictingStaff = []; - selectedStaffIds.forEach(staffId => { - const conflicts = getStaffConflicts(staffId); - if (conflicts.length > 0) { - const staff = allStaff.find(s => s.id === staffId); - conflictingStaff.push(staff?.employee_name); - } - }); - - if (conflictingStaff.length > 0) { - toast({ - title: "âš ï¸ Time Conflict Detected", - description: `${conflictingStaff.join(', ')} ${conflictingStaff.length === 1 ? 'is' : 'are'} already assigned to overlapping shifts.`, - variant: "destructive", - }); - return; - } - - if (selectedStaffIds.length > remaining) { - toast({ - title: "Assignment Limit", - description: `Only ${remaining} more staff ${remaining === 1 ? 'is' : 'are'} needed.`, - variant: "destructive", - }); - return; - } - - // Add all selected staff - const newAssignments = selectedStaffIds.map(staffId => { - const staff = allStaff.find(s => s.id === staffId); - return { - employee_id: staff.id, - employee_name: staff.employee_name, - position: currentRole.service, - shift_date: order.event_date, - shift_start: currentRole.start_time, - shift_end: currentRole.end_time, - location: currentShift.address || order.event_address, - hub_location: order.hub_location, - }; - }); - - updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments = [ - ...assignments, - ...newAssignments - ]; - - updateOrderMutation.mutate(updatedOrder); - }; - - const handleAssignStaff = (staffMember) => { - const updatedOrder = { ...order }; - const assignments = updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments || []; - - // Strictly enforce the requested count - if (assignments.length >= needed) { - toast({ - title: "Assignment Limit Reached", - description: `This position requested exactly ${needed} staff. Cannot assign more.`, - variant: "destructive", - }); - return; - } - - // Check if already assigned - if (assignments.some(a => a.employee_id === staffMember.id)) { - toast({ - title: "Already assigned", - description: `${staffMember.employee_name} is already assigned to this role.`, - variant: "destructive", - }); - return; - } - - // Check for conflicts - const conflicts = getStaffConflicts(staffMember.id); - if (conflicts.length > 0) { - toast({ - title: "âš ï¸ Time Conflict", - description: `${staffMember.employee_name} is already assigned to ${conflicts[0].orderName} at ${conflicts[0].time}`, - variant: "destructive", - }); - return; - } - - // Add new assignment - const newAssignment = { - employee_id: staffMember.id, - employee_name: staffMember.employee_name, - position: currentRole.service, - shift_date: order.event_date, - shift_start: currentRole.start_time, - shift_end: currentRole.end_time, - location: currentShift.address || order.event_address, - hub_location: order.hub_location, - }; - - updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments = [ - ...assignments, - newAssignment - ]; - - updateOrderMutation.mutate(updatedOrder); - }; - - const handleRemoveStaff = (employeeId) => { - const updatedOrder = { ...order }; - const assignments = updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments || []; - - updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments = - assignments.filter(a => a.employee_id !== employeeId); - - updateOrderMutation.mutate(updatedOrder); - }; - - const handleSwapStaff = (newStaffMember) => { - if (!swapMode) return; - - const updatedOrder = { ...order }; - const assignments = updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments || []; - - // Check for conflicts - const conflicts = getStaffConflicts(newStaffMember.id); - if (conflicts.length > 0) { - toast({ - title: "âš ï¸ Time Conflict", - description: `${newStaffMember.employee_name} is already assigned to ${conflicts[0].orderName} at ${conflicts[0].time}`, - variant: "destructive", - }); - return; - } - - // Replace the assignment - assignments[swapMode.assignmentIndex] = { - employee_id: newStaffMember.id, - employee_name: newStaffMember.employee_name, - position: currentRole.service, - shift_date: order.event_date, - shift_start: currentRole.start_time, - shift_end: currentRole.end_time, - location: currentShift.address || order.event_address, - hub_location: order.hub_location, - }; - - updatedOrder.shifts_data[selectedShiftIndex].roles[selectedRoleIndex].assignments = assignments; - updateOrderMutation.mutate(updatedOrder); - setSwapMode(null); - }; - - const assignments = currentRole.assignments || []; - const needed = parseInt(currentRole.count) || 0; - const assigned = assignments.length; - const isFullyStaffed = assigned >= needed; - - // Filter staff by role and exclude already assigned - const assignedIds = new Set(assignments.map(a => a.employee_id)); - const roleFilteredStaff = allStaff.filter(s => - matchesRole(s.position, currentRole.service) || - matchesRole(s.position_2, currentRole.service) - ); - - const availableStaff = roleFilteredStaff - .filter(s => !assignedIds.has(s.id)) - .filter(s => { - if (!searchTerm) return true; - const lowerSearch = searchTerm.toLowerCase(); - return ( - s.employee_name?.toLowerCase().includes(lowerSearch) || - s.position?.toLowerCase().includes(lowerSearch) || - s.position_2?.toLowerCase().includes(lowerSearch) - ); - }); - - // Calculate total assignments across all roles in this shift - let totalNeeded = 0; - let totalAssigned = 0; - currentShift.roles.forEach(role => { - totalNeeded += parseInt(role.count) || 0; - totalAssigned += role.assignments?.length || 0; - }); - - const toggleStaffSelection = (staffId) => { - setSelectedStaffIds(prev => - prev.includes(staffId) - ? prev.filter(id => id !== staffId) - : [...prev, staffId] - ); - }; - - const selectAll = () => { - const remaining = needed - assigned; - const selectableStaff = availableStaff.slice(0, remaining); - setSelectedStaffIds(selectableStaff.map(s => s.id)); - }; - - const deselectAll = () => { - setSelectedStaffIds([]); - }; - - return ( - - - -
-
- - {order.event_name} - -

{order.client_business}

-
- = totalNeeded - ? 'bg-emerald-500 text-white border-0 animate-pulse' - : 'bg-orange-500 text-white border-0' - } font-semibold px-3 py-1 shadow-md`} - > - {totalAssigned >= totalNeeded ? ( - <> - - Fully Staffed - - ) : ( - <> - - Needs Staff - - )} - -
- -
- - - {order.event_date ? format(new Date(order.event_date), 'EEEE, MMMM d, yyyy') : 'No date'} - -
- - {currentShift.address && ( -
- - {currentShift.address} -
- )} -
- -
- {/* Staff Assignment Summary */} -
-
-
- -

Staff Assignment

-
- = totalNeeded - ? 'border-emerald-500 text-emerald-700 bg-emerald-50' - : 'border-orange-500 text-orange-700 bg-orange-50' - }`} - > - {totalAssigned} / {totalNeeded} - -
- - {totalAssigned >= totalNeeded && ( -
-
- - ✨ Fully staffed - All positions filled! -
-
- )} -
- - {/* Position Selection */} - {currentShift.roles.length > 1 && ( -
- - -
- )} - - {/* Current Position Details */} -
-
-

{currentRole.service}

- = needed - ? 'bg-emerald-500 text-white' - : 'bg-orange-500 text-white' - } font-bold px-3 py-1 text-base`} - > - {assigned}/{needed} - -
- - {currentRole.start_time && ( -
- - - {convertTo12Hour(currentRole.start_time)} - {convertTo12Hour(currentRole.end_time)} - -
- )} -
- - {/* Swap Mode Banner */} - {swapMode && ( -
-
-
- - - Swap Mode Active - Select replacement for {assignments[swapMode.assignmentIndex]?.employee_name} - -
- -
-
- )} - - {/* Assigned Staff List */} - {assignments.length > 0 && ( -
-

✅ Assigned Staff:

-
- {assignments.map((assignment, idx) => { - const conflicts = getStaffConflicts(assignment.employee_id); - return ( -
-
- - - {getInitials(assignment.employee_name)} - - -
-

{assignment.employee_name}

-

{currentRole.service}

- {conflicts.length > 0 && ( -
- - Time conflict detected -
- )} -
-
-
- - -
-
- ); - })} -
-
- )} - - {/* Add Staff Section */} - {(assigned < needed || swapMode) && ( -
-
-

- {swapMode ? '🔄 Select Replacement:' : '➕ Add Staff:'} -

- {!swapMode && availableStaff.length > 0 && ( -
- - {selectedStaffIds.length > 0 && ( - <> - - - - )} -
- )} -
- - {/* Search */} -
-
- - setSearchTerm(e.target.value)} - className="pl-10" - /> -
-

- Showing {availableStaff.length} {currentRole.service.toLowerCase()}(s) - {roleFilteredStaff.length !== allStaff.length && ( - (filtered by role) - )} -

-
- - {availableStaff.length > 0 ? ( -
- {availableStaff.map((staff, idx) => { - const isSelected = selectedStaffIds.includes(staff.id); - const conflicts = getStaffConflicts(staff.id); - const hasConflict = conflicts.length > 0; - - return ( -
-
- {!swapMode && ( - toggleStaffSelection(staff.id)} - disabled={hasConflict} - className="border-2" - /> - )} - - - {getInitials(staff.employee_name)} - - -
-

{staff.employee_name}

-
-

{staff.position || 'Staff Member'}

- {staff.position_2 && ( - {staff.position_2} - )} -
- {hasConflict && ( -
- - - Conflict: {conflicts[0].orderName} ({conflicts[0].time}) - -
- )} -
-
- -
- ); - })} -
- ) : ( -
- -

- {searchTerm - ? 'No staff match your search' - : `No available ${currentRole.service.toLowerCase()}s found` - } -

-

- {searchTerm ? 'Try a different search term' : 'All matching staff have been assigned'} -

-
- )} -
- )} -
- -
-
- {selectedShiftIndex > 0 && ( - - )} - {selectedShiftIndex < order.shifts_data.length - 1 && ( - - )} -
-
- = totalNeeded - ? 'bg-emerald-50 border-emerald-500 text-emerald-700' - : 'bg-orange-50 border-orange-500 text-orange-700' - }`} - > - {totalAssigned}/{totalNeeded} Filled - - -
-
-
-
- ); -} \ No newline at end of file diff --git a/frontend-web-free/src/components/events/EventForm.jsx b/frontend-web-free/src/components/events/EventForm.jsx deleted file mode 100644 index f018b68a..00000000 --- a/frontend-web-free/src/components/events/EventForm.jsx +++ /dev/null @@ -1,1102 +0,0 @@ - -import React, { useState, useEffect } from "react"; -import { base44 } from "@/api/base44Client"; -import { useQuery } from "@tanstack/react-query"; -import { Card, CardContent } from "@/components/ui/card"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { Button } from "@/components/ui/button"; -import { Switch } from "@/components/ui/switch"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Plus, Save, FileText, Building2, Calendar, Zap, Shield, Search, Minus, Trash2, MapPin, X, RefreshCw, Users, CheckCircle2 } from "lucide-react"; -import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Calendar as CalendarComponent } from "@/components/ui/calendar"; -import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; -import { format } from "date-fns"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Badge } from "@/components/ui/badge"; -import { Textarea } from "@/components/ui/textarea"; -import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from "@/components/ui/command"; - -const UNIFORM_TYPES = ["Type 1", "Type 2", "Type 3", "All Black", "Business Casual", "Chef Whites"]; - -export default function EventForm({ event, onSubmit, isSubmitting, currentUser }) { - const [formData, setFormData] = useState(event || { - event_name: "", - order_type: "one_time", // rapid, one_time, recurring, permanent - recurrence_type: "single", // This field is largely superseded by recurring_frequency in the new UI, but kept for compatibility. - recurrence_start_date: "", - recurrence_end_date: "", - scatter_dates: [], - recurring_days: [], // Added for weekly recurring - recurring_frequency: "weekly", // weekly, monthly, custom - default for recurring events - business_id: "", - business_name: "", - hub: "", - po_reference: "", - status: "Draft", - date: "", - include_backup: false, - backup_staff_count: 0, - shifts: [{ - shift_name: "Shift 1", - location_address: "", - same_as_billing: true, - roles: [{ - role: "", - department: "", - count: 1, - start_time: "09:00", - end_time: "17:00", - hours: 8, - uniform: "Type 1", - break_minutes: 30, - rate_per_hour: 0, - total_value: 0 - }] - }], - notes: "", - total: 0 - }); - - const [roleSearchOpen, setRoleSearchOpen] = useState({}); - - const { data: user } = useQuery({ - queryKey: ['current-user-form'], - queryFn: () => base44.auth.me(), - enabled: !currentUser, - }); - - const currentUserData = currentUser || user; - const userRole = currentUserData?.user_role || currentUserData?.role || "admin"; - const isVendor = userRole === "vendor"; - - const { data: businesses = [] } = useQuery({ - queryKey: ['businesses'], - queryFn: () => base44.entities.Business.list(), - initialData: [], - }); - - const { data: allRates = [] } = useQuery({ - queryKey: ['vendor-rates-all'], - queryFn: () => base44.entities.VendorRate.list(), - initialData: [], - }); - - const { data: vendorSettings = [] } = useQuery({ - queryKey: ['vendor-settings'], - queryFn: () => base44.entities.VendorDefaultSettings.list(), - initialData: [], - }); - - // Get unique roles for dropdown - const availableRoles = [...new Set(allRates.map(r => r.role_name))].sort(); - - // Get hubs for current vendor - const vendorHubs = isVendor - ? [...new Set(businesses.filter(b => b.business_name === currentUserData?.company_name).map(b => b.hub_building))].filter(Boolean) - : []; - - // Auto-fill client details if current user is a client - useEffect(() => { - if (currentUserData && userRole === "client" && !event) { - const clientBusiness = businesses.find(b => - b.email === currentUserData.email || b.contact_name === currentUserData.full_name - ); - - if (clientBusiness) { - setFormData(prev => ({ - ...prev, - business_id: clientBusiness.id, - business_name: clientBusiness.business_name, - hub: clientBusiness.hub_building || prev.hub, - shifts: prev.shifts.map(shift => ({ - ...shift, - location_address: clientBusiness.address || shift.location_address - })) - })); - } - } - }, [currentUserData, businesses, event, userRole]); - - useEffect(() => { - if (event) { - setFormData(event); - } - }, [event]); - - const handleChange = (field, value) => { - setFormData(prev => ({ ...prev, [field]: value })); - }; - - const handleBusinessChange = (businessId) => { - const selectedBusiness = businesses.find(b => b.id === businessId); - if (selectedBusiness) { - setFormData(prev => ({ - ...prev, - business_id: businessId, - business_name: selectedBusiness.business_name || "", - shifts: prev.shifts.map(shift => ({ - ...shift, - location_address: shift.same_as_billing ? selectedBusiness.address || shift.location_address : shift.location_address - })) - })); - } - }; - - const calculateHours = (startTime, endTime, breakMinutes = 0) => { - if (!startTime || !endTime) return 0; - - const [startHour, startMin] = startTime.split(':').map(Number); - const [endHour, endMin] = endTime.split(':').map(Number); - - const startMinutes = startHour * 60 + startMin; - const endMinutes = endHour * 60 + endMin; - - let totalMinutes = endMinutes - startMinutes; - if (totalMinutes < 0) totalMinutes += 24 * 60; - - totalMinutes -= (breakMinutes || 0); - - return Math.max(0, totalMinutes / 60); - }; - - const getRateForRole = (roleName) => { - const rate = allRates.find(r => r.role_name === roleName && r.is_active); - return rate ? parseFloat(rate.client_rate || 0) : 0; - }; - - const handleRoleChange = (shiftIndex, roleIndex, field, value) => { - setFormData(prev => { - const newShifts = [...prev.shifts]; - const role = newShifts[shiftIndex].roles[roleIndex]; - - role[field] = value; - - // Auto-populate rate when role is selected - if (field === 'role') { - const rate = getRateForRole(value); - role.rate_per_hour = rate; - } - - // Recalculate hours when time changes - if (field === 'start_time' || field === 'end_time' || field === 'break_minutes') { - role.hours = calculateHours(role.start_time, role.end_time, role.break_minutes); - } - - // Recalculate total - role.total_value = (role.rate_per_hour || 0) * (role.hours || 0) * (role.count || 1); - - return { ...prev, shifts: newShifts }; - }); - - // Recalculate grand total - updateGrandTotal(); - }; - - const updateGrandTotal = () => { - setTimeout(() => { - setFormData(prev => { - const total = prev.shifts.reduce((sum, shift) => { - const shiftTotal = shift.roles.reduce((roleSum, role) => roleSum + (role.total_value || 0), 0); - return sum + shiftTotal; - }, 0); - return { ...prev, total }; - }); - }, 0); - }; - - const handleAddRole = (shiftIndex) => { - setFormData(prev => { - const newShifts = [...prev.shifts]; - newShifts[shiftIndex].roles.push({ - role: "", - department: "", - count: 1, - start_time: "09:00", - end_time: "17:00", - hours: 8, - uniform: "Type 1", - break_minutes: 30, - rate_per_hour: 0, - total_value: 0 - }); - return { ...prev, shifts: newShifts }; - }); - }; - - const handleRemoveRole = (shiftIndex, roleIndex) => { - setFormData(prev => { - const newShifts = [...prev.shifts]; - newShifts[shiftIndex].roles.splice(roleIndex, 1); - return { ...prev, shifts: newShifts }; - }); - updateGrandTotal(); - }; - - const handleAddShift = () => { - setFormData(prev => ({ - ...prev, - shifts: [...prev.shifts, { - shift_name: `Shift ${prev.shifts.length + 1}`, - location_address: "", - same_as_billing: true, - roles: [{ - role: "", - department: "", - count: 1, - start_time: "09:00", - end_time: "17:00", - hours: 8, - uniform: "Type 1", - break_minutes: 30, - rate_per_hour: 0, - total_value: 0 - }] - }] - })); - }; - - const handleOrderTypeChange = (type) => { - setFormData(prev => { - const newState = { - ...prev, - order_type: type, - date: "", // Always clear the single 'date' field on order type change, it will be set by rapid/one_time/permanent if needed. - recurrence_start_date: "", // Clear these when order type changes - recurrence_end_date: "", - scatter_dates: [], // Clear these when order type changes - recurring_days: [], // Clear these when order type changes - recurring_frequency: "weekly" // Default for recurring - }; - - // Set recurrence_type for backend compatibility if it's still used there, but new UI uses recurring_frequency - if (type === "recurring") { - newState.recurrence_type = "date_range"; // Default to 'date_range' to maintain previous behavior if possible - } else { - newState.recurrence_type = "single"; // For one_time, rapid, permanent - } - - if (type === "rapid" && !prev.date) { // Only set if not already set, or if changing from another type - newState.date = format(new Date(), 'yyyy-MM-dd'); // Default rapid to today if no date - } else if (type === "one_time" || type === "permanent") { - newState.date = prev.date; // Preserve date if user had one for one_time/permanent - } - // If type is recurring, date is already cleared. Other recurring fields default/cleared. - - return newState; - }); - }; - - const handleScatterDateSelect = (dates) => { - setFormData(prev => ({ - ...prev, - scatter_dates: dates?.map(d => format(d, 'yyyy-MM-dd')).sort() || [] - })); - }; - - const handleDayToggle = (day) => { - setFormData(prev => { - const days = prev.recurring_days || []; - const exists = days.includes(day); - return { - ...prev, - recurring_days: exists - ? days.filter(d => d !== day) - : [...days, day].sort((a,b) => a-b) // Ensure days are sorted - }; - }); - }; - - const handleSubmit = (e, isDraft = false) => { - e.preventDefault(); - let status; - if (isDraft) { - status = "DRAFT"; - } else { - switch (formData.order_type) { - case "rapid": - status = "ACTIVE"; // Rapid requests are active immediately upon submission - break; - case "one_time": - case "recurring": - case "permanent": - default: // In case of an unexpected order_type, default to Pending - status = "PENDING"; // These types typically need approval/processing - break; - } - } - - const dataToSubmit = { - ...formData, - status: status - }; - onSubmit(dataToSubmit); - }; - - return ( -
handleSubmit(e, false)} className="space-y-6"> - {/* Order Type Selection - 4 Options */} - - -

Select Order Type

-
- {/* Rapid */} - - - {/* One-Time */} - - - {/* Recurring */} - - - {/* Permanent */} - -
-
-
- - {/* Recurring Options - Android Style */} - {formData.order_type === 'recurring' && ( - - -
- - -
- - {/* Frequency Selection */} -
- -
- - - -
-
- - {/* Weekly - Android Alarm Style Day Selection */} - {formData.recurring_frequency === 'weekly' && ( -
- -
- {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((day, index) => { - const isSelected = (formData.recurring_days || []).includes(index); - return ( - - ); - })} -
- {formData.recurring_days && formData.recurring_days.length > 0 && ( -
- {formData.recurring_days.length} day{formData.recurring_days.length > 1 ? 's' : ''} selected -
- )} -
- )} - - {/* Monthly - Date Range */} - {formData.recurring_frequency === 'monthly' && ( -
- -
-
- - handleChange('recurrence_start_date', e.target.value)} - className="border-slate-300 bg-white h-12" - /> -
-
- - handleChange('recurrence_end_date', e.target.value)} - className="border-slate-300 bg-white h-12" - /> -
-
-
- )} - - {/* Custom - Multiple Specific Dates */} - {formData.recurring_frequency === 'custom' && ( -
- - - - - - - new Date(d)) || []} - onSelect={handleScatterDateSelect} - initialFocus - className="rounded-lg border-0" - /> - - - {formData.scatter_dates && formData.scatter_dates.length > 0 && ( -
- {formData.scatter_dates.map(date => ( - - {format(new Date(date), 'MMM d, yyyy')} - - - ))} -
- )} -
- )} - - {/* Summary Section */} - {((formData.recurring_frequency === 'weekly' && formData.recurring_days?.length > 0) || - (formData.recurring_frequency === 'monthly' && formData.recurrence_start_date && formData.recurrence_end_date) || - (formData.recurring_frequency === 'custom' && formData.scatter_dates?.length > 0)) && ( -
-
- - Recurrence Summary -
-
- {formData.recurring_frequency === 'weekly' && formData.recurring_days?.length > 0 && ( -

• Repeats every - {['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] - .filter((_, i) => formData.recurring_days.includes(i)) - .join(', ')} -

- )} - {formData.recurring_frequency === 'monthly' && formData.recurrence_start_date && formData.recurrence_end_date && ( -

• Repeats monthly from {format(new Date(formData.recurrence_start_date), 'MMM d, yyyy')} to {format(new Date(formData.recurrence_end_date), 'MMM d, yyyy')}

- )} - {formData.recurring_frequency === 'custom' && formData.scatter_dates?.length > 0 && ( -

• {formData.scatter_dates.length} specific date{formData.scatter_dates.length > 1 ? 's' : ''} selected

- )} -
-
- )} -
-
- )} - - {/* Event Details */} - - -

Event

- -
-
- - handleChange('event_name', e.target.value)} - placeholder="Event Name" - required - className="border-slate-200" - /> -
- -
- {(formData.order_type === 'one_time' || formData.order_type === 'rapid' || formData.order_type === 'permanent') && ( -
- - handleChange('date', e.target.value)} - required - className="border-slate-200" - /> -
- )} - - {/* Hub Selection - Show if vendor has multiple locations */} - {isVendor && vendorHubs.length > 1 ? ( -
- - -
- ) : ( -
- - handleChange('hub', e.target.value)} - placeholder="Hub location" - className="border-slate-200" - /> -
- )} -
- - {/* PO Reference - Now Optional */} -
- - handleChange('po_reference', e.target.value)} - placeholder="PO reference" - className="border-slate-200" - /> -
- - {/* Client/Business Selection */} - {isVendor && ( -
- - - {formData.business_id && businesses.find(b => b.id === formData.business_id)?.rate_group && ( -

- â„¹ï¸ Rate Group: {businesses.find(b => b.id === formData.business_id)?.rate_group} (Auto-detected from location) -

- )} -
- )} - - {/* Zero Risk Backup Staff */} -
-
- { - handleChange('include_backup', checked); - if (!checked) handleChange('backup_staff_count', 0); - }} - className="mt-1" - /> -
- -

- Extra pool of staff in case of call-outs or no-shows -

- {formData.include_backup && ( -
- - handleChange('backup_staff_count', parseInt(e.target.value) || 1)} - className="w-24 mt-1 border-green-300" - /> -
- )} -
-
-
-
-
-
- - {/* Shifts Section */} - {formData.shifts.map((shift, shiftIndex) => ( - - -
-
-
- {shiftIndex + 1} -
-
-

{shift.shift_name}

- {shift.location_address && ( -

- - {shift.location_address} -

- )} -
-
- -
- - {/* Roles */} -
- {shift.roles.map((role, roleIndex) => ( -
-
-
- {roleIndex + 1} -
-
- {/* Service/Role with Search */} -
- - setRoleSearchOpen(prev => ({ ...prev, [`${shiftIndex}-${roleIndex}`]: open }))} - > - - - - - - - No role found. - - {availableRoles.map((roleName) => ( - { - handleRoleChange(shiftIndex, roleIndex, 'role', roleName); - setRoleSearchOpen(prev => ({ ...prev, [`${shiftIndex}-${roleIndex}`]: false })); - }} - > - {roleName} - - ))} - - - - -
- - {/* Count */} -
- -
- - handleRoleChange(shiftIndex, roleIndex, 'count', parseInt(e.target.value) || 1)} - className="w-16 text-center" - /> - -
-
- - {/* Start Time */} -
- - handleRoleChange(shiftIndex, roleIndex, 'start_time', e.target.value)} - className="border-slate-200" - /> -
- - {/* End Time */} -
- - handleRoleChange(shiftIndex, roleIndex, 'end_time', e.target.value)} - className="border-slate-200" - /> -
-
- - {shift.roles.length > 1 && ( - - )} -
- -
- {/* Department */} -
- - handleRoleChange(shiftIndex, roleIndex, 'department', e.target.value)} - placeholder="Department" - className="border-slate-200" - /> -
- - {/* Hours (Auto-calculated) */} -
- -
- - {role.hours || 0} - -
-
- - {/* Break (min) */} -
- - handleRoleChange(shiftIndex, roleIndex, 'break_minutes', parseInt(e.target.value) || 0)} - className="border-slate-200" - /> -
- - {/* Uniform */} -
- - -
-
- - {/* Rate and Total */} -
-
- -
- $ - -
-
-
- -
- ${(role.total_value || 0).toFixed(2)} -
-
-
-
- ))} - - {/* Add Role Button */} - -
- - {/* Shift Total */} -
- Shift Total: - - ${shift.roles.reduce((sum, r) => sum + (r.total_value || 0), 0).toFixed(2)} - -
-
-
- ))} - - {/* Add Another Shift Button */} - - - {/* Other Instructions */} - - - -