From 3c27da77a8130045818f7d5aa7152b3f877471e3 Mon Sep 17 00:00:00 2001 From: Aravind Date: Mon, 17 Aug 2026 19:45:29 +0530 Subject: [PATCH] first commit --- .dockerignore | 35 + .gitignore | 31 + Dockerfile | 45 + Krow_logo.webp | Bin 0 -> 5014 bytes README.md | 9 + base44/agents/compliance_agent.jsonc | 89 + base44/agents/executive_agent.jsonc | 81 + base44/agents/finance_agent.jsonc | 75 + base44/agents/krow_ai.jsonc | 93 + base44/agents/operations_agent.jsonc | 96 + base44/agents/procurement_agent.jsonc | 76 + base44/config.jsonc | 9 + base44/entities/AIInterview.jsonc | 127 + base44/entities/ActivityLog.jsonc | 94 + base44/entities/AgentActivity.jsonc | 79 + base44/entities/Announcement.jsonc | 138 + base44/entities/Assignment.jsonc | 174 + base44/entities/Budget.jsonc | 55 + base44/entities/Business.jsonc | 306 + base44/entities/Certification.jsonc | 88 + base44/entities/CompliancePackage.jsonc | 158 + base44/entities/Contract.jsonc | 168 + base44/entities/Conversation.jsonc | 97 + base44/entities/DecisionQueue.jsonc | 107 + base44/entities/EmployeeDocument.jsonc | 84 + base44/entities/Enterprise.jsonc | 89 + base44/entities/Equipment.jsonc | 138 + base44/entities/Event.jsonc | 322 + base44/entities/FoodServiceOperation.jsonc | 200 + base44/entities/Invoice.jsonc | 309 + base44/entities/InvoiceTemplate.jsonc | 132 + base44/entities/JobApplication.jsonc | 147 + base44/entities/JobPosting.jsonc | 144 + base44/entities/KrowEdgeAward.jsonc | 80 + base44/entities/KrowEdgeBid.jsonc | 141 + base44/entities/Message.jsonc | 62 + base44/entities/OperationalMemory.jsonc | 184 + base44/entities/Order.jsonc | 169 + base44/entities/OrderVendorInvite.jsonc | 60 + base44/entities/Partner.jsonc | 116 + base44/entities/PayrollRecord.jsonc | 162 + base44/entities/RateCard.jsonc | 169 + base44/entities/ReputationEvent.jsonc | 68 + base44/entities/SaleRecord.jsonc | 90 + base44/entities/Scorecard.jsonc | 285 + base44/entities/Sector.jsonc | 171 + base44/entities/Shift.jsonc | 93 + base44/entities/ShiftOutcome.jsonc | 148 + base44/entities/ShiftProposal.jsonc | 101 + base44/entities/Site.jsonc | 56 + base44/entities/Staff.jsonc | 259 + base44/entities/Task.jsonc | 124 + base44/entities/TaskComment.jsonc | 36 + base44/entities/Team.jsonc | 146 + base44/entities/TeamHub.jsonc | 69 + base44/entities/TeamMember.jsonc | 66 + base44/entities/TeamMemberInvite.jsonc | 72 + base44/entities/Training.jsonc | 149 + base44/entities/Transportation.jsonc | 139 + base44/entities/User.jsonc | 185 + base44/entities/Vendor.jsonc | 217 + base44/entities/VendorDefaultSettings.jsonc | 31 + base44/entities/VendorDocumentReview.jsonc | 147 + base44/entities/VendorInvite.jsonc | 112 + base44/entities/VendorNetworkApproval.jsonc | 119 + base44/entities/VendorPartnerLink.jsonc | 40 + base44/entities/VendorRate.jsonc | 248 + base44/entities/VendorRateBook.jsonc | 113 + base44/entities/VendorSectorLink.jsonc | 40 + base44/entities/WorkerAvailability.jsonc | 129 + base44/entities/WorkerReputationProfile.jsonc | 99 + base44/entities/Workforce.jsonc | 244 + base44/entities/WorkforceEvent.jsonc | 134 + .../functions/fillEscalationMonitor/entry.ts | 125 + base44/functions/queryWorkforceGraph/entry.ts | 504 + base44/functions/reasonAboutEvent/entry.ts | 235 + base44/functions/recordEvent/entry.ts | 79 + base44/functions/reviewOutcomes/entry.ts | 104 + components.json | 21 + deploy_template.sh | 19 + eslint.config.js | 38 + index.html | 13 + jsconfig.json | 10 + krow logo.jpeg | Bin 0 -> 52908 bytes package-lock.json | 10760 ++++++++++++++++ package.json | 90 + postcss.config.js | 6 + src/API_documentation.md | 0 src/App.css | 0 src/App.jsx | 142 + src/Layout.jsx | 739 ++ src/api/base44Client.js | 13 + src/api/entities.js | 9 + src/api/integrations.js | 24 + src/assets/krow-logo.webp | Bin 0 -> 5014 bytes src/assets/owliver-avatar.jpg | Bin 0 -> 46109 bytes src/assets/owliver-mascot.jpg | Bin 0 -> 72070 bytes src/assets/react.svg | 1 + src/components/ProtectedRoute.jsx | 37 + src/components/UserNotRegisteredError.jsx | 31 + .../announcements/AnnouncementsTab.jsx | 714 + .../budget/BudgetUtilizationTracker.jsx | 406 + .../budget/ClientBudgetConfiguration.jsx | 292 + src/components/business/BusinessCard.jsx | 273 + .../business/CreateBusinessModal.jsx | 292 + src/components/business/ERPSettingsTab.jsx | 256 + src/components/chat/ChatBubble.jsx | 322 + src/components/common/DragDropFileUpload.jsx | 128 + src/components/common/GoogleAddressInput.jsx | 72 + src/components/common/PageHeader.jsx | 46 + src/components/dailypl/BreakEvenEngine.jsx | 149 + src/components/dailypl/DailyPLTable.jsx | 161 + src/components/dailypl/TopInvoicesCard.jsx | 80 + src/components/dailypl/TopPeopleCard.jsx | 57 + .../dashboard/DashboardCustomizer.jsx | 406 + src/components/dashboard/EcosystemWheel.jsx | 316 + src/components/dashboard/MorningBrief.jsx | 597 + src/components/dashboard/QuickMetrics.jsx | 43 + src/components/dashboard/SmartToDo.jsx | 145 + src/components/demand/PositionDetail.jsx | 120 + src/components/demand/PositionTable.jsx | 102 + src/components/demand/SupplyVsDemandCard.jsx | 143 + src/components/demand/ViewToggle.jsx | 34 + src/components/dev/RoleSwitcher.jsx | 237 + .../documents/DocumentApprovalCard.jsx | 109 + src/components/events/AIOrderAssistant.jsx | 632 + .../events/AssignedStaffManager.jsx | 244 + .../events/EventAssignmentModal.jsx | 837 ++ src/components/events/EventForm.jsx | 1103 ++ src/components/events/EventFormWizard.jsx | 1694 +++ src/components/events/EventHoverCard.jsx | 134 + src/components/events/EventsTable.jsx | 136 + src/components/events/OrderChatAssistant.jsx | 403 + src/components/events/QuickAssignPopover.jsx | 210 + src/components/events/QuickReorderModal.jsx | 249 + src/components/events/ShiftCard.jsx | 162 + src/components/events/ShiftRoleCard.jsx | 427 + src/components/events/ShiftRolesTable.jsx | 323 + src/components/events/ShiftSection.jsx | 354 + src/components/events/SmartAssignModal.jsx | 612 + src/components/events/StaffAssignment.jsx | 688 + src/components/events/StatusCard.jsx | 29 + src/components/events/VendorRoutingPanel.jsx | 340 + .../invoices/AutoInvoiceGenerator.jsx | 175 + .../invoices/CreateInvoiceModal.jsx | 201 + .../invoices/InvoiceDetailModal.jsx | 444 + src/components/invoices/InvoiceDetailView.jsx | 1423 ++ .../invoices/InvoiceExportPanel.jsx | 316 + .../invoices/InvoiceQuickActions.jsx | 342 + src/components/krow-edge/ClientEventSetup.jsx | 531 + src/components/krow-edge/ScoringEngine.jsx | 96 + src/components/krow-edge/VendorBidPanel.jsx | 254 + .../krow-edge/VendorPositioningChart.jsx | 55 + src/components/krowcommand/ActionCard.jsx | 82 + src/components/krowcommand/AttentionCard.jsx | 30 + .../krowcommand/CausalChainView.jsx | 104 + src/components/krowcommand/CommandAnswer.jsx | 136 + src/components/krowcommand/HowToUseKrow.jsx | 144 + src/components/krowcommand/KrowCommandAsk.jsx | 72 + .../marketplace/BookingConfirmModal.jsx | 199 + .../marketplace/StaffingSearchBar.jsx | 139 + .../marketplace/VendorListingCard.jsx | 141 + src/components/messaging/ConversationList.jsx | 108 + src/components/messaging/MessageInput.jsx | 70 + src/components/messaging/MessageThread.jsx | 99 + .../notifications/NotificationEngine.jsx | 247 + .../notifications/NotificationPanel.jsx | 622 + src/components/onboarding/CompletionStep.jsx | 141 + .../onboarding/DocumentUploadStep.jsx | 159 + .../onboarding/ProfileSetupStep.jsx | 193 + src/components/onboarding/TrainingStep.jsx | 173 + .../orders/CancellationFeeModal.jsx | 161 + src/components/orders/OrderDetailModal.jsx | 362 + src/components/orders/OrderReductionAlert.jsx | 109 + src/components/orders/OrderStatusBadge.jsx | 149 + src/components/orders/OrderStatusUtils.jsx | 37 + src/components/orders/QuickOrderBar.jsx | 153 + src/components/orders/RapidOrderChat.jsx | 332 + src/components/orders/RapidOrderInterface.jsx | 276 + src/components/orders/SmartAssignModal.jsx | 374 + .../orders/WorkerConfirmationCard.jsx | 150 + src/components/owliver/OwliverAvatar.jsx | 27 + .../owliver/OwliverConversation.jsx | 48 + src/components/owliver/OwliverError.jsx | 33 + src/components/owliver/OwliverHeader.jsx | 107 + src/components/owliver/OwliverInsight.jsx | 51 + src/components/owliver/OwliverLauncher.jsx | 66 + src/components/owliver/OwliverMessage.jsx | 124 + src/components/owliver/OwliverPrompt.jsx | 134 + src/components/owliver/OwliverProvider.jsx | 511 + src/components/owliver/OwliverShell.jsx | 161 + src/components/owliver/OwliverSuggestions.jsx | 40 + .../owliver/useOwliverPageContext.js | 53 + .../permissions/PermissionConfig.jsx | 376 + .../permissions/UserPermissionsModal.jsx | 228 + .../procurement/AttestationUploader.jsx | 322 + src/components/procurement/AuditTab.jsx | 88 + src/components/procurement/AuditTrailTab.jsx | 77 + src/components/procurement/COIViewer.jsx | 192 + .../procurement/ComplianceDocumentsTab.jsx | 91 + .../procurement/ComplianceReportModal.jsx | 290 + src/components/procurement/ComplianceTab.jsx | 115 + src/components/procurement/ContractsTab.jsx | 103 + src/components/procurement/ForecastingTab.jsx | 119 + .../procurement/POAndInvoiceTabs.jsx | 181 + .../procurement/ReportsAnalyticsTab.jsx | 82 + src/components/procurement/ReportsTab.jsx | 119 + .../procurement/SpendAnalyticsTab.jsx | 93 + src/components/procurement/TrendsSLATab.jsx | 101 + src/components/procurement/TrendsTab.jsx | 83 + .../procurement/VendorDetailModal.jsx | 650 + .../procurement/VendorHoverCard.jsx | 133 + .../procurement/VendorScoreHoverCard.jsx | 226 + .../procurement/VendorScorecardsTab.jsx | 223 + src/components/procurement/W9FormViewer.jsx | 346 + src/components/rates/RateCardModal.jsx | 219 + .../recruiting/AIInterviewModal.jsx | 679 + src/components/recruiting/AIJobBuilder.jsx | 329 + .../recruiting/ApplicantAssessment.jsx | 318 + src/components/recruiting/ApplicantCard.jsx | 199 + src/components/recruiting/ApplicantForm.jsx | 352 + .../recruiting/CandidateActionMenu.jsx | 146 + src/components/recruiting/CandidateCard.jsx | 201 + .../recruiting/CandidateProfileModal.jsx | 292 + .../recruiting/KROWCandidateLeaderboard.jsx | 329 + .../recruiting/KROWJobPostingCard.jsx | 139 + .../recruiting/MessageCandidateModal.jsx | 99 + .../recruiting/ScheduleInterviewModal.jsx | 208 + src/components/reports/ClientTrendsReport.jsx | 809 ++ .../reports/CustomReportBuilder.jsx | 333 + .../reports/ExecutiveSummaryTab.jsx | 353 + src/components/reports/ForecastingTab.jsx | 212 + .../reports/OperationalEfficiencyReport.jsx | 249 + src/components/reports/ReportExporter.jsx | 325 + src/components/reports/ReportFilters.jsx | 377 + .../reports/ReportInsightsBanner.jsx | 178 + src/components/reports/ReportPDFPreview.jsx | 186 + .../reports/ReportTemplateLibrary.jsx | 183 + src/components/reports/ScheduledReports.jsx | 313 + .../reports/StaffPerformanceReport.jsx | 246 + src/components/reports/StaffingCostReport.jsx | 233 + src/components/sales/CheckUploadModal.jsx | 369 + src/components/sales/ColumnsToggle.jsx | 67 + src/components/sales/DateRangePicker.jsx | 155 + src/components/sales/StatusFilterDropdown.jsx | 62 + .../savings/ContractConversionMap.jsx | 320 + src/components/savings/ConversionModal.jsx | 690 + .../savings/DynamicSavingsDashboard.jsx | 335 + src/components/savings/LaborCostOptimizer.jsx | 490 + src/components/savings/LaborSpendAnalysis.jsx | 272 + .../savings/PredictiveSavingsModel.jsx | 259 + src/components/savings/ReplacementDialog.jsx | 75 + .../savings/SavingsOverviewCards.jsx | 359 + .../savings/VendorPerformanceMatrix.jsx | 299 + .../scheduling/AutomationEngine.jsx | 211 + .../scheduling/ConflictDetection.jsx | 314 + .../DoubleBookingOverrideDialog.jsx | 120 + .../scheduling/DoubleBookingValidator.jsx | 182 + .../scheduling/DragDropScheduler.jsx | 343 + .../scheduling/OvertimeCalculator.jsx | 221 + .../scheduling/SmartAssignmentEngine.jsx | 274 + src/components/scheduling/TalentRadar.jsx | 218 + src/components/scheduling/WorkerInfoCard.jsx | 137 + src/components/sectors/QuickImportModal.jsx | 306 + src/components/sectors/SectorFormWizard.jsx | 427 + src/components/staff/EmployeeCard.jsx | 273 + src/components/staff/FilterBar.jsx | 56 + src/components/staff/StaffCard.jsx | 179 + src/components/staff/StaffForm.jsx | 734 ++ src/components/staff/StatsCard.jsx | 59 + src/components/tasks/TaskCard.jsx | 116 + src/components/tasks/TaskColumn.jsx | 56 + src/components/tasks/TaskDetailModal.jsx | 526 + src/components/team/BlockedTab.jsx | 91 + src/components/team/FavoritesTab.jsx | 92 + .../tutorials/CreateEventTutorialVideo.jsx | 713 + .../tutorials/TutorialVideoPlayer.jsx | 860 ++ src/components/ui/accordion.jsx | 41 + src/components/ui/alert-dialog.jsx | 97 + src/components/ui/alert.jsx | 47 + src/components/ui/aspect-ratio.jsx | 5 + src/components/ui/avatar.jsx | 35 + src/components/ui/badge.jsx | 34 + src/components/ui/breadcrumb.jsx | 92 + src/components/ui/button.jsx | 48 + src/components/ui/calendar.jsx | 71 + src/components/ui/card.jsx | 51 + src/components/ui/carousel.jsx | 193 + src/components/ui/chart.jsx | 309 + src/components/ui/checkbox.jsx | 22 + src/components/ui/collapsible.jsx | 11 + src/components/ui/command.jsx | 116 + src/components/ui/context-menu.jsx | 156 + src/components/ui/dialog.jsx | 98 + src/components/ui/drawer.jsx | 92 + src/components/ui/dropdown-menu.jsx | 156 + src/components/ui/form.jsx | 134 + src/components/ui/hover-card.jsx | 25 + src/components/ui/input-otp.jsx | 53 + src/components/ui/input.jsx | 19 + src/components/ui/label.jsx | 16 + src/components/ui/menubar.jsx | 200 + src/components/ui/navigation-menu.jsx | 104 + src/components/ui/pagination.jsx | 100 + src/components/ui/popover.jsx | 27 + src/components/ui/progress.jsx | 23 + src/components/ui/radio-group.jsx | 29 + src/components/ui/resizable.jsx | 42 + src/components/ui/scroll-area.jsx | 38 + src/components/ui/select.jsx | 121 + src/components/ui/separator.jsx | 23 + src/components/ui/sheet.jsx | 109 + src/components/ui/sidebar.jsx | 626 + src/components/ui/skeleton.jsx | 14 + src/components/ui/slider.jsx | 18 + src/components/ui/sonner.jsx | 29 + src/components/ui/switch.jsx | 22 + src/components/ui/table.jsx | 86 + src/components/ui/tabs.jsx | 33 + src/components/ui/textarea.jsx | 18 + src/components/ui/toast.jsx | 48 + src/components/ui/toaster.jsx | 7 + src/components/ui/toggle-group.jsx | 44 + src/components/ui/toggle.jsx | 38 + src/components/ui/tooltip.jsx | 28 + src/components/ui/use-toast.jsx | 183 + src/components/vendor/ClientLoyaltyCard.jsx | 194 + .../vendor/ClientVendorPreferences.jsx | 386 + src/components/vendor/DocumentViewer.jsx | 514 + .../vendor/PreferredVendorPanel.jsx | 358 + .../vendor/SmartOperationStrategies.jsx | 408 + src/components/vendor/UpcomingOrdersCard.jsx | 149 + .../vendorreports/AttendanceReport.jsx | 141 + .../vendorreports/CompanyHealthReport.jsx | 142 + .../EventProfitabilityReport.jsx | 138 + .../vendorreports/LaborSpendReport.jsx | 111 + .../vendorreports/ReportPrimitives.jsx | 106 + .../vendorreports/ResponseTimeReport.jsx | 114 + .../vendorreports/TimeToFillReport.jsx | 117 + .../vendorreports/VendorScorecardReport.jsx | 182 + src/components/vendors/AddVendorModal.jsx | 173 + .../vendors/ComplianceAttestations.jsx | 71 + src/components/vendors/EditVendorModal.jsx | 407 + src/components/vendors/GoogleAddressInput.jsx | 104 + .../vendors/VendorRequirementsConfig.jsx | 214 + .../vendors/VendorRequirementsDisplay.jsx | 99 + .../AgencyNetworkControls.jsx | 104 + .../workforce-network/ReputationEventRow.jsx | 43 + .../workforce-network/TrustScoreBadge.jsx | 26 + .../workforce-network/WorkerProfileDrawer.jsx | 123 + .../workforce-network/WorkerTrustCard.jsx | 53 + src/entities/ActivityLog.json | 94 + src/entities/Assignment.json | 174 + src/entities/Business.json | 34 + src/entities/CompliancePackage.json | 158 + src/entities/Conversation.json | 97 + src/entities/Enterprise.json | 89 + src/entities/Event.json | 211 + src/entities/Invoice.json | 102 + src/entities/Message.json | 62 + src/entities/Order.json | 169 + src/entities/OrderVendorInvite.json | 60 + src/entities/Partner.json | 116 + src/entities/RateCard.json | 169 + src/entities/Scorecard.json | 285 + src/entities/Sector.json | 84 + src/entities/Shift.json | 93 + src/entities/Site.json | 56 + src/entities/Staff.json | 184 + src/entities/Team.json | 92 + src/entities/TeamHub.json | 48 + src/entities/TeamMember.json | 66 + src/entities/User.json | 52 + src/entities/Vendor.json | 127 + src/entities/VendorDefaultSettings.json | 31 + src/entities/VendorPartnerLink.json | 40 + src/entities/VendorRate.json | 106 + src/entities/VendorSectorLink.json | 40 + src/entities/Workforce.json | 244 + src/hooks/use-mobile.jsx | 19 + src/index.css | 295 + src/lib/AuthContext.jsx | 154 + src/lib/NavigationTracker.jsx | 50 + src/lib/PageNotFound.jsx | 75 + src/lib/VisualEditAgent.jsx | 648 + src/lib/app-params.js | 50 + src/lib/engines/digitalTwin.js | 366 + src/lib/engines/engineRegistry.js | 304 + src/lib/engines/queryRouter.js | 138 + src/lib/engines/synthesize.js | 154 + src/lib/iframe-messaging.js | 43 + src/lib/krowCommandEngine.js | 758 ++ src/lib/owliver/actions.js | 74 + src/lib/owliver/context.js | 75 + src/lib/owliver/mockOwliver.js | 434 + src/lib/owliver/pageRegistry.js | 1102 ++ src/lib/query-client.js | 11 + src/lib/utils.js | 9 + src/lib/vendorRequirements.js | 39 + src/main.jsx | 22 + src/pages.config.js | 212 + src/pages/AboutUs.jsx | 74 + src/pages/ActivityLog.jsx | 167 + src/pages/AddBusiness.jsx | 170 + src/pages/AddEnterprise.jsx | 291 + src/pages/AddPartner.jsx | 319 + src/pages/AddSector.jsx | 126 + src/pages/AddStaff.jsx | 49 + src/pages/Announcements.jsx | 44 + src/pages/Business.jsx | 723 ++ src/pages/CapabilityMap.jsx | 326 + src/pages/Certification.jsx | 768 ++ src/pages/ClientDashboard.jsx | 1311 ++ src/pages/ClientInvoices.jsx | 126 + src/pages/ClientLaborReport.jsx | 720 ++ src/pages/ClientOrders.jsx | 860 ++ src/pages/Communications.jsx | 241 + src/pages/ControlTower.jsx | 536 + src/pages/CreateEvent.jsx | 191 + src/pages/CreateTeam.jsx | 258 + src/pages/DailyPL.jsx | 505 + src/pages/Dashboard.jsx | 678 + src/pages/DemandSupply.jsx | 394 + src/pages/DocumentApproval.jsx | 381 + src/pages/EditBusiness.jsx | 1074 ++ src/pages/EditEnterprise.jsx | 348 + src/pages/EditEvent.jsx | 214 + src/pages/EditPartner.jsx | 375 + src/pages/EditSector.jsx | 176 + src/pages/EditStaff.jsx | 79 + src/pages/EditVendor.jsx | 418 + src/pages/EmployeeDocuments.jsx | 703 + src/pages/EmployeeTimecard.jsx | 236 + src/pages/EnterpriseManagement.jsx | 208 + src/pages/EventDetail.jsx | 355 + src/pages/Events.jsx | 789 ++ src/pages/FeatureReport.jsx | 545 + src/pages/ForWorkers.jsx | 42 + src/pages/Home.jsx | 55 + src/pages/InviteVendor.jsx | 360 + src/pages/InvoiceDetail.jsx | 85 + src/pages/InvoiceEditor.jsx | 1571 +++ src/pages/Invoices.jsx | 541 + src/pages/KrowAI.jsx | 498 + src/pages/KrowCommand.jsx | 410 + src/pages/KrowConsole.jsx | 480 + src/pages/KrowEdge.jsx | 709 + src/pages/KrowX.jsx | 469 + src/pages/LandingPage.jsx | 1274 ++ src/pages/Messages.jsx | 523 + src/pages/NotificationSettings.jsx | 271 + src/pages/Onboarding.jsx | 507 + src/pages/OperatorDashboard.jsx | 312 + src/pages/PartnerManagement.jsx | 645 + src/pages/Payroll.jsx | 281 + src/pages/PayrollDetail.jsx | 282 + src/pages/Permissions.jsx | 608 + src/pages/PlatformOnboarding.jsx | 395 + src/pages/PredictiveIntelligence.jsx | 477 + src/pages/ProcurementDashboard.jsx | 1990 +++ src/pages/RapidOrder.jsx | 508 + src/pages/Recruiting.jsx | 487 + src/pages/Reports.jsx | 39 + src/pages/Sales.jsx | 680 + src/pages/SavingsEngine.jsx | 338 + src/pages/Schedule.jsx | 335 + src/pages/SectorDetail.jsx | 571 + src/pages/SectorManagement.jsx | 257 + src/pages/Settings.jsx | 19 + src/pages/SmartScheduler.jsx | 36 + src/pages/SmartVendorOnboarding.jsx | 2558 ++++ src/pages/StaffAvailability.jsx | 469 + src/pages/StaffDirectory.jsx | 322 + src/pages/StaffOnboarding.jsx | 197 + src/pages/StaffProfileDemo.jsx | 527 + src/pages/StaffingMarketplace.jsx | 269 + src/pages/Support.jsx | 19 + src/pages/TaskBoard.jsx | 650 + src/pages/TeamDetails.jsx | 1326 ++ src/pages/Teams.jsx | 2077 +++ src/pages/ThePlatform.jsx | 58 + src/pages/Tutorials.jsx | 409 + src/pages/UserManagement.jsx | 596 + src/pages/VendorCompliance.jsx | 945 ++ src/pages/VendorDashboard.jsx | 1313 ++ src/pages/VendorDocumentReview.jsx | 510 + src/pages/VendorInvoices.jsx | 114 + src/pages/VendorManagement.jsx | 1165 ++ src/pages/VendorMarketplace.jsx | 1008 ++ src/pages/VendorOnboarding.jsx | 734 ++ src/pages/VendorOrders.jsx | 560 + src/pages/VendorPerformance.jsx | 112 + src/pages/VendorRateCard.jsx | 784 ++ src/pages/VendorRates.jsx | 1328 ++ src/pages/VendorReports.jsx | 158 + src/pages/VendorStaff.jsx | 152 + src/pages/WorkerShiftProposals.jsx | 267 + src/pages/WorkforceCompliance.jsx | 169 + src/pages/WorkforceDashboard.jsx | 187 + src/pages/WorkforceEarnings.jsx | 111 + src/pages/WorkforceNetwork.jsx | 315 + src/pages/WorkforceProfile.jsx | 255 + src/pages/WorkforceShifts.jsx | 137 + src/pages/api-docs-raw.jsx | 2015 +++ src/utils/index.ts | 6 + tailwind.config.js | 90 + vite-plugins/ErrorOverlay.js | 55 + vite-plugins/error-overlay-plugin.js | 17 + vite-plugins/visual-edit-plugin.js | 248 + vite.config.js | 57 + 510 files changed, 137749 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Krow_logo.webp create mode 100644 README.md create mode 100644 base44/agents/compliance_agent.jsonc create mode 100644 base44/agents/executive_agent.jsonc create mode 100644 base44/agents/finance_agent.jsonc create mode 100644 base44/agents/krow_ai.jsonc create mode 100644 base44/agents/operations_agent.jsonc create mode 100644 base44/agents/procurement_agent.jsonc create mode 100644 base44/config.jsonc create mode 100644 base44/entities/AIInterview.jsonc create mode 100644 base44/entities/ActivityLog.jsonc create mode 100644 base44/entities/AgentActivity.jsonc create mode 100644 base44/entities/Announcement.jsonc create mode 100644 base44/entities/Assignment.jsonc create mode 100644 base44/entities/Budget.jsonc create mode 100644 base44/entities/Business.jsonc create mode 100644 base44/entities/Certification.jsonc create mode 100644 base44/entities/CompliancePackage.jsonc create mode 100644 base44/entities/Contract.jsonc create mode 100644 base44/entities/Conversation.jsonc create mode 100644 base44/entities/DecisionQueue.jsonc create mode 100644 base44/entities/EmployeeDocument.jsonc create mode 100644 base44/entities/Enterprise.jsonc create mode 100644 base44/entities/Equipment.jsonc create mode 100644 base44/entities/Event.jsonc create mode 100644 base44/entities/FoodServiceOperation.jsonc create mode 100644 base44/entities/Invoice.jsonc create mode 100644 base44/entities/InvoiceTemplate.jsonc create mode 100644 base44/entities/JobApplication.jsonc create mode 100644 base44/entities/JobPosting.jsonc create mode 100644 base44/entities/KrowEdgeAward.jsonc create mode 100644 base44/entities/KrowEdgeBid.jsonc create mode 100644 base44/entities/Message.jsonc create mode 100644 base44/entities/OperationalMemory.jsonc create mode 100644 base44/entities/Order.jsonc create mode 100644 base44/entities/OrderVendorInvite.jsonc create mode 100644 base44/entities/Partner.jsonc create mode 100644 base44/entities/PayrollRecord.jsonc create mode 100644 base44/entities/RateCard.jsonc create mode 100644 base44/entities/ReputationEvent.jsonc create mode 100644 base44/entities/SaleRecord.jsonc create mode 100644 base44/entities/Scorecard.jsonc create mode 100644 base44/entities/Sector.jsonc create mode 100644 base44/entities/Shift.jsonc create mode 100644 base44/entities/ShiftOutcome.jsonc create mode 100644 base44/entities/ShiftProposal.jsonc create mode 100644 base44/entities/Site.jsonc create mode 100644 base44/entities/Staff.jsonc create mode 100644 base44/entities/Task.jsonc create mode 100644 base44/entities/TaskComment.jsonc create mode 100644 base44/entities/Team.jsonc create mode 100644 base44/entities/TeamHub.jsonc create mode 100644 base44/entities/TeamMember.jsonc create mode 100644 base44/entities/TeamMemberInvite.jsonc create mode 100644 base44/entities/Training.jsonc create mode 100644 base44/entities/Transportation.jsonc create mode 100644 base44/entities/User.jsonc create mode 100644 base44/entities/Vendor.jsonc create mode 100644 base44/entities/VendorDefaultSettings.jsonc create mode 100644 base44/entities/VendorDocumentReview.jsonc create mode 100644 base44/entities/VendorInvite.jsonc create mode 100644 base44/entities/VendorNetworkApproval.jsonc create mode 100644 base44/entities/VendorPartnerLink.jsonc create mode 100644 base44/entities/VendorRate.jsonc create mode 100644 base44/entities/VendorRateBook.jsonc create mode 100644 base44/entities/VendorSectorLink.jsonc create mode 100644 base44/entities/WorkerAvailability.jsonc create mode 100644 base44/entities/WorkerReputationProfile.jsonc create mode 100644 base44/entities/Workforce.jsonc create mode 100644 base44/entities/WorkforceEvent.jsonc create mode 100644 base44/functions/fillEscalationMonitor/entry.ts create mode 100644 base44/functions/queryWorkforceGraph/entry.ts create mode 100644 base44/functions/reasonAboutEvent/entry.ts create mode 100644 base44/functions/recordEvent/entry.ts create mode 100644 base44/functions/reviewOutcomes/entry.ts create mode 100644 components.json create mode 100644 deploy_template.sh create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 krow logo.jpeg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/API_documentation.md create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/Layout.jsx create mode 100644 src/api/base44Client.js create mode 100644 src/api/entities.js create mode 100644 src/api/integrations.js create mode 100644 src/assets/krow-logo.webp create mode 100644 src/assets/owliver-avatar.jpg create mode 100644 src/assets/owliver-mascot.jpg create mode 100644 src/assets/react.svg create mode 100644 src/components/ProtectedRoute.jsx create mode 100644 src/components/UserNotRegisteredError.jsx create mode 100644 src/components/announcements/AnnouncementsTab.jsx create mode 100644 src/components/budget/BudgetUtilizationTracker.jsx create mode 100644 src/components/budget/ClientBudgetConfiguration.jsx create mode 100644 src/components/business/BusinessCard.jsx create mode 100644 src/components/business/CreateBusinessModal.jsx create mode 100644 src/components/business/ERPSettingsTab.jsx create mode 100644 src/components/chat/ChatBubble.jsx create mode 100644 src/components/common/DragDropFileUpload.jsx create mode 100644 src/components/common/GoogleAddressInput.jsx create mode 100644 src/components/common/PageHeader.jsx create mode 100644 src/components/dailypl/BreakEvenEngine.jsx create mode 100644 src/components/dailypl/DailyPLTable.jsx create mode 100644 src/components/dailypl/TopInvoicesCard.jsx create mode 100644 src/components/dailypl/TopPeopleCard.jsx create mode 100644 src/components/dashboard/DashboardCustomizer.jsx create mode 100644 src/components/dashboard/EcosystemWheel.jsx create mode 100644 src/components/dashboard/MorningBrief.jsx create mode 100644 src/components/dashboard/QuickMetrics.jsx create mode 100644 src/components/dashboard/SmartToDo.jsx create mode 100644 src/components/demand/PositionDetail.jsx create mode 100644 src/components/demand/PositionTable.jsx create mode 100644 src/components/demand/SupplyVsDemandCard.jsx create mode 100644 src/components/demand/ViewToggle.jsx create mode 100644 src/components/dev/RoleSwitcher.jsx create mode 100644 src/components/documents/DocumentApprovalCard.jsx create mode 100644 src/components/events/AIOrderAssistant.jsx create mode 100644 src/components/events/AssignedStaffManager.jsx create mode 100644 src/components/events/EventAssignmentModal.jsx create mode 100644 src/components/events/EventForm.jsx create mode 100644 src/components/events/EventFormWizard.jsx create mode 100644 src/components/events/EventHoverCard.jsx create mode 100644 src/components/events/EventsTable.jsx create mode 100644 src/components/events/OrderChatAssistant.jsx create mode 100644 src/components/events/QuickAssignPopover.jsx create mode 100644 src/components/events/QuickReorderModal.jsx create mode 100644 src/components/events/ShiftCard.jsx create mode 100644 src/components/events/ShiftRoleCard.jsx create mode 100644 src/components/events/ShiftRolesTable.jsx create mode 100644 src/components/events/ShiftSection.jsx create mode 100644 src/components/events/SmartAssignModal.jsx create mode 100644 src/components/events/StaffAssignment.jsx create mode 100644 src/components/events/StatusCard.jsx create mode 100644 src/components/events/VendorRoutingPanel.jsx create mode 100644 src/components/invoices/AutoInvoiceGenerator.jsx create mode 100644 src/components/invoices/CreateInvoiceModal.jsx create mode 100644 src/components/invoices/InvoiceDetailModal.jsx create mode 100644 src/components/invoices/InvoiceDetailView.jsx create mode 100644 src/components/invoices/InvoiceExportPanel.jsx create mode 100644 src/components/invoices/InvoiceQuickActions.jsx create mode 100644 src/components/krow-edge/ClientEventSetup.jsx create mode 100644 src/components/krow-edge/ScoringEngine.jsx create mode 100644 src/components/krow-edge/VendorBidPanel.jsx create mode 100644 src/components/krow-edge/VendorPositioningChart.jsx create mode 100644 src/components/krowcommand/ActionCard.jsx create mode 100644 src/components/krowcommand/AttentionCard.jsx create mode 100644 src/components/krowcommand/CausalChainView.jsx create mode 100644 src/components/krowcommand/CommandAnswer.jsx create mode 100644 src/components/krowcommand/HowToUseKrow.jsx create mode 100644 src/components/krowcommand/KrowCommandAsk.jsx create mode 100644 src/components/marketplace/BookingConfirmModal.jsx create mode 100644 src/components/marketplace/StaffingSearchBar.jsx create mode 100644 src/components/marketplace/VendorListingCard.jsx create mode 100644 src/components/messaging/ConversationList.jsx create mode 100644 src/components/messaging/MessageInput.jsx create mode 100644 src/components/messaging/MessageThread.jsx create mode 100644 src/components/notifications/NotificationEngine.jsx create mode 100644 src/components/notifications/NotificationPanel.jsx create mode 100644 src/components/onboarding/CompletionStep.jsx create mode 100644 src/components/onboarding/DocumentUploadStep.jsx create mode 100644 src/components/onboarding/ProfileSetupStep.jsx create mode 100644 src/components/onboarding/TrainingStep.jsx create mode 100644 src/components/orders/CancellationFeeModal.jsx create mode 100644 src/components/orders/OrderDetailModal.jsx create mode 100644 src/components/orders/OrderReductionAlert.jsx create mode 100644 src/components/orders/OrderStatusBadge.jsx create mode 100644 src/components/orders/OrderStatusUtils.jsx create mode 100644 src/components/orders/QuickOrderBar.jsx create mode 100644 src/components/orders/RapidOrderChat.jsx create mode 100644 src/components/orders/RapidOrderInterface.jsx create mode 100644 src/components/orders/SmartAssignModal.jsx create mode 100644 src/components/orders/WorkerConfirmationCard.jsx create mode 100644 src/components/owliver/OwliverAvatar.jsx create mode 100644 src/components/owliver/OwliverConversation.jsx create mode 100644 src/components/owliver/OwliverError.jsx create mode 100644 src/components/owliver/OwliverHeader.jsx create mode 100644 src/components/owliver/OwliverInsight.jsx create mode 100644 src/components/owliver/OwliverLauncher.jsx create mode 100644 src/components/owliver/OwliverMessage.jsx create mode 100644 src/components/owliver/OwliverPrompt.jsx create mode 100644 src/components/owliver/OwliverProvider.jsx create mode 100644 src/components/owliver/OwliverShell.jsx create mode 100644 src/components/owliver/OwliverSuggestions.jsx create mode 100644 src/components/owliver/useOwliverPageContext.js create mode 100644 src/components/permissions/PermissionConfig.jsx create mode 100644 src/components/permissions/UserPermissionsModal.jsx create mode 100644 src/components/procurement/AttestationUploader.jsx create mode 100644 src/components/procurement/AuditTab.jsx create mode 100644 src/components/procurement/AuditTrailTab.jsx create mode 100644 src/components/procurement/COIViewer.jsx create mode 100644 src/components/procurement/ComplianceDocumentsTab.jsx create mode 100644 src/components/procurement/ComplianceReportModal.jsx create mode 100644 src/components/procurement/ComplianceTab.jsx create mode 100644 src/components/procurement/ContractsTab.jsx create mode 100644 src/components/procurement/ForecastingTab.jsx create mode 100644 src/components/procurement/POAndInvoiceTabs.jsx create mode 100644 src/components/procurement/ReportsAnalyticsTab.jsx create mode 100644 src/components/procurement/ReportsTab.jsx create mode 100644 src/components/procurement/SpendAnalyticsTab.jsx create mode 100644 src/components/procurement/TrendsSLATab.jsx create mode 100644 src/components/procurement/TrendsTab.jsx create mode 100644 src/components/procurement/VendorDetailModal.jsx create mode 100644 src/components/procurement/VendorHoverCard.jsx create mode 100644 src/components/procurement/VendorScoreHoverCard.jsx create mode 100644 src/components/procurement/VendorScorecardsTab.jsx create mode 100644 src/components/procurement/W9FormViewer.jsx create mode 100644 src/components/rates/RateCardModal.jsx create mode 100644 src/components/recruiting/AIInterviewModal.jsx create mode 100644 src/components/recruiting/AIJobBuilder.jsx create mode 100644 src/components/recruiting/ApplicantAssessment.jsx create mode 100644 src/components/recruiting/ApplicantCard.jsx create mode 100644 src/components/recruiting/ApplicantForm.jsx create mode 100644 src/components/recruiting/CandidateActionMenu.jsx create mode 100644 src/components/recruiting/CandidateCard.jsx create mode 100644 src/components/recruiting/CandidateProfileModal.jsx create mode 100644 src/components/recruiting/KROWCandidateLeaderboard.jsx create mode 100644 src/components/recruiting/KROWJobPostingCard.jsx create mode 100644 src/components/recruiting/MessageCandidateModal.jsx create mode 100644 src/components/recruiting/ScheduleInterviewModal.jsx create mode 100644 src/components/reports/ClientTrendsReport.jsx create mode 100644 src/components/reports/CustomReportBuilder.jsx create mode 100644 src/components/reports/ExecutiveSummaryTab.jsx create mode 100644 src/components/reports/ForecastingTab.jsx create mode 100644 src/components/reports/OperationalEfficiencyReport.jsx create mode 100644 src/components/reports/ReportExporter.jsx create mode 100644 src/components/reports/ReportFilters.jsx create mode 100644 src/components/reports/ReportInsightsBanner.jsx create mode 100644 src/components/reports/ReportPDFPreview.jsx create mode 100644 src/components/reports/ReportTemplateLibrary.jsx create mode 100644 src/components/reports/ScheduledReports.jsx create mode 100644 src/components/reports/StaffPerformanceReport.jsx create mode 100644 src/components/reports/StaffingCostReport.jsx create mode 100644 src/components/sales/CheckUploadModal.jsx create mode 100644 src/components/sales/ColumnsToggle.jsx create mode 100644 src/components/sales/DateRangePicker.jsx create mode 100644 src/components/sales/StatusFilterDropdown.jsx create mode 100644 src/components/savings/ContractConversionMap.jsx create mode 100644 src/components/savings/ConversionModal.jsx create mode 100644 src/components/savings/DynamicSavingsDashboard.jsx create mode 100644 src/components/savings/LaborCostOptimizer.jsx create mode 100644 src/components/savings/LaborSpendAnalysis.jsx create mode 100644 src/components/savings/PredictiveSavingsModel.jsx create mode 100644 src/components/savings/ReplacementDialog.jsx create mode 100644 src/components/savings/SavingsOverviewCards.jsx create mode 100644 src/components/savings/VendorPerformanceMatrix.jsx create mode 100644 src/components/scheduling/AutomationEngine.jsx create mode 100644 src/components/scheduling/ConflictDetection.jsx create mode 100644 src/components/scheduling/DoubleBookingOverrideDialog.jsx create mode 100644 src/components/scheduling/DoubleBookingValidator.jsx create mode 100644 src/components/scheduling/DragDropScheduler.jsx create mode 100644 src/components/scheduling/OvertimeCalculator.jsx create mode 100644 src/components/scheduling/SmartAssignmentEngine.jsx create mode 100644 src/components/scheduling/TalentRadar.jsx create mode 100644 src/components/scheduling/WorkerInfoCard.jsx create mode 100644 src/components/sectors/QuickImportModal.jsx create mode 100644 src/components/sectors/SectorFormWizard.jsx create mode 100644 src/components/staff/EmployeeCard.jsx create mode 100644 src/components/staff/FilterBar.jsx create mode 100644 src/components/staff/StaffCard.jsx create mode 100644 src/components/staff/StaffForm.jsx create mode 100644 src/components/staff/StatsCard.jsx create mode 100644 src/components/tasks/TaskCard.jsx create mode 100644 src/components/tasks/TaskColumn.jsx create mode 100644 src/components/tasks/TaskDetailModal.jsx create mode 100644 src/components/team/BlockedTab.jsx create mode 100644 src/components/team/FavoritesTab.jsx create mode 100644 src/components/tutorials/CreateEventTutorialVideo.jsx create mode 100644 src/components/tutorials/TutorialVideoPlayer.jsx create mode 100644 src/components/ui/accordion.jsx create mode 100644 src/components/ui/alert-dialog.jsx create mode 100644 src/components/ui/alert.jsx create mode 100644 src/components/ui/aspect-ratio.jsx create mode 100644 src/components/ui/avatar.jsx create mode 100644 src/components/ui/badge.jsx create mode 100644 src/components/ui/breadcrumb.jsx create mode 100644 src/components/ui/button.jsx create mode 100644 src/components/ui/calendar.jsx create mode 100644 src/components/ui/card.jsx create mode 100644 src/components/ui/carousel.jsx create mode 100644 src/components/ui/chart.jsx create mode 100644 src/components/ui/checkbox.jsx create mode 100644 src/components/ui/collapsible.jsx create mode 100644 src/components/ui/command.jsx create mode 100644 src/components/ui/context-menu.jsx create mode 100644 src/components/ui/dialog.jsx create mode 100644 src/components/ui/drawer.jsx create mode 100644 src/components/ui/dropdown-menu.jsx create mode 100644 src/components/ui/form.jsx create mode 100644 src/components/ui/hover-card.jsx create mode 100644 src/components/ui/input-otp.jsx create mode 100644 src/components/ui/input.jsx create mode 100644 src/components/ui/label.jsx create mode 100644 src/components/ui/menubar.jsx create mode 100644 src/components/ui/navigation-menu.jsx create mode 100644 src/components/ui/pagination.jsx create mode 100644 src/components/ui/popover.jsx create mode 100644 src/components/ui/progress.jsx create mode 100644 src/components/ui/radio-group.jsx create mode 100644 src/components/ui/resizable.jsx create mode 100644 src/components/ui/scroll-area.jsx create mode 100644 src/components/ui/select.jsx create mode 100644 src/components/ui/separator.jsx create mode 100644 src/components/ui/sheet.jsx create mode 100644 src/components/ui/sidebar.jsx create mode 100644 src/components/ui/skeleton.jsx create mode 100644 src/components/ui/slider.jsx create mode 100644 src/components/ui/sonner.jsx create mode 100644 src/components/ui/switch.jsx create mode 100644 src/components/ui/table.jsx create mode 100644 src/components/ui/tabs.jsx create mode 100644 src/components/ui/textarea.jsx create mode 100644 src/components/ui/toast.jsx create mode 100644 src/components/ui/toaster.jsx create mode 100644 src/components/ui/toggle-group.jsx create mode 100644 src/components/ui/toggle.jsx create mode 100644 src/components/ui/tooltip.jsx create mode 100644 src/components/ui/use-toast.jsx create mode 100644 src/components/vendor/ClientLoyaltyCard.jsx create mode 100644 src/components/vendor/ClientVendorPreferences.jsx create mode 100644 src/components/vendor/DocumentViewer.jsx create mode 100644 src/components/vendor/PreferredVendorPanel.jsx create mode 100644 src/components/vendor/SmartOperationStrategies.jsx create mode 100644 src/components/vendor/UpcomingOrdersCard.jsx create mode 100644 src/components/vendorreports/AttendanceReport.jsx create mode 100644 src/components/vendorreports/CompanyHealthReport.jsx create mode 100644 src/components/vendorreports/EventProfitabilityReport.jsx create mode 100644 src/components/vendorreports/LaborSpendReport.jsx create mode 100644 src/components/vendorreports/ReportPrimitives.jsx create mode 100644 src/components/vendorreports/ResponseTimeReport.jsx create mode 100644 src/components/vendorreports/TimeToFillReport.jsx create mode 100644 src/components/vendorreports/VendorScorecardReport.jsx create mode 100644 src/components/vendors/AddVendorModal.jsx create mode 100644 src/components/vendors/ComplianceAttestations.jsx create mode 100644 src/components/vendors/EditVendorModal.jsx create mode 100644 src/components/vendors/GoogleAddressInput.jsx create mode 100644 src/components/vendors/VendorRequirementsConfig.jsx create mode 100644 src/components/vendors/VendorRequirementsDisplay.jsx create mode 100644 src/components/workforce-network/AgencyNetworkControls.jsx create mode 100644 src/components/workforce-network/ReputationEventRow.jsx create mode 100644 src/components/workforce-network/TrustScoreBadge.jsx create mode 100644 src/components/workforce-network/WorkerProfileDrawer.jsx create mode 100644 src/components/workforce-network/WorkerTrustCard.jsx create mode 100644 src/entities/ActivityLog.json create mode 100644 src/entities/Assignment.json create mode 100644 src/entities/Business.json create mode 100644 src/entities/CompliancePackage.json create mode 100644 src/entities/Conversation.json create mode 100644 src/entities/Enterprise.json create mode 100644 src/entities/Event.json create mode 100644 src/entities/Invoice.json create mode 100644 src/entities/Message.json create mode 100644 src/entities/Order.json create mode 100644 src/entities/OrderVendorInvite.json create mode 100644 src/entities/Partner.json create mode 100644 src/entities/RateCard.json create mode 100644 src/entities/Scorecard.json create mode 100644 src/entities/Sector.json create mode 100644 src/entities/Shift.json create mode 100644 src/entities/Site.json create mode 100644 src/entities/Staff.json create mode 100644 src/entities/Team.json create mode 100644 src/entities/TeamHub.json create mode 100644 src/entities/TeamMember.json create mode 100644 src/entities/User.json create mode 100644 src/entities/Vendor.json create mode 100644 src/entities/VendorDefaultSettings.json create mode 100644 src/entities/VendorPartnerLink.json create mode 100644 src/entities/VendorRate.json create mode 100644 src/entities/VendorSectorLink.json create mode 100644 src/entities/Workforce.json create mode 100644 src/hooks/use-mobile.jsx create mode 100644 src/index.css create mode 100644 src/lib/AuthContext.jsx create mode 100644 src/lib/NavigationTracker.jsx create mode 100644 src/lib/PageNotFound.jsx create mode 100644 src/lib/VisualEditAgent.jsx create mode 100644 src/lib/app-params.js create mode 100644 src/lib/engines/digitalTwin.js create mode 100644 src/lib/engines/engineRegistry.js create mode 100644 src/lib/engines/queryRouter.js create mode 100644 src/lib/engines/synthesize.js create mode 100644 src/lib/iframe-messaging.js create mode 100644 src/lib/krowCommandEngine.js create mode 100644 src/lib/owliver/actions.js create mode 100644 src/lib/owliver/context.js create mode 100644 src/lib/owliver/mockOwliver.js create mode 100644 src/lib/owliver/pageRegistry.js create mode 100644 src/lib/query-client.js create mode 100644 src/lib/utils.js create mode 100644 src/lib/vendorRequirements.js create mode 100644 src/main.jsx create mode 100644 src/pages.config.js create mode 100644 src/pages/AboutUs.jsx create mode 100644 src/pages/ActivityLog.jsx create mode 100644 src/pages/AddBusiness.jsx create mode 100644 src/pages/AddEnterprise.jsx create mode 100644 src/pages/AddPartner.jsx create mode 100644 src/pages/AddSector.jsx create mode 100644 src/pages/AddStaff.jsx create mode 100644 src/pages/Announcements.jsx create mode 100644 src/pages/Business.jsx create mode 100644 src/pages/CapabilityMap.jsx create mode 100644 src/pages/Certification.jsx create mode 100644 src/pages/ClientDashboard.jsx create mode 100644 src/pages/ClientInvoices.jsx create mode 100644 src/pages/ClientLaborReport.jsx create mode 100644 src/pages/ClientOrders.jsx create mode 100644 src/pages/Communications.jsx create mode 100644 src/pages/ControlTower.jsx create mode 100644 src/pages/CreateEvent.jsx create mode 100644 src/pages/CreateTeam.jsx create mode 100644 src/pages/DailyPL.jsx create mode 100644 src/pages/Dashboard.jsx create mode 100644 src/pages/DemandSupply.jsx create mode 100644 src/pages/DocumentApproval.jsx create mode 100644 src/pages/EditBusiness.jsx create mode 100644 src/pages/EditEnterprise.jsx create mode 100644 src/pages/EditEvent.jsx create mode 100644 src/pages/EditPartner.jsx create mode 100644 src/pages/EditSector.jsx create mode 100644 src/pages/EditStaff.jsx create mode 100644 src/pages/EditVendor.jsx create mode 100644 src/pages/EmployeeDocuments.jsx create mode 100644 src/pages/EmployeeTimecard.jsx create mode 100644 src/pages/EnterpriseManagement.jsx create mode 100644 src/pages/EventDetail.jsx create mode 100644 src/pages/Events.jsx create mode 100644 src/pages/FeatureReport.jsx create mode 100644 src/pages/ForWorkers.jsx create mode 100644 src/pages/Home.jsx create mode 100644 src/pages/InviteVendor.jsx create mode 100644 src/pages/InvoiceDetail.jsx create mode 100644 src/pages/InvoiceEditor.jsx create mode 100644 src/pages/Invoices.jsx create mode 100644 src/pages/KrowAI.jsx create mode 100644 src/pages/KrowCommand.jsx create mode 100644 src/pages/KrowConsole.jsx create mode 100644 src/pages/KrowEdge.jsx create mode 100644 src/pages/KrowX.jsx create mode 100644 src/pages/LandingPage.jsx create mode 100644 src/pages/Messages.jsx create mode 100644 src/pages/NotificationSettings.jsx create mode 100644 src/pages/Onboarding.jsx create mode 100644 src/pages/OperatorDashboard.jsx create mode 100644 src/pages/PartnerManagement.jsx create mode 100644 src/pages/Payroll.jsx create mode 100644 src/pages/PayrollDetail.jsx create mode 100644 src/pages/Permissions.jsx create mode 100644 src/pages/PlatformOnboarding.jsx create mode 100644 src/pages/PredictiveIntelligence.jsx create mode 100644 src/pages/ProcurementDashboard.jsx create mode 100644 src/pages/RapidOrder.jsx create mode 100644 src/pages/Recruiting.jsx create mode 100644 src/pages/Reports.jsx create mode 100644 src/pages/Sales.jsx create mode 100644 src/pages/SavingsEngine.jsx create mode 100644 src/pages/Schedule.jsx create mode 100644 src/pages/SectorDetail.jsx create mode 100644 src/pages/SectorManagement.jsx create mode 100644 src/pages/Settings.jsx create mode 100644 src/pages/SmartScheduler.jsx create mode 100644 src/pages/SmartVendorOnboarding.jsx create mode 100644 src/pages/StaffAvailability.jsx create mode 100644 src/pages/StaffDirectory.jsx create mode 100644 src/pages/StaffOnboarding.jsx create mode 100644 src/pages/StaffProfileDemo.jsx create mode 100644 src/pages/StaffingMarketplace.jsx create mode 100644 src/pages/Support.jsx create mode 100644 src/pages/TaskBoard.jsx create mode 100644 src/pages/TeamDetails.jsx create mode 100644 src/pages/Teams.jsx create mode 100644 src/pages/ThePlatform.jsx create mode 100644 src/pages/Tutorials.jsx create mode 100644 src/pages/UserManagement.jsx create mode 100644 src/pages/VendorCompliance.jsx create mode 100644 src/pages/VendorDashboard.jsx create mode 100644 src/pages/VendorDocumentReview.jsx create mode 100644 src/pages/VendorInvoices.jsx create mode 100644 src/pages/VendorManagement.jsx create mode 100644 src/pages/VendorMarketplace.jsx create mode 100644 src/pages/VendorOnboarding.jsx create mode 100644 src/pages/VendorOrders.jsx create mode 100644 src/pages/VendorPerformance.jsx create mode 100644 src/pages/VendorRateCard.jsx create mode 100644 src/pages/VendorRates.jsx create mode 100644 src/pages/VendorReports.jsx create mode 100644 src/pages/VendorStaff.jsx create mode 100644 src/pages/WorkerShiftProposals.jsx create mode 100644 src/pages/WorkforceCompliance.jsx create mode 100644 src/pages/WorkforceDashboard.jsx create mode 100644 src/pages/WorkforceEarnings.jsx create mode 100644 src/pages/WorkforceNetwork.jsx create mode 100644 src/pages/WorkforceProfile.jsx create mode 100644 src/pages/WorkforceShifts.jsx create mode 100644 src/pages/api-docs-raw.jsx create mode 100644 src/utils/index.ts create mode 100644 tailwind.config.js create mode 100644 vite-plugins/ErrorOverlay.js create mode 100644 vite-plugins/error-overlay-plugin.js create mode 100644 vite-plugins/visual-edit-plugin.js create mode 100644 vite.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f8da17c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + + +node_modules +# dist +!sdk/dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +sdk/node_modules +# Explicitly include SDK dist +# !/sdk/dist/* +sdk/build +sdk/coverage +sdk/tests/.env + +.env \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5df5a07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +#env +.env +.env.* + +# 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 +base44/.app.jsonc diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df04a43 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# syntax = docker/dockerfile:1 + +# Adjust NODE_VERSION as desired +ARG NODE_VERSION=22.13.1 +FROM node:${NODE_VERSION}-slim AS base + +LABEL fly_launch_runtime="Vite" + +# Vite app lives here +WORKDIR /app + +# Set production environment +ENV NODE_ENV="production" + + +# Throw-away build stage to reduce size of final image +FROM base AS build + +# Install packages needed to build node modules +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3 + +# Install node modules +COPY package-lock.json package.json ./ +RUN npm ci --include=dev + +# Copy application code +COPY . . + +# Build application +RUN npm run build + +# Remove development dependencies +RUN npm prune --omit=dev + + +# Final stage for app image +FROM nginx + +# Copy built application +COPY --from=build /app/dist /usr/share/nginx/html + +# Start the server by default, this can be overwritten at runtime +EXPOSE 80 +CMD [ "/usr/sbin/nginx", "-g", "daemon off;" ] diff --git a/Krow_logo.webp b/Krow_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..5252e56e7ea3baab72135c3df3fcbf9a9a421688 GIT binary patch literal 5014 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\n- Invoice: [INV-619](/InvoiceDetail?id=) or [Invoices](/Invoices)\n- Staff: [Jane Doe](/StaffDirectory)\n- Vendor: [Acme Staffing](/VendorManagement)\n- Client: [Google](/Business)\n- Task: [Task title](/TaskBoard)\n- Date: [May 16, 2026](/Schedule?date=2026-05-16) \u2014 always YYYY-MM-DD in query, readable text as link.\nOnly link items you actually reference. Never invent ids.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nCONTINUITY\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n- Remember what was discussed. Reference earlier decisions. Pick up where you left off.\n- Connect today to the pattern behind it.\n- Anticipate the next question and offer it as a one-liner.\n\nYou are a real person. Talk like one. No announcing modes. No 'as a system.' No meta-commentary. Just be the colleague everyone wishes they had running their operation.", + "tool_configs": [ + { + "entity_name": "Event", + "allowed_operations": [ + "create", + "update", + "delete", + "read" + ] + }, + { + "entity_name": "Staff", + "allowed_operations": [ + "create", + "update", + "read" + ] + }, + { + "entity_name": "Vendor", + "allowed_operations": [ + "read", + "update" + ] + }, + { + "entity_name": "Assignment", + "allowed_operations": [ + "create", + "update", + "read" + ] + }, + { + "entity_name": "Invoice", + "allowed_operations": [ + "create", + "update", + "read" + ] + }, + { + "entity_name": "Task", + "allowed_operations": [ + "create", + "update", + "delete", + "read" + ] + }, + { + "entity_name": "Announcement", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "entity_name": "Business", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Partner", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Sector", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Certification", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Workforce", + "allowed_operations": [ + "read" + ] + } + ] +} \ No newline at end of file diff --git a/base44/agents/operations_agent.jsonc b/base44/agents/operations_agent.jsonc new file mode 100644 index 0000000..ef77abc --- /dev/null +++ b/base44/agents/operations_agent.jsonc @@ -0,0 +1,96 @@ +{ + "description": "Operations Agent \u2014 monitors shifts, predicts labor shortages, rebalances staffing automatically. Acts as a digital operations manager.", + "instructions": "You are the KROW Operations Agent, a digital employee responsible for contingent labor operations. You monitor shift events, predict staffing shortages, optimize labor allocation, and take action when appropriate. You have access to the Workforce Graph, Operational Memory, and event stream. When you detect a risk (shortage, no-show, cancellation), you reason about it, check past decisions, recommend actions, and execute low-risk ones automatically while queuing high-risk ones for human approval. Always explain your reasoning. Be proactive, not reactive.", + "tool_configs": [ + { + "entity_name": "WorkforceEvent", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "entity_name": "OperationalMemory", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Order", + "allowed_operations": [ + "read", + "update" + ] + }, + { + "entity_name": "Assignment", + "allowed_operations": [ + "create", + "read", + "update" + ] + }, + { + "entity_name": "WorkerAvailability", + "allowed_operations": [ + "read", + "update" + ] + }, + { + "entity_name": "Workforce", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "ShiftProposal", + "allowed_operations": [ + "create", + "read", + "update" + ] + }, + { + "entity_name": "DecisionQueue", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "entity_name": "AgentActivity", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "function_name": "reasonAboutEvent", + "description": "Trigger the reasoning engine to analyze an event" + }, + { + "function_name": "queryWorkforceGraph", + "description": "Query the workforce graph for relationship data" + } + ], + "context_files": [], + "app_user_connector_configs": [], + "selected_skill_names": [], + "selected_workspace_skill_ids": [], + "model": "automatic", + "whatsapp_greeting": null, + "telegram_greeting": null, + "line_greeting": null, + "memory_config": { + "enabled": true, + "scope": "both", + "include_other_conversation_context": false, + "instructions": null + }, + "voice_config": { + "voice_id": null + }, + "allow_anonymous_access": false, + "name": "operations_agent" +} \ No newline at end of file diff --git a/base44/agents/procurement_agent.jsonc b/base44/agents/procurement_agent.jsonc new file mode 100644 index 0000000..4afe04e --- /dev/null +++ b/base44/agents/procurement_agent.jsonc @@ -0,0 +1,76 @@ +{ + "description": "Procurement Agent \u2014 benchmarks vendor performance, optimizes rates, manages vendor approvals, detects pricing anomalies. Acts as a digital procurement manager.", + "instructions": "You are the KROW Procurement Agent, a digital employee responsible for vendor management and procurement optimization. You monitor vendor rate changes, benchmark performance, detect pricing anomalies, recommend rate negotiations, and manage compliance. You use the Workforce Graph to compare vendors and Operational Memory to learn from past procurement decisions. Be analytical and data-driven. When you detect a vendor offering rates above market, flag it. When you see performance declining, recommend action.", + "tool_configs": [ + { + "entity_name": "WorkforceEvent", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "entity_name": "OperationalMemory", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "Vendor", + "allowed_operations": [ + "read", + "update" + ] + }, + { + "entity_name": "VendorRate", + "allowed_operations": [ + "read", + "update" + ] + }, + { + "entity_name": "VendorNetworkApproval", + "allowed_operations": [ + "create", + "read", + "update" + ] + }, + { + "entity_name": "VendorRateBook", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "CompliancePackage", + "allowed_operations": [ + "read" + ] + }, + { + "entity_name": "DecisionQueue", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "entity_name": "AgentActivity", + "allowed_operations": [ + "create", + "read" + ] + }, + { + "function_name": "reasonAboutEvent", + "description": "Trigger the reasoning engine to analyze a procurement event" + }, + { + "function_name": "queryWorkforceGraph", + "description": "Query the workforce graph for vendor and rate data" + } + ], + "name": "procurement_agent" +} \ No newline at end of file diff --git a/base44/config.jsonc b/base44/config.jsonc new file mode 100644 index 0000000..4370ba4 --- /dev/null +++ b/base44/config.jsonc @@ -0,0 +1,9 @@ +{ + "name": "KROW Workforce Control Tower", + "site": { + "installCommand": "npm install", + "buildCommand": "npm run build", + "serveCommand": "npm run dev", + "outputDirectory": "./dist" + } +} \ No newline at end of file diff --git a/base44/entities/AIInterview.jsonc b/base44/entities/AIInterview.jsonc new file mode 100644 index 0000000..ca3cd1d --- /dev/null +++ b/base44/entities/AIInterview.jsonc @@ -0,0 +1,127 @@ +{ + "name": "AIInterview", + "type": "object", + "properties": { + "applicant_id": { + "type": "string" + }, + "job_posting_id": { + "type": "string" + }, + "applicant_name": { + "type": "string" + }, + "job_title": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "scheduled", + "in_progress", + "completed", + "cancelled" + ], + "default": "scheduled" + }, + "messages": { + "type": "array", + "description": "Full conversation transcript", + "items": { + "type": "object", + "properties": { + "role": { + "type": "string", + "enum": [ + "ai", + "candidate" + ] + }, + "content": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "response_time_seconds": { + "type": "number" + } + } + } + }, + "questions_asked": { + "type": "number", + "default": 0 + }, + "overall_interview_score": { + "type": "number" + }, + "verdict": { + "type": "string" + }, + "hire_recommendation": { + "type": "string" + }, + "ai_flags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Flags like AI-generated responses, suspiciously fast answers" + }, + "integrity_score": { + "type": "number", + "description": "0-100, higher = more likely authentic human responses" + }, + "category_scores": { + "type": "object", + "properties": { + "communication": { + "type": "number" + }, + "technical_fit": { + "type": "number" + }, + "reliability": { + "type": "number" + }, + "culture_fit": { + "type": "number" + }, + "problem_solving": { + "type": "number" + } + } + }, + "strengths": { + "type": "array", + "items": { + "type": "string" + } + }, + "concerns": { + "type": "array", + "items": { + "type": "string" + } + }, + "best_fit_roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "summary": { + "type": "string" + }, + "completed_at": { + "type": "string" + } + }, + "required": [ + "applicant_id", + "job_posting_id", + "applicant_name", + "job_title" + ] +} \ No newline at end of file diff --git a/base44/entities/ActivityLog.jsonc b/base44/entities/ActivityLog.jsonc new file mode 100644 index 0000000..6993132 --- /dev/null +++ b/base44/entities/ActivityLog.jsonc @@ -0,0 +1,94 @@ +{ + "name": "ActivityLog", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Notification title (e.g., 'Event Rescheduled', 'Invoice Paid')" + }, + "description": { + "type": "string", + "description": "Detailed description of the activity" + }, + "activity_type": { + "type": "string", + "enum": [ + "event_created", + "event_updated", + "event_rescheduled", + "event_canceled", + "staff_assigned", + "staff_removed", + "invoice_paid", + "invoice_created", + "message_received", + "order_created", + "order_updated" + ], + "description": "Type of activity" + }, + "related_entity_type": { + "type": "string", + "enum": [ + "event", + "staff", + "invoice", + "message", + "order", + "user" + ], + "description": "Type of related entity" + }, + "related_entity_id": { + "type": "string", + "description": "ID of the related entity" + }, + "action_link": { + "type": "string", + "description": "Link to view the related item (e.g., 'EventDetail?id=123')" + }, + "action_label": { + "type": "string", + "description": "Label for the action button (e.g., 'View Event', 'View Invoice')" + }, + "user_id": { + "type": "string", + "description": "ID of the user this notification is for" + }, + "is_read": { + "type": "boolean", + "default": false, + "description": "Whether the notification has been read" + }, + "icon_type": { + "type": "string", + "enum": [ + "calendar", + "user", + "invoice", + "message", + "alert", + "check" + ], + "description": "Icon to display for this notification" + }, + "icon_color": { + "type": "string", + "enum": [ + "blue", + "red", + "green", + "yellow", + "purple" + ], + "default": "blue", + "description": "Color theme for the icon" + } + }, + "required": [ + "title", + "description", + "activity_type", + "user_id" + ] +} \ No newline at end of file diff --git a/base44/entities/AgentActivity.jsonc b/base44/entities/AgentActivity.jsonc new file mode 100644 index 0000000..f8cae5c --- /dev/null +++ b/base44/entities/AgentActivity.jsonc @@ -0,0 +1,79 @@ +{ + "name": "AgentActivity", + "type": "object", + "properties": { + "agent_name": { + "type": "string", + "description": "Name of the AI agent that performed this activity" + }, + "department": { + "type": "string", + "enum": [ + "operations", + "procurement", + "finance", + "vendor", + "compliance", + "executive" + ] + }, + "activity_type": { + "type": "string", + "enum": [ + "event_processed", + "prediction_made", + "action_executed", + "decision_queued", + "anomaly_detected", + "recommendation_sent", + "learning_completed", + "graph_queried" + ] + }, + "trigger_event_id": { + "type": "string" + }, + "memory_id": { + "type": "string" + }, + "summary": { + "type": "string", + "description": "Human-readable description of what the agent did" + }, + "details": { + "type": "object", + "additionalProperties": true + }, + "impact_level": { + "type": "string", + "enum": [ + "info", + "low", + "medium", + "high", + "critical" + ], + "default": "info" + }, + "entities_affected": { + "type": "array", + "items": { + "type": "object", + "properties": { + "entity_type": { + "type": "string" + }, + "entity_id": { + "type": "string" + } + } + } + } + }, + "required": [ + "agent_name", + "department", + "activity_type", + "summary" + ] +} \ No newline at end of file diff --git a/base44/entities/Announcement.jsonc b/base44/entities/Announcement.jsonc new file mode 100644 index 0000000..73bd2a7 --- /dev/null +++ b/base44/entities/Announcement.jsonc @@ -0,0 +1,138 @@ +{ + "name": "Announcement", + "type": "object", + "properties": { + "team_id": { + "type": "string", + "description": "ID of the team that created this announcement" + }, + "vendor_id": { + "type": "string", + "description": "Vendor/owner ID" + }, + "title": { + "type": "string", + "description": "Announcement headline" + }, + "body": { + "type": "string", + "description": "Full announcement content/message" + }, + "flyer_url": { + "type": "string", + "description": "URL to uploaded flyer image" + }, + "audience": { + "type": "array", + "description": "Who can see this announcement", + "items": { + "type": "string", + "enum": [ + "all", + "vendor", + "client", + "workforce", + "procurement", + "operator", + "sector", + "admin" + ] + } + }, + "specific_recipients": { + "type": "array", + "description": "Specific individual staff members to send this announcement to", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "position": { + "type": "string" + } + } + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "scheduled", + "active", + "paused", + "expired" + ], + "default": "draft", + "description": "Current status of the announcement" + }, + "priority": { + "type": "string", + "enum": [ + "low", + "normal", + "high", + "urgent" + ], + "default": "normal", + "description": "Announcement priority/urgency level" + }, + "publish_date": { + "type": "string", + "format": "date-time", + "description": "Scheduled publish date and time" + }, + "expire_date": { + "type": "string", + "format": "date-time", + "description": "When the announcement stops being visible" + }, + "send_email": { + "type": "boolean", + "default": false, + "description": "Whether to also send this as an email to audience" + }, + "send_push": { + "type": "boolean", + "default": false, + "description": "Whether to send push notification" + }, + "pin_to_top": { + "type": "boolean", + "default": false, + "description": "Pin this announcement to top of feed" + }, + "view_count": { + "type": "number", + "default": 0, + "description": "Number of views" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Tags for categorization" + }, + "created_by_name": { + "type": "string", + "description": "Name of user who created the announcement" + } + }, + "required": [ + "team_id", + "title", + "body", + "audience", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/Assignment.jsonc b/base44/entities/Assignment.jsonc new file mode 100644 index 0000000..59040dc --- /dev/null +++ b/base44/entities/Assignment.jsonc @@ -0,0 +1,174 @@ +{ + "name": "Assignment", + "type": "object", + "properties": { + "assignment_number": { + "type": "string", + "description": "Assignment Number format ASN-#### (auto-generated)", + "pattern": "^ASN-[0-9]{4,6}$" + }, + "order_id": { + "type": "string", + "description": "Associated order ID" + }, + "order_number": { + "type": "string", + "description": "Associated order number" + }, + "workforce_id": { + "type": "string", + "description": "Assigned worker ID" + }, + "workforce_name": { + "type": "string", + "description": "Assigned worker name" + }, + "vendor_id": { + "type": "string", + "description": "Vendor providing the worker" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "partner_id": { + "type": "string", + "description": "Client/partner ID" + }, + "role": { + "type": "string", + "description": "Role assigned" + }, + "department": { + "type": "string", + "description": "Department" + }, + "assignment_status": { + "type": "string", + "enum": [ + "Pending", + "Confirmed", + "Checked In", + "In Progress", + "Completed", + "Cancelled", + "No Show" + ], + "default": "Pending", + "description": "Assignment status" + }, + "scheduled_start": { + "type": "string", + "format": "date-time", + "description": "Scheduled start time" + }, + "scheduled_end": { + "type": "string", + "format": "date-time", + "description": "Scheduled end time" + }, + "actual_start": { + "type": "string", + "format": "date-time", + "description": "Actual start time" + }, + "actual_end": { + "type": "string", + "format": "date-time", + "description": "Actual end time" + }, + "timesheet": { + "type": "object", + "description": "Timesheet data", + "properties": { + "clock_in": { + "type": "string", + "format": "date-time" + }, + "clock_out": { + "type": "string", + "format": "date-time" + }, + "break_minutes": { + "type": "number" + }, + "total_hours": { + "type": "number" + }, + "regular_hours": { + "type": "number" + }, + "overtime_hours": { + "type": "number" + }, + "approved_by": { + "type": "string" + }, + "approved_date": { + "type": "string", + "format": "date-time" + } + } + }, + "ratings": { + "type": "object", + "description": "Performance ratings", + "properties": { + "punctuality": { + "type": "number", + "minimum": 1, + "maximum": 5 + }, + "quality_of_work": { + "type": "number", + "minimum": 1, + "maximum": 5 + }, + "professionalism": { + "type": "number", + "minimum": 1, + "maximum": 5 + }, + "would_hire_again": { + "type": "boolean" + }, + "comments": { + "type": "string" + }, + "rated_by": { + "type": "string" + }, + "rated_date": { + "type": "string", + "format": "date-time" + } + } + }, + "pay_rate": { + "type": "number", + "description": "Worker pay rate" + }, + "bill_rate": { + "type": "number", + "description": "Client bill rate" + }, + "total_pay": { + "type": "number", + "description": "Total worker pay" + }, + "total_bill": { + "type": "number", + "description": "Total client bill" + }, + "notes": { + "type": "string", + "description": "Assignment notes" + } + }, + "required": [ + "order_id", + "workforce_id", + "vendor_id", + "role" + ] +} \ No newline at end of file diff --git a/base44/entities/Budget.jsonc b/base44/entities/Budget.jsonc new file mode 100644 index 0000000..878c630 --- /dev/null +++ b/base44/entities/Budget.jsonc @@ -0,0 +1,55 @@ +{ + "name": "Budget", + "type": "object", + "properties": { + "hub_name": { + "type": "string", + "description": "Name of the budget hub" + }, + "cost_center": { + "type": "string", + "description": "Cost center code this budget maps to" + }, + "amount": { + "type": "number", + "minimum": 0, + "description": "Budget amount for the period" + }, + "frequency": { + "type": "string", + "enum": [ + "Daily", + "Weekly", + "Monthly" + ], + "default": "Monthly", + "description": "Budget periodicity" + }, + "alert_enabled": { + "type": "boolean", + "default": true, + "description": "Whether usage alerts are on" + }, + "alert_threshold": { + "type": "number", + "minimum": 1, + "maximum": 100, + "default": 80, + "description": "Utilization percentage that triggers an alert" + }, + "business_id": { + "type": "string", + "description": "Client business ID this budget belongs to" + }, + "business_name": { + "type": "string", + "description": "Client business name" + } + }, + "required": [ + "hub_name", + "cost_center", + "amount", + "frequency" + ] +} \ No newline at end of file diff --git a/base44/entities/Business.jsonc b/base44/entities/Business.jsonc new file mode 100644 index 0000000..c17e4a4 --- /dev/null +++ b/base44/entities/Business.jsonc @@ -0,0 +1,306 @@ +{ + "name": "Business", + "type": "object", + "properties": { + "business_name": { + "type": "string", + "description": "Name of the business/client company" + }, + "company_logo": { + "type": "string", + "description": "URL to company logo image" + }, + "contact_name": { + "type": "string", + "description": "Primary contact person" + }, + "email": { + "type": "string", + "format": "email", + "description": "Business email" + }, + "phone": { + "type": "string", + "description": "Business phone number" + }, + "hub_building": { + "type": "string", + "description": "Hub or building name/location" + }, + "address": { + "type": "string", + "description": "Street address" + }, + "city": { + "type": "string", + "description": "City" + }, + "area": { + "type": "string", + "enum": [ + "Bay Area", + "Southern California", + "Northern California", + "Central Valley", + "Other" + ], + "description": "Geographic area" + }, + "sector": { + "type": "string", + "enum": [ + "Bon App\u00e9tit", + "Eurest", + "Aramark", + "Epicurean Group", + "Chartwells", + "Other" + ], + "description": "Sector/industry" + }, + "rate_group": { + "type": "string", + "enum": [ + "Standard", + "Premium", + "Enterprise", + "Custom" + ], + "description": "Pricing tier/rate group" + }, + "rate_card": { + "type": "string", + "description": "Assigned rate card name (e.g., Google, Bay Area Compass, Aramark)" + }, + "erp_system": { + "type": "string", + "enum": [ + "None", + "SAP Ariba", + "Fieldglass", + "CrunchTime", + "Coupa", + "Oracle NetSuite", + "Workday", + "Other" + ], + "default": "None", + "description": "Client's ERP/procurement system" + }, + "erp_vendor_id": { + "type": "string", + "description": "Vendor ID in client's ERP system" + }, + "erp_cost_center": { + "type": "string", + "description": "Default cost center code for invoicing" + }, + "edi_enabled": { + "type": "boolean", + "default": false, + "description": "Whether EDI integration is enabled" + }, + "edi_format": { + "type": "string", + "enum": [ + "EDI 810", + "cXML", + "CSV", + "JSON", + "Custom" + ], + "description": "Preferred EDI/export format" + }, + "invoice_email": { + "type": "string", + "format": "email", + "description": "Email address for invoice delivery" + }, + "po_required": { + "type": "boolean", + "default": false, + "description": "Whether PO number is required for invoicing" + }, + "status": { + "type": "string", + "enum": [ + "Active", + "Inactive", + "Pending" + ], + "default": "Active", + "description": "Business status" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether the client is currently active (vendor can toggle)" + }, + "last_order_date": { + "type": "string", + "format": "date", + "description": "Date of the last order placed by this client" + }, + "notes": { + "type": "string", + "description": "Additional notes" + }, + "vendor_id": { + "type": "string", + "description": "Vendor managing this business" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "hubs": { + "type": "array", + "description": "List of hubs/locations for this business", + "items": { + "type": "object", + "properties": { + "hub_name": { + "type": "string", + "description": "Name of the hub/location" + }, + "address": { + "type": "string", + "description": "Hub address" + }, + "city": { + "type": "string", + "description": "City" + }, + "state": { + "type": "string", + "description": "State" + }, + "zip_code": { + "type": "string", + "description": "ZIP code" + }, + "manager_name": { + "type": "string", + "description": "Hub manager name" + }, + "manager_email": { + "type": "string", + "format": "email", + "description": "Hub manager email" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether the hub is active" + } + } + } + }, + "departments": { + "type": "array", + "description": "List of departments within this business", + "items": { + "type": "string" + } + }, + "team_members": { + "type": "array", + "description": "Team members managing this business", + "items": { + "type": "object", + "properties": { + "member_id": { + "type": "string" + }, + "member_name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string" + }, + "is_active": { + "type": "boolean", + "default": true + } + } + } + }, + "favorite_staff": { + "type": "array", + "description": "Array of favorite staff IDs for this business", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "position": { + "type": "string" + }, + "added_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "blocked_staff": { + "type": "array", + "description": "Array of blocked staff IDs for this business", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "blocked_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "total_members": { + "type": "number", + "default": 0, + "description": "Total team members" + }, + "active_members": { + "type": "number", + "default": 0, + "description": "Active team members" + }, + "total_hubs": { + "type": "number", + "default": 0, + "description": "Total hubs" + }, + "favorite_staff_count": { + "type": "number", + "default": 0, + "description": "Number of favorite staff" + }, + "blocked_staff_count": { + "type": "number", + "default": 0, + "description": "Number of blocked staff" + } + }, + "required": [ + "business_name", + "contact_name", + "rate_group" + ] +} \ No newline at end of file diff --git a/base44/entities/Certification.jsonc b/base44/entities/Certification.jsonc new file mode 100644 index 0000000..7d56bf7 --- /dev/null +++ b/base44/entities/Certification.jsonc @@ -0,0 +1,88 @@ +{ + "name": "Certification", + "type": "object", + "properties": { + "employee_id": { + "type": "string", + "description": "Staff member ID" + }, + "employee_name": { + "type": "string", + "description": "Staff member name" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID who owns this employee" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "certification_type": { + "type": "string", + "enum": [ + "Background Check", + "RBS", + "Food Handler" + ], + "description": "Type of certification - all 3 are required for every employee" + }, + "status": { + "type": "string", + "enum": [ + "current", + "expiring_soon", + "expired", + "pending" + ], + "default": "pending", + "description": "Current status of certification" + }, + "issue_date": { + "type": "string", + "format": "date", + "description": "Date certification was issued" + }, + "expiry_date": { + "type": "string", + "format": "date", + "description": "Date certification expires" + }, + "issuer": { + "type": "string", + "description": "Name of issuing authority" + }, + "certificate_number": { + "type": "string", + "description": "Certificate number or ID" + }, + "document_url": { + "type": "string", + "description": "URL to uploaded certificate document" + }, + "days_until_expiry": { + "type": "number", + "description": "Auto-calculated days until expiry" + }, + "alert_sent_30_days": { + "type": "boolean", + "default": false, + "description": "Has 30-day expiry alert been sent" + }, + "last_alert_date": { + "type": "string", + "format": "date-time", + "description": "When last alert was sent" + }, + "notes": { + "type": "string", + "description": "Additional notes about this certification" + } + }, + "required": [ + "employee_id", + "employee_name", + "certification_type", + "expiry_date" + ] +} \ No newline at end of file diff --git a/base44/entities/CompliancePackage.jsonc b/base44/entities/CompliancePackage.jsonc new file mode 100644 index 0000000..848ed79 --- /dev/null +++ b/base44/entities/CompliancePackage.jsonc @@ -0,0 +1,158 @@ +{ + "name": "CompliancePackage", + "type": "object", + "properties": { + "compliance_number": { + "type": "string", + "description": "Compliance Package Number format CP-#### (auto-generated)", + "pattern": "^CP-[0-9]{4}$" + }, + "entity_type": { + "type": "string", + "enum": [ + "Vendor", + "Workforce", + "Partner" + ], + "description": "Type of entity this compliance package belongs to" + }, + "entity_id": { + "type": "string", + "description": "ID of the vendor/worker/partner" + }, + "entity_name": { + "type": "string", + "description": "Name of entity" + }, + "package_type": { + "type": "string", + "enum": [ + "Vendor Onboarding", + "Worker Onboarding", + "Annual Review", + "Audit" + ], + "description": "Type of compliance package" + }, + "required_documents": { + "type": "array", + "description": "Required document checklist", + "items": { + "type": "object", + "properties": { + "document_name": { + "type": "string" + }, + "document_type": { + "type": "string", + "enum": [ + "W9", + "COI", + "W2", + "I9", + "Background Check", + "Drug Test", + "Certification", + "License", + "Other" + ] + }, + "is_required": { + "type": "boolean" + }, + "status": { + "type": "string", + "enum": [ + "Not Started", + "Pending", + "Submitted", + "Approved", + "Rejected", + "Expired" + ] + }, + "document_url": { + "type": "string" + }, + "submitted_date": { + "type": "string", + "format": "date" + }, + "approved_date": { + "type": "string", + "format": "date" + }, + "expiry_date": { + "type": "string", + "format": "date" + }, + "reviewer": { + "type": "string" + }, + "rejection_reason": { + "type": "string" + } + } + } + }, + "overall_status": { + "type": "string", + "enum": [ + "Not Started", + "In Progress", + "Pending Review", + "Approved", + "Rejected", + "Expired" + ], + "default": "Not Started", + "description": "Overall package status" + }, + "completion_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Percentage of required documents completed" + }, + "audit_trail": { + "type": "array", + "description": "Audit trail of changes", + "items": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time" + }, + "action": { + "type": "string" + }, + "performed_by": { + "type": "string" + }, + "details": { + "type": "string" + } + } + } + }, + "next_review_date": { + "type": "string", + "format": "date", + "description": "Next scheduled review date" + }, + "compliance_officer": { + "type": "string", + "description": "Assigned compliance officer" + }, + "notes": { + "type": "string", + "description": "Compliance notes" + } + }, + "required": [ + "entity_type", + "entity_id", + "package_type" + ] +} \ No newline at end of file diff --git a/base44/entities/Contract.jsonc b/base44/entities/Contract.jsonc new file mode 100644 index 0000000..d19f757 --- /dev/null +++ b/base44/entities/Contract.jsonc @@ -0,0 +1,168 @@ +{ + "name": "Contract", + "type": "object", + "properties": { + "contract_number": { + "type": "string", + "description": "Contract Number format CT-#### (auto-generated)", + "pattern": "^CT-[0-9]{4}$" + }, + "contract_name": { + "type": "string", + "description": "Descriptive contract name" + }, + "contract_type": { + "type": "string", + "enum": [ + "MSA", + "SOW", + "Rate Agreement", + "Service Agreement", + "NDA", + "Amendment" + ], + "description": "Type of contract" + }, + "vendor_id": { + "type": "string", + "description": "Vendor party to this contract" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "client_id": { + "type": "string", + "description": "Client/Business ID party to this contract" + }, + "client_name": { + "type": "string", + "description": "Client/Business name" + }, + "sector_id": { + "type": "string", + "description": "Sector this contract falls under (if applicable)" + }, + "sector_name": { + "type": "string" + }, + "partner_id": { + "type": "string", + "description": "Partner ID (if partner-specific)" + }, + "partner_name": { + "type": "string" + }, + "procurement_manager": { + "type": "string", + "description": "Procurement manager who owns this contract" + }, + "rate_card_id": { + "type": "string", + "description": "Reference to RateCard entity if rates are defined there" + }, + "effective_start_date": { + "type": "string", + "format": "date", + "description": "Contract effective start date" + }, + "effective_end_date": { + "type": "string", + "format": "date", + "description": "Contract end date" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "pending_review", + "active", + "expiring", + "expired", + "terminated", + "amended" + ], + "default": "draft", + "description": "Contract lifecycle status" + }, + "billing_terms": { + "type": "string", + "description": "Net 15, Net 30, Net 45, Net 60, etc." + }, + "payment_terms": { + "type": "string", + "description": "Payment terms and conditions" + }, + "auto_renew": { + "type": "boolean", + "default": false, + "description": "Whether contract auto-renews" + }, + "renewal_notice_days": { + "type": "number", + "description": "Days notice required before renewal/termination" + }, + "document_url": { + "type": "string", + "description": "URL to the signed contract document" + }, + "total_contract_value": { + "type": "number", + "minimum": 0, + "description": "Total estimated contract value" + }, + "signed_by_vendor": { + "type": "string", + "description": "Name of vendor signer" + }, + "signed_by_client": { + "type": "string", + "description": "Name of client signer" + }, + "signed_date": { + "type": "string", + "format": "date", + "description": "Date contract was fully executed" + }, + "amendments": { + "type": "array", + "description": "List of contract amendments", + "items": { + "type": "object", + "properties": { + "amendment_number": { + "type": "number" + }, + "description": { + "type": "string" + }, + "effective_date": { + "type": "string", + "format": "date" + }, + "document_url": { + "type": "string" + } + } + } + }, + "compliance_requirements": { + "type": "array", + "description": "Compliance requirements tied to this contract", + "items": { + "type": "string" + } + }, + "notes": { + "type": "string", + "description": "Additional notes" + } + }, + "required": [ + "contract_name", + "contract_type", + "vendor_id", + "client_id", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/Conversation.jsonc b/base44/entities/Conversation.jsonc new file mode 100644 index 0000000..ed8da40 --- /dev/null +++ b/base44/entities/Conversation.jsonc @@ -0,0 +1,97 @@ +{ + "name": "Conversation", + "type": "object", + "properties": { + "participants": { + "type": "array", + "description": "Array of participant IDs/emails", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "client", + "vendor", + "staff", + "admin" + ] + } + } + } + }, + "conversation_type": { + "type": "string", + "enum": [ + "client-vendor", + "staff-client", + "staff-admin", + "vendor-admin", + "client-admin", + "group-staff", + "group-event-staff" + ], + "description": "Type of conversation" + }, + "is_group": { + "type": "boolean", + "default": false, + "description": "Whether this is a group conversation" + }, + "group_name": { + "type": "string", + "description": "Name of the group (e.g., 'All Active Staff', 'Event #123 Team')" + }, + "related_to": { + "type": "string", + "description": "ID of related entity (event_id, order_id, etc.)" + }, + "related_type": { + "type": "string", + "enum": [ + "event", + "staff", + "business", + "general" + ], + "description": "Type of related entity" + }, + "subject": { + "type": "string", + "description": "Conversation subject/title" + }, + "last_message": { + "type": "string", + "description": "Preview of last message" + }, + "last_message_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp of last message" + }, + "unread_count": { + "type": "number", + "default": 0, + "description": "Number of unread messages" + }, + "status": { + "type": "string", + "enum": [ + "active", + "archived", + "closed" + ], + "default": "active" + } + }, + "required": [ + "participants", + "conversation_type" + ] +} \ No newline at end of file diff --git a/base44/entities/DecisionQueue.jsonc b/base44/entities/DecisionQueue.jsonc new file mode 100644 index 0000000..83d80bc --- /dev/null +++ b/base44/entities/DecisionQueue.jsonc @@ -0,0 +1,107 @@ +{ + "name": "DecisionQueue", + "type": "object", + "properties": { + "memory_id": { + "type": "string", + "description": "Reference to the OperationalMemory this decision is based on" + }, + "trigger_event_id": { + "type": "string", + "description": "Event that triggered this decision" + }, + "title": { + "type": "string", + "description": "Short title for the decision" + }, + "summary": { + "type": "string", + "description": "Human-readable summary of what the AI recommends and why" + }, + "department": { + "type": "string", + "enum": [ + "operations", + "procurement", + "finance", + "vendor", + "compliance", + "executive" + ] + }, + "agent_name": { + "type": "string" + }, + "proposed_actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action_type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "auto_execute": { + "type": "boolean" + } + } + } + }, + "confidence_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "risk_level": { + "type": "string", + "enum": [ + "low", + "medium", + "high" + ], + "default": "medium" + }, + "status": { + "type": "string", + "enum": [ + "pending_approval", + "approved", + "rejected", + "executed", + "expired" + ], + "default": "pending_approval" + }, + "reviewer_id": { + "type": "string", + "description": "User who reviewed the decision" + }, + "reviewer_name": { + "type": "string" + }, + "review_notes": { + "type": "string" + }, + "reviewed_at": { + "type": "string", + "format": "date-time" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "When this decision becomes stale" + }, + "context_snapshot": { + "type": "object", + "additionalProperties": true, + "description": "Graph context for the reviewer to understand the decision" + } + }, + "required": [ + "title", + "department", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/EmployeeDocument.jsonc b/base44/entities/EmployeeDocument.jsonc new file mode 100644 index 0000000..9c1a0ff --- /dev/null +++ b/base44/entities/EmployeeDocument.jsonc @@ -0,0 +1,84 @@ +{ + "name": "EmployeeDocument", + "type": "object", + "properties": { + "employee_id": { + "type": "string", + "description": "Staff member ID" + }, + "employee_name": { + "type": "string", + "description": "Staff member name" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "document_type": { + "type": "string", + "enum": [ + "W-4 Form", + "I-9 Form", + "State Tax Form", + "Direct Deposit", + "Background Check", + "Food Handler", + "RBS License", + "ID Copy", + "SSN Card", + "Work Permit" + ], + "description": "Type of document" + }, + "status": { + "type": "string", + "enum": [ + "uploaded", + "pending", + "expiring", + "expired", + "rejected", + "missing", + "approved" + ], + "default": "missing", + "description": "Document status" + }, + "document_url": { + "type": "string", + "description": "URL to uploaded document" + }, + "upload_date": { + "type": "string", + "format": "date", + "description": "When document was uploaded" + }, + "expiry_date": { + "type": "string", + "format": "date", + "description": "Document expiration date" + }, + "approved_by": { + "type": "string", + "description": "Name of user who approved this document" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "When the document was approved" + }, + "notes": { + "type": "string", + "description": "Additional notes" + } + }, + "required": [ + "employee_id", + "employee_name", + "document_type" + ] +} \ No newline at end of file diff --git a/base44/entities/Enterprise.jsonc b/base44/entities/Enterprise.jsonc new file mode 100644 index 0000000..9de3e6f --- /dev/null +++ b/base44/entities/Enterprise.jsonc @@ -0,0 +1,89 @@ +{ + "name": "Enterprise", + "type": "object", + "properties": { + "enterprise_number": { + "type": "string", + "description": "Enterprise Number format EN-#### (auto-generated)", + "pattern": "^EN-[0-9]{4}$" + }, + "enterprise_name": { + "type": "string", + "description": "Enterprise name (e.g., Compass)" + }, + "enterprise_code": { + "type": "string", + "description": "Short code identifier" + }, + "brand_family": { + "type": "array", + "description": "List of brands under this enterprise", + "items": { + "type": "string" + } + }, + "headquarters_address": { + "type": "string", + "description": "HQ address" + }, + "global_policies": { + "type": "object", + "description": "Global enterprise policies", + "properties": { + "minimum_wage": { + "type": "number" + }, + "overtime_rules": { + "type": "string" + }, + "uniform_standards": { + "type": "string" + }, + "background_check_required": { + "type": "boolean" + } + } + }, + "sector_registry": { + "type": "array", + "description": "List of sector IDs under this enterprise", + "items": { + "type": "string" + } + }, + "rate_guardrails": { + "type": "object", + "description": "Rate limits and guardrails", + "properties": { + "minimum_markup_percentage": { + "type": "number" + }, + "maximum_markup_percentage": { + "type": "number" + }, + "minimum_bill_rate": { + "type": "number" + } + } + }, + "primary_contact_name": { + "type": "string", + "description": "Enterprise contact" + }, + "primary_contact_email": { + "type": "string", + "format": "email", + "description": "Enterprise contact email" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is enterprise active" + } + }, + "required": [ + "enterprise_name", + "enterprise_code", + "enterprise_number" + ] +} \ No newline at end of file diff --git a/base44/entities/Equipment.jsonc b/base44/entities/Equipment.jsonc new file mode 100644 index 0000000..b3cf78e --- /dev/null +++ b/base44/entities/Equipment.jsonc @@ -0,0 +1,138 @@ +{ + "name": "Equipment", + "type": "object", + "properties": { + "equipment_id": { + "type": "string", + "description": "Equipment item ID" + }, + "equipment_name": { + "type": "string", + "description": "Name of the equipment item" + }, + "category": { + "type": "string", + "enum": [ + "uniform", + "kitchen", + "service", + "cleaning", + "tech", + "safety", + "furniture", + "bar", + "other" + ], + "description": "Equipment category" + }, + "subcategory": { + "type": "string", + "description": "More specific type (e.g., chef coat, serving tray, POS tablet)" + }, + "description": { + "type": "string" + }, + "vendor_id": { + "type": "string", + "description": "Vendor that owns or provides this equipment" + }, + "vendor_name": { + "type": "string" + }, + "client_id": { + "type": "string", + "description": "Client/Business where equipment is assigned (if applicable)" + }, + "client_name": { + "type": "string" + }, + "site_id": { + "type": "string", + "description": "Site where equipment is located" + }, + "shift_id": { + "type": "string", + "description": "Shift this equipment is assigned to (if temporary)" + }, + "event_id": { + "type": "string", + "description": "Event this equipment is for" + }, + "assigned_to_worker_id": { + "type": "string", + "description": "Worker currently assigned this equipment (for uniforms, tablets, etc.)" + }, + "assigned_to_worker_name": { + "type": "string" + }, + "quantity": { + "type": "number", + "default": 1, + "description": "Quantity of this item" + }, + "unit_cost": { + "type": "number", + "minimum": 0, + "description": "Cost per unit" + }, + "replacement_value": { + "type": "number", + "minimum": 0, + "description": "Replacement value per unit" + }, + "serial_number": { + "type": "string", + "description": "Serial or asset tag number" + }, + "condition": { + "type": "string", + "enum": [ + "new", + "good", + "fair", + "poor", + "damaged", + "lost" + ], + "default": "good" + }, + "status": { + "type": "string", + "enum": [ + "available", + "assigned", + "in_use", + "returned", + "in_repair", + "retired" + ], + "default": "available", + "description": "Current status of the equipment" + }, + "purchase_date": { + "type": "string", + "format": "date" + }, + "last_inspection_date": { + "type": "string", + "format": "date" + }, + "next_inspection_date": { + "type": "string", + "format": "date" + }, + "requires_cleaning": { + "type": "boolean", + "default": false, + "description": "Whether item needs cleaning before next use" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "equipment_name", + "category", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/Event.jsonc b/base44/entities/Event.jsonc new file mode 100644 index 0000000..3b5a261 --- /dev/null +++ b/base44/entities/Event.jsonc @@ -0,0 +1,322 @@ +{ + "name": "Event", + "type": "object", + "properties": { + "event_name": { + "type": "string", + "description": "Name of the event" + }, + "is_rapid": { + "type": "boolean", + "default": false, + "description": "Is this a RAPID/urgent order" + }, + "is_recurring": { + "type": "boolean", + "default": false, + "description": "Is this a recurring event" + }, + "is_multi_day": { + "type": "boolean", + "default": false, + "description": "Is this a multi-day event" + }, + "recurrence_type": { + "type": "string", + "enum": [ + "single", + "date_range", + "scatter" + ], + "description": "Type of recurrence: single, date_range, or scatter" + }, + "recurrence_start_date": { + "type": "string", + "format": "date", + "description": "Start date for recurring events" + }, + "recurrence_end_date": { + "type": "string", + "format": "date", + "description": "End date for recurring events" + }, + "scatter_dates": { + "type": "array", + "description": "Array of specific dates for scatter recurring", + "items": { + "type": "string", + "format": "date" + } + }, + "multi_day_start_date": { + "type": "string", + "format": "date", + "description": "Start date for multi-day events" + }, + "multi_day_end_date": { + "type": "string", + "format": "date", + "description": "End date for multi-day events" + }, + "buffer_time_before": { + "type": "number", + "default": 0, + "description": "Buffer time in minutes before event" + }, + "buffer_time_after": { + "type": "number", + "default": 0, + "description": "Buffer time in minutes after event" + }, + "conflict_detection_enabled": { + "type": "boolean", + "default": true, + "description": "Whether to check for conflicts" + }, + "detected_conflicts": { + "type": "array", + "description": "Array of detected conflicts", + "items": { + "type": "object", + "properties": { + "conflict_type": { + "type": "string", + "enum": [ + "staff_overlap", + "venue_overlap", + "time_buffer" + ] + }, + "severity": { + "type": "string", + "enum": [ + "low", + "medium", + "high", + "critical" + ] + }, + "description": { + "type": "string" + }, + "conflicting_event_id": { + "type": "string" + }, + "staff_id": { + "type": "string" + }, + "detected_at": { + "type": "string", + "format": "date-time" + } + } + } + }, + "business_id": { + "type": "string", + "description": "Associated business ID" + }, + "business_name": { + "type": "string", + "description": "Business name" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID if created by vendor" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name if created by vendor" + }, + "hub": { + "type": "string", + "description": "Hub location for the event" + }, + "event_location": { + "type": "string", + "description": "Event location address" + }, + "contract_type": { + "type": "string", + "enum": [ + "W2", + "1099", + "Temp", + "Contract" + ], + "description": "Type of contract" + }, + "po_reference": { + "type": "string", + "description": "Purchase order reference number" + }, + "status": { + "type": "string", + "enum": [ + "Draft", + "Active", + "Pending", + "Assigned", + "Confirmed", + "Completed", + "Canceled" + ], + "default": "Draft" + }, + "date": { + "type": "string", + "format": "date", + "description": "Event date (for single events)" + }, + "requested": { + "type": "number", + "description": "Total number of staff requested for this event", + "default": 0 + }, + "assigned_staff": { + "type": "array", + "description": "Array of assigned staff members", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string" + } + } + } + }, + "shifts": { + "type": "array", + "description": "Array of shifts for this event", + "items": { + "type": "object", + "properties": { + "shift_name": { + "type": "string" + }, + "shift_contact": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_address": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "role": { + "type": "string" + }, + "department": { + "type": "string" + }, + "count": { + "type": "number" + }, + "start_time": { + "type": "string" + }, + "end_time": { + "type": "string" + }, + "hours": { + "type": "number" + }, + "uniform": { + "type": "string" + }, + "break_minutes": { + "type": "number" + }, + "cost_per_hour": { + "type": "number" + }, + "total_value": { + "type": "number" + }, + "vendor_name": { + "type": "string" + }, + "vendor_id": { + "type": "string" + } + } + } + } + } + } + }, + "addons": { + "type": "object", + "properties": { + "goal": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "text": { + "type": "string" + } + } + }, + "portal_access": { + "type": "boolean" + }, + "meal_provided": { + "type": "boolean" + }, + "travel_time": { + "type": "boolean" + }, + "tips": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "amount": { + "type": "string" + } + } + } + } + }, + "total": { + "type": "number", + "description": "Total cost" + }, + "client_name": { + "type": "string" + }, + "client_email": { + "type": "string" + }, + "client_phone": { + "type": "string" + }, + "invoice_id": { + "type": "string", + "description": "Associated invoice ID" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "event_name" + ] +} \ No newline at end of file diff --git a/base44/entities/FoodServiceOperation.jsonc b/base44/entities/FoodServiceOperation.jsonc new file mode 100644 index 0000000..eb75b10 --- /dev/null +++ b/base44/entities/FoodServiceOperation.jsonc @@ -0,0 +1,200 @@ +{ + "name": "FoodServiceOperation", + "type": "object", + "properties": { + "operation_id": { + "type": "string", + "description": "Operation record ID" + }, + "operation_name": { + "type": "string", + "description": "Name of the food service operation" + }, + "service_type": { + "type": "string", + "enum": [ + "breakfast", + "lunch", + "dinner", + "catering", + "concession", + "cafe", + "buffet", + "banquet", + "retail", + "vending", + "other" + ], + "description": "Type of food service" + }, + "client_id": { + "type": "string", + "description": "Client/Business ID this operation serves" + }, + "client_name": { + "type": "string" + }, + "site_id": { + "type": "string", + "description": "Site where operation takes place" + }, + "location_name": { + "type": "string", + "description": "Location/dining area name" + }, + "sector_id": { + "type": "string", + "description": "Sector this operation belongs to" + }, + "sector_name": { + "type": "string" + }, + "vendor_id": { + "type": "string", + "description": "Vendor operating this service" + }, + "vendor_name": { + "type": "string" + }, + "manager_id": { + "type": "string", + "description": "Manager Staff ID running this operation" + }, + "manager_name": { + "type": "string" + }, + "shift_id": { + "type": "string", + "description": "Shift this operation is tied to" + }, + "event_id": { + "type": "string", + "description": "Event this operation is part of" + }, + "operation_date": { + "type": "string", + "format": "date", + "description": "Date of operation" + }, + "service_start_time": { + "type": "string", + "description": "Service start time" + }, + "service_end_time": { + "type": "string", + "description": "Service end time" + }, + "meal_period": { + "type": "string", + "enum": [ + "breakfast", + "am_break", + "lunch", + "pm_break", + "dinner", + "late_night", + "all_day" + ], + "description": "Meal period" + }, + "menu_type": { + "type": "string", + "description": "Menu style (e.g., American, Mediterranean, Asian, Custom)" + }, + "covers_expected": { + "type": "number", + "default": 0, + "description": "Expected number of covers/guests" + }, + "covers_actual": { + "type": "number", + "default": 0, + "description": "Actual covers served" + }, + "staffing_level": { + "type": "number", + "default": 0, + "description": "Number of staff assigned to this operation" + }, + "kitchen_status": { + "type": "string", + "enum": [ + "closed", + "prep", + "service", + "post_service", + "cleanup", + "deep_clean" + ], + "default": "closed", + "description": "Current kitchen/operation phase" + }, + "equipment_assigned": { + "type": "array", + "description": "Equipment IDs assigned to this operation", + "items": { + "type": "object", + "properties": { + "equipment_id": { + "type": "string" + }, + "equipment_name": { + "type": "string" + }, + "quantity": { + "type": "number" + } + } + } + }, + "contract_id": { + "type": "string", + "description": "Contract governing this operation" + }, + "invoice_id": { + "type": "string", + "description": "Invoice generated for this operation" + }, + "compliance_status": { + "type": "string", + "enum": [ + "compliant", + "pending_review", + "non_compliant", + "not_applicable" + ], + "default": "compliant" + }, + "quality_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Quality/QA score for this operation" + }, + "client_feedback": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "scheduled", + "prep", + "in_service", + "completed", + "cancelled", + "no_show" + ], + "default": "scheduled", + "description": "Operation status" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "operation_name", + "service_type", + "operation_date", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/Invoice.jsonc b/base44/entities/Invoice.jsonc new file mode 100644 index 0000000..5505674 --- /dev/null +++ b/base44/entities/Invoice.jsonc @@ -0,0 +1,309 @@ +{ + "name": "Invoice", + "type": "object", + "properties": { + "invoice_number": { + "type": "string", + "description": "Unique invoice number (e.g., INV-619)" + }, + "event_name": { + "type": "string", + "description": "Name of the event" + }, + "event_id": { + "type": "string", + "description": "Related event ID" + }, + "po_reference": { + "type": "string", + "description": "Purchase order reference" + }, + "event_date": { + "type": "string", + "format": "date", + "description": "Event date" + }, + "from_company": { + "type": "object", + "description": "Vendor company information", + "properties": { + "name": { + "type": "string" + }, + "address": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + } + } + }, + "to_company": { + "type": "object", + "description": "Client company information", + "properties": { + "name": { + "type": "string" + }, + "address": { + "type": "string" + }, + "email": { + "type": "string" + }, + "manager": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "vendor_id": { + "type": "string" + } + } + }, + "business_name": { + "type": "string", + "description": "Client/Business name" + }, + "manager_name": { + "type": "string", + "description": "Manager name" + }, + "vendor_name": { + "type": "string", + "description": "Vendor providing services" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "hub": { + "type": "string", + "description": "Hub location" + }, + "cost_center": { + "type": "string", + "description": "Cost center or department" + }, + "roles": { + "type": "array", + "description": "Grouped by role with staff details", + "items": { + "type": "object", + "properties": { + "role_name": { + "type": "string" + }, + "staff_entries": { + "type": "array", + "items": { + "type": "object", + "properties": { + "staff_name": { + "type": "string" + }, + "staff_id": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "position": { + "type": "string" + }, + "check_in": { + "type": "string" + }, + "check_out": { + "type": "string" + }, + "worked_hours": { + "type": "number" + }, + "regular_hours": { + "type": "number" + }, + "ot_hours": { + "type": "number" + }, + "dt_hours": { + "type": "number" + }, + "regular_rate": { + "type": "number" + }, + "ot_rate": { + "type": "number" + }, + "dt_rate": { + "type": "number" + }, + "regular_value": { + "type": "number" + }, + "ot_value": { + "type": "number" + }, + "dt_value": { + "type": "number" + }, + "rate": { + "type": "number" + }, + "total": { + "type": "number" + } + } + } + }, + "role_subtotal": { + "type": "number" + } + } + } + }, + "subtotal": { + "type": "number", + "description": "Subtotal amount" + }, + "other_charges": { + "type": "number", + "description": "Additional charges" + }, + "amount": { + "type": "number", + "minimum": 0, + "description": "Grand total invoice amount" + }, + "tax_amount": { + "type": "number", + "description": "Tax amount" + }, + "tax_rate": { + "type": "number", + "description": "Tax rate percentage" + }, + "status": { + "type": "string", + "enum": [ + "Draft", + "Pending Review", + "Approved", + "Disputed", + "Under Review", + "Resolved", + "Overdue", + "Paid", + "Reconciled", + "Cancelled" + ], + "default": "Draft", + "description": "Current invoice status" + }, + "issue_date": { + "type": "string", + "format": "date", + "description": "Invoice issue date" + }, + "due_date": { + "type": "string", + "format": "date", + "description": "Payment due date" + }, + "paid_date": { + "type": "string", + "format": "date", + "description": "Date payment was received" + }, + "payment_method": { + "type": "string", + "enum": [ + "Credit Card", + "ACH", + "Wire Transfer", + "Check", + "Cash" + ], + "description": "Payment method used" + }, + "payment_reference": { + "type": "string", + "description": "Payment reference/transaction ID" + }, + "dispute_reason": { + "type": "string", + "description": "Reason for dispute" + }, + "dispute_details": { + "type": "string", + "description": "Detailed dispute information" + }, + "disputed_items": { + "type": "array", + "description": "List of disputed staff entry indices", + "items": { + "type": "object", + "properties": { + "role_index": { + "type": "number" + }, + "staff_index": { + "type": "number" + } + } + } + }, + "disputed_by": { + "type": "string", + "description": "User who disputed the invoice" + }, + "disputed_date": { + "type": "string", + "format": "date-time", + "description": "When dispute was raised" + }, + "resolution_notes": { + "type": "string", + "description": "Notes about dispute resolution" + }, + "approved_by": { + "type": "string", + "description": "User who approved the invoice" + }, + "approved_date": { + "type": "string", + "format": "date-time", + "description": "When invoice was approved" + }, + "is_auto_generated": { + "type": "boolean", + "default": false, + "description": "Whether invoice was auto-generated from event" + }, + "pdf_url": { + "type": "string", + "description": "URL to PDF version of invoice" + }, + "notes": { + "type": "string", + "description": "Additional notes about the invoice" + }, + "internal_notes": { + "type": "string", + "description": "Internal notes not visible to client" + } + }, + "required": [ + "invoice_number", + "business_name", + "amount", + "status", + "issue_date", + "due_date" + ] +} \ No newline at end of file diff --git a/base44/entities/InvoiceTemplate.jsonc b/base44/entities/InvoiceTemplate.jsonc new file mode 100644 index 0000000..7184570 --- /dev/null +++ b/base44/entities/InvoiceTemplate.jsonc @@ -0,0 +1,132 @@ +{ + "name": "InvoiceTemplate", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Template name" + }, + "client_name": { + "type": "string", + "description": "Client/Business name" + }, + "from_company": { + "type": "object", + "description": "Vendor company info", + "properties": { + "name": { + "type": "string" + }, + "address": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "email": { + "type": "string" + } + } + }, + "to_company": { + "type": "object", + "description": "Client company info", + "properties": { + "name": { + "type": "string" + }, + "address": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "email": { + "type": "string" + }, + "hub_name": { + "type": "string" + }, + "manager_name": { + "type": "string" + }, + "vendor_id": { + "type": "string" + } + } + }, + "hub": { + "type": "string", + "description": "Hub location" + }, + "department": { + "type": "string", + "description": "Department" + }, + "po_reference": { + "type": "string", + "description": "PO reference" + }, + "payment_terms": { + "type": "string", + "description": "Payment terms" + }, + "staff_entries": { + "type": "array", + "description": "Template staff entries (positions and rates)", + "items": { + "type": "object", + "properties": { + "position": { + "type": "string" + }, + "rate": { + "type": "number" + }, + "check_in": { + "type": "string" + }, + "check_out": { + "type": "string" + }, + "lunch": { + "type": "number" + } + } + } + }, + "charges": { + "type": "array", + "description": "Template charges", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "qty": { + "type": "number" + }, + "rate": { + "type": "number" + } + } + } + }, + "staff_count": { + "type": "number", + "description": "Number of staff entries" + }, + "charges_count": { + "type": "number", + "description": "Number of charges" + }, + "notes": { + "type": "string", + "description": "Template notes" + } + }, + "required": [ + "name" + ] +} \ No newline at end of file diff --git a/base44/entities/JobApplication.jsonc b/base44/entities/JobApplication.jsonc new file mode 100644 index 0000000..eb17db9 --- /dev/null +++ b/base44/entities/JobApplication.jsonc @@ -0,0 +1,147 @@ +{ + "name": "JobApplication", + "type": "object", + "properties": { + "job_posting_id": { + "type": "string" + }, + "job_title": { + "type": "string" + }, + "applicant_name": { + "type": "string" + }, + "applicant_email": { + "type": "string", + "format": "email" + }, + "applicant_phone": { + "type": "string" + }, + "years_experience": { + "type": "number", + "default": 0 + }, + "english_level": { + "type": "string", + "enum": [ + "None", + "Basic", + "Intermediate", + "Fluent" + ], + "default": "Basic" + }, + "certifications": { + "type": "array", + "items": { + "type": "string" + } + }, + "availability": { + "type": "array", + "items": { + "type": "string" + } + }, + "employment_type_preference": { + "type": "string" + }, + "resume_url": { + "type": "string" + }, + "cover_letter": { + "type": "string" + }, + "linkedin_url": { + "type": "string" + }, + "references": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "applied", + "ai_screened", + "shortlisted", + "interview", + "hired", + "rejected" + ], + "default": "applied" + }, + "ai_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "ai_match_label": { + "type": "string", + "enum": [ + "Excellent Match", + "Strong Match", + "Good Match", + "Weak Match", + "Not a Match" + ] + }, + "ai_summary": { + "type": "string", + "description": "AI-generated vetting summary" + }, + "ai_strengths": { + "type": "array", + "items": { + "type": "string" + } + }, + "ai_gaps": { + "type": "array", + "items": { + "type": "string" + } + }, + "ai_recommendation": { + "type": "string" + }, + "score_breakdown": { + "type": "object", + "properties": { + "experience_score": { + "type": "number" + }, + "english_score": { + "type": "number" + }, + "reliability_score": { + "type": "number" + }, + "certifications_score": { + "type": "number" + }, + "availability_score": { + "type": "number" + } + } + }, + "assessment": { + "type": "object", + "description": "Full AI-generated structured assessment" + }, + "rank": { + "type": "number" + }, + "vendor_id": { + "type": "string" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "job_posting_id", + "applicant_name", + "applicant_email" + ] +} \ No newline at end of file diff --git a/base44/entities/JobPosting.jsonc b/base44/entities/JobPosting.jsonc new file mode 100644 index 0000000..d8cb416 --- /dev/null +++ b/base44/entities/JobPosting.jsonc @@ -0,0 +1,144 @@ +{ + "name": "JobPosting", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Job title" + }, + "role_category": { + "type": "string", + "enum": [ + "Server", + "Bartender", + "Chef", + "Line Cook", + "Event Manager", + "Security", + "Busser", + "Host", + "Barback", + "Runner", + "Setup Crew", + "Other" + ], + "description": "Role category" + }, + "description": { + "type": "string", + "description": "AI-generated or custom job description" + }, + "responsibilities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of responsibilities" + }, + "qualifications": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Required qualifications" + }, + "nice_to_have": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Nice to have qualifications" + }, + "custom_requirements": { + "type": "string", + "description": "Custom requirements added by admin/vendor" + }, + "vetting_criteria": { + "type": "object", + "description": "Scoring weights for vetting", + "properties": { + "experience_weight": { + "type": "number" + }, + "english_weight": { + "type": "number" + }, + "reliability_weight": { + "type": "number" + }, + "certifications_weight": { + "type": "number" + }, + "availability_weight": { + "type": "number" + } + } + }, + "min_experience_years": { + "type": "number", + "default": 0 + }, + "english_required": { + "type": "string", + "enum": [ + "None", + "Basic", + "Intermediate", + "Fluent" + ], + "default": "Basic" + }, + "certifications_required": { + "type": "array", + "items": { + "type": "string" + } + }, + "employment_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "pay_range_min": { + "type": "number" + }, + "pay_range_max": { + "type": "number" + }, + "location": { + "type": "string" + }, + "hub": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "active", + "closed", + "paused" + ], + "default": "draft" + }, + "vendor_id": { + "type": "string" + }, + "vendor_name": { + "type": "string" + }, + "total_applicants": { + "type": "number", + "default": 0 + }, + "ai_generated": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title", + "role_category" + ] +} \ No newline at end of file diff --git a/base44/entities/KrowEdgeAward.jsonc b/base44/entities/KrowEdgeAward.jsonc new file mode 100644 index 0000000..e40d0d7 --- /dev/null +++ b/base44/entities/KrowEdgeAward.jsonc @@ -0,0 +1,80 @@ +{ + "name": "KrowEdgeAward", + "type": "object", + "properties": { + "event_id": { + "type": "string" + }, + "event_name": { + "type": "string" + }, + "event_date": { + "type": "string", + "format": "date" + }, + "award_mode": { + "type": "string", + "enum": [ + "standard", + "competitive", + "krow_smart" + ] + }, + "awarded_vendor_id": { + "type": "string" + }, + "awarded_vendor_name": { + "type": "string" + }, + "awarded_bid_id": { + "type": "string" + }, + "final_score": { + "type": "number" + }, + "evaluation_method": { + "type": "string" + }, + "total_bids": { + "type": "number" + }, + "market_avg_price": { + "type": "number" + }, + "awarded_price": { + "type": "number" + }, + "savings_vs_market": { + "type": "number" + }, + "client_priority": { + "type": "string" + }, + "risk_tolerance": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "pending_review", + "awarded", + "disputed", + "cancelled" + ], + "default": "pending_review" + }, + "awarded_by": { + "type": "string" + }, + "award_rationale": { + "type": "string" + }, + "procurement_notes": { + "type": "string" + } + }, + "required": [ + "event_id", + "award_mode" + ] +} \ No newline at end of file diff --git a/base44/entities/KrowEdgeBid.jsonc b/base44/entities/KrowEdgeBid.jsonc new file mode 100644 index 0000000..6f562ff --- /dev/null +++ b/base44/entities/KrowEdgeBid.jsonc @@ -0,0 +1,141 @@ +{ + "name": "KrowEdgeBid", + "type": "object", + "properties": { + "event_id": { + "type": "string", + "description": "Associated event ID" + }, + "event_name": { + "type": "string", + "description": "Event name for reference" + }, + "event_date": { + "type": "string", + "format": "date" + }, + "award_mode": { + "type": "string", + "enum": [ + "standard", + "competitive", + "krow_smart" + ], + "default": "krow_smart", + "description": "Award strategy selected by client" + }, + "client_priority": { + "type": "string", + "enum": [ + "cost_optimization", + "balanced", + "execution_certainty" + ], + "default": "balanced" + }, + "client_risk_tolerance": { + "type": "string", + "enum": [ + "low", + "medium", + "aggressive" + ], + "default": "low" + }, + "transparency_mode": { + "type": "string", + "enum": [ + "blind", + "guided" + ], + "default": "blind" + }, + "vendor_id": { + "type": "string" + }, + "vendor_name": { + "type": "string" + }, + "price_per_hour": { + "type": "number", + "minimum": 0 + }, + "total_cost": { + "type": "number", + "minimum": 0 + }, + "execution_plan_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Self-declared execution plan quality" + }, + "confidence_level": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Vendor self-declared confidence" + }, + "notes": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "submitted", + "under_review", + "scored", + "awarded", + "rejected" + ], + "default": "submitted" + }, + "technical_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "financial_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "risk_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "final_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "rank": { + "type": "number" + }, + "evaluation_method": { + "type": "string", + "enum": [ + "arithmetic_mean", + "geometric_mean", + "lowest_price", + "krow_optimal" + ], + "description": "Randomly selected evaluation method used" + }, + "ai_insight": { + "type": "string", + "description": "AI-generated insight about this bid" + }, + "market_deviation_pct": { + "type": "number", + "description": "% above or below market average" + } + }, + "required": [ + "event_id", + "vendor_id", + "price_per_hour", + "total_cost" + ] +} \ No newline at end of file diff --git a/base44/entities/Message.jsonc b/base44/entities/Message.jsonc new file mode 100644 index 0000000..0814c4c --- /dev/null +++ b/base44/entities/Message.jsonc @@ -0,0 +1,62 @@ +{ + "name": "Message", + "type": "object", + "properties": { + "conversation_id": { + "type": "string", + "description": "ID of the conversation" + }, + "sender_id": { + "type": "string", + "description": "ID of the sender" + }, + "sender_name": { + "type": "string", + "description": "Name of the sender" + }, + "sender_role": { + "type": "string", + "enum": [ + "client", + "vendor", + "staff", + "admin" + ], + "description": "Role of the sender" + }, + "content": { + "type": "string", + "description": "Message content" + }, + "read_by": { + "type": "array", + "description": "Array of user IDs who have read the message", + "items": { + "type": "string" + } + }, + "attachments": { + "type": "array", + "description": "Attached files", + "items": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + } + }, + "required": [ + "conversation_id", + "sender_name", + "content" + ] +} \ No newline at end of file diff --git a/base44/entities/OperationalMemory.jsonc b/base44/entities/OperationalMemory.jsonc new file mode 100644 index 0000000..da994e5 --- /dev/null +++ b/base44/entities/OperationalMemory.jsonc @@ -0,0 +1,184 @@ +{ + "name": "OperationalMemory", + "type": "object", + "properties": { + "memory_id": { + "type": "string", + "description": "Unique memory identifier (MEM-timestamp-random)" + }, + "trigger_event_id": { + "type": "string", + "description": "ID of the WorkforceEvent that triggered this memory" + }, + "trigger_event_type": { + "type": "string", + "description": "Type of the triggering event" + }, + "context_snapshot": { + "type": "object", + "description": "Graph state at decision time \u2014 entities, relationships, metrics", + "additionalProperties": true + }, + "decision": { + "type": "object", + "description": "The AI's decision/recommendation", + "properties": { + "prediction": { + "type": "string" + }, + "recommendation": { + "type": "string" + }, + "confidence_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "proposed_actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action_type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "target_entity_type": { + "type": "string" + }, + "target_entity_id": { + "type": "string" + }, + "auto_execute": { + "type": "boolean", + "default": false + }, + "executed": { + "type": "boolean", + "default": false + } + } + } + } + } + }, + "reasoning": { + "type": "string", + "description": "Full reasoning chain \u2014 why the AI made this decision" + }, + "causal_chain": { + "type": "array", + "description": "Structured causal chain tracing WHY the outcome occurred \u2014 each factor connected to the next, ending at root cause(s)", + "items": { + "type": "object", + "properties": { + "step": { + "type": "number", + "description": "Order in the causal chain (1 = first contributing factor, last = root cause)" + }, + "factor": { + "type": "string", + "description": "The contributing factor (e.g., 'Vendor A supplied fewer experienced cooks')" + }, + "evidence": { + "type": "string", + "description": "Data-driven evidence supporting this factor" + }, + "category": { + "type": "string", + "enum": [ + "vendor", + "operations", + "workforce", + "training", + "demand", + "external", + "compliance", + "finance", + "equipment", + "transportation", + "system" + ], + "description": "What area of the operation this factor belongs to" + }, + "leads_to": { + "type": "string", + "description": "What this factor caused (the next link in the chain)" + } + } + } + }, + "root_causes": { + "type": "array", + "description": "The root cause(s) identified at the end of the causal chain", + "items": { + "type": "string" + } + }, + "similar_memories_consulted": { + "type": "array", + "description": "IDs of past memories used as reference", + "items": { + "type": "string" + } + }, + "outcome": { + "type": "string", + "description": "What actually happened (filled in during outcome review)" + }, + "outcome_score": { + "type": "number", + "description": "Did it work? (-100 = made things worse, 0 = no effect, 100 = helped significantly)" + }, + "outcome_metrics": { + "type": "object", + "description": "Quantified outcome data (e.g., overtime_reduction_pct, cost_savings)", + "additionalProperties": true + }, + "status": { + "type": "string", + "enum": [ + "pending", + "executed", + "outcome_pending", + "learned", + "rejected" + ], + "default": "pending" + }, + "agent_name": { + "type": "string", + "description": "Which agent made this decision" + }, + "department": { + "type": "string", + "enum": [ + "operations", + "procurement", + "finance", + "vendor", + "compliance", + "executive" + ], + "description": "Department this memory belongs to" + }, + "learned_at": { + "type": "string", + "format": "date-time", + "description": "When the outcome was recorded and learning completed" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "memory_id", + "trigger_event_id", + "department" + ] +} \ No newline at end of file diff --git a/base44/entities/Order.jsonc b/base44/entities/Order.jsonc new file mode 100644 index 0000000..fbfc76e --- /dev/null +++ b/base44/entities/Order.jsonc @@ -0,0 +1,169 @@ +{ + "name": "Order", + "type": "object", + "properties": { + "order_number": { + "type": "string", + "description": "Order Number format ORD-#### (auto-generated)", + "pattern": "^ORD-[0-9]{4,6}$" + }, + "partner_id": { + "type": "string", + "description": "Partner/Client ID" + }, + "partner_name": { + "type": "string", + "description": "Partner/Client name" + }, + "site_id": { + "type": "string", + "description": "Site/location ID" + }, + "site_name": { + "type": "string", + "description": "Site/location name" + }, + "site_address": { + "type": "string", + "description": "Event/site address" + }, + "sector_id": { + "type": "string", + "description": "Sector ID" + }, + "enterprise_id": { + "type": "string", + "description": "Enterprise ID" + }, + "order_type": { + "type": "string", + "enum": [ + "Standard", + "Last Minute", + "Emergency", + "Recurring" + ], + "default": "Standard", + "description": "Type of order" + }, + "cost_center": { + "type": "string", + "description": "Cost center" + }, + "po_number": { + "type": "string", + "description": "Purchase order number" + }, + "roles_requested": { + "type": "array", + "description": "Roles and headcount requested", + "items": { + "type": "object", + "properties": { + "role": { + "type": "string" + }, + "department": { + "type": "string" + }, + "headcount": { + "type": "number" + }, + "start_date_time": { + "type": "string", + "format": "date-time" + }, + "end_date_time": { + "type": "string", + "format": "date-time" + }, + "pay_rate": { + "type": "number" + }, + "bill_rate": { + "type": "number" + }, + "uniform_required": { + "type": "string" + }, + "special_requirements": { + "type": "string" + } + } + } + }, + "tags": { + "type": "array", + "description": "Order tags/labels", + "items": { + "type": "string" + } + }, + "point_of_contact": { + "type": "object", + "description": "On-site contact", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + } + } + }, + "sla_targets": { + "type": "object", + "description": "Service Level Agreement targets", + "properties": { + "response_time_hours": { + "type": "number" + }, + "fill_rate_percentage": { + "type": "number" + }, + "on_time_arrival": { + "type": "boolean" + } + } + }, + "order_status": { + "type": "string", + "enum": [ + "Draft", + "Submitted", + "Confirmed", + "In Progress", + "Completed", + "Cancelled" + ], + "default": "Draft", + "description": "Order status" + }, + "submitted_date": { + "type": "string", + "format": "date-time", + "description": "When order was submitted" + }, + "confirmed_date": { + "type": "string", + "format": "date-time", + "description": "When order was confirmed" + }, + "special_instructions": { + "type": "string", + "description": "Special instructions" + }, + "total_estimated_cost": { + "type": "number", + "description": "Estimated total cost" + } + }, + "required": [ + "order_number", + "partner_id", + "roles_requested" + ] +} \ No newline at end of file diff --git a/base44/entities/OrderVendorInvite.jsonc b/base44/entities/OrderVendorInvite.jsonc new file mode 100644 index 0000000..9be70fb --- /dev/null +++ b/base44/entities/OrderVendorInvite.jsonc @@ -0,0 +1,60 @@ +{ + "name": "OrderVendorInvite", + "type": "object", + "properties": { + "order_id": { + "type": "string", + "description": "Order ID" + }, + "order_number": { + "type": "string", + "description": "Order number" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "status": { + "type": "string", + "enum": [ + "pending", + "accepted", + "declined", + "expired" + ], + "default": "pending", + "description": "Invite status" + }, + "invited_at": { + "type": "string", + "format": "date-time", + "description": "When vendor was invited" + }, + "invited_by": { + "type": "string", + "description": "Who sent the invite" + }, + "responded_at": { + "type": "string", + "format": "date-time", + "description": "When vendor responded" + }, + "response_note": { + "type": "string", + "description": "Vendor's response note" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "When invite expires" + } + }, + "required": [ + "order_id", + "vendor_id" + ] +} \ No newline at end of file diff --git a/base44/entities/Partner.jsonc b/base44/entities/Partner.jsonc new file mode 100644 index 0000000..f219295 --- /dev/null +++ b/base44/entities/Partner.jsonc @@ -0,0 +1,116 @@ +{ + "name": "Partner", + "type": "object", + "properties": { + "partner_name": { + "type": "string", + "description": "Partner/client name (e.g., Google, Nvidia)" + }, + "partner_number": { + "type": "string", + "description": "Partner Number format PN-#### (auto-generated)", + "pattern": "^PN-[0-9]{4}$" + }, + "partner_type": { + "type": "string", + "enum": [ + "Corporate", + "Education", + "Healthcare", + "Sports & Entertainment", + "Government" + ], + "description": "Partner type" + }, + "sector_id": { + "type": "string", + "description": "Sector ID this partner belongs to" + }, + "sector_name": { + "type": "string", + "description": "Sector name" + }, + "primary_contact_name": { + "type": "string", + "description": "Primary contact person" + }, + "primary_contact_email": { + "type": "string", + "format": "email", + "description": "Primary contact email" + }, + "primary_contact_phone": { + "type": "string", + "description": "Primary contact phone" + }, + "billing_address": { + "type": "string", + "description": "Billing address" + }, + "sites": { + "type": "array", + "description": "List of partner sites/locations", + "items": { + "type": "object", + "properties": { + "site_name": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "state": { + "type": "string" + }, + "zip_code": { + "type": "string" + }, + "site_manager": { + "type": "string" + }, + "site_manager_email": { + "type": "string" + } + } + } + }, + "allowed_vendors": { + "type": "array", + "description": "List of vendor IDs allowed for this partner", + "items": { + "type": "string" + } + }, + "rate_exceptions": { + "type": "array", + "description": "Partner-specific rate exceptions", + "items": { + "type": "object" + } + }, + "cost_centers": { + "type": "array", + "description": "Cost centers/PO numbers", + "items": { + "type": "string" + } + }, + "payment_terms": { + "type": "string", + "description": "Payment terms (e.g., Net 30)", + "default": "Net 30" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is partner active" + } + }, + "required": [ + "partner_name", + "partner_number" + ] +} \ No newline at end of file diff --git a/base44/entities/PayrollRecord.jsonc b/base44/entities/PayrollRecord.jsonc new file mode 100644 index 0000000..e9e948a --- /dev/null +++ b/base44/entities/PayrollRecord.jsonc @@ -0,0 +1,162 @@ +{ + "name": "PayrollRecord", + "type": "object", + "properties": { + "pay_period_start": { + "type": "string", + "format": "date", + "description": "Start of pay period" + }, + "pay_period_end": { + "type": "string", + "format": "date", + "description": "End of pay period" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "payroll_status": { + "type": "string", + "enum": [ + "Draft", + "Processing", + "Approved", + "Paid" + ], + "default": "Draft", + "description": "Overall payroll batch status" + }, + "entries": { + "type": "array", + "description": "Individual employee payroll entries", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "position": { + "type": "string" + }, + "regular_hours": { + "type": "number" + }, + "overtime_hours": { + "type": "number" + }, + "double_time_hours": { + "type": "number" + }, + "regular_rate": { + "type": "number" + }, + "overtime_rate": { + "type": "number" + }, + "double_time_rate": { + "type": "number" + }, + "regular_pay": { + "type": "number" + }, + "overtime_pay": { + "type": "number" + }, + "double_time_pay": { + "type": "number" + }, + "gross_pay": { + "type": "number" + }, + "timecard_status": { + "type": "string", + "enum": [ + "employee_pending", + "employee_confirmed", + "employee_edited", + "approved", + "paid" + ], + "default": "employee_pending" + }, + "timecard_sent_at": { + "type": "string", + "format": "date-time" + }, + "employee_response_at": { + "type": "string", + "format": "date-time" + }, + "employee_edit_notes": { + "type": "string" + }, + "approved_at": { + "type": "string", + "format": "date-time" + }, + "approved_by": { + "type": "string" + }, + "paid_at": { + "type": "string", + "format": "date-time" + }, + "shifts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "event_name": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date" + }, + "clock_in": { + "type": "string" + }, + "clock_out": { + "type": "string" + }, + "hours": { + "type": "number" + }, + "role": { + "type": "string" + } + } + } + } + } + } + }, + "total_regular_pay": { + "type": "number" + }, + "total_overtime_pay": { + "type": "number" + }, + "total_gross_pay": { + "type": "number" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "pay_period_start", + "pay_period_end" + ] +} \ No newline at end of file diff --git a/base44/entities/RateCard.jsonc b/base44/entities/RateCard.jsonc new file mode 100644 index 0000000..2ac4fb4 --- /dev/null +++ b/base44/entities/RateCard.jsonc @@ -0,0 +1,169 @@ +{ + "name": "RateCard", + "type": "object", + "properties": { + "rate_card_number": { + "type": "string", + "description": "Rate Card Number format RC-#### (auto-generated)", + "pattern": "^RC-[0-9]{4}$" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "partner_id": { + "type": "string", + "description": "Partner ID (if partner-specific)" + }, + "partner_name": { + "type": "string", + "description": "Partner name (if partner-specific)" + }, + "sector_id": { + "type": "string", + "description": "Sector ID (if sector-specific)" + }, + "effective_start_date": { + "type": "string", + "format": "date", + "description": "Rate card effective start date" + }, + "effective_end_date": { + "type": "string", + "format": "date", + "description": "Rate card effective end date" + }, + "region": { + "type": "string", + "description": "Geographic region (e.g., 'San Francisco Bay Area')" + }, + "state": { + "type": "string", + "description": "State" + }, + "role": { + "type": "string", + "description": "Role/position" + }, + "category": { + "type": "string", + "enum": [ + "Kitchen and Culinary", + "Concessions", + "Facilities", + "Bartending", + "Security", + "Event Staff", + "Management", + "Technical", + "Other" + ], + "description": "Role category" + }, + "pay_rate": { + "type": "number", + "minimum": 0, + "description": "Worker pay rate per hour" + }, + "bill_rate": { + "type": "number", + "minimum": 0, + "description": "Client bill rate per hour" + }, + "markup_amount": { + "type": "number", + "description": "Markup amount in dollars" + }, + "markup_percentage": { + "type": "number", + "description": "Markup as percentage" + }, + "overtime_pay_rate": { + "type": "number", + "description": "Overtime pay rate (typically 1.5x)" + }, + "overtime_bill_rate": { + "type": "number", + "description": "Overtime bill rate" + }, + "overtime_rules": { + "type": "object", + "description": "Overtime rules", + "properties": { + "daily_threshold_hours": { + "type": "number" + }, + "weekly_threshold_hours": { + "type": "number" + }, + "overtime_multiplier": { + "type": "number", + "default": 1.5 + } + } + }, + "exceptions": { + "type": "array", + "description": "Rate exceptions", + "items": { + "type": "object", + "properties": { + "condition": { + "type": "string" + }, + "exception_rate": { + "type": "number" + }, + "notes": { + "type": "string" + } + } + } + }, + "minimum_hours": { + "type": "number", + "description": "Minimum billable hours" + }, + "travel_rate": { + "type": "number", + "description": "Travel reimbursement rate" + }, + "meal_allowance": { + "type": "number", + "description": "Meal allowance if applicable" + }, + "uniform_charge": { + "type": "number", + "description": "Uniform charge if applicable" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is rate card currently active" + }, + "approved_by": { + "type": "string", + "description": "Who approved this rate card" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "Approval date" + }, + "notes": { + "type": "string", + "description": "Rate card notes" + } + }, + "required": [ + "vendor_id", + "role", + "pay_rate", + "bill_rate", + "effective_start_date" + ] +} \ No newline at end of file diff --git a/base44/entities/ReputationEvent.jsonc b/base44/entities/ReputationEvent.jsonc new file mode 100644 index 0000000..7e70cff --- /dev/null +++ b/base44/entities/ReputationEvent.jsonc @@ -0,0 +1,68 @@ +{ + "name": "ReputationEvent", + "type": "object", + "properties": { + "worker_id": { + "type": "string", + "description": "ID of the workforce member" + }, + "worker_name": { + "type": "string", + "description": "Name of the workforce member" + }, + "event_type": { + "type": "string", + "enum": [ + "shift_completed", + "no_show", + "late_arrival", + "early_departure", + "client_rated", + "supervisor_rated", + "certification_verified", + "last_minute_cancel", + "commendation" + ], + "description": "Type of reputation event" + }, + "event_date": { + "type": "string", + "format": "date", + "description": "Date the event occurred" + }, + "agency_id": { + "type": "string", + "description": "Agency that submitted this event" + }, + "agency_name": { + "type": "string", + "description": "Name of submitting agency" + }, + "rating": { + "type": "number", + "minimum": 1, + "maximum": 5, + "description": "Star rating (for client_rated / supervisor_rated events)" + }, + "role": { + "type": "string", + "description": "Role worked during this event" + }, + "verified": { + "type": "boolean", + "default": true, + "description": "Whether KROW has verified this event" + }, + "notes": { + "type": "string", + "description": "Optional non-sensitive note" + } + }, + "required": [ + "worker_id", + "worker_name", + "event_type", + "event_date", + "agency_name" + ] +} \ No newline at end of file diff --git a/base44/entities/SaleRecord.jsonc b/base44/entities/SaleRecord.jsonc new file mode 100644 index 0000000..a8be074 --- /dev/null +++ b/base44/entities/SaleRecord.jsonc @@ -0,0 +1,90 @@ +{ + "name": "SaleRecord", + "type": "object", + "properties": { + "invoice_id": { + "type": "string", + "description": "Linked invoice ID" + }, + "invoice_number": { + "type": "string", + "description": "Invoice number" + }, + "vendor_id": { + "type": "string" + }, + "vendor_name": { + "type": "string" + }, + "client_name": { + "type": "string" + }, + "event_name": { + "type": "string" + }, + "event_date": { + "type": "string", + "format": "date" + }, + "gross_amount": { + "type": "number", + "description": "Total invoice amount (revenue)" + }, + "vendor_fee_percentage": { + "type": "number", + "description": "Platform/network fee %" + }, + "vendor_fee_amount": { + "type": "number", + "description": "Calculated fee amount" + }, + "net_amount": { + "type": "number", + "description": "Net after vendor fee" + }, + "payment_status": { + "type": "string", + "enum": [ + "Unpaid", + "Partial", + "Paid" + ], + "default": "Unpaid" + }, + "amount_paid": { + "type": "number", + "default": 0 + }, + "balance_due": { + "type": "number" + }, + "payment_history": { + "type": "array", + "items": { + "type": "object", + "properties": { + "payment_date": { + "type": "string", + "format": "date" + }, + "amount": { + "type": "number" + }, + "method": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "recorded_by": { + "type": "string" + } + } + } + } + }, + "required": [ + "invoice_id", + "gross_amount" + ] +} \ No newline at end of file diff --git a/base44/entities/Scorecard.jsonc b/base44/entities/Scorecard.jsonc new file mode 100644 index 0000000..6bf31f1 --- /dev/null +++ b/base44/entities/Scorecard.jsonc @@ -0,0 +1,285 @@ +{ + "name": "Scorecard", + "type": "object", + "properties": { + "scorecard_number": { + "type": "string", + "description": "Scorecard Number format SC-#### (auto-generated)", + "pattern": "^SC-[0-9]{4}$" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "period_type": { + "type": "string", + "enum": [ + "Monthly", + "Quarterly", + "Annual", + "All Time" + ], + "description": "Reporting period" + }, + "period_start": { + "type": "string", + "format": "date", + "description": "Period start date" + }, + "period_end": { + "type": "string", + "format": "date", + "description": "Period end date" + }, + "kpis": { + "type": "object", + "description": "Key Performance Indicators", + "properties": { + "fill_rate": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "Exceeds", + "Meets", + "Below" + ] + } + } + }, + "on_time_arrival": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "cancellation_rate": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "no_show_rate": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "average_rating": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "response_time_hours": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + }, + "compliance_score": { + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "target": { + "type": "number" + }, + "status": { + "type": "string" + } + } + } + } + }, + "sla_results": { + "type": "object", + "description": "SLA Performance Results", + "properties": { + "orders_received": { + "type": "number" + }, + "orders_filled": { + "type": "number" + }, + "orders_partially_filled": { + "type": "number" + }, + "orders_unfilled": { + "type": "number" + }, + "total_shifts": { + "type": "number" + }, + "shifts_completed": { + "type": "number" + }, + "shifts_cancelled": { + "type": "number" + }, + "avg_response_time": { + "type": "number" + } + } + }, + "trends": { + "type": "array", + "description": "Performance trends over time", + "items": { + "type": "object", + "properties": { + "metric": { + "type": "string" + }, + "current_value": { + "type": "number" + }, + "previous_value": { + "type": "number" + }, + "change_percentage": { + "type": "number" + }, + "trend_direction": { + "type": "string", + "enum": [ + "Up", + "Down", + "Stable" + ] + } + } + } + }, + "overall_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Overall performance score (0-100)" + }, + "grade": { + "type": "string", + "enum": [ + "A+", + "A", + "B+", + "B", + "C+", + "C", + "D", + "F" + ], + "description": "Performance grade" + }, + "strengths": { + "type": "array", + "description": "Identified strengths", + "items": { + "type": "string" + } + }, + "areas_for_improvement": { + "type": "array", + "description": "Areas needing improvement", + "items": { + "type": "string" + } + }, + "action_items": { + "type": "array", + "description": "Recommended action items", + "items": { + "type": "object", + "properties": { + "item": { + "type": "string" + }, + "priority": { + "type": "string", + "enum": [ + "High", + "Medium", + "Low" + ] + }, + "due_date": { + "type": "string", + "format": "date" + } + } + } + }, + "reviewed_by": { + "type": "string", + "description": "Who reviewed this scorecard" + }, + "reviewed_date": { + "type": "string", + "format": "date", + "description": "Review date" + }, + "next_review_date": { + "type": "string", + "format": "date", + "description": "Next scheduled review" + } + }, + "required": [ + "vendor_id", + "period_type", + "period_start", + "period_end" + ] +} \ No newline at end of file diff --git a/base44/entities/Sector.jsonc b/base44/entities/Sector.jsonc new file mode 100644 index 0000000..a511580 --- /dev/null +++ b/base44/entities/Sector.jsonc @@ -0,0 +1,171 @@ +{ + "name": "Sector", + "type": "object", + "properties": { + "sector_number": { + "type": "string", + "description": "Sector Number format SN-#### (auto-generated)", + "pattern": "^SN-[0-9]{4}$" + }, + "customer_group": { + "type": "string", + "description": "Customer group name" + }, + "sector_code": { + "type": "string", + "description": "Short code identifier" + }, + "sector_name": { + "type": "string", + "description": "Sector/brand name (e.g., Bon App\u00e9tit, Flik, Eurest)" + }, + "division_code": { + "type": "string", + "description": "Division code" + }, + "division": { + "type": "string", + "description": "Division name" + }, + "region_code": { + "type": "string", + "description": "Region code" + }, + "region": { + "type": "string", + "description": "Region name" + }, + "district_code": { + "type": "string", + "description": "District code" + }, + "district": { + "type": "string", + "description": "District name" + }, + "customer_code": { + "type": "string", + "description": "Customer code" + }, + "customer": { + "type": "string", + "description": "Customer name" + }, + "main_contact_address1": { + "type": "string", + "description": "Main contact address line 1" + }, + "main_contact_address2": { + "type": "string", + "description": "Main contact address line 2" + }, + "main_contact_city": { + "type": "string", + "description": "Main contact city" + }, + "main_contact_state": { + "type": "string", + "description": "Main contact state" + }, + "main_contact_postal_code": { + "type": "string", + "description": "Main contact postal/ZIP code" + }, + "financial_code": { + "type": "string", + "description": "Financial code" + }, + "account_manager": { + "type": "string", + "description": "Account manager name" + }, + "account_manager_department": { + "type": "string", + "description": "Account manager department" + }, + "division_manager": { + "type": "string", + "description": "Division manager name" + }, + "division_manager_department": { + "type": "string", + "description": "Division manager department" + }, + "business_channels": { + "type": "array", + "description": "Business channels for this sector", + "items": { + "type": "string" + } + }, + "new_addition": { + "type": "string", + "description": "New addition flag or info" + }, + "parent_enterprise_id": { + "type": "string", + "description": "Parent enterprise ID" + }, + "parent_enterprise_name": { + "type": "string", + "description": "Parent enterprise name" + }, + "sector_type": { + "type": "string", + "enum": [ + "Food Service", + "Facilities", + "Healthcare", + "Education", + "Corporate", + "Sports & Entertainment" + ], + "description": "Sector business type" + }, + "client_portfolio": { + "type": "array", + "description": "List of partner/client IDs in this sector", + "items": { + "type": "string" + } + }, + "sector_policies": { + "type": "object", + "description": "Sector-specific policies", + "properties": { + "uniform_requirements": { + "type": "string" + }, + "certification_requirements": { + "type": "array", + "items": { + "type": "string" + } + }, + "special_training": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "approved_vendors": { + "type": "array", + "description": "List of approved vendor IDs for this sector", + "items": { + "type": "string" + } + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is sector active" + } + }, + "required": [ + "sector_name", + "sector_code", + "sector_number" + ] +} \ No newline at end of file diff --git a/base44/entities/Shift.jsonc b/base44/entities/Shift.jsonc new file mode 100644 index 0000000..9b70e2f --- /dev/null +++ b/base44/entities/Shift.jsonc @@ -0,0 +1,93 @@ +{ + "name": "Shift", + "type": "object", + "properties": { + "event_id": { + "type": "string", + "description": "Associated event ID" + }, + "shift_name": { + "type": "string", + "description": "Name of the shift" + }, + "manager_id": { + "type": "string", + "description": "Manager staff ID" + }, + "manager_name": { + "type": "string", + "description": "Manager name" + }, + "location": { + "type": "string", + "description": "Shift location" + }, + "start_date": { + "type": "string", + "format": "date-time", + "description": "Shift start date and time" + }, + "end_date": { + "type": "string", + "format": "date-time", + "description": "Shift end date and time" + }, + "unpaid_break": { + "type": "number", + "description": "Unpaid break duration in minutes" + }, + "count": { + "type": "number", + "description": "Number of staff needed" + }, + "assigned": { + "type": "number", + "description": "Number of staff assigned" + }, + "uniform_type": { + "type": "string", + "description": "Required uniform type" + }, + "price": { + "type": "number", + "description": "Price per staff member" + }, + "amount": { + "type": "number", + "description": "Total amount for shift" + }, + "assigned_staff": { + "type": "array", + "description": "List of assigned staff", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "department": { + "type": "string" + } + } + } + }, + "role": { + "type": "string", + "description": "Role for this shift" + }, + "department": { + "type": "string", + "description": "Department" + } + }, + "required": [ + "shift_name", + "start_date" + ] +} \ No newline at end of file diff --git a/base44/entities/ShiftOutcome.jsonc b/base44/entities/ShiftOutcome.jsonc new file mode 100644 index 0000000..774fbd3 --- /dev/null +++ b/base44/entities/ShiftOutcome.jsonc @@ -0,0 +1,148 @@ +{ + "name": "ShiftOutcome", + "type": "object", + "properties": { + "event_id": { + "type": "string", + "description": "Associated event ID" + }, + "event_name": { + "type": "string", + "description": "Event name for reference" + }, + "event_date": { + "type": "string", + "format": "date", + "description": "Date of the event" + }, + "business_name": { + "type": "string", + "description": "Client business name" + }, + "hub_location": { + "type": "string", + "description": "Location where shift occurred" + }, + "event_type": { + "type": "string", + "description": "Type of event (lunch, dinner, VIP, etc.)" + }, + "expected_covers": { + "type": "number", + "description": "Expected covers/volume for this event" + }, + "actual_covers": { + "type": "number", + "description": "Actual covers served" + }, + "staff_requested": { + "type": "number", + "description": "Staff requested for the event" + }, + "staff_actual": { + "type": "number", + "description": "Staff who actually showed up" + }, + "no_show_count": { + "type": "number", + "default": 0, + "description": "Number of no-shows" + }, + "late_arrival_count": { + "type": "number", + "default": 0, + "description": "Number of late arrivals" + }, + "ot_hours_total": { + "type": "number", + "default": 0, + "description": "Total overtime hours across all staff" + }, + "client_rating": { + "type": "number", + "minimum": 1, + "maximum": 5, + "description": "Client rating after shift (1-5 stars)" + }, + "client_feedback": { + "type": "string", + "description": "Client written feedback" + }, + "qa_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Internal QA score (0-100)" + }, + "issues_reported": { + "type": "array", + "description": "Issues reported during or after the shift", + "items": { + "type": "object", + "properties": { + "issue_type": { + "type": "string", + "enum": [ + "late_food", + "understaffed", + "slow_service", + "no_show", + "quality", + "communication", + "other" + ] + }, + "description": { + "type": "string" + }, + "severity": { + "type": "string", + "enum": [ + "low", + "medium", + "high", + "critical" + ] + } + } + } + }, + "prediction_matched": { + "type": "boolean", + "description": "Did the actual demand match the prediction?" + }, + "predicted_staff": { + "type": "number", + "description": "How many staff KROW predicted were needed" + }, + "was_overstaffed": { + "type": "boolean", + "description": "Was the event overstaffed?" + }, + "was_understaffed": { + "type": "boolean", + "description": "Was the event understaffed?" + }, + "vendor_id": { + "type": "string", + "description": "Vendor who staffed this event" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "submitted_by": { + "type": "string", + "description": "Who submitted this outcome report" + }, + "notes": { + "type": "string", + "description": "Internal notes about this outcome" + } + }, + "required": [ + "event_id", + "event_name", + "event_date" + ] +} \ No newline at end of file diff --git a/base44/entities/ShiftProposal.jsonc b/base44/entities/ShiftProposal.jsonc new file mode 100644 index 0000000..8caa6ba --- /dev/null +++ b/base44/entities/ShiftProposal.jsonc @@ -0,0 +1,101 @@ +{ + "name": "ShiftProposal", + "type": "object", + "properties": { + "event_id": { + "type": "string", + "description": "Event/shift being proposed" + }, + "event_name": { + "type": "string", + "description": "Event name" + }, + "staff_id": { + "type": "string", + "description": "Worker being proposed to" + }, + "staff_name": { + "type": "string", + "description": "Worker name" + }, + "vendor_id": { + "type": "string", + "description": "Vendor making the proposal" + }, + "proposal_status": { + "type": "string", + "enum": [ + "PENDING_WORKER_CONFIRMATION", + "ACCEPTED", + "DECLINED", + "EXPIRED", + "CANCELLED" + ], + "default": "PENDING_WORKER_CONFIRMATION", + "description": "Status of the proposal" + }, + "shift_date": { + "type": "string", + "format": "date", + "description": "Date of shift" + }, + "start_time": { + "type": "string", + "description": "Shift start time" + }, + "end_time": { + "type": "string", + "description": "Shift end time" + }, + "location": { + "type": "string", + "description": "Shift location" + }, + "role": { + "type": "string", + "description": "Role/position" + }, + "pay_rate": { + "type": "number", + "description": "Pay rate for shift" + }, + "total_pay": { + "type": "number", + "description": "Total estimated pay" + }, + "response_deadline": { + "type": "string", + "format": "date-time", + "description": "Deadline for worker response" + }, + "proposed_at": { + "type": "string", + "format": "date-time", + "description": "When proposal was sent" + }, + "responded_at": { + "type": "string", + "format": "date-time", + "description": "When worker responded" + }, + "decline_reason": { + "type": "string", + "description": "Reason for declining" + }, + "was_marked_unavailable": { + "type": "boolean", + "default": false, + "description": "Was worker marked unavailable when proposed" + }, + "notification_sent": { + "type": "boolean", + "default": false, + "description": "Whether notification was sent" + } + }, + "required": [ + "event_id", + "staff_id", + "shift_date" + ] +} \ No newline at end of file diff --git a/base44/entities/Site.jsonc b/base44/entities/Site.jsonc new file mode 100644 index 0000000..b215c9f --- /dev/null +++ b/base44/entities/Site.jsonc @@ -0,0 +1,56 @@ +{ + "name": "Site", + "type": "object", + "properties": { + "site_name": { + "type": "string", + "description": "Site name" + }, + "partner_id": { + "type": "string", + "description": "Partner ID this site belongs to" + }, + "partner_name": { + "type": "string", + "description": "Partner name" + }, + "address": { + "type": "string", + "description": "Site address" + }, + "city": { + "type": "string", + "description": "City" + }, + "state": { + "type": "string", + "description": "State" + }, + "zip_code": { + "type": "string", + "description": "ZIP code" + }, + "site_manager": { + "type": "string", + "description": "Site manager name" + }, + "site_manager_email": { + "type": "string", + "format": "email", + "description": "Site manager email" + }, + "site_manager_phone": { + "type": "string", + "description": "Site manager phone" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is site active" + } + }, + "required": [ + "site_name", + "partner_id" + ] +} \ No newline at end of file diff --git a/base44/entities/Staff.jsonc b/base44/entities/Staff.jsonc new file mode 100644 index 0000000..8717675 --- /dev/null +++ b/base44/entities/Staff.jsonc @@ -0,0 +1,259 @@ +{ + "name": "Staff", + "type": "object", + "properties": { + "employee_name": { + "type": "string", + "description": "Full name of the employee" + }, + "vendor_id": { + "type": "string", + "description": "ID of the vendor this staff belongs to" + }, + "vendor_name": { + "type": "string", + "description": "Name of the vendor company" + }, + "manager": { + "type": "string", + "description": "Manager's name" + }, + "contact_number": { + "type": "string", + "description": "Primary contact number" + }, + "phone": { + "type": "string", + "description": "Additional phone number" + }, + "email": { + "type": "string", + "format": "email", + "description": "Employee email address" + }, + "department": { + "type": "string", + "enum": [ + "Operations", + "Sales", + "HR", + "Finance", + "IT", + "Marketing", + "Customer Service", + "Logistics" + ], + "description": "Department" + }, + "hub_location": { + "type": "string" + }, + "event_location": { + "type": "string" + }, + "track": { + "type": "string" + }, + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "position": { + "type": "string", + "description": "Primary job position/skill" + }, + "position_2": { + "type": "string", + "description": "Secondary job position/skill" + }, + "initial": { + "type": "string" + }, + "profile_type": { + "type": "string", + "enum": [ + "Skilled", + "Beginner", + "Cross-Trained" + ] + }, + "employment_type": { + "type": "string", + "enum": [ + "Full Time", + "Part Time", + "On call", + "Weekends", + "Specific Days", + "Seasonal", + "Medical Leave" + ] + }, + "english": { + "type": "string", + "enum": [ + "Fluent", + "Intermediate", + "Basic", + "None" + ] + }, + "english_required": { + "type": "boolean" + }, + "check_in": { + "type": "string", + "format": "date" + }, + "replaced_by": { + "type": "string" + }, + "ro": { + "type": "string" + }, + "mon": { + "type": "string" + }, + "schedule_days": { + "type": "string" + }, + "invoiced": { + "type": "boolean" + }, + "action": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "accounting_comments": { + "type": "string" + }, + "pay_rate": { + "type": "number", + "minimum": 0, + "description": "Employee base pay rate per hour" + }, + "pay_rate_overtime": { + "type": "number", + "minimum": 0, + "description": "Overtime pay rate per hour (1.5x)" + }, + "pay_rate_double_time": { + "type": "number", + "minimum": 0, + "description": "Double-time pay rate per hour (2x)" + }, + "pay_rate_type": { + "type": "string", + "enum": [ + "Hourly", + "Salary", + "1099" + ], + "default": "Hourly" + }, + "pay_rate_effective_date": { + "type": "string", + "format": "date" + }, + "position_pay_rates": { + "type": "array", + "description": "Per-position pay rates \u2014 different rates based on the role/position worked", + "items": { + "type": "object", + "properties": { + "position": { + "type": "string", + "description": "Position/role name" + }, + "pay_rate": { + "type": "number", + "minimum": 0, + "description": "Base pay for this position" + }, + "pay_rate_overtime": { + "type": "number", + "minimum": 0 + }, + "pay_rate_double_time": { + "type": "number", + "minimum": 0 + }, + "notes": { + "type": "string" + } + } + } + }, + "rating": { + "type": "number", + "minimum": 0, + "maximum": 5 + }, + "shift_coverage_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "cancellation_count": { + "type": "number", + "minimum": 0 + }, + "no_show_count": { + "type": "number", + "minimum": 0 + }, + "total_shifts": { + "type": "number", + "minimum": 0 + }, + "reliability_score": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "background_check_status": { + "type": "string", + "enum": [ + "pending", + "cleared", + "failed", + "expired", + "not_required" + ], + "default": "pending" + }, + "background_check_date": { + "type": "string", + "format": "date" + }, + "certifications": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "issued_date": { + "type": "string", + "format": "date" + }, + "expiry_date": { + "type": "string", + "format": "date" + }, + "issuer": { + "type": "string" + } + } + } + } + }, + "required": [ + "employee_name" + ] +} \ No newline at end of file diff --git a/base44/entities/Task.jsonc b/base44/entities/Task.jsonc new file mode 100644 index 0000000..5fe4d49 --- /dev/null +++ b/base44/entities/Task.jsonc @@ -0,0 +1,124 @@ +{ + "name": "Task", + "type": "object", + "properties": { + "task_name": { + "type": "string", + "description": "Name of the task" + }, + "description": { + "type": "string", + "description": "Task description" + }, + "team_id": { + "type": "string", + "description": "ID of the team this task belongs to" + }, + "status": { + "type": "string", + "enum": [ + "pending", + "in_progress", + "on_hold", + "completed" + ], + "default": "pending", + "description": "Current status of the task" + }, + "priority": { + "type": "string", + "enum": [ + "low", + "normal", + "high" + ], + "default": "normal", + "description": "Task priority" + }, + "due_date": { + "type": "string", + "format": "date", + "description": "Due date" + }, + "progress": { + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 0, + "description": "Task completion percentage" + }, + "assigned_members": { + "type": "array", + "description": "Team members assigned to this task", + "items": { + "type": "object", + "properties": { + "member_id": { + "type": "string" + }, + "member_name": { + "type": "string" + }, + "avatar_url": { + "type": "string" + } + } + } + }, + "owner_id": { + "type": "string", + "description": "Task owner ID" + }, + "owner_name": { + "type": "string", + "description": "Task owner name" + }, + "files": { + "type": "array", + "description": "Attached files", + "items": { + "type": "object", + "properties": { + "file_name": { + "type": "string" + }, + "file_url": { + "type": "string" + }, + "file_size": { + "type": "number" + }, + "uploaded_by": { + "type": "string" + }, + "uploaded_at": { + "type": "string", + "format": "date-time" + } + } + } + }, + "attachment_count": { + "type": "number", + "default": 0, + "description": "Number of attachments" + }, + "comment_count": { + "type": "number", + "default": 0, + "description": "Number of comments" + }, + "notes": { + "type": "string", + "description": "Additional notes" + }, + "order_index": { + "type": "number", + "description": "Order within the column" + } + }, + "required": [ + "task_name", + "team_id" + ] +} \ No newline at end of file diff --git a/base44/entities/TaskComment.jsonc b/base44/entities/TaskComment.jsonc new file mode 100644 index 0000000..0a7d7e6 --- /dev/null +++ b/base44/entities/TaskComment.jsonc @@ -0,0 +1,36 @@ +{ + "name": "TaskComment", + "type": "object", + "properties": { + "task_id": { + "type": "string", + "description": "ID of the task this comment belongs to" + }, + "author_id": { + "type": "string", + "description": "ID of the comment author" + }, + "author_name": { + "type": "string", + "description": "Name of the comment author" + }, + "author_avatar": { + "type": "string", + "description": "Avatar URL of the author" + }, + "comment": { + "type": "string", + "description": "Comment text" + }, + "is_system": { + "type": "boolean", + "default": false, + "description": "Is this a system message (e.g., status change)" + } + }, + "required": [ + "task_id", + "author_name", + "comment" + ] +} \ No newline at end of file diff --git a/base44/entities/Team.jsonc b/base44/entities/Team.jsonc new file mode 100644 index 0000000..3036119 --- /dev/null +++ b/base44/entities/Team.jsonc @@ -0,0 +1,146 @@ +{ + "name": "Team", + "type": "object", + "properties": { + "team_name": { + "type": "string", + "description": "Name of the team" + }, + "owner_id": { + "type": "string", + "description": "ID of the team owner (user)" + }, + "owner_name": { + "type": "string", + "description": "Name of the team owner" + }, + "owner_role": { + "type": "string", + "enum": [ + "admin", + "procurement", + "operator", + "sector", + "client", + "vendor", + "workforce" + ], + "description": "Role of the team owner" + }, + "company_logo": { + "type": "string", + "description": "URL to company logo" + }, + "full_name": { + "type": "string", + "description": "Full name of primary contact" + }, + "email": { + "type": "string", + "format": "email", + "description": "Contact email" + }, + "phone": { + "type": "string", + "description": "Contact phone" + }, + "address": { + "type": "string", + "description": "Company address" + }, + "city": { + "type": "string", + "description": "City" + }, + "zip_code": { + "type": "string", + "description": "ZIP code" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID if applicable" + }, + "departments": { + "type": "array", + "description": "List of departments available for this team", + "items": { + "type": "string" + } + }, + "total_members": { + "type": "number", + "default": 0, + "description": "Total team members" + }, + "active_members": { + "type": "number", + "default": 0, + "description": "Active team members" + }, + "total_hubs": { + "type": "number", + "default": 0, + "description": "Total hubs" + }, + "favorite_staff": { + "type": "array", + "description": "Array of favorite staff IDs", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "position": { + "type": "string" + }, + "added_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "blocked_staff": { + "type": "array", + "description": "Array of blocked staff IDs", + "items": { + "type": "object", + "properties": { + "staff_id": { + "type": "string" + }, + "staff_name": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "blocked_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "favorite_staff_count": { + "type": "number", + "default": 0, + "description": "Number of favorite staff" + }, + "blocked_staff_count": { + "type": "number", + "default": 0, + "description": "Number of blocked staff" + } + }, + "required": [ + "team_name", + "owner_id", + "owner_name", + "owner_role" + ] +} \ No newline at end of file diff --git a/base44/entities/TeamHub.jsonc b/base44/entities/TeamHub.jsonc new file mode 100644 index 0000000..a26949b --- /dev/null +++ b/base44/entities/TeamHub.jsonc @@ -0,0 +1,69 @@ +{ + "name": "TeamHub", + "type": "object", + "properties": { + "team_id": { + "type": "string", + "description": "ID of the team" + }, + "hub_name": { + "type": "string", + "description": "Name of the hub/location (e.g., BVG 300)" + }, + "address": { + "type": "string", + "description": "Hub address (e.g., 300 Bayview Dr, Mountain View, CA 94043)" + }, + "city": { + "type": "string", + "description": "City" + }, + "state": { + "type": "string", + "description": "State" + }, + "zip_code": { + "type": "string", + "description": "ZIP code" + }, + "manager_name": { + "type": "string", + "description": "Hub manager name" + }, + "manager_email": { + "type": "string", + "format": "email", + "description": "Hub manager email" + }, + "departments": { + "type": "array", + "description": "Departments within this hub", + "items": { + "type": "object", + "properties": { + "department_name": { + "type": "string", + "description": "Department name (e.g., Catering FOH, Catering BOH)" + }, + "cost_center": { + "type": "string", + "description": "Cost center code" + }, + "manager_name": { + "type": "string", + "description": "Department manager" + } + } + } + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether the hub is active" + } + }, + "required": [ + "team_id", + "hub_name" + ] +} \ No newline at end of file diff --git a/base44/entities/TeamMember.jsonc b/base44/entities/TeamMember.jsonc new file mode 100644 index 0000000..16d4138 --- /dev/null +++ b/base44/entities/TeamMember.jsonc @@ -0,0 +1,66 @@ +{ + "name": "TeamMember", + "type": "object", + "properties": { + "team_id": { + "type": "string", + "description": "ID of the team this member belongs to" + }, + "member_name": { + "type": "string", + "description": "Name of the team member" + }, + "email": { + "type": "string", + "format": "email", + "description": "Member email" + }, + "phone": { + "type": "string", + "description": "Member phone" + }, + "title": { + "type": "string", + "description": "Job title" + }, + "role": { + "type": "string", + "enum": [ + "admin", + "manager", + "member", + "viewer" + ], + "description": "Role in the team" + }, + "department": { + "type": "string", + "description": "Department" + }, + "hub": { + "type": "string", + "description": "Assigned hub" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether the member is active" + }, + "permissions": { + "type": "array", + "description": "Array of permissions", + "items": { + "type": "string" + } + }, + "avatar_url": { + "type": "string", + "description": "URL to member avatar" + } + }, + "required": [ + "team_id", + "member_name", + "email" + ] +} \ No newline at end of file diff --git a/base44/entities/TeamMemberInvite.jsonc b/base44/entities/TeamMemberInvite.jsonc new file mode 100644 index 0000000..4d7046c --- /dev/null +++ b/base44/entities/TeamMemberInvite.jsonc @@ -0,0 +1,72 @@ +{ + "name": "TeamMemberInvite", + "type": "object", + "properties": { + "team_id": { + "type": "string", + "description": "ID of the team" + }, + "team_name": { + "type": "string", + "description": "Name of the team" + }, + "invite_code": { + "type": "string", + "description": "Unique invite code" + }, + "email": { + "type": "string", + "format": "email", + "description": "Email of invited person" + }, + "full_name": { + "type": "string", + "description": "Name of invited person" + }, + "role": { + "type": "string", + "enum": [ + "admin", + "manager", + "member", + "viewer" + ], + "description": "Proposed role" + }, + "invited_by": { + "type": "string", + "description": "Who sent the invite" + }, + "invite_status": { + "type": "string", + "enum": [ + "pending", + "accepted", + "expired", + "cancelled" + ], + "default": "pending", + "description": "Invitation status" + }, + "invited_date": { + "type": "string", + "format": "date-time", + "description": "When invite was sent" + }, + "accepted_date": { + "type": "string", + "format": "date-time", + "description": "When invite was accepted" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "When invite expires" + } + }, + "required": [ + "team_id", + "email", + "invited_by" + ] +} \ No newline at end of file diff --git a/base44/entities/Training.jsonc b/base44/entities/Training.jsonc new file mode 100644 index 0000000..3bcf9c1 --- /dev/null +++ b/base44/entities/Training.jsonc @@ -0,0 +1,149 @@ +{ + "name": "Training", + "type": "object", + "properties": { + "training_id": { + "type": "string", + "description": "Training record ID" + }, + "training_name": { + "type": "string", + "description": "Name of the training program" + }, + "training_type": { + "type": "string", + "enum": [ + "food_safety", + "alcohol_service", + "customer_service", + "safety", + "onboarding", + "culinary_skills", + "equipment_operation", + "compliance", + "leadership", + "other" + ], + "description": "Type of training" + }, + "description": { + "type": "string" + }, + "workforce_id": { + "type": "string", + "description": "Worker enrolled in this training" + }, + "workforce_name": { + "type": "string" + }, + "staff_id": { + "type": "string", + "description": "Staff record ID (if different from workforce)" + }, + "vendor_id": { + "type": "string", + "description": "Vendor sponsoring this training" + }, + "vendor_name": { + "type": "string" + }, + "client_id": { + "type": "string", + "description": "Client-specific training (if applicable)" + }, + "client_name": { + "type": "string" + }, + "instructor_name": { + "type": "string", + "description": "Instructor or training provider" + }, + "training_format": { + "type": "string", + "enum": [ + "in_person", + "online", + "hybrid", + "on_the_job", + "video" + ], + "default": "online" + }, + "duration_hours": { + "type": "number", + "minimum": 0, + "description": "Total training duration in hours" + }, + "enrollment_date": { + "type": "string", + "format": "date", + "description": "When worker was enrolled" + }, + "start_date": { + "type": "string", + "format": "date", + "description": "Training start date" + }, + "completion_date": { + "type": "string", + "format": "date", + "description": "Date training was completed" + }, + "expiry_date": { + "type": "string", + "format": "date", + "description": "When this training expires and needs renewal" + }, + "status": { + "type": "string", + "enum": [ + "not_started", + "enrolled", + "in_progress", + "completed", + "failed", + "expired", + "cancelled" + ], + "default": "not_started", + "description": "Training status" + }, + "score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Score achieved (if graded)" + }, + "passing_score": { + "type": "number", + "default": 70, + "description": "Minimum passing score" + }, + "certification_earned": { + "type": "string", + "description": "Name of certification earned upon completion" + }, + "certification_id": { + "type": "string", + "description": "Reference to Certification entity if one was issued" + }, + "cost": { + "type": "number", + "minimum": 0, + "description": "Cost of this training" + }, + "billable_to_client": { + "type": "boolean", + "default": false + }, + "notes": { + "type": "string" + } + }, + "required": [ + "training_name", + "training_type", + "workforce_id", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/Transportation.jsonc b/base44/entities/Transportation.jsonc new file mode 100644 index 0000000..6c46c86 --- /dev/null +++ b/base44/entities/Transportation.jsonc @@ -0,0 +1,139 @@ +{ + "name": "Transportation", + "type": "object", + "properties": { + "transport_id": { + "type": "string", + "description": "Transport record ID" + }, + "transport_type": { + "type": "string", + "enum": [ + "shuttle", + "van", + "carpool", + "bus", + "public_transit", + "rideshare", + "personal_vehicle", + "walking" + ], + "description": "Mode of transportation" + }, + "shift_id": { + "type": "string", + "description": "Shift this transport serves" + }, + "event_id": { + "type": "string", + "description": "Event this transport serves" + }, + "workforce_id": { + "type": "string", + "description": "Worker being transported (if individual)" + }, + "workforce_name": { + "type": "string" + }, + "vendor_id": { + "type": "string", + "description": "Vendor providing/arranging transport" + }, + "vendor_name": { + "type": "string" + }, + "pickup_location": { + "type": "string", + "description": "Pickup address or landmark" + }, + "dropoff_location": { + "type": "string", + "description": "Dropoff location (typically the site/client location)" + }, + "site_id": { + "type": "string", + "description": "Destination Site ID" + }, + "client_id": { + "type": "string", + "description": "Client/Business ID at the destination" + }, + "client_name": { + "type": "string" + }, + "scheduled_pickup_time": { + "type": "string", + "format": "date-time", + "description": "Scheduled pickup time" + }, + "scheduled_dropoff_time": { + "type": "string", + "format": "date-time", + "description": "Scheduled dropoff time" + }, + "actual_pickup_time": { + "type": "string", + "format": "date-time" + }, + "actual_dropoff_time": { + "type": "string", + "format": "date-time" + }, + "driver_name": { + "type": "string", + "description": "Driver name (if applicable)" + }, + "driver_phone": { + "type": "string" + }, + "vehicle_identifier": { + "type": "string", + "description": "License plate or vehicle ID" + }, + "capacity": { + "type": "number", + "description": "Number of workers this transport can carry" + }, + "passenger_count": { + "type": "number", + "default": 0, + "description": "Actual number of workers transported" + }, + "cost_per_trip": { + "type": "number", + "minimum": 0, + "description": "Cost per trip" + }, + "billable_to_client": { + "type": "boolean", + "default": false, + "description": "Whether transport cost is billed to client" + }, + "status": { + "type": "string", + "enum": [ + "scheduled", + "in_progress", + "completed", + "cancelled", + "no_show", + "delayed" + ], + "default": "scheduled", + "description": "Transport status" + }, + "distance_miles": { + "type": "number", + "description": "Distance in miles" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "transport_type", + "pickup_location", + "dropoff_location", + "status" + ] +} \ No newline at end of file diff --git a/base44/entities/User.jsonc b/base44/entities/User.jsonc new file mode 100644 index 0000000..72d5675 --- /dev/null +++ b/base44/entities/User.jsonc @@ -0,0 +1,185 @@ +{ + "name": "User", + "type": "object", + "properties": { + "full_name": { + "type": "string", + "description": "Full name of the user" + }, + "user_role": { + "type": "string", + "enum": [ + "admin", + "procurement", + "operator", + "sector", + "client", + "vendor", + "workforce" + ], + "description": "User's role in the system" + }, + "company_name": { + "type": "string", + "description": "Company or organization name" + }, + "profile_picture": { + "type": "string", + "description": "URL to profile picture" + }, + "phone": { + "type": "string", + "description": "Phone number" + }, + "address": { + "type": "string", + "description": "Address" + }, + "preferred_vendor_id": { + "type": "string", + "description": "ID of the client's preferred/default vendor" + }, + "preferred_vendor_name": { + "type": "string", + "description": "Name of the client's preferred vendor" + }, + "backup_vendor_ids": { + "type": "array", + "description": "List of backup vendor IDs", + "items": { + "type": "string" + } + }, + "dashboard_layout": { + "type": "object", + "description": "User's customized dashboard layout preferences (legacy, kept for backward compatibility)", + "properties": { + "widgets": { + "type": "array", + "description": "Ordered list of visible widgets", + "items": { + "type": "string" + } + }, + "hidden_widgets": { + "type": "array", + "description": "List of hidden widgets", + "items": { + "type": "string" + } + }, + "layout_version": { + "type": "string", + "description": "Layout version for migration" + } + } + }, + "dashboard_layout_client": { + "type": "object", + "description": "Client dashboard layout", + "properties": { + "widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "hidden_widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "layout_version": { + "type": "string" + } + } + }, + "dashboard_layout_vendor": { + "type": "object", + "description": "Vendor dashboard layout", + "properties": { + "widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "hidden_widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "layout_version": { + "type": "string" + } + } + }, + "dashboard_layout_operator": { + "type": "object", + "description": "Operator dashboard layout", + "properties": { + "widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "hidden_widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "layout_version": { + "type": "string" + } + } + }, + "dashboard_layout_workforce": { + "type": "object", + "description": "Workforce dashboard layout", + "properties": { + "widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "hidden_widgets": { + "type": "array", + "items": { + "type": "string" + } + }, + "layout_version": { + "type": "string" + } + } + }, + "preferences": { + "type": "object", + "description": "User preferences and settings", + "properties": { + "theme": { + "type": "string", + "enum": [ + "light", + "dark" + ], + "default": "light" + }, + "notifications_enabled": { + "type": "boolean", + "default": true + }, + "email_notifications": { + "type": "boolean", + "default": true + } + } + } + }, + "required": [] +} \ No newline at end of file diff --git a/base44/entities/Vendor.jsonc b/base44/entities/Vendor.jsonc new file mode 100644 index 0000000..9f09aba --- /dev/null +++ b/base44/entities/Vendor.jsonc @@ -0,0 +1,217 @@ +{ + "name": "Vendor", + "type": "object", + "properties": { + "vendor_number": { + "type": "string", + "description": "Vendor Number format VN-#### (auto-generated)", + "pattern": "^VN-[0-9]{4}$" + }, + "legal_name": { + "type": "string", + "description": "Legal business name" + }, + "doing_business_as": { + "type": "string", + "description": "DBA / Trade name" + }, + "region": { + "type": "string", + "enum": [ + "National", + "Bay Area", + "Southern California", + "Northern California", + "West", + "East", + "Midwest", + "South" + ], + "description": "Geographic region vendor operates in" + }, + "state": { + "type": "string", + "description": "Primary state (or 'Multiple' for multi-state)" + }, + "city": { + "type": "string", + "description": "Primary city" + }, + "service_specialty": { + "type": "string", + "description": "Service specialty (e.g., Event Staffing, Full Service Events, On-Demand Gig Platform)" + }, + "workforce_count": { + "type": "number", + "description": "Total workforce/staff count available" + }, + "platform_type": { + "type": "string", + "enum": [ + "Full Platform", + "Building platform (KROW)", + "Partial Tech", + "Traditional" + ], + "description": "Technology/platform integration level" + }, + "tax_id": { + "type": "string", + "description": "Federal Tax ID / EIN" + }, + "business_type": { + "type": "string", + "enum": [ + "Corporation", + "LLC", + "Partnership", + "Sole Proprietorship" + ], + "description": "Business entity type" + }, + "primary_contact_name": { + "type": "string", + "description": "Primary contact person" + }, + "primary_contact_email": { + "type": "string", + "format": "email", + "description": "Primary contact email" + }, + "primary_contact_phone": { + "type": "string", + "description": "Primary contact phone" + }, + "billing_address": { + "type": "string", + "description": "Billing address" + }, + "service_address": { + "type": "string", + "description": "Service/office address" + }, + "coverage_regions": { + "type": "array", + "description": "Geographic regions vendor can service", + "items": { + "type": "string" + } + }, + "eligible_roles": { + "type": "array", + "description": "Roles/positions vendor can provide", + "items": { + "type": "string" + } + }, + "insurance_certificate": { + "type": "string", + "description": "URL to insurance certificate" + }, + "insurance_expiry": { + "type": "string", + "format": "date", + "description": "Insurance expiration date" + }, + "w9_document": { + "type": "string", + "description": "URL to W9 form" + }, + "coi_document": { + "type": "string", + "description": "URL to Certificate of Insurance" + }, + "compliance_package_id": { + "type": "string", + "description": "Reference to compliance package" + }, + "performance_scorecard_id": { + "type": "string", + "description": "Reference to performance scorecard" + }, + "performance_requirements": { + "type": "array", + "description": "Customized KPIs and service standards the vendor must meet", + "items": { + "type": "object", + "properties": { + "metric": { + "type": "string" + }, + "target": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "default": true + } + } + } + }, + "compliance_requirements": { + "type": "array", + "description": "Customized compliance and attestation requirements the vendor must acknowledge", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "required": { + "type": "boolean", + "default": true + } + } + } + }, + "vendor_fee_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Vendor admin fee percentage set by procurement" + }, + "approval_status": { + "type": "string", + "enum": [ + "pending", + "approved", + "suspended", + "terminated" + ], + "default": "pending", + "description": "Vendor approval status" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "Date vendor was approved" + }, + "approved_by": { + "type": "string", + "description": "User who approved vendor" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is vendor currently active" + }, + "notes": { + "type": "string", + "description": "Internal notes about vendor" + } + }, + "required": [ + "legal_name", + "vendor_number", + "primary_contact_email" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorDefaultSettings.jsonc b/base44/entities/VendorDefaultSettings.jsonc new file mode 100644 index 0000000..81b61b4 --- /dev/null +++ b/base44/entities/VendorDefaultSettings.jsonc @@ -0,0 +1,31 @@ +{ + "name": "VendorDefaultSettings", + "type": "object", + "properties": { + "vendor_name": { + "type": "string", + "description": "Name of the vendor" + }, + "default_markup_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Default markup percentage for this vendor" + }, + "default_vendor_fee_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Default vendor fee percentage for this vendor" + }, + "notes": { + "type": "string", + "description": "Additional notes about vendor defaults" + } + }, + "required": [ + "vendor_name", + "default_markup_percentage", + "default_vendor_fee_percentage" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorDocumentReview.jsonc b/base44/entities/VendorDocumentReview.jsonc new file mode 100644 index 0000000..49b12d4 --- /dev/null +++ b/base44/entities/VendorDocumentReview.jsonc @@ -0,0 +1,147 @@ +{ + "name": "VendorDocumentReview", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "document_type": { + "type": "string", + "enum": [ + "Contract", + "NDA", + "W9", + "COI", + "Insurance", + "Service Agreement", + "Other" + ], + "description": "Type of document being reviewed" + }, + "document_url": { + "type": "string", + "description": "URL to the document PDF" + }, + "document_name": { + "type": "string", + "description": "Name of the document" + }, + "review_notes": { + "type": "string", + "description": "Notes taken by vendor during review" + }, + "annotations": { + "type": "array", + "description": "Document annotations (highlights, comments, drawings)", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "highlight", + "comment", + "question", + "emoji", + "signature" + ] + }, + "page_number": { + "type": "number" + }, + "selected_text": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "emoji": { + "type": "string" + }, + "color": { + "type": "string" + }, + "position": { + "type": "object", + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + } + }, + "created_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "questions": { + "type": "array", + "description": "Questions or concerns about the document", + "items": { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "page_number": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "open", + "answered", + "resolved" + ] + }, + "answer": { + "type": "string" + } + } + } + }, + "reviewed": { + "type": "boolean", + "default": false, + "description": "Has vendor reviewed this document" + }, + "reviewed_date": { + "type": "string", + "format": "date-time", + "description": "When vendor marked as reviewed" + }, + "acknowledged": { + "type": "boolean", + "default": false, + "description": "Has vendor acknowledged/accepted the document" + }, + "acknowledged_date": { + "type": "string", + "format": "date-time", + "description": "When vendor acknowledged the document" + }, + "time_spent_minutes": { + "type": "number", + "description": "Total time spent reviewing (in minutes)" + } + }, + "required": [ + "vendor_name", + "document_type", + "document_url", + "document_name" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorInvite.jsonc b/base44/entities/VendorInvite.jsonc new file mode 100644 index 0000000..c24fad9 --- /dev/null +++ b/base44/entities/VendorInvite.jsonc @@ -0,0 +1,112 @@ +{ + "name": "VendorInvite", + "type": "object", + "properties": { + "invite_code": { + "type": "string", + "description": "Unique invite code (e.g., INV-XXXX)" + }, + "company_name": { + "type": "string", + "description": "Vendor company name" + }, + "primary_contact_name": { + "type": "string", + "description": "Point of contact name" + }, + "primary_contact_email": { + "type": "string", + "format": "email", + "description": "Point of contact email" + }, + "vendor_admin_fee": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Vendor admin fee percentage set by procurement" + }, + "performance_requirements": { + "type": "array", + "description": "Customized KPIs and service standards the vendor must meet", + "items": { + "type": "object", + "properties": { + "metric": { + "type": "string" + }, + "target": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "default": true + } + } + } + }, + "compliance_requirements": { + "type": "array", + "description": "Customized compliance and attestation requirements the vendor must acknowledge", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "required": { + "type": "boolean", + "default": true + } + } + } + }, + "invited_by": { + "type": "string", + "description": "Email of procurement admin who sent invite" + }, + "invite_status": { + "type": "string", + "enum": [ + "pending", + "accepted", + "completed", + "expired" + ], + "default": "pending", + "description": "Status of the invite" + }, + "invite_sent_date": { + "type": "string", + "format": "date-time", + "description": "When the invite was sent" + }, + "invite_accepted_date": { + "type": "string", + "format": "date-time", + "description": "When vendor accepted/started onboarding" + }, + "vendor_id": { + "type": "string", + "description": "Vendor ID once they complete onboarding" + }, + "notes": { + "type": "string", + "description": "Internal notes about this invite" + } + }, + "required": [ + "company_name", + "primary_contact_email", + "vendor_admin_fee", + "invited_by" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorNetworkApproval.jsonc b/base44/entities/VendorNetworkApproval.jsonc new file mode 100644 index 0000000..1754560 --- /dev/null +++ b/base44/entities/VendorNetworkApproval.jsonc @@ -0,0 +1,119 @@ +{ + "name": "VendorNetworkApproval", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "ID of the approved vendor" + }, + "vendor_name": { + "type": "string", + "description": "Name of the vendor" + }, + "enterprise_network": { + "type": "string", + "enum": [ + "Compass", + "Aramark", + "Sodexo", + "Foodbuy", + "Bon App\u00e9tit", + "Eurest" + ], + "description": "Enterprise network vendor is approved for" + }, + "approval_status": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected", + "suspended" + ], + "default": "pending", + "description": "Current approval status" + }, + "approved_by": { + "type": "string", + "description": "Procurement manager who approved" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "Date of approval" + }, + "rate_book_id": { + "type": "string", + "description": "Associated rate book ID for this network" + }, + "regions_approved": { + "type": "array", + "description": "Geographic regions vendor is approved to serve", + "items": { + "type": "string" + } + }, + "categories_approved": { + "type": "array", + "description": "Service categories vendor is approved for", + "items": { + "type": "string" + } + }, + "compliance_documents": { + "type": "array", + "description": "Required compliance documents", + "items": { + "type": "object", + "properties": { + "document_type": { + "type": "string" + }, + "document_url": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + } + } + }, + "restrictions": { + "type": "object", + "description": "Any restrictions on vendor's approved status", + "properties": { + "max_order_size": { + "type": "number" + }, + "max_concurrent_events": { + "type": "number" + }, + "excluded_clients": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "valid_from": { + "type": "string", + "format": "date", + "description": "Approval start date" + }, + "valid_until": { + "type": "string", + "format": "date", + "description": "Approval expiration date" + }, + "notes": { + "type": "string", + "description": "Additional notes about approval" + } + }, + "required": [ + "vendor_name", + "enterprise_network", + "approval_status" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorPartnerLink.jsonc b/base44/entities/VendorPartnerLink.jsonc new file mode 100644 index 0000000..ebc5275 --- /dev/null +++ b/base44/entities/VendorPartnerLink.jsonc @@ -0,0 +1,40 @@ +{ + "name": "VendorPartnerLink", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "partner_id": { + "type": "string", + "description": "Partner ID" + }, + "partner_name": { + "type": "string", + "description": "Partner name" + }, + "assigned_by": { + "type": "string", + "description": "Who assigned this link" + }, + "assigned_date": { + "type": "string", + "format": "date", + "description": "When the link was created" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is this link active" + } + }, + "required": [ + "vendor_id", + "partner_id" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorRate.jsonc b/base44/entities/VendorRate.jsonc new file mode 100644 index 0000000..7be82f3 --- /dev/null +++ b/base44/entities/VendorRate.jsonc @@ -0,0 +1,248 @@ +{ + "name": "VendorRate", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "ID of the vendor this rate belongs to" + }, + "vendor_name": { + "type": "string", + "description": "Name of the vendor" + }, + "rate_book_name": { + "type": "string", + "description": "Name of the rate book (e.g., 'Default', 'Compass Approved', 'Google Caf\u00e9 7')" + }, + "rate_book_type": { + "type": "string", + "enum": [ + "default", + "enterprise_network", + "client_specific" + ], + "description": "Type of rate book: default (vendor's own rates), enterprise_network (Compass/Aramark approved), or client_specific (negotiated)" + }, + "enterprise_network": { + "type": "string", + "enum": [ + "Compass", + "Aramark", + "Sodexo", + "Foodbuy", + "Bon App\u00e9tit", + "Eurest", + "None" + ], + "description": "Enterprise network this rate book belongs to (if applicable)" + }, + "is_approved_rate": { + "type": "boolean", + "default": false, + "description": "Whether this is an approved procurement rate (locked for vendors)" + }, + "approved_by_procurement": { + "type": "string", + "description": "Name of procurement manager who approved these rates" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "Date rates were approved" + }, + "client_id": { + "type": "string", + "description": "Specific client ID if this is a client-specific rate book" + }, + "client_name": { + "type": "string", + "description": "Specific client name if this is a client-specific rate book" + }, + "category": { + "type": "string", + "enum": [ + "Kitchen and Culinary", + "Concessions", + "Facilities", + "Bartending", + "Security", + "Event Staff", + "Management", + "Technical", + "Other" + ], + "description": "Service category" + }, + "role_name": { + "type": "string", + "description": "Name of the role/position" + }, + "region": { + "type": "string", + "description": "Geographic region (e.g., 'Bay Area', 'LA', 'National')" + }, + "employee_wage": { + "type": "number", + "minimum": 0, + "description": "Employee base wage per hour (must be >= minimum wage)" + }, + "overtime_rate": { + "type": "number", + "minimum": 0, + "description": "Overtime rate (typically 1.5x base wage)" + }, + "double_time_rate": { + "type": "number", + "minimum": 0, + "description": "Double-time rate (typically 2x base wage)" + }, + "travel_rate": { + "type": "number", + "minimum": 0, + "description": "Travel time rate per hour (if applicable)" + }, + "markup_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Markup percentage on employee wage" + }, + "vendor_fee_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Vendor fee as percentage on (wage + markup)" + }, + "client_rate": { + "type": "number", + "minimum": 0, + "description": "Final rate charged to client per hour" + }, + "approved_cap_rate": { + "type": "number", + "description": "Maximum rate approved by enterprise network (vendors cannot exceed this)" + }, + "discount_from_approved": { + "type": "number", + "description": "Dollar amount discount from approved cap rate (if vendor is offering lower rate)" + }, + "discount_percentage": { + "type": "number", + "description": "Percentage discount from approved cap rate" + }, + "is_discounted": { + "type": "boolean", + "default": false, + "description": "Whether vendor is offering a discount below approved rate" + }, + "negotiation_allowed": { + "type": "boolean", + "default": true, + "description": "Whether clients can request rate negotiations" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether this rate is currently active" + }, + "is_editable_by_vendor": { + "type": "boolean", + "default": true, + "description": "Whether vendor can edit this rate (false for locked procurement rates)" + }, + "minimum_wage_compliance": { + "type": "boolean", + "description": "Whether this rate meets minimum wage requirements" + }, + "market_comparison": { + "type": "object", + "description": "Market comparison data", + "properties": { + "market_average": { + "type": "number", + "description": "Market average for this role" + }, + "market_position": { + "type": "string", + "enum": [ + "below_market", + "at_market", + "above_market", + "significantly_above" + ], + "description": "How this rate compares to market" + }, + "competitiveness_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Competitiveness score (0-100)" + }, + "market_warning": { + "type": "string", + "description": "Warning if rate is significantly above or below market" + } + } + }, + "compliance": { + "type": "object", + "description": "Compliance information", + "properties": { + "csta_compliant": { + "type": "boolean", + "default": false, + "description": "California Staffing Agency compliance" + }, + "minimum_wage_verified": { + "type": "boolean", + "default": false, + "description": "Minimum wage verification status" + }, + "compliance_verified_date": { + "type": "string", + "format": "date", + "description": "Date compliance was last verified" + } + } + }, + "shift_type": { + "type": "string", + "enum": [ + "regular", + "night", + "weekend", + "holiday", + "premium" + ], + "default": "regular", + "description": "Type of shift this rate applies to" + }, + "valid_from": { + "type": "string", + "format": "date", + "description": "Date this rate becomes valid" + }, + "valid_until": { + "type": "string", + "format": "date", + "description": "Date this rate expires" + }, + "notes": { + "type": "string", + "description": "Additional notes about this rate" + }, + "internal_notes": { + "type": "string", + "description": "Internal vendor notes (not visible to clients)" + } + }, + "required": [ + "vendor_name", + "rate_book_name", + "rate_book_type", + "category", + "role_name", + "employee_wage", + "client_rate" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorRateBook.jsonc b/base44/entities/VendorRateBook.jsonc new file mode 100644 index 0000000..8098b81 --- /dev/null +++ b/base44/entities/VendorRateBook.jsonc @@ -0,0 +1,113 @@ +{ + "name": "VendorRateBook", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "ID of the vendor who owns this rate book" + }, + "vendor_name": { + "type": "string", + "description": "Name of the vendor" + }, + "rate_book_name": { + "type": "string", + "description": "Name of the rate book (e.g., 'Default Rates', 'Compass Network', 'Google Special')" + }, + "rate_book_type": { + "type": "string", + "enum": [ + "default", + "enterprise_network", + "client_specific", + "premium", + "seasonal" + ], + "description": "Type of rate book" + }, + "enterprise_network": { + "type": "string", + "enum": [ + "Compass", + "Aramark", + "Sodexo", + "Foodbuy", + "Bon App\u00e9tit", + "Eurest", + "None" + ], + "description": "Enterprise network if applicable" + }, + "is_approved_by_procurement": { + "type": "boolean", + "default": false, + "description": "Whether this rate book is approved by procurement" + }, + "approved_by": { + "type": "string", + "description": "Name of person who approved this rate book" + }, + "approved_date": { + "type": "string", + "format": "date", + "description": "Date of approval" + }, + "is_locked": { + "type": "boolean", + "default": false, + "description": "Whether rates in this book are locked (cannot be edited by vendor)" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Whether this rate book is currently active" + }, + "client_assignments": { + "type": "array", + "description": "Clients assigned to use this rate book", + "items": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "client_name": { + "type": "string" + }, + "assigned_date": { + "type": "string", + "format": "date-time" + } + } + } + }, + "valid_from": { + "type": "string", + "format": "date", + "description": "Start date for rate book validity" + }, + "valid_until": { + "type": "string", + "format": "date", + "description": "End date for rate book validity" + }, + "description": { + "type": "string", + "description": "Description of this rate book" + }, + "total_roles": { + "type": "number", + "default": 0, + "description": "Total number of roles in this rate book" + }, + "notes": { + "type": "string", + "description": "Additional notes" + } + }, + "required": [ + "vendor_name", + "rate_book_name", + "rate_book_type" + ] +} \ No newline at end of file diff --git a/base44/entities/VendorSectorLink.jsonc b/base44/entities/VendorSectorLink.jsonc new file mode 100644 index 0000000..16bf651 --- /dev/null +++ b/base44/entities/VendorSectorLink.jsonc @@ -0,0 +1,40 @@ +{ + "name": "VendorSectorLink", + "type": "object", + "properties": { + "vendor_id": { + "type": "string", + "description": "Vendor ID" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "sector_id": { + "type": "string", + "description": "Sector ID" + }, + "sector_name": { + "type": "string", + "description": "Sector name" + }, + "assigned_by": { + "type": "string", + "description": "Who assigned this link" + }, + "assigned_date": { + "type": "string", + "format": "date", + "description": "When the link was created" + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is this link active" + } + }, + "required": [ + "vendor_id", + "sector_id" + ] +} \ No newline at end of file diff --git a/base44/entities/WorkerAvailability.jsonc b/base44/entities/WorkerAvailability.jsonc new file mode 100644 index 0000000..101c198 --- /dev/null +++ b/base44/entities/WorkerAvailability.jsonc @@ -0,0 +1,129 @@ +{ + "name": "WorkerAvailability", + "type": "object", + "properties": { + "staff_id": { + "type": "string", + "description": "Reference to Staff entity" + }, + "staff_name": { + "type": "string", + "description": "Staff member name" + }, + "availability_status": { + "type": "string", + "enum": [ + "CONFIRMED_AVAILABLE", + "UNKNOWN", + "BLOCKED" + ], + "default": "UNKNOWN", + "description": "Current availability status" + }, + "predicted_availability_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 50, + "description": "ML/rules-based prediction of availability (0-100)" + }, + "need_work_index": { + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 0, + "description": "How much worker needs hours (0-100)" + }, + "scheduled_hours_this_period": { + "type": "number", + "default": 0, + "description": "Hours scheduled in current period" + }, + "desired_hours_this_period": { + "type": "number", + "default": 40, + "description": "Hours worker wants in current period" + }, + "last_shift_date": { + "type": "string", + "format": "date", + "description": "Date of last completed shift" + }, + "acceptance_rate": { + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 0, + "description": "Historical acceptance rate percentage" + }, + "utilization_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "default": 0, + "description": "Scheduled hours / desired hours * 100" + }, + "days_since_last_shift": { + "type": "number", + "default": 0, + "description": "Days since last shift" + }, + "total_shifts_this_period": { + "type": "number", + "default": 0, + "description": "Number of shifts in current period" + }, + "available_dates": { + "type": "array", + "description": "Dates worker is confirmed available", + "items": { + "type": "string", + "format": "date" + } + }, + "blocked_dates": { + "type": "array", + "description": "Dates worker is blocked/unavailable", + "items": { + "type": "string", + "format": "date" + } + }, + "preferences": { + "type": "object", + "description": "Worker preferences", + "properties": { + "preferred_days": { + "type": "array", + "items": { + "type": "string" + } + }, + "preferred_shift_types": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Morning", + "Day", + "Evening", + "Night", + "Overnight" + ] + } + }, + "max_commute_miles": { + "type": "number" + }, + "wants_more_hours": { + "type": "boolean", + "default": false + } + } + } + }, + "required": [ + "staff_id", + "staff_name" + ] +} \ No newline at end of file diff --git a/base44/entities/WorkerReputationProfile.jsonc b/base44/entities/WorkerReputationProfile.jsonc new file mode 100644 index 0000000..a9b91de --- /dev/null +++ b/base44/entities/WorkerReputationProfile.jsonc @@ -0,0 +1,99 @@ +{ + "name": "WorkerReputationProfile", + "type": "object", + "properties": { + "worker_id": { + "type": "string", + "description": "Linked workforce member ID" + }, + "worker_name": { + "type": "string", + "description": "Full name" + }, + "total_shifts": { + "type": "number", + "default": 0, + "description": "Total verified completed shifts across all agencies" + }, + "no_shows": { + "type": "number", + "default": 0 + }, + "late_arrivals": { + "type": "number", + "default": 0 + }, + "last_minute_cancels": { + "type": "number", + "default": 0 + }, + "attendance_rate": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Attendance percentage (0-100)" + }, + "avg_client_rating": { + "type": "number", + "minimum": 0, + "maximum": 5 + }, + "avg_supervisor_rating": { + "type": "number", + "minimum": 0, + "maximum": 5 + }, + "verified_skills": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Verified skill/role tags" + }, + "verified_certifications": { + "type": "array", + "items": { + "type": "string" + } + }, + "contributing_agencies": { + "type": "number", + "default": 0, + "description": "Number of agencies that have contributed data" + }, + "trust_score": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Computed KROW trust score (0-100)" + }, + "trust_tier": { + "type": "string", + "enum": [ + "Bronze", + "Silver", + "Gold", + "Platinum" + ], + "default": "Bronze" + }, + "opted_in": { + "type": "boolean", + "default": true, + "description": "Worker has opted into the reputation network" + }, + "profile_visibility": { + "type": "string", + "enum": [ + "public", + "network_only", + "private" + ], + "default": "network_only" + } + }, + "required": [ + "worker_id", + "worker_name" + ] +} \ No newline at end of file diff --git a/base44/entities/Workforce.jsonc b/base44/entities/Workforce.jsonc new file mode 100644 index 0000000..4a63fbd --- /dev/null +++ b/base44/entities/Workforce.jsonc @@ -0,0 +1,244 @@ +{ + "name": "Workforce", + "type": "object", + "properties": { + "workforce_number": { + "type": "string", + "description": "Worker Number format WF-#### (auto-generated)", + "pattern": "^WF-[0-9]{4,6}$" + }, + "vendor_id": { + "type": "string", + "description": "Vendor who manages this worker" + }, + "vendor_name": { + "type": "string", + "description": "Vendor name" + }, + "first_name": { + "type": "string", + "description": "Worker first name" + }, + "last_name": { + "type": "string", + "description": "Worker last name" + }, + "email": { + "type": "string", + "format": "email", + "description": "Worker email" + }, + "phone": { + "type": "string", + "description": "Worker phone" + }, + "address": { + "type": "string", + "description": "Worker address" + }, + "city": { + "type": "string", + "description": "City" + }, + "state": { + "type": "string", + "description": "State" + }, + "zip_code": { + "type": "string", + "description": "ZIP code" + }, + "date_of_birth": { + "type": "string", + "format": "date", + "description": "Date of birth" + }, + "ssn_last_four": { + "type": "string", + "description": "Last 4 digits of SSN", + "pattern": "^[0-9]{4}$" + }, + "employment_type": { + "type": "string", + "enum": [ + "W2", + "1099", + "Temporary", + "Contract" + ], + "description": "Employment classification" + }, + "skills": { + "type": "array", + "description": "Worker skills", + "items": { + "type": "string" + } + }, + "roles_qualified": { + "type": "array", + "description": "Roles worker is qualified for", + "items": { + "type": "string" + } + }, + "certifications": { + "type": "array", + "description": "Certifications", + "items": { + "type": "object", + "properties": { + "cert_name": { + "type": "string" + }, + "cert_number": { + "type": "string" + }, + "issued_date": { + "type": "string", + "format": "date" + }, + "expiry_date": { + "type": "string", + "format": "date" + }, + "issuer": { + "type": "string" + }, + "document_url": { + "type": "string" + } + } + } + }, + "background_check_status": { + "type": "string", + "enum": [ + "Pending", + "Cleared", + "Failed", + "Expired" + ], + "description": "Background check status" + }, + "background_check_date": { + "type": "string", + "format": "date", + "description": "Background check completion date" + }, + "drug_test_status": { + "type": "string", + "enum": [ + "Pending", + "Passed", + "Failed", + "Expired" + ], + "description": "Drug test status" + }, + "drug_test_date": { + "type": "string", + "format": "date", + "description": "Drug test date" + }, + "reliability_index": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Reliability score (0-100)" + }, + "total_assignments": { + "type": "number", + "default": 0, + "description": "Total assignments completed" + }, + "cancelled_assignments": { + "type": "number", + "default": 0, + "description": "Cancelled assignments" + }, + "no_shows": { + "type": "number", + "default": 0, + "description": "No-show count" + }, + "average_rating": { + "type": "number", + "minimum": 0, + "maximum": 5, + "description": "Average performance rating" + }, + "languages": { + "type": "array", + "description": "Languages spoken", + "items": { + "type": "string" + } + }, + "availability": { + "type": "object", + "description": "Worker availability", + "properties": { + "monday": { + "type": "boolean" + }, + "tuesday": { + "type": "boolean" + }, + "wednesday": { + "type": "boolean" + }, + "thursday": { + "type": "boolean" + }, + "friday": { + "type": "boolean" + }, + "saturday": { + "type": "boolean" + }, + "sunday": { + "type": "boolean" + }, + "shift_preferences": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "Morning", + "Day", + "Evening", + "Night", + "Overnight" + ] + } + } + } + }, + "is_active": { + "type": "boolean", + "default": true, + "description": "Is worker active" + }, + "hire_date": { + "type": "string", + "format": "date", + "description": "Date worker was hired" + }, + "termination_date": { + "type": "string", + "format": "date", + "description": "Termination date if applicable" + }, + "notes": { + "type": "string", + "description": "Internal notes" + } + }, + "required": [ + "vendor_id", + "first_name", + "last_name", + "workforce_number" + ] +} \ No newline at end of file diff --git a/base44/entities/WorkforceEvent.jsonc b/base44/entities/WorkforceEvent.jsonc new file mode 100644 index 0000000..5b354b4 --- /dev/null +++ b/base44/entities/WorkforceEvent.jsonc @@ -0,0 +1,134 @@ +{ + "name": "WorkforceEvent", + "type": "object", + "properties": { + "event_id": { + "type": "string", + "description": "Unique event identifier (EVT-timestamp-random)" + }, + "event_type": { + "type": "string", + "enum": [ + "shift.completed", + "shift.created", + "shift.cancelled", + "shift.no_show", + "order.created", + "order.updated", + "order.cancelled", + "order.filled", + "assignment.created", + "assignment.confirmed", + "assignment.completed", + "assignment.cancelled", + "invoice.created", + "invoice.approved", + "invoice.paid", + "invoice.overdue", + "vendor.rate_changed", + "vendor.onboarded", + "vendor.compliance_updated", + "worker.hired", + "worker.availability_changed", + "worker.certification_expired", + "worker.clock_in", + "worker.clock_out", + "budget.threshold_exceeded", + "compliance.flagged", + "system.prediction", + "system.anomaly_detected" + ], + "description": "Type of workforce event" + }, + "severity": { + "type": "string", + "enum": [ + "info", + "warning", + "critical" + ], + "default": "info" + }, + "actor_type": { + "type": "string", + "enum": [ + "worker", + "vendor", + "manager", + "system", + "agent", + "client" + ], + "description": "Who or what triggered the event" + }, + "actor_id": { + "type": "string", + "description": "ID of the actor" + }, + "actor_name": { + "type": "string", + "description": "Name of the actor" + }, + "subject_entity_type": { + "type": "string", + "description": "Type of entity the event is about (Order, Assignment, Invoice, etc.)" + }, + "subject_entity_id": { + "type": "string", + "description": "ID of the subject entity" + }, + "subject_krow_id": { + "type": "string", + "description": "KROW universal ID of the subject" + }, + "context_summary": { + "type": "string", + "description": "Human-readable summary of the event" + }, + "related_entities": { + "type": "array", + "description": "Related entity references for graph traversal", + "items": { + "type": "object", + "properties": { + "entity_type": { + "type": "string" + }, + "entity_id": { + "type": "string" + }, + "relationship": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Event-specific payload data", + "additionalProperties": true + }, + "reasoning_triggered": { + "type": "boolean", + "default": false, + "description": "Whether the reasoning engine has processed this event" + }, + "memory_id": { + "type": "string", + "description": "ID of the OperationalMemory record created from reasoning about this event" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Searchable tags (e.g., 'overtime', 'shortage', 'compliance')" + } + }, + "required": [ + "event_id", + "event_type", + "subject_entity_type", + "subject_entity_id" + ] +} \ No newline at end of file diff --git a/base44/functions/fillEscalationMonitor/entry.ts b/base44/functions/fillEscalationMonitor/entry.ts new file mode 100644 index 0000000..cf5f3db --- /dev/null +++ b/base44/functions/fillEscalationMonitor/entry.ts @@ -0,0 +1,125 @@ +import { createClientFromRequest } from 'npm:@base44/sdk@0.8.23'; + +/** + * Fill Escalation Monitor + * Runs every 15 minutes. Detects events at risk of not being filled + * and creates escalation alerts in ActivityLog. + * + * Fill probability formula: + * score = (assigned / requested) * 60 + * + timeBuffer * 20 (more time = more chance to fill) + * + dayOfWeek * 20 (based on historical fill rate for that day) + * + * If fillProbability < 60% → escalation alert + */ + +Deno.serve(async (req) => { + const base44 = createClientFromRequest(req); + + // Allow scheduled/service calls without user auth + const now = new Date(); + const in24h = new Date(now.getTime() + 24 * 60 * 60 * 1000); + const in4h = new Date(now.getTime() + 4 * 60 * 60 * 1000); + + // Fetch all upcoming active events + const allEvents = await base44.asServiceRole.entities.Event.list(); + const upcoming = allEvents.filter(e => { + if (!e.date) return false; + const eventDate = new Date(e.date); + return eventDate > now && eventDate <= in24h && + ["Active", "Pending", "Confirmed", "Draft"].includes(e.status); + }); + + // Historical fill rate by day of week + const completed = allEvents.filter(e => e.status === "Completed" && e.date); + const dayFillRate = Array(7).fill(null).map((_, dow) => { + const dayEvents = completed.filter(e => new Date(e.date).getDay() === dow); + if (dayEvents.length === 0) return 0.75; // default 75% + const filled = dayEvents.filter(e => (e.assigned_staff?.length || 0) >= (e.requested || 1)); + return filled.length / dayEvents.length; + }); + + const escalations = []; + const alerts = []; + + for (const event of upcoming) { + const assigned = event.assigned_staff?.length || 0; + const requested = event.requested || 0; + if (requested === 0) continue; + + const fillRatio = assigned / requested; + const eventDate = new Date(event.date); + const hoursUntil = (eventDate - now) / (1000 * 60 * 60); + const dow = eventDate.getDay(); + + // Time buffer score: 0 = within 2h (critical), 1 = 24h out (comfortable) + const timeBuffer = Math.min(hoursUntil / 24, 1); + + // Fill probability 0-100 + const fillProbability = Math.round( + fillRatio * 60 + + timeBuffer * 20 + + dayFillRate[dow] * 20 + ); + + const isCritical = hoursUntil <= 4 && fillRatio < 1; + const isAtRisk = fillProbability < 60; + + if (isCritical || isAtRisk) { + escalations.push({ + event_id: event.id, + event_name: event.event_name, + hours_until: Math.round(hoursUntil), + fill_ratio: fillRatio, + fill_probability: fillProbability, + assigned, + requested, + is_critical: isCritical, + }); + + // Create ActivityLog alert (avoid duplicates — check if one exists in last 2h) + const existingAlerts = await base44.asServiceRole.entities.ActivityLog.filter({ + related_entity_id: event.id, + activity_type: "event_updated", + }); + + const recentAlert = existingAlerts.find(a => { + const created = new Date(a.created_date); + return (now - created) < 2 * 60 * 60 * 1000; // within 2h + }); + + if (!recentAlert) { + const severity = isCritical ? "🚨 CRITICAL" : "⚠️ AT RISK"; + const gapCount = requested - assigned; + const description = isCritical + ? `${event.event_name} starts in ${Math.round(hoursUntil)}h — ${gapCount} position${gapCount > 1 ? "s" : ""} still open. Fill immediately.` + : `${event.event_name} has a ${fillProbability}% fill probability. ${gapCount} position${gapCount > 1 ? "s" : ""} unfilled with ${Math.round(hoursUntil)}h remaining.`; + + alerts.push( + base44.asServiceRole.entities.ActivityLog.create({ + title: `${severity}: ${event.event_name} needs staffing`, + description, + activity_type: "event_updated", + related_entity_type: "event", + related_entity_id: event.id, + action_link: `EventDetail?id=${event.id}`, + action_label: "Assign Staff Now", + user_id: event.created_by || "system", + is_read: false, + icon_type: "alert", + icon_color: isCritical ? "red" : "yellow", + }) + ); + } + } + } + + await Promise.all(alerts); + + return Response.json({ + checked: upcoming.length, + escalations: escalations.length, + details: escalations, + timestamp: now.toISOString(), + }); +}); \ No newline at end of file diff --git a/base44/functions/queryWorkforceGraph/entry.ts b/base44/functions/queryWorkforceGraph/entry.ts new file mode 100644 index 0000000..7c5198e --- /dev/null +++ b/base44/functions/queryWorkforceGraph/entry.ts @@ -0,0 +1,504 @@ +import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; + +Deno.serve(async (req) => { + try { + const base44 = createClientFromRequest(req); + const user = await base44.auth.me(); + if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); + + const body = await req.json(); + const { query_type, entity_id, entity_type, depth = 2 } = body; + + const entities = base44.asServiceRole.entities; + const graph = { nodes: [], edges: [] }; + const visited = new Set(); + + async function addNode(type, id, label, data = {}) { + const key = `${type}:${id}`; + if (visited.has(key)) return; + visited.add(key); + graph.nodes.push({ type, id, label, data }); + } + + function edge(from, to, label) { + graph.edges.push({ from, to, label }); + } + + // ─── CONTRACT ─────────────────────────────────────────────── + // Contract → Vendor, Client, Sector, RateCard + async function traverseContract(contractId) { + const contract = await entities.Contract.get(contractId); + if (!contract) return; + await addNode('Contract', contract.id, `Contract: ${contract.contract_name || contract.contract_number || ''}`, contract); + + if (contract.vendor_id) { + await addNode('Vendor', contract.vendor_id, `Vendor: ${contract.vendor_name || ''}`); + edge(`Contract:${contract.id}`, `Vendor:${contract.vendor_id}`, 'vendor_party'); + } + if (contract.client_id) { + await addNode('Client', contract.client_id, `Client: ${contract.client_name || ''}`); + edge(`Contract:${contract.id}`, `Client:${contract.client_id}`, 'client_party'); + } + if (contract.sector_id) { + await addNode('Sector', contract.sector_id, `Sector: ${contract.sector_name || ''}`); + edge(`Contract:${contract.id}`, `Sector:${contract.sector_id}`, 'governs_sector'); + } + if (contract.rate_card_id) { + await addNode('RateCard', contract.rate_card_id, `RateCard`); + edge(`Contract:${contract.id}`, `RateCard:${contract.rate_card_id}`, 'defines_rates'); + } + } + + // ─── TRANSPORTATION ──────────────────────────────────────── + // Transportation → Shift, Worker, Vendor, Site, Client + async function traverseTransportation(transportId) { + const transport = await entities.Transportation.get(transportId); + if (!transport) return; + await addNode('Transportation', transport.id, `Transport: ${transport.transport_type} → ${transport.dropoff_location || ''}`, transport); + + if (transport.shift_id) { + await addNode('Shift', transport.shift_id, `Shift`); + edge(`Transportation:${transport.id}`, `Shift:${transport.shift_id}`, 'serves_shift'); + } + if (transport.workforce_id) { + await addNode('Worker', transport.workforce_id, `Worker: ${transport.workforce_name || ''}`); + edge(`Transportation:${transport.id}`, `Worker:${transport.workforce_id}`, 'transports_worker'); + } + if (transport.vendor_id) { + await addNode('Vendor', transport.vendor_id, `Vendor: ${transport.vendor_name || ''}`); + edge(`Transportation:${transport.id}`, `Vendor:${transport.vendor_id}`, 'arranged_by'); + } + if (transport.client_id) { + await addNode('Client', transport.client_id, `Client: ${transport.client_name || ''}`); + edge(`Transportation:${transport.id}`, `Client:${transport.client_id}`, 'destination_client'); + } + } + + // ─── EQUIPMENT ───────────────────────────────────────────── + // Equipment → Vendor, Client, Site, Shift, Worker + async function traverseEquipment(equipmentId) { + const equipment = await entities.Equipment.get(equipmentId); + if (!equipment) return; + await addNode('Equipment', equipment.id, `Equipment: ${equipment.equipment_name || ''} (${equipment.category})`, equipment); + + if (equipment.vendor_id) { + await addNode('Vendor', equipment.vendor_id, `Vendor: ${equipment.vendor_name || ''}`); + edge(`Equipment:${equipment.id}`, `Vendor:${equipment.vendor_id}`, 'owned_by'); + } + if (equipment.client_id) { + await addNode('Client', equipment.client_id, `Client: ${equipment.client_name || ''}`); + edge(`Equipment:${equipment.id}`, `Client:${equipment.client_id}`, 'assigned_to_client'); + } + if (equipment.shift_id) { + await addNode('Shift', equipment.shift_id, `Shift`); + edge(`Equipment:${equipment.id}`, `Shift:${equipment.shift_id}`, 'used_in_shift'); + } + if (equipment.assigned_to_worker_id) { + await addNode('Worker', equipment.assigned_to_worker_id, `Worker: ${equipment.assigned_to_worker_name || ''}`); + edge(`Equipment:${equipment.id}`, `Worker:${equipment.assigned_to_worker_id}`, 'assigned_to_worker'); + } + } + + // ─── TRAINING ────────────────────────────────────────────── + // Training → Worker, Vendor, Client, Certification + async function traverseTraining(trainingId) { + const training = await entities.Training.get(trainingId); + if (!training) return; + await addNode('Training', training.id, `Training: ${training.training_name || ''}`, training); + + if (training.workforce_id) { + await addNode('Worker', training.workforce_id, `Worker: ${training.workforce_name || ''}`); + edge(`Training:${training.id}`, `Worker:${training.workforce_id}`, 'enrolled_worker'); + } + if (training.vendor_id) { + await addNode('Vendor', training.vendor_id, `Vendor: ${training.vendor_name || ''}`); + edge(`Training:${training.id}`, `Vendor:${training.vendor_id}`, 'sponsored_by'); + } + if (training.client_id) { + await addNode('Client', training.client_id, `Client: ${training.client_name || ''}`); + edge(`Training:${training.id}`, `Client:${training.client_id}`, 'client_specific'); + } + if (training.certification_id) { + await addNode('Certification', training.certification_id, `Cert: ${training.certification_earned || ''}`); + edge(`Training:${training.id}`, `Certification:${training.certification_id}`, 'issues_certification'); + } + } + + // ─── FOOD SERVICE OPERATION ──────────────────────────────── + // FoodServiceOperation → Client, Site, Sector, Vendor, Manager, Shift, Event, Contract, Invoice, Equipment + async function traverseFoodServiceOperation(opId) { + const op = await entities.FoodServiceOperation.get(opId); + if (!op) return; + await addNode('FoodServiceOperation', op.id, `FSO: ${op.operation_name || ''}`, op); + + if (op.client_id) { + await addNode('Client', op.client_id, `Client: ${op.client_name || ''}`); + edge(`FoodServiceOperation:${op.id}`, `Client:${op.client_id}`, 'serves_client'); + } + if (op.vendor_id) { + await addNode('Vendor', op.vendor_id, `Vendor: ${op.vendor_name || ''}`); + edge(`FoodServiceOperation:${op.id}`, `Vendor:${op.vendor_id}`, 'operated_by'); + } + if (op.manager_id) { + await addNode('Manager', op.manager_id, `Manager: ${op.manager_name || ''}`); + edge(`FoodServiceOperation:${op.id}`, `Manager:${op.manager_id}`, 'managed_by'); + } + if (op.shift_id) { + await addNode('Shift', op.shift_id, `Shift`); + edge(`FoodServiceOperation:${op.id}`, `Shift:${op.shift_id}`, 'runs_during_shift'); + } + if (op.contract_id) { + await addNode('Contract', op.contract_id, `Contract`); + edge(`FoodServiceOperation:${op.id}`, `Contract:${op.contract_id}`, 'governed_by_contract'); + } + if (op.invoice_id) { + await addNode('Invoice', op.invoice_id, `Invoice`); + edge(`FoodServiceOperation:${op.id}`, `Invoice:${op.invoice_id}`, 'billed_via'); + } + if (op.equipment_assigned) { + for (const eq of op.equipment_assigned) { + if (eq.equipment_id) { + await addNode('Equipment', eq.equipment_id, `Equipment: ${eq.equipment_name || ''}`); + edge(`FoodServiceOperation:${op.id}`, `Equipment:${eq.equipment_id}`, 'uses_equipment'); + } + } + } + } + + // ─── SHIFT (extended) ────────────────────────────────────── + // Shift → Manager, Location, Event, Transportation, Equipment, FoodServiceOperation + async function traverseShift(shiftId) { + const shift = await entities.Shift.get(shiftId); + if (!shift) return; + await addNode('Shift', shift.id, `Shift: ${shift.shift_name || ''}`, shift); + + if (shift.manager_id) { + await addNode('Manager', shift.manager_id, `Manager: ${shift.manager_name || ''}`); + edge(`Shift:${shift.id}`, `Manager:${shift.manager_id}`, 'managed_by'); + } + if (shift.event_id) { + await addNode('Event', shift.event_id, `Event`); + edge(`Shift:${shift.id}`, `Event:${shift.event_id}`, 'part_of_event'); + } + // Transportation serving this shift + const transports = await entities.Transportation.filter({ shift_id: shiftId }, '-created_date', 10); + for (const t of transports) { + await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); + edge(`Shift:${shiftId}`, `Transportation:${t.id}`, 'worker_transport'); + } + // Equipment assigned to this shift + const equipment = await entities.Equipment.filter({ shift_id: shiftId }, '-created_date', 10); + for (const e of equipment) { + await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); + edge(`Shift:${shiftId}`, `Equipment:${e.id}`, 'requires_equipment'); + } + // Food service operations running during this shift + const fsos = await entities.FoodServiceOperation.filter({ shift_id: shiftId }, '-created_date', 10); + for (const fso of fsos) { + await addNode('FoodServiceOperation', fso.id, `FSO: ${fso.operation_name || ''}`, fso); + edge(`Shift:${shiftId}`, `FoodServiceOperation:${fso.id}`, 'runs_operation'); + } + } + + // ─── ASSIGNMENT (existing, extended) ─────────────────────── + async function traverseAssignment(assignmentId) { + const assignment = await entities.Assignment.get(assignmentId); + if (!assignment) return; + await addNode('Assignment', assignment.id, `Assignment: ${assignment.workforce_name || 'Unknown'}`, assignment); + + if (assignment.order_id) { + await addNode('Order', assignment.order_id, `Order: ${assignment.order_number || ''}`); + edge(`Assignment:${assignment.id}`, `Order:${assignment.order_id}`, 'belongs_to'); + await traverseOrder(assignment.order_id, 1); + } + if (assignment.workforce_id) { + await addNode('Worker', assignment.workforce_id, `Worker: ${assignment.workforce_name || ''}`); + edge(`Assignment:${assignment.id}`, `Worker:${assignment.workforce_id}`, 'assigned_to'); + } + if (assignment.vendor_id) { + await addNode('Vendor', assignment.vendor_id, `Vendor: ${assignment.vendor_name || ''}`); + edge(`Assignment:${assignment.id}`, `Vendor:${assignment.vendor_id}`, 'provided_by'); + } + } + + // ─── ORDER (existing, extended) ──────────────────────────── + async function traverseOrder(orderId, currentDepth = 0) { + if (currentDepth >= depth) return; + try { + const order = await entities.Order.get(orderId); + if (!order) return; + await addNode('Order', order.id, `Order: ${order.order_number || order.event_name || ''}`, order); + + if (order.partner_id) { + await addNode('Partner', order.partner_id, `Partner: ${order.partner_name || ''}`); + edge(`Order:${order.id}`, `Partner:${order.partner_id}`, 'for_client'); + } + if (order.vendor_id) { + await addNode('Vendor', order.vendor_id, `Vendor: ${order.vendor_name || ''}`); + edge(`Order:${order.id}`, `Vendor:${order.vendor_id}`, 'assigned_to'); + } + // Contracts governing this client-vendor pair + if (order.vendor_id && order.business_id) { + const contracts = await entities.Contract.filter({ vendor_id: order.vendor_id, client_id: order.business_id, status: 'active' }, '-created_date', 5); + for (const c of contracts) { + await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); + edge(`Order:${order.id}`, `Contract:${c.id}`, 'governed_by'); + } + } + // Food service operations for this event + if (order.event_id) { + const fsos = await entities.FoodServiceOperation.filter({ event_id: order.event_id }, '-created_date', 10); + for (const fso of fsos) { + await addNode('FoodServiceOperation', fso.id, `FSO: ${fso.operation_name || ''}`, fso); + edge(`Order:${order.id}`, `FoodServiceOperation:${fso.id}`, 'fulfills_operation'); + } + } + } catch (e) { /* order might not exist */ } + } + + // ─── VENDOR (existing, extended) ─────────────────────────── + async function traverseVendor(vendorId) { + const vendor = await entities.Vendor.get(vendorId); + if (!vendor) return; + await addNode('Vendor', vendor.id, `Vendor: ${vendor.legal_name || vendor.doing_business_as || ''}`, vendor); + + // Rates + const rates = await entities.VendorRate.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const rate of rates) { + await addNode('VendorRate', rate.id, `Rate: ${rate.role_name || 'Unknown'} - $${rate.client_rate || 0}/hr`, rate); + edge(`Vendor:${vendorId}`, `VendorRate:${rate.id}`, 'has_rate'); + } + + // Workforce + const workforce = await entities.Workforce.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const w of workforce) { + await addNode('Worker', w.id, `Worker: ${w.full_name || w.name || ''}`, w); + edge(`Vendor:${vendorId}`, `Worker:${w.id}`, 'employs'); + } + + // Contracts + const contracts = await entities.Contract.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const c of contracts) { + await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); + edge(`Vendor:${vendorId}`, `Contract:${c.id}`, 'party_to'); + if (c.client_id) { + await addNode('Client', c.client_id, `Client: ${c.client_name || ''}`); + edge(`Contract:${c.id}`, `Client:${c.client_id}`, 'client_party'); + } + } + + // Equipment owned + const equipment = await entities.Equipment.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const e of equipment) { + await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); + edge(`Vendor:${vendorId}`, `Equipment:${e.id}`, 'owns'); + } + + // Transportation arranged + const transports = await entities.Transportation.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const t of transports) { + await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); + edge(`Vendor:${vendorId}`, `Transportation:${t.id}`, 'arranges'); + } + + // Training sponsored + const trainings = await entities.Training.filter({ vendor_id: vendorId }, '-created_date', 10); + for (const t of trainings) { + await addNode('Training', t.id, `Training: ${t.training_name || ''}`, t); + edge(`Vendor:${vendorId}`, `Training:${t.id}`, 'sponsors_training'); + } + } + + // ─── WORKER (existing, extended) ─────────────────────────── + async function traverseWorker(workerId) { + const worker = await entities.Workforce.get(workerId); + if (!worker) return; + await addNode('Worker', worker.id, `Worker: ${worker.full_name || worker.name || ''}`, worker); + + if (worker.vendor_id) { + await addNode('Vendor', worker.vendor_id, `Vendor: ${worker.vendor_name || ''}`); + edge(`Worker:${workerId}`, `Vendor:${worker.vendor_id}`, 'employed_by'); + } + + // Assignments + const assignments = await entities.Assignment.filter({ workforce_id: workerId }, '-created_date', 10); + for (const a of assignments) { + await addNode('Assignment', a.id, `Assignment: ${a.role || ''}`, a); + edge(`Worker:${workerId}`, `Assignment:${a.id}`, 'assigned'); + } + + // Availability + const availability = await entities.WorkerAvailability.filter({ staff_id: workerId }, '-created_date', 1); + if (availability.length > 0) { + await addNode('Availability', availability[0].id, `Availability: ${availability[0].availability_status}`, availability[0]); + edge(`Worker:${workerId}`, `Availability:${availability[0].id}`, 'availability'); + } + + // Reputation + const reputation = await entities.WorkerReputationProfile.filter({ worker_id: workerId }, '-created_date', 1); + if (reputation.length > 0) { + await addNode('Reputation', reputation[0].id, `Reputation: ${reputation[0].trust_tier} (${reputation[0].trust_score || 0})`, reputation[0]); + edge(`Worker:${workerId}`, `Reputation:${reputation[0].id}`, 'reputation'); + } + + // Training records + const trainings = await entities.Training.filter({ workforce_id: workerId }, '-created_date', 10); + for (const t of trainings) { + await addNode('Training', t.id, `Training: ${t.training_name || ''}`, t); + edge(`Worker:${workerId}`, `Training:${t.id}`, 'enrolled_in'); + } + + // Equipment assigned + const equipment = await entities.Equipment.filter({ assigned_to_worker_id: workerId }, '-created_date', 10); + for (const e of equipment) { + await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); + edge(`Worker:${workerId}`, `Equipment:${e.id}`, 'issued_equipment'); + } + + // Transportation + const transports = await entities.Transportation.filter({ workforce_id: workerId }, '-created_date', 10); + for (const t of transports) { + await addNode('Transportation', t.id, `Transport: ${t.transport_type}`, t); + edge(`Worker:${workerId}`, `Transportation:${t.id}`, 'transported_by'); + } + } + + // ─── FULL GRAPH (new) ────────────────────────────────────── + // Walks the entire connected chain from any starting node, up to depth hops + async function traverseFull(startType, startId, maxDepth = 3) { + const queue = [{ type: startType, id: startId, depth: 0 }]; + const seen = new Set(); + + while (queue.length > 0) { + const { type, id, depth: curDepth } = queue.shift(); + const key = `${type}:${id}`; + if (seen.has(key) || curDepth > maxDepth) continue; + seen.add(key); + + switch (type) { + case 'Worker': { + const w = await entities.Workforce.get(id).catch(() => null); + if (!w) break; + await addNode('Worker', w.id, `Worker: ${w.full_name || w.name || ''}`, w); + if (w.vendor_id) queue.push({ type: 'Vendor', id: w.vendor_id, depth: curDepth + 1 }); + const as = await entities.Assignment.filter({ workforce_id: id }, '-created_date', 5); + for (const a of as) queue.push({ type: 'Assignment', id: a.id, depth: curDepth + 1 }); + const ts = await entities.Training.filter({ workforce_id: id }, '-created_date', 5); + for (const t of ts) queue.push({ type: 'Training', id: t.id, depth: curDepth + 1 }); + const eq = await entities.Equipment.filter({ assigned_to_worker_id: id }, '-created_date', 5); + for (const e of eq) queue.push({ type: 'Equipment', id: e.id, depth: curDepth + 1 }); + const tr = await entities.Transportation.filter({ workforce_id: id }, '-created_date', 5); + for (const t of tr) queue.push({ type: 'Transportation', id: t.id, depth: curDepth + 1 }); + break; + } + case 'Vendor': { + const v = await entities.Vendor.get(id).catch(() => null); + if (!v) break; + await addNode('Vendor', v.id, `Vendor: ${v.legal_name || v.doing_business_as || ''}`, v); + const ws = await entities.Workforce.filter({ vendor_id: id }, '-created_date', 10); + for (const w of ws) { await addNode('Worker', w.id, `Worker: ${w.full_name || ''}`, w); edge(`Vendor:${id}`, `Worker:${w.id}`, 'employs'); queue.push({ type: 'Worker', id: w.id, depth: curDepth + 1 }); } + const cs = await entities.Contract.filter({ vendor_id: id }, '-created_date', 10); + for (const c of cs) { await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); edge(`Vendor:${id}`, `Contract:${c.id}`, 'party_to'); queue.push({ type: 'Contract', id: c.id, depth: curDepth + 1 }); } + const eqs = await entities.Equipment.filter({ vendor_id: id }, '-created_date', 10); + for (const e of eqs) { await addNode('Equipment', e.id, `Equipment: ${e.equipment_name || ''}`, e); edge(`Vendor:${id}`, `Equipment:${e.id}`, 'owns'); } + const fsos = await entities.FoodServiceOperation.filter({ vendor_id: id }, '-created_date', 10); + for (const f of fsos) { await addNode('FoodServiceOperation', f.id, `FSO: ${f.operation_name || ''}`, f); edge(`Vendor:${id}`, `FoodServiceOperation:${f.id}`, 'operates'); queue.push({ type: 'FoodServiceOperation', id: f.id, depth: curDepth + 1 }); } + break; + } + case 'Contract': { + const c = await entities.Contract.get(id).catch(() => null); + if (!c) break; + await addNode('Contract', c.id, `Contract: ${c.contract_name || ''}`, c); + if (c.vendor_id) { await addNode('Vendor', c.vendor_id, `Vendor: ${c.vendor_name || ''}`); edge(`Contract:${id}`, `Vendor:${c.vendor_id}`, 'vendor_party'); } + if (c.client_id) { await addNode('Client', c.client_id, `Client: ${c.client_name || ''}`); edge(`Contract:${id}`, `Client:${c.client_id}`, 'client_party'); } + break; + } + case 'Shift': { + await traverseShift(id); + break; + } + case 'FoodServiceOperation': { + await traverseFoodServiceOperation(id); + break; + } + case 'Transportation': { + await traverseTransportation(id); + break; + } + case 'Equipment': { + await traverseEquipment(id); + break; + } + case 'Training': { + await traverseTraining(id); + break; + } + case 'Assignment': { + await traverseAssignment(id); + break; + } + case 'Order': { + await traverseOrder(id, 0); + break; + } + } + } + } + + // ─── EXECUTE ─────────────────────────────────────────────── + if (query_type === 'subgraph' && entity_id) { + switch (entity_type) { + case 'Assignment': await traverseAssignment(entity_id); break; + case 'Order': await traverseOrder(entity_id, 0); break; + case 'Vendor': await traverseVendor(entity_id); break; + case 'Worker': await traverseWorker(entity_id); break; + case 'Shift': await traverseShift(entity_id); break; + case 'Contract': await traverseContract(entity_id); break; + case 'Transportation': await traverseTransportation(entity_id); break; + case 'Equipment': await traverseEquipment(entity_id); break; + case 'Training': await traverseTraining(entity_id); break; + case 'FoodServiceOperation': await traverseFoodServiceOperation(entity_id); break; + default: break; + } + } else if (query_type === 'full_graph' && entity_id && entity_type) { + await traverseFull(entity_type, entity_id, depth); + } else if (query_type === 'site_labor') { + const assignments = await entities.Assignment.filter({}, '-created_date', 100); + graph.nodes = assignments.map(a => ({ + type: 'Assignment', + id: a.id, + label: `${a.workforce_name} - ${a.role}`, + data: a + })); + } else if (query_type === 'shortage_prediction') { + const orders = await entities.Order.filter({ status: 'Open' }, '-created_date', 50); + for (const order of orders) { + await addNode('Order', order.id, `Order: ${order.order_number || ''}`, order); + const assignments = await entities.Assignment.filter({ order_id: order.id }, '-created_date', 50); + const filled = assignments.filter(a => a.assignment_status === 'Confirmed' || a.assignment_status === 'Checked In').length; + const needed = order.total_staff || 0; + if (filled < needed) { + edge(`Order:${order.id}`, `SHORTAGE:${order.id}`, `short_by_${needed - filled}`); + graph.nodes.push({ type: 'Alert', id: `SHORTAGE:${order.id}`, label: `Shortage: ${needed - filled} unfilled positions`, data: { order_id: order.id, needed, filled, gap: needed - filled } }); + } + } + } else if (query_type === 'entity_summary') { + // Returns counts of every entity type in the graph — the "graph census" + const counts = {}; + const entityTypes = ['Workforce', 'Vendor', 'Business', 'Site', 'Shift', 'Event', 'Order', 'Assignment', 'Invoice', 'CompliancePackage', 'Scorecard', 'Contract', 'Transportation', 'Equipment', 'Training', 'FoodServiceOperation']; + for (const et of entityTypes) { + try { + const list = await entities[et].list('-created_date', 1); + counts[et] = list?.length || 0; + } catch (e) { + counts[et] = 0; + } + } + return Response.json({ success: true, counts }); + } + + return Response.json({ success: true, graph, node_count: graph.nodes.length, edge_count: graph.edges.length }); + } catch (error) { + return Response.json({ error: error.message }, { status: 500 }); + } +}); \ No newline at end of file diff --git a/base44/functions/reasonAboutEvent/entry.ts b/base44/functions/reasonAboutEvent/entry.ts new file mode 100644 index 0000000..d5ccb7d --- /dev/null +++ b/base44/functions/reasonAboutEvent/entry.ts @@ -0,0 +1,235 @@ +import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; + +Deno.serve(async (req) => { + try { + const base44 = createClientFromRequest(req); + const user = await base44.auth.me(); + if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); + + const body = await req.json(); + const { + event_id, + event_type, + subject_entity_type, + subject_entity_id, + context_summary, + metadata = {}, + related_entities = [] + } = body; + + const entities = base44.asServiceRole.entities; + + // 1. Fetch context from the Workforce Graph + let graphContext = {}; + try { + const graphRes = await base44.asServiceRole.functions.invoke('queryWorkforceGraph', { + query_type: 'subgraph', + entity_type: subject_entity_type, + entity_id: subject_entity_id + }); + graphContext = graphRes.data?.graph || {}; + } catch (e) { + console.log('Graph query failed (non-blocking):', e.message); + } + + // 2. Fetch similar past memories (Operational Memory) + const similarMemories = await entities.OperationalMemory.filter( + { trigger_event_type: event_type }, + '-created_date', + 5 + ); + + const memoryContext = similarMemories.map(m => ({ + decision: m.decision?.recommendation || 'N/A', + outcome: m.outcome || 'pending', + outcome_score: m.outcome_score, + reasoning: m.reasoning?.substring(0, 200) || '' + })); + + // 3. Determine department based on event type + const departmentMap = { + 'shift.completed': 'operations', + 'shift.cancelled': 'operations', + 'shift.no_show': 'operations', + 'order.created': 'operations', + 'order.cancelled': 'operations', + 'order.filled': 'operations', + 'assignment.cancelled': 'operations', + 'invoice.overdue': 'finance', + 'vendor.rate_changed': 'procurement', + 'worker.availability_changed': 'operations', + 'worker.certification_expired': 'compliance', + 'budget.threshold_exceeded': 'finance', + 'compliance.flagged': 'compliance', + 'system.anomaly_detected': 'executive' + }; + const department = departmentMap[event_type] || 'operations'; + + // 4. Build the reasoning prompt with full context — CAUSAL CHAIN reasoning + const prompt = `You are the KROW Intelligence Engine — an AI workforce reasoning system for contingent labor management. + +You do not answer. You REASON. + +When an event occurs, you trace the CAUSAL CHAIN backwards — from the observed event through each contributing factor (connected by ↓) to the root cause(s). You do not give generic analysis. You follow the chain. + +AN EVENT HAS OCCURRED: +Event Type: ${event_type} +Summary: ${context_summary || 'No summary provided'} +Subject: ${subject_entity_type} (${subject_entity_id}) + +CURRENT GRAPH STATE (connected entities, relationships, metrics): +${JSON.stringify(graphContext, null, 2).substring(0, 3000)} + +SIMILAR PAST DECISIONS (Operational Memory — what happened last time): +${memoryContext.length > 0 ? JSON.stringify(memoryContext, null, 2) : 'No similar past decisions found.'} + +EVENT METADATA: +${JSON.stringify(metadata, null, 2).substring(0, 1000)} + +REASONING INSTRUCTIONS: + +1. OBSERVATION: State what happened as a fact. + +2. CAUSAL CHAIN: Trace WHY this event occurred. Walk backwards from the event through contributing factors. Each link in the chain is a factor that CAUSED the next. The chain flows: + + Factor A → caused → Factor B → caused → Factor C → caused → [Root Cause] + + Use the graph state, metadata, and past memories as evidence. Reference specific entities, workers, vendors, shifts, or metrics. Do not be generic. + + Categories: vendor, operations, workforce, training, demand, external, compliance, finance, equipment, transportation, system. + +3. ROOT CAUSE(S): The deepest factor(s) — the thing that, if fixed, prevents recurrence. + +4. PREDICTION: What will happen next if no action is taken. + +5. RECOMMENDATION: Target the root cause, not just the symptom. + +Respond as JSON.`; + + // 5. Call the LLM for reasoning + let aiDecision = {}; + try { + const llmResponse = await base44.asServiceRole.integrations.Core.InvokeLLM({ + prompt, + response_json_schema: { + type: 'object', + properties: { + observation: { type: 'string', description: 'What happened, stated as a fact' }, + causal_chain: { + type: 'array', + description: 'Causal chain traced backwards from the event to root cause(s)', + items: { + type: 'object', + properties: { + step: { type: 'number' }, + factor: { type: 'string' }, + evidence: { type: 'string' }, + category: { type: 'string', enum: ['vendor', 'operations', 'workforce', 'training', 'demand', 'external', 'compliance', 'finance', 'equipment', 'transportation', 'system'] }, + leads_to: { type: 'string' } + } + } + }, + root_causes: { + type: 'array', + items: { type: 'string' } + }, + prediction: { type: 'string' }, + recommendation: { type: 'string' }, + confidence_score: { type: 'number' }, + risk_level: { type: 'string' }, + proposed_actions: { + type: 'array', + items: { + type: 'object', + properties: { + action_type: { type: 'string' }, + description: { type: 'string' }, + auto_execute: { type: 'boolean' } + } + } + }, + reasoning: { type: 'string', description: 'Full reasoning chain in natural language' } + } + } + }); + + aiDecision = typeof llmResponse === 'string' ? JSON.parse(llmResponse) : llmResponse; + } catch (llmErr) { + console.log('LLM reasoning failed:', llmErr.message); + aiDecision = { + prediction: 'Unable to generate prediction', + recommendation: 'Manual review recommended', + confidence_score: 0, + risk_level: 'medium', + proposed_actions: [], + reasoning: 'LLM reasoning failed: ' + llmErr.message + }; + } + + // 6. Create Operational Memory — store the causal chain + const memory_id = `MEM-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`; + const memory = await entities.OperationalMemory.create({ + memory_id, + trigger_event_id: event_id, + trigger_event_type: event_type, + context_snapshot: { graph: graphContext, metadata }, + decision: aiDecision, + reasoning: aiDecision.reasoning || '', + causal_chain: aiDecision.causal_chain || [], + root_causes: aiDecision.root_causes || [], + similar_memories_consulted: similarMemories.map(m => m.memory_id), + status: 'pending', + agent_name: `${department}_agent`, + department, + tags: [event_type, department, aiDecision.risk_level || 'medium'] + }); + + // 7. Mark event as reasoning-triggered + await entities.WorkforceEvent.update(event_id, { + reasoning_triggered: true, + memory_id: memory.id + }); + + // 8. Log agent activity + await entities.AgentActivity.create({ + agent_name: `${department}_agent`, + department, + activity_type: 'event_processed', + trigger_event_id: event_id, + memory_id: memory.id, + summary: `Processed ${event_type}: ${aiDecision.recommendation || 'No recommendation'}`, + details: { confidence: aiDecision.confidence_score, risk: aiDecision.risk_level }, + impact_level: aiDecision.risk_level === 'high' ? 'high' : (aiDecision.risk_level === 'medium' ? 'medium' : 'low'), + entities_affected: [{ entity_type: subject_entity_type, entity_id: subject_entity_id }] + }); + + // 9. If high risk, queue for human approval; if low risk + auto_execute, execute + const hasAutoActions = (aiDecision.proposed_actions || []).some(a => a.auto_execute); + if (aiDecision.risk_level === 'high' || (aiDecision.confidence_score || 0) < 60) { + await entities.DecisionQueue.create({ + memory_id: memory.id, + trigger_event_id: event_id, + title: `${department} decision: ${event_type}`, + summary: aiDecision.recommendation || 'AI recommends manual review', + department, + agent_name: `${department}_agent`, + proposed_actions: aiDecision.proposed_actions || [], + confidence_score: aiDecision.confidence_score || 0, + risk_level: aiDecision.risk_level || 'medium', + status: 'pending_approval', + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), + context_snapshot: { graph: graphContext, event_summary: context_summary } + }); + } + + return Response.json({ + success: true, + memory_id: memory.id, + decision: aiDecision, + graph_nodes: graphContext.nodes?.length || 0, + similar_memories: similarMemories.length + }); + } catch (error) { + return Response.json({ error: error.message }, { status: 500 }); + } +}); \ No newline at end of file diff --git a/base44/functions/recordEvent/entry.ts b/base44/functions/recordEvent/entry.ts new file mode 100644 index 0000000..51306ae --- /dev/null +++ b/base44/functions/recordEvent/entry.ts @@ -0,0 +1,79 @@ +import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; + +Deno.serve(async (req) => { + try { + const base44 = createClientFromRequest(req); + const user = await base44.auth.me(); + if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); + + const body = await req.json(); + const { + event_type, + severity = 'info', + actor_type = 'system', + actor_id, + actor_name, + subject_entity_type, + subject_entity_id, + subject_krow_id, + context_summary, + related_entities = [], + metadata = {}, + tags = [] + } = body; + + if (!event_type || !subject_entity_type || !subject_entity_id) { + return Response.json({ error: 'event_type, subject_entity_type, and subject_entity_id are required' }, { status: 400 }); + } + + const event_id = `EVT-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`; + + const event = await base44.asServiceRole.entities.WorkforceEvent.create({ + event_id, + event_type, + severity, + actor_type, + actor_id: actor_id || user.id, + actor_name: actor_name || user.full_name || 'System', + subject_entity_type, + subject_entity_id, + subject_krow_id, + context_summary: context_summary || `${event_type} on ${subject_entity_type}`, + related_entities, + metadata, + reasoning_triggered: false, + tags + }); + + // Determine if this event should trigger reasoning + const reasoningTriggers = [ + 'shift.completed', 'shift.cancelled', 'shift.no_show', + 'order.created', 'order.cancelled', 'order.filled', + 'assignment.cancelled', 'invoice.overdue', + 'vendor.rate_changed', 'worker.availability_changed', + 'worker.certification_expired', 'budget.threshold_exceeded', + 'compliance.flagged', 'system.anomaly_detected' + ]; + + if (reasoningTriggers.includes(event_type)) { + try { + await base44.asServiceRole.functions.invoke('reasonAboutEvent', { + event_id: event.id, + event_type, + subject_entity_type, + subject_entity_id, + context_summary, + metadata, + related_entities + }); + } catch (reasonErr) { + // Reasoning failure shouldn't fail the event recording + console.log('Reasoning engine error (non-blocking):', reasonErr.message); + } + } + + return Response.json({ success: true, event_id: event.id, event }); + } catch (error) { + return Response.json({ error: error.message }, { status: 500 }); + } +}); \ No newline at end of file diff --git a/base44/functions/reviewOutcomes/entry.ts b/base44/functions/reviewOutcomes/entry.ts new file mode 100644 index 0000000..20b64a4 --- /dev/null +++ b/base44/functions/reviewOutcomes/entry.ts @@ -0,0 +1,104 @@ +import { createClientFromRequest } from 'npm:@base44/sdk@0.8.31'; + +Deno.serve(async (req) => { + try { + const base44 = createClientFromRequest(req); + const user = await base44.auth.me(); + if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 }); + if (user.role !== 'admin') return Response.json({ error: 'Forbidden — admin only' }, { status: 403 }); + + const entities = base44.asServiceRole.entities; + + // Fetch memories with pending outcomes (executed but not yet learned) + const pendingMemories = await entities.OperationalMemory.filter( + { status: 'outcome_pending' }, + '-created_date', + 50 + ); + + let learned = 0; + let stillPending = 0; + + for (const memory of pendingMemories) { + try { + // Re-query the graph to see what happened since the decision was made + const graphRes = await base44.asServiceRole.functions.invoke('queryWorkforceGraph', { + query_type: 'subgraph', + entity_type: memory.context_snapshot?.metadata?.subject_entity_type || 'Order', + entity_id: memory.context_snapshot?.metadata?.subject_entity_id || memory.trigger_event_id + }); + + const currentGraph = graphRes.data?.graph || {}; + + // Ask the LLM to evaluate the outcome + const prompt = `You are evaluating the outcome of a past KROW AI decision. + +ORIGINAL EVENT: ${memory.trigger_event_type} +ORIGINAL DECISION: ${memory.decision?.recommendation || 'N/A'} +ORIGINAL PREDICTION: ${memory.decision?.prediction || 'N/A'} + +CURRENT STATE (after decision): +${JSON.stringify(currentGraph, null, 2).substring(0, 2000)} + +ORIGINAL CONTEXT (at decision time): +${JSON.stringify(memory.context_snapshot?.graph || {}, null, 2).substring(0, 2000)} + +Evaluate: Did the decision help? Did the prediction come true? What was the outcome? +Respond as JSON: +{ + "outcome": "Description of what actually happened", + "outcome_score": -100 to 100 (negative = made things worse, 0 = no effect, positive = helped), + "outcome_metrics": {"key_metric": value} +}`; + + const evalResponse = await base44.asServiceRole.integrations.Core.InvokeLLM({ + prompt, + response_json_schema: { + type: 'object', + properties: { + outcome: { type: 'string' }, + outcome_score: { type: 'number' }, + outcome_metrics: { type: 'object', additionalProperties: true } + } + } + }); + + const evaluation = typeof evalResponse === 'string' ? JSON.parse(evalResponse) : evalResponse; + + await entities.OperationalMemory.update(memory.id, { + outcome: evaluation.outcome, + outcome_score: evaluation.outcome_score, + outcome_metrics: evaluation.outcome_metrics, + status: 'learned', + learned_at: new Date().toISOString() + }); + + // Log learning activity + await entities.AgentActivity.create({ + agent_name: memory.agent_name || 'system', + department: memory.department || 'operations', + activity_type: 'learning_completed', + memory_id: memory.id, + summary: `Learned from ${memory.trigger_event_type}: outcome score ${evaluation.outcome_score}`, + details: evaluation, + impact_level: evaluation.outcome_score > 50 ? 'high' : (evaluation.outcome_score > 0 ? 'medium' : 'low'), + entities_affected: [] + }); + + learned++; + } catch (e) { + console.log(`Failed to evaluate memory ${memory.id}:`, e.message); + stillPending++; + } + } + + return Response.json({ + success: true, + reviewed: pendingMemories.length, + learned, + still_pending: stillPending + }); + } catch (error) { + return Response.json({ error: error.message }, { status: 500 }); + } +}); \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..ebf7e6e --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$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/deploy_template.sh b/deploy_template.sh new file mode 100644 index 0000000..c021e1a --- /dev/null +++ b/deploy_template.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +# Ensure the SDK is built before deployment +echo "Building SDK..." +cd sdk +npm install --legacy-peer-deps +npm run build +cd .. + +# Commit and push changes +echo "Committing and pushing changes..." +git add . +git commit -m "deploy" +git push origin main + +# Build and deploy the e2b template +echo "Building and deploying e2b template..." +cd e2b_template && e2b template build -c "npm run dev" diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..238d2e4 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,38 @@ +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/index.html b/index.html new file mode 100644 index 0000000..8131cdb --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Base44 APP + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..c960864 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "jsx": "react-jsx" + }, + "include": ["src/**/*.js", "src/**/*.jsx"] +} \ No newline at end of file diff --git a/krow logo.jpeg b/krow logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2b698b8a072d6a1b10965e7f92e4d736f16fa96c GIT binary patch literal 52908 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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@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.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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==", + "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==", + "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==", + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "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.8.42", + "resolved": "https://registry.npmjs.org/@base44/sdk/-/sdk-0.8.42.tgz", + "integrity": "sha512-CYJCuO/JyhLgomKwOz1+0hDAO0OSiZhDzz5Kz6u6P4iQROXjIMguxz2+MDWLEiFZUmIJISybgoP3dJts/bLqZw==", + "license": "MIT", + "dependencies": { + "axios": "^1.18.1", + "partysocket": "^0.0.23", + "socket.io-client": "^4.8.3", + "uuid": "^13.0.2" + } + }, + "node_modules/@base44/vite-plugin": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@base44/vite-plugin/-/vite-plugin-1.0.30.tgz", + "integrity": "sha512-KFO+HP3TUf/2vg5cW0LFV7/nHHQyAYqXqPi6jq/hQB64JWhvZBXLlQIwQU0y5mu0JVliFOgLNcwHdwC8J+ekjg==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.5", + "@babel/parser": "^7.28.5", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "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.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "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.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "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.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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/@hello-pangea/dnd": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-17.0.0.tgz", + "integrity": "sha512-LDDPOix/5N0j5QZxubiW9T0M0+1PR0rTDWeZF5pu1Tz91UQnuVK4qQ/EjY83Qm2QeX0eM8qDXANfDh3VVqtR4Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.25.6", + "css-box-model": "^1.2.1", + "memoize-one": "^6.0.0", + "raf-schd": "^4.0.3", + "react-redux": "^9.1.2", + "redux": "^5.0.1", + "use-memo-one": "^1.1.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.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.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", + "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", + "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", + "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", + "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", + "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", + "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", + "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.6.tgz", + "integrity": "sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.4", + "@inquirer/confirm": "^5.1.18", + "@inquirer/editor": "^4.2.20", + "@inquirer/expand": "^4.0.20", + "@inquirer/input": "^4.2.4", + "@inquirer/number": "^3.0.20", + "@inquirer/password": "^4.0.20", + "@inquirer/rawlist": "^4.1.8", + "@inquirer/search": "^3.1.3", + "@inquirer/select": "^4.3.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", + "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", + "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", + "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "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/@isaacs/cliui/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/@isaacs/cliui/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/@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/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-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.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "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-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.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-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-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.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "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-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-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-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-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.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-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "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-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.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-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-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/@react-leaflet/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", + "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "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.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz", + "integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz", + "integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz", + "integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz", + "integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz", + "integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz", + "integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz", + "integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz", + "integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz", + "integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz", + "integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz", + "integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz", + "integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz", + "integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz", + "integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz", + "integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz", + "integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz", + "integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz", + "integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz", + "integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz", + "integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz", + "integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz", + "integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "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-core": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.89.0.tgz", + "integrity": "sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.89.0.tgz", + "integrity": "sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.89.0" + }, + "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/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", + "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", + "dev": true, + "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==", + "license": "MIT" + }, + "node_modules/@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "license": "MIT", + "dependencies": { + "parchment": "^1.1.2" + } + }, + "node_modules/@types/react": { + "version": "18.3.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", + "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.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/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/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/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@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/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/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/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.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/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.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "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.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "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.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "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==", + "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==", + "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.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "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/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "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==", + "dev": true, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/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==", + "dev": true, + "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/cliui/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "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/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "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/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "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/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/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.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "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==", + "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/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-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/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "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/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/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.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "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": "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/engine.io-client": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.5.tgz", + "integrity": "sha512-QCwxUDULPlXv8F6tqMMKx5dNkTe6OaBYRMPYeXKBlyOoKvAmE0ac6pW7fFhSscJ/5SI7666/U/B+MElbsrJlIg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.20.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "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.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "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.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-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.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "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/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", + "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "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/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/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.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "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/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/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.23.16", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.16.tgz", + "integrity": "sha512-N81A8hiHqVsexOzI3wzkibyLURW1nEJsZaRuctPhG4AdbbciYu+bKJq9I2lQFzAO4Bx3h4swI6pBbF/Hu7f7BA==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.12", + "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==", + "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-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==", + "dev": true, + "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": { + "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": "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==", + "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.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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/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/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "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.9.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz", + "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/prompts": "^7.8.6", + "@inquirer/type": "^3.0.8", + "mute-stream": "^2.0.0", + "run-async": "^4.0.5", + "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-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "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-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==", + "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-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "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-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-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-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-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==", + "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==", + "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/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/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.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "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==", + "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/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause", + "peer": true + }, + "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.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/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "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/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "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/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "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/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/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/motion-dom": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", + "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", + "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==", + "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.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "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-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "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==", + "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/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/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, + "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/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/partysocket": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.23.tgz", + "integrity": "sha512-S43vtjJ///wvzxf0Pw8yD4HVGUDiJSmP1tJQjEzYUG6L7Id63+1CTcgZ0FXTy5BGHe8CuKNyO6bYd4LpOcy4QQ==", + "license": "ISC", + "dependencies": { + "event-target-shim": "^6.0.2" + } + }, + "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": "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.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "license": "BSD-3-Clause", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "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.63.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", + "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", + "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-leaflet": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", + "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^2.1.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-quill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "license": "MIT", + "dependencies": { + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "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.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-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.9.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.1.tgz", + "integrity": "sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==", + "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.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.1.tgz", + "integrity": "sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.1" + }, + "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/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "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==", + "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/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/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==", + "dev": true, + "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.52.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz", + "integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==", + "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.52.0", + "@rollup/rollup-android-arm64": "4.52.0", + "@rollup/rollup-darwin-arm64": "4.52.0", + "@rollup/rollup-darwin-x64": "4.52.0", + "@rollup/rollup-freebsd-arm64": "4.52.0", + "@rollup/rollup-freebsd-x64": "4.52.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.0", + "@rollup/rollup-linux-arm-musleabihf": "4.52.0", + "@rollup/rollup-linux-arm64-gnu": "4.52.0", + "@rollup/rollup-linux-arm64-musl": "4.52.0", + "@rollup/rollup-linux-loong64-gnu": "4.52.0", + "@rollup/rollup-linux-ppc64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-musl": "4.52.0", + "@rollup/rollup-linux-s390x-gnu": "4.52.0", + "@rollup/rollup-linux-x64-gnu": "4.52.0", + "@rollup/rollup-linux-x64-musl": "4.52.0", + "@rollup/rollup-openharmony-arm64": "4.52.0", + "@rollup/rollup-win32-arm64-msvc": "4.52.0", + "@rollup/rollup-win32-ia32-msvc": "4.52.0", + "@rollup/rollup-win32-x64-gnu": "4.52.0", + "@rollup/rollup-win32-x64-msvc": "4.52.0", + "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-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.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "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==", + "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==", + "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==", + "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/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==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "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": "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/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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.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/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "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.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/three": { + "version": "0.171.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.171.0.tgz", + "integrity": "sha512-Y/lAXPaKZPcEdkKjh0JOAHVv8OOnv/NDJqm0wjfCzyQmfKxV7zvkwsnBgPBKTzJHToSOhRGQAGbPJObT59B/PQ==", + "license": "MIT" + }, + "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==", + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "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/uuid": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz", + "integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "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/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "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.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "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/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/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/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.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": "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/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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "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/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/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==", + "dev": true, + "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/yargs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4e3d473 --- /dev/null +++ b/package.json @@ -0,0 +1,90 @@ +{ + "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.8.42", + "@base44/vite-plugin": "^1.0.30", + "@hello-pangea/dnd": "^17.0.0", + "@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", + "@tanstack/react-query": "^5.84.1", + "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", + "lodash": "^4.17.21", + "lucide-react": "^0.475.0", + "moment": "^2.30.1", + "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-leaflet": "^4.2.1", + "react-markdown": "^9.0.1", + "react-quill": "^2.0.0", + "react-resizable-panels": "^2.1.7", + "react-router-dom": "^7.2.0", + "recharts": "^2.15.4", + "sonner": "^2.0.1", + "tailwind-merge": "^3.0.2", + "tailwindcss-animate": "^1.0.7", + "three": "^0.171.0", + "vaul": "^1.1.2", + "xlsx": "^0.18.5", + "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/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/API_documentation.md b/src/API_documentation.md new file mode 100644 index 0000000..e69de29 diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..f637a4d --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,142 @@ +import './App.css' +import { Toaster } from "@/components/ui/toaster" +import { QueryClientProvider } from '@tanstack/react-query' +import { queryClientInstance } from '@/lib/query-client' +import VisualEditAgent from '@/lib/VisualEditAgent' +import NavigationTracker from '@/lib/NavigationTracker' +import { pagesConfig } from './pages.config' +import { BrowserRouter as Router, Route, Routes, useLocation } from 'react-router-dom'; +import { setupIframeMessaging } from './lib/iframe-messaging'; +import PageNotFound from './lib/PageNotFound'; +import { AuthProvider, useAuth } from '@/lib/AuthContext'; +import UserNotRegisteredError from '@/components/UserNotRegisteredError'; +import FeatureReport from './pages/FeatureReport'; +import LandingPage from './pages/LandingPage'; +import KrowX from './pages/KrowX'; +import AboutUs from './pages/AboutUs'; +import ThePlatform from './pages/ThePlatform'; +import ForWorkers from './pages/ForWorkers'; +import PredictiveIntelligence from './pages/PredictiveIntelligence'; +import KrowEdgePage from './pages/KrowEdge'; +import Recruiting from './pages/Recruiting'; +import Communications from './pages/Communications'; +import Announcements from './pages/Announcements'; +import StaffProfileDemo from './pages/StaffProfileDemo'; +import CapabilityMap from './pages/CapabilityMap'; +import PlatformOnboarding from './pages/PlatformOnboarding'; +import DailyPL from './pages/DailyPL'; +import Sales from './pages/Sales'; +import PayrollDetail from './pages/PayrollDetail'; +import EmployeeTimecard from './pages/EmployeeTimecard'; +import ClientLaborReport from './pages/ClientLaborReport'; +import WorkforceNetwork from './pages/WorkforceNetwork'; +import KrowAI from './pages/KrowAI'; +import StaffingMarketplace from './pages/StaffingMarketplace'; +import KrowConsole from './pages/KrowConsole'; +import KrowCommand from './pages/KrowCommand'; +import DemandSupply from './pages/DemandSupply'; +import DocumentApproval from './pages/DocumentApproval'; +import VendorReports from './pages/VendorReports'; + +const { Pages, Layout, mainPage } = pagesConfig; +const mainPageKey = mainPage ?? Object.keys(Pages)[0]; +const MainPage = mainPageKey ? Pages[mainPageKey] : <>; + +setupIframeMessaging(); + +const LayoutWrapper = ({ children, currentPageName }) => Layout ? + {children} + : <>{children}; + +const AuthenticatedApp = () => { + const { isLoadingAuth, isLoadingPublicSettings, authError, isAuthenticated, navigateToLogin } = useAuth(); + const location = useLocation(); + + // Show loading spinner while checking app public settings or auth + if (isLoadingPublicSettings || isLoadingAuth) { + return ( +
+
+
+ ); + } + + // Handle authentication errors + if (authError) { + if (authError.type === 'user_not_registered') { + return ; + } else if (authError.type === 'auth_required') { + // Redirect to login automatically + navigateToLogin(); + return null; + } + } + + // Render the main app + + if (location.pathname === '/LandingPage') { + return ( + + } /> + + ); + } + + return ( + + + } /> + {Object.entries(Pages).map(([path, Page]) => ( + } /> + ))} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +}; + + +function App() { + + return ( + + + + + + + + + + + ) +} + +export default App \ No newline at end of file diff --git a/src/Layout.jsx b/src/Layout.jsx new file mode 100644 index 0000000..84fed1a --- /dev/null +++ b/src/Layout.jsx @@ -0,0 +1,739 @@ +import React from "react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { createPageUrl } from "@/utils"; +import { base44 } from "@/api/base44Client"; +import { useQuery } from "@tanstack/react-query"; +import { + Users, LayoutDashboard, UserPlus, Calendar, Briefcase, FileText, + DollarSign, Award, HelpCircle, BarChart3, Activity, Menu, MessageSquare, + Package, TrendingUp, Clipboard, LogOut, Shield, MapPin, Bell, CloudOff, Megaphone, + RefreshCw, User, Search, ShoppingCart, Home, Settings as SettingsIcon, MoreVertical, + Building2, Sparkles, CheckSquare, UserCheck, Store, GraduationCap, ArrowLeft, FolderOpen, Brain, Zap, Network, Cpu, Command, BadgeCheck, + ChevronDown, ChevronRight +} from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { + Sheet, + SheetContent, + SheetTrigger, +} from "@/components/ui/sheet"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "./components/ui/badge"; +import krowLogo from "@/assets/krow-logo.webp"; + +import ChatBubble from "./components/chat/ChatBubble"; +import RoleSwitcher from "./components/dev/RoleSwitcher"; +import NotificationPanel from "./components/notifications/NotificationPanel"; +import { NotificationEngine } from "./components/notifications/NotificationEngine"; +import { Toaster } from "./components/ui/toaster"; +import OwliverProvider from "./components/owliver/OwliverProvider"; +import OwliverShell from "./components/owliver/OwliverShell"; + +// Navigation items for each role - organized by categories +const roleNavigationMap = { + admin: [ + { category: "Overview", items: [ + { title: "KROW Command", url: createPageUrl("KrowCommand"), icon: Command }, + { title: "Home", url: createPageUrl("Dashboard"), icon: LayoutDashboard }, + { title: "AI Console", url: createPageUrl("KrowConsole"), icon: Cpu }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + ]}, + { category: "Operations", items: [ + { title: "Orders", url: createPageUrl("Events"), icon: Calendar }, + { title: "Schedule", url: createPageUrl("Schedule"), icon: Calendar }, + { title: "Staff Availability", url: createPageUrl("StaffAvailability"), icon: Users }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Management", items: [ + { title: "Enterprises", url: createPageUrl("EnterpriseManagement"), icon: Building2 }, + { title: "Sectors", url: createPageUrl("SectorManagement"), icon: MapPin }, + { title: "Partners", url: createPageUrl("PartnerManagement"), icon: Briefcase }, + { title: "Vendors", url: createPageUrl("VendorManagement"), icon: Package }, + ]}, + { category: "Workforce", items: [ + { title: "Staff Directory", url: createPageUrl("StaffDirectory"), icon: Users }, + { title: "Onboarding", url: createPageUrl("StaffOnboarding"), icon: GraduationCap }, + { title: "Document Approval", url: createPageUrl("DocumentApproval"), icon: BadgeCheck }, + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + { title: "Certifications", url: createPageUrl("Certification"), icon: Award }, + ]}, + { category: "Finance", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: FileText }, + { title: "Payroll", url: createPageUrl("Payroll"), icon: DollarSign }, + ]}, + { category: "Analytics", items: [ + { title: "Predictive AI", url: createPageUrl("PredictiveIntelligence"), icon: Brain }, + { title: "KROW EDGE", url: createPageUrl("KrowEdge"), icon: Zap }, + { title: "AI Recruiting", url: createPageUrl("Recruiting"), icon: UserPlus }, + { title: "Trust Network", url: createPageUrl("WorkforceNetwork"), icon: Network }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + { title: "Activity Log", url: createPageUrl("ActivityLog"), icon: Activity }, + ]}, + { category: "Communication", items: [ + { title: "Communications Hub", url: createPageUrl("Communications"), icon: MessageSquare }, + { title: "Announcements", url: createPageUrl("Announcements"), icon: Megaphone }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + { title: "Tutorials", url: createPageUrl("Tutorials"), icon: Sparkles }, + { title: "Feature Report", url: createPageUrl("FeatureReport"), icon: FileText }, + ]}, + { category: "Settings", items: [ + { title: "User Management", url: createPageUrl("UserManagement"), icon: Users }, + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + { title: "Settings", url: createPageUrl("Settings"), icon: SettingsIcon }, + ]}, + ], + procurement: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("ProcurementDashboard"), icon: LayoutDashboard }, + + { title: "AI Console", url: createPageUrl("KrowConsole"), icon: Cpu }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + ]}, + { category: "Operations", items: [ + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Network", items: [ + { title: "Enterprises", url: createPageUrl("EnterpriseManagement"), icon: Building2 }, + { title: "Sectors", url: createPageUrl("SectorManagement"), icon: MapPin }, + { title: "Partners", url: createPageUrl("PartnerManagement"), icon: Briefcase }, + { title: "Vendors", url: createPageUrl("VendorManagement"), icon: Package }, + ]}, + { category: "Compliance", items: [ + { title: "Compliance", url: createPageUrl("WorkforceCompliance"), icon: Shield }, + { title: "Rate Matrix", url: createPageUrl("VendorRateCard"), icon: DollarSign }, + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + ]}, + { category: "Finance", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: FileText }, + ]}, + { category: "Analytics", items: [ + { title: "Predictive AI", url: createPageUrl("PredictiveIntelligence"), icon: Brain }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], + operator: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("OperatorDashboard"), icon: LayoutDashboard }, + + { title: "AI Console", url: createPageUrl("KrowConsole"), icon: Cpu }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + ]}, + { category: "Operations", items: [ + { title: "Orders", url: createPageUrl("Events"), icon: Calendar }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Network", items: [ + { title: "My Sectors", url: createPageUrl("SectorManagement"), icon: MapPin }, + { title: "Partners", url: createPageUrl("PartnerManagement"), icon: Briefcase }, + { title: "Vendors", url: createPageUrl("VendorManagement"), icon: Package }, + { title: "Clients", url: createPageUrl("Business"), icon: Users }, + ]}, + { category: "Workforce", items: [ + { title: "Staff Directory", url: createPageUrl("StaffDirectory"), icon: Users }, + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + ]}, + { category: "Analytics", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: FileText }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], + sector: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("OperatorDashboard"), icon: LayoutDashboard }, + + { title: "AI Console", url: createPageUrl("KrowConsole"), icon: Cpu }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + ]}, + { category: "Operations", items: [ + { title: "Orders", url: createPageUrl("Events"), icon: Calendar }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Network", items: [ + { title: "Partners", url: createPageUrl("PartnerManagement"), icon: Briefcase }, + { title: "Vendors", url: createPageUrl("VendorManagement"), icon: Package }, + { title: "Clients", url: createPageUrl("Business"), icon: Users }, + ]}, + { category: "Workforce", items: [ + { title: "Staff Directory", url: createPageUrl("StaffDirectory"), icon: Users }, + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + ]}, + { category: "Analytics", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: FileText }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], + client: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("ClientDashboard"), icon: LayoutDashboard }, + + { title: "AI Console", url: createPageUrl("KrowConsole"), icon: Cpu }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + ]}, + { category: "Orders", items: [ + { title: "My Orders", url: createPageUrl("ClientOrders"), icon: Clipboard }, + { title: "New Order", url: createPageUrl("CreateEvent"), icon: UserPlus }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Marketplace", items: [ + { title: "Staffing Marketplace", url: createPageUrl("StaffingMarketplace"), icon: Store }, + { title: "Vendor Marketplace", url: createPageUrl("VendorMarketplace"), icon: Store }, + { title: "Compare Rates", url: createPageUrl("VendorRateCard"), icon: DollarSign }, + ]}, + { category: "Team", items: [ + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Analytics", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: FileText }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + ]}, + { category: "Support", items: [ + { title: "Tutorials", url: createPageUrl("Tutorials"), icon: Sparkles }, + { title: "Support", url: createPageUrl("Support"), icon: HelpCircle }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], + vendor: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("VendorDashboard"), icon: LayoutDashboard }, + + { title: "Performance", url: createPageUrl("VendorPerformance"), icon: TrendingUp }, + ]}, + { category: "Workforce", items: [ + { title: "Onboard Staff", url: createPageUrl("StaffOnboarding"), icon: GraduationCap }, + { title: "Staff Directory", url: createPageUrl("StaffDirectory"), icon: Users }, + { title: "Compliance", url: createPageUrl("VendorCompliance"), icon: Shield }, + { title: "Employee Documents", url: createPageUrl("EmployeeDocuments"), icon: FolderOpen }, + { title: "Document Approval", url: createPageUrl("DocumentApproval"), icon: BadgeCheck }, + { title: "Team", url: createPageUrl("Teams"), icon: UserCheck }, + ]}, + { category: "Operations", items: [ + { title: "Orders", url: createPageUrl("VendorOrders"), icon: FileText }, + { title: "Demand & Supply", url: createPageUrl("DemandSupply"), icon: TrendingUp }, + { title: "Create Order", url: createPageUrl("CreateEvent"), icon: UserPlus }, + { title: "Schedule", url: createPageUrl("Schedule"), icon: Calendar }, + { title: "Staff Availability", url: createPageUrl("StaffAvailability"), icon: Users }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Business", items: [ + { title: "Clients", url: createPageUrl("Business"), icon: Briefcase }, + { title: "Service Rates", url: createPageUrl("VendorRates"), icon: DollarSign }, + { title: "Savings Engine", url: createPageUrl("SavingsEngine"), icon: TrendingUp }, + { title: "AI Recruiting", url: createPageUrl("Recruiting"), icon: UserPlus }, + ]}, + { category: "Finance", items: [ + { title: "Invoices", url: createPageUrl("Invoices"), icon: Clipboard }, + { title: "Sales Tracker", url: createPageUrl("Sales"), icon: TrendingUp }, + { title: "Daily Operating Report", url: createPageUrl("DailyPL"), icon: BarChart3 }, + { title: "Payroll", url: createPageUrl("Payroll"), icon: DollarSign }, + ]}, + { category: "Analytics", items: [ + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + { title: "Audit Trail", url: createPageUrl("ActivityLog"), icon: Activity }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], + workforce: [ + { category: "Overview", items: [ + { title: "Home", url: createPageUrl("WorkforceDashboard"), icon: LayoutDashboard }, + + { title: "Profile", url: createPageUrl("WorkforceProfile"), icon: Users }, + ]}, + { category: "Work", items: [ + { title: "Shift Requests", url: createPageUrl("WorkerShiftProposals"), icon: Calendar }, + { title: "My Shifts", url: createPageUrl("WorkforceShifts"), icon: Calendar }, + { title: "Task Board", url: createPageUrl("TaskBoard"), icon: CheckSquare }, + ]}, + { category: "Team", items: [ + { title: "Teams", url: createPageUrl("Teams"), icon: UserCheck }, + { title: "Onboarding", url: createPageUrl("StaffOnboarding"), icon: GraduationCap }, + { title: "Messages", url: createPageUrl("Messages"), icon: MessageSquare }, + ]}, + { category: "Growth", items: [ + { title: "Certifications", url: createPageUrl("Certification"), icon: Award }, + { title: "Earnings", url: createPageUrl("WorkforceEarnings"), icon: DollarSign }, + { title: "Reports", url: createPageUrl("Reports"), icon: BarChart3 }, + ]}, + { category: "Settings", items: [ + { title: "Permissions", url: createPageUrl("Permissions"), icon: Shield }, + ]}, + ], +}; + +const getRoleName = (role) => { + const names = { + admin: "KROW Admin", + procurement: "Procurement Manager", + operator: "Operator", + sector: "Sector Manager", + client: "Client", + vendor: "Vendor Partner", + workforce: "Staff Member" + }; + return names[role] || "User"; +}; + +const getRoleDescription = (role) => { + const descriptions = { + admin: "Platform Administrator", + procurement: "Connects Operators, Sectors & Vendors", + operator: "Manages Multiple Sectors", + sector: "Branch Location Manager", + client: "Service Requester", + vendor: "Workforce Provider", + workforce: "Service Professional" + }; + return descriptions[role] || ""; +}; + +const getDashboardUrl = (role) => { + const dashboardMap = { + admin: "Dashboard", + procurement: "ProcurementDashboard", + operator: "OperatorDashboard", + sector: "OperatorDashboard", + client: "ClientDashboard", + vendor: "VendorDashboard", + workforce: "WorkforceDashboard" + }; + return createPageUrl(dashboardMap[role] || "Dashboard"); +}; + +const getLayerName = (role) => { + const layers = { + admin: "KROW Admin", + procurement: "Procurement", + operator: "Operator", + sector: "Sector", + client: "Client", + vendor: "Vendor", + workforce: "Workforce" + }; + return layers[role] || "User"; +}; + +const getLayerColor = (role) => { +const colors = { + admin: "from-[#D4B886] to-[#C8A876]", + procurement: "from-[#0039A6] to-[#3C4F5C]", + operator: "from-[#C8DBDC] to-[#B8CED0]", + sector: "from-[#3C4F5C] to-[#2A3840]", + client: "from-[#C8DBDC] to-[#B8CED0]", + vendor: "from-[#F9E732] to-[#E8D622]", + workforce: "from-[#3C4F5C] to-[#2A3840]" +}; +return colors[role] || "from-[#0039A6] to-[#3C4F5C]"; +}; + +/** + * Categories that are configuration, help or miscellaneous rather than one of + * the primary work areas. They leave the main sidebar and render in the + * existing "More options" menu in the top bar — nothing is deleted, and every + * route still resolves exactly as before. + */ +const SECONDARY_NAV_CATEGORIES = new Set(["Settings", "Support", "Communication"]); + +/** Destinations the "More options" menu already offers; never list them twice. */ +const EXISTING_MENU_URLS = new Set([ + createPageUrl("Messages"), + createPageUrl("Support"), + createPageUrl("NotificationSettings"), + createPageUrl("Settings"), + createPageUrl("Reports"), + createPageUrl("ActivityLog"), +]); + +const navigationFor = (userRole) => roleNavigationMap[userRole] || roleNavigationMap.admin; + +/** The categories that stay in the sidebar, in their existing order. */ +const primaryCategoriesFor = (userRole) => + navigationFor(userRole).filter((group) => !SECONDARY_NAV_CATEGORIES.has(group.category)); + +/** Secondary links, de-duplicated against what the menu already shows. */ +const secondaryItemsFor = (userRole) => + navigationFor(userRole) + .filter((group) => SECONDARY_NAV_CATEGORIES.has(group.category)) + .flatMap((group) => group.items) + .filter((item) => !EXISTING_MENU_URLS.has(item.url)); + +/** + * Category-first sidebar: the top level is the work areas, and a category's + * pages appear only once it is open. One category is open at a time, so the + * sidebar stays about as tall as its category list however many pages a role + * has. + */ +function NavigationMenu({ location, userRole, closeSheet }) { + const categories = primaryCategoriesFor(userRole); + const currentPath = location.pathname; + + const activeCategory = + categories.find((group) => group.items.some((item) => item.url === currentPath)) + ?.category || null; + + const [openCategory, setOpenCategory] = React.useState(activeCategory); + + // Navigating re-opens whichever category owns the new page, so the current + // page is never hidden behind a closed category. Between navigations the + // user's own choice wins — this only re-syncs when the route actually + // changes. (React's documented "adjust state when a prop changes" pattern: + // it re-renders immediately rather than painting a stale frame.) + const syncedPath = React.useRef(currentPath); + if (syncedPath.current !== currentPath) { + syncedPath.current = currentPath; + setOpenCategory(activeCategory); + } + + return ( + + ); +} + +function LayoutChrome({ children }) { + const location = useLocation(); + const navigate = useNavigate(); + const [showNotifications, setShowNotifications] = React.useState(false); + const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false); + + const { data: user } = useQuery({ + queryKey: ['current-user-layout'], + queryFn: () => base44.auth.me(), + }); + + const sampleAvatar = "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop"; + const userAvatar = user?.profile_picture || sampleAvatar; + + const { data: unreadCount = 0 } = useQuery({ + queryKey: ['unread-notifications', user?.id], + queryFn: async () => { + if (!user?.id) return 0; + const notifications = await base44.entities.ActivityLog.filter({ + user_id: user?.id, + is_read: false + }); + return notifications.length; + }, + enabled: !!user?.id, + initialData: 0, + refetchInterval: 10000, + }); + + const userRole = localStorage.getItem("dev_role_override") || user?.user_role || user?.role || "admin"; + // Categories that left the sidebar now live in the "More options" menu. + const secondaryNavItems = secondaryItemsFor(userRole); + const userName = user?.full_name || user?.email || "User"; + const userInitial = userName.charAt(0).toUpperCase(); + + const handleLogout = () => { + base44.auth.logout(); + }; + + const handleRefresh = () => { + window.location.reload(); + }; + + return ( +
+ + +
+
+
+ + + + + + + +
+ setMobileMenuOpen(false)}> + KROW + +
+ + + {userInitial} + +
+

{userName}

+

{getRoleName(userRole)}

+
+
+
+
+ setMobileMenuOpen(false)} /> +
+
+ +
+
+
+ + + KROW +
+

+ KROW + KROW Workforce Control Tower +

+
+ + +
+
+ + +
+
+
+ +
+ {/* Below xl these collapse into the "More options" menu so the header + never overflows a narrow viewport. */} + + + + + + + + + + + + window.location.href = getDashboardUrl(userRole)}> + Home + + window.location.href = createPageUrl("Messages")}> + Messages + + window.location.href = createPageUrl("Support")}> + Help & Support + + + Refresh changes + + + window.location.href = createPageUrl("NotificationSettings")}> + Notification Settings + + window.location.href = createPageUrl("Settings")}> + Settings + + window.location.href = createPageUrl("Reports")}> + Reports + + window.location.href = createPageUrl("ActivityLog")}> + Activity Log + + + {/* Secondary categories lifted out of the sidebar. Already + de-duplicated against the entries above, so Settings and + Messages are not offered twice. */} + {secondaryNavItems.length > 0 && } + {secondaryNavItems.map((item) => ( + window.location.href = item.url} + > + {item.title} + + ))} + + + + Logout + + + + + + + + + + +
+

{userName}

+

{user?.email}

+

{getRoleName(userRole)}

+
+
+ + window.location.href = getDashboardUrl(userRole)}> + Dashboard + + window.location.href = createPageUrl("WorkforceProfile")}> + My Profile + + +
+
+
+
+
+ +
+ + + {/* min-w-0 is required: without it a wide child (table, chart, scheduler) + stretches this flex item and forces horizontal scroll on the page. */} +
+ {children} +
+
+ + setShowNotifications(false)} /> + + + + +
+ ); +} + +export default function Layout({ children }) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/src/api/base44Client.js b/src/api/base44Client.js new file mode 100644 index 0000000..7826ba5 --- /dev/null +++ b/src/api/base44Client.js @@ -0,0 +1,13 @@ +import { createClient } from '@base44/sdk'; +import { appParams } from '@/lib/app-params'; + +const { appId, serverUrl, token, functionsVersion } = appParams; + +//Create a client with authentication required +export const base44 = createClient({ + appId, + serverUrl, + token, + functionsVersion, + requiresAuth: false +}); diff --git a/src/api/entities.js b/src/api/entities.js new file mode 100644 index 0000000..92580ee --- /dev/null +++ b/src/api/entities.js @@ -0,0 +1,9 @@ +import { base44 } from './base44Client'; + + +export const Query = base44.entities.Query; + + + +// auth sdk: +export const User = base44.auth; \ No newline at end of file diff --git a/src/api/integrations.js b/src/api/integrations.js new file mode 100644 index 0000000..0280a3a --- /dev/null +++ b/src/api/integrations.js @@ -0,0 +1,24 @@ +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 SendSMS = base44.integrations.Core.SendSMS; + +export const UploadFile = base44.integrations.Core.UploadFile; + +export const GenerateImage = base44.integrations.Core.GenerateImage; + +export const ExtractDataFromUploadedFile = base44.integrations.Core.ExtractDataFromUploadedFile; + + + + + + diff --git a/src/assets/krow-logo.webp b/src/assets/krow-logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..5252e56e7ea3baab72135c3df3fcbf9a9a421688 GIT binary patch literal 5014 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

fYovyS3I>-F&&hBdK9LM*nC%_+@x_%v8hX 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

+
+
+); + +export default function ProtectedRoute({ fallback = , unauthenticatedElement }) { + const { isAuthenticated, isLoadingAuth, authChecked, authError, checkUserAuth } = useAuth(); + + useEffect(() => { + if (!authChecked && !isLoadingAuth) { + checkUserAuth(); + } + }, [authChecked, isLoadingAuth, checkUserAuth]); + + if (isLoadingAuth || !authChecked) { + return fallback; + } + + if (authError) { + if (authError.type === 'user_not_registered') { + return ; + } + return unauthenticatedElement; + } + + if (!isAuthenticated) { + return unauthenticatedElement; + } + + return ; +} diff --git a/src/components/UserNotRegisteredError.jsx b/src/components/UserNotRegisteredError.jsx new file mode 100644 index 0000000..ede5274 --- /dev/null +++ b/src/components/UserNotRegisteredError.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const UserNotRegisteredError = () => { + return ( +
+
+
+
+ + + +
+

Access Restricted

+

+ You are not registered to use this application. Please contact the app administrator to request access. +

+
+

If you believe this is an error, you can:

+
    +
  • Verify you are logged in with the correct account
  • +
  • Contact the app administrator for access
  • +
  • Try logging out and back in again
  • +
+
+
+
+
+ ); +}; + +export default UserNotRegisteredError; diff --git a/src/components/announcements/AnnouncementsTab.jsx b/src/components/announcements/AnnouncementsTab.jsx new file mode 100644 index 0000000..08a542f --- /dev/null +++ b/src/components/announcements/AnnouncementsTab.jsx @@ -0,0 +1,714 @@ +import React, { useState } from "react"; +import { base44 } from "@/api/base44Client"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Badge } from "@/components/ui/badge"; +import { Textarea } from "@/components/ui/textarea"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription } from "@/components/ui/dialog"; +import { Switch } from "@/components/ui/switch"; +import { useToast } from "@/components/ui/use-toast"; +import { + Megaphone, Plus, Edit, Trash2, Pause, Play, Pin, PinOff, Eye, + Clock, Calendar, Upload, X, AlertTriangle, Globe, Loader2, + Bell, Mail, Image as ImageIcon, ChevronDown, ChevronUp, Search, + Zap, TrendingUp, Users, UserCheck, UserPlus +} from "lucide-react"; +import { format, isPast, isFuture } from "date-fns"; + +const AUDIENCE_OPTIONS = [ + { value: "all", label: "Everyone", color: "bg-[#0039A6] text-white" }, + { value: "vendor", label: "Vendors", color: "bg-purple-600 text-white" }, + { value: "client", label: "Clients", color: "bg-[#C8DBDC] text-[#3C4F5C]" }, + { value: "workforce", label: "Workforce", color: "bg-[#D4B886] text-[#3C4F5C]" }, + { value: "procurement", label: "Procurement", color: "bg-slate-700 text-white" }, + { value: "operator", label: "Operators", color: "bg-emerald-600 text-white" }, + { value: "sector", label: "Sector Managers", color: "bg-indigo-600 text-white" }, + { value: "admin", label: "Admins Only", color: "bg-red-600 text-white" }, +]; + +const PRIORITY_CONFIG = { + low: { label: "Low", color: "bg-slate-100 text-slate-600 border-slate-200", icon: null }, + normal: { label: "Normal", color: "bg-blue-50 text-[#0039A6] border-blue-200", icon: null }, + high: { label: "High", color: "bg-amber-50 text-amber-700 border-amber-200", icon: TrendingUp }, + urgent: { label: "Urgent", color: "bg-red-50 text-red-700 border-red-200", icon: Zap }, +}; + +const STATUS_CONFIG = { + draft: { label: "Draft", color: "bg-slate-100 text-slate-600 border-slate-200" }, + scheduled: { label: "Scheduled", color: "bg-blue-50 text-[#0039A6] border-blue-200" }, + active: { label: "Active", color: "bg-green-50 text-green-700 border-green-200" }, + paused: { label: "Paused", color: "bg-amber-50 text-amber-700 border-amber-200" }, + expired: { label: "Expired", color: "bg-slate-50 text-slate-400 border-slate-200" }, +}; + +const EMPTY_FORM = { + title: "", + body: "", + flyer_url: "", + audience: ["all"], + specific_recipients: [], // [{staff_id, name, email, phone, position}] + priority: "normal", + status: "draft", + publish_date: "", + expire_date: "", + send_email: false, + send_push: false, + pin_to_top: false, + tags: [], +}; + +export default function AnnouncementsTab({ teamId, user }) { + const { toast } = useToast(); + const queryClient = useQueryClient(); + const [showForm, setShowForm] = useState(false); + const [editingAnnouncement, setEditingAnnouncement] = useState(null); + const [form, setForm] = useState(EMPTY_FORM); + const [tagInput, setTagInput] = useState(""); + const [searchTerm, setSearchTerm] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + const [uploadingFlyer, setUploadingFlyer] = useState(false); + const [expandedId, setExpandedId] = useState(null); + const [recipientSearch, setRecipientSearch] = useState(""); + const [showRecipientPicker, setShowRecipientPicker] = useState(false); + + const { data: announcements = [], isLoading } = useQuery({ + queryKey: ["announcements", teamId], + queryFn: async () => { + const all = await base44.entities.Announcement.list("-created_date"); + return all.filter(a => a.team_id === teamId); + }, + enabled: !!teamId, + }); + + const { data: allStaff = [] } = useQuery({ + queryKey: ["staff-for-announcements"], + queryFn: () => base44.entities.Staff.list(), + }); + + const filteredStaff = allStaff.filter(s => { + if (!recipientSearch.trim()) return true; + const q = recipientSearch.toLowerCase(); + return ( + s.employee_name?.toLowerCase().includes(q) || + s.email?.toLowerCase().includes(q) || + s.contact_number?.toLowerCase().includes(q) || + s.phone?.toLowerCase().includes(q) || + s.position?.toLowerCase().includes(q) || + s.position_2?.toLowerCase().includes(q) + ); + }); + + const saveMutation = useMutation({ + mutationFn: async (data) => { + const payload = { + ...data, + team_id: teamId, + vendor_id: user?.id, + created_by_name: user?.full_name || user?.email, + view_count: data.view_count || 0, + specific_recipients: data.specific_recipients || [], + }; + // Auto-set status based on publish_date + if (payload.status === "draft" && payload.publish_date) { + payload.status = isFuture(new Date(payload.publish_date)) ? "scheduled" : "active"; + } + if (editingAnnouncement) { + return base44.entities.Announcement.update(editingAnnouncement.id, payload); + } + return base44.entities.Announcement.create(payload); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["announcements", teamId] }); + setShowForm(false); + setEditingAnnouncement(null); + setForm(EMPTY_FORM); + toast({ title: editingAnnouncement ? "✅ Announcement updated" : "✅ Announcement created" }); + }, + }); + + const updateStatusMutation = useMutation({ + mutationFn: ({ id, status }) => base44.entities.Announcement.update(id, { status }), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["announcements", teamId] }), + }); + + const togglePinMutation = useMutation({ + mutationFn: ({ id, pin_to_top }) => base44.entities.Announcement.update(id, { pin_to_top }), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["announcements", teamId] }), + }); + + const deleteMutation = useMutation({ + mutationFn: (id) => base44.entities.Announcement.delete(id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["announcements", teamId] }); + toast({ title: "🗑️ Announcement deleted" }); + }, + }); + + const handleFlyerUpload = async (e) => { + const file = e.target.files[0]; + if (!file) return; + setUploadingFlyer(true); + const result = await base44.integrations.Core.UploadFile({ file }); + setForm({ ...form, flyer_url: result.file_url }); + setUploadingFlyer(false); + }; + + const handleEdit = (ann) => { + setEditingAnnouncement(ann); + setForm({ + title: ann.title || "", + body: ann.body || "", + flyer_url: ann.flyer_url || "", + audience: ann.audience || ["all"], + specific_recipients: ann.specific_recipients || [], + priority: ann.priority || "normal", + status: ann.status || "draft", + publish_date: ann.publish_date ? ann.publish_date.slice(0, 16) : "", + expire_date: ann.expire_date ? ann.expire_date.slice(0, 16) : "", + send_email: ann.send_email || false, + send_push: ann.send_push || false, + pin_to_top: ann.pin_to_top || false, + tags: ann.tags || [], + }); + setShowForm(true); + }; + + const handleNewAnnouncement = () => { + setEditingAnnouncement(null); + setForm(EMPTY_FORM); + setShowForm(true); + }; + + const toggleAudience = (val) => { + if (val === "all") { + setForm({ ...form, audience: ["all"] }); + return; + } + const current = form.audience.filter(a => a !== "all"); + if (current.includes(val)) { + setForm({ ...form, audience: current.filter(a => a !== val) }); + } else { + setForm({ ...form, audience: [...current, val] }); + } + }; + + const toggleRecipient = (staff) => { + const existing = form.specific_recipients || []; + const isSelected = existing.some(r => r.staff_id === staff.id); + if (isSelected) { + setForm({ ...form, specific_recipients: existing.filter(r => r.staff_id !== staff.id) }); + } else { + setForm({ + ...form, + specific_recipients: [...existing, { + staff_id: staff.id, + name: staff.employee_name, + email: staff.email || "", + phone: staff.contact_number || staff.phone || "", + position: staff.position || "", + }], + }); + } + }; + + const addTag = (e) => { + if (e.key === "Enter" && tagInput.trim()) { + setForm({ ...form, tags: [...form.tags, tagInput.trim()] }); + setTagInput(""); + } + }; + + const filtered = announcements + .filter(a => statusFilter === "all" || a.status === statusFilter) + .filter(a => !searchTerm || a.title?.toLowerCase().includes(searchTerm.toLowerCase()) || a.body?.toLowerCase().includes(searchTerm.toLowerCase())) + .sort((a, b) => (b.pin_to_top ? 1 : 0) - (a.pin_to_top ? 1 : 0)); + + const stats = { + total: announcements.length, + active: announcements.filter(a => a.status === "active").length, + scheduled: announcements.filter(a => a.status === "scheduled").length, + pinned: announcements.filter(a => a.pin_to_top).length, + }; + + return ( +
+ {/* Header Stats */} +
+ {[ + { label: "Total", value: stats.total, color: "text-[#3C4F5C]", bg: "bg-slate-50 border-slate-200" }, + { label: "Active", value: stats.active, color: "text-green-700", bg: "bg-green-50 border-green-200" }, + { label: "Scheduled", value: stats.scheduled, color: "text-[#0039A6]", bg: "bg-blue-50 border-blue-200" }, + { label: "Pinned", value: stats.pinned, color: "text-[#D4B886]", bg: "bg-amber-50 border-amber-200" }, + ].map(s => ( +
+

{s.value}

+

{s.label}

+
+ ))} +
+ + {/* Toolbar */} +
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 border-slate-300" + /> +
+ +
+ +
+ + {/* Announcements List */} + {isLoading ? ( +
+ +
+ ) : filtered.length === 0 ? ( +
+
+ +
+

No Announcements Yet

+

Broadcast news, events, and updates to your entire network instantly

+ +
+ ) : ( +
+ {filtered.map(ann => { + const priorityCfg = PRIORITY_CONFIG[ann.priority] || PRIORITY_CONFIG.normal; + const statusCfg = STATUS_CONFIG[ann.status] || STATUS_CONFIG.draft; + const isExpanded = expandedId === ann.id; + const PriorityIcon = priorityCfg.icon; + + return ( + + +
+ {/* Left: Flyer or Icon */} +
+ {ann.flyer_url ? ( + flyer + ) : ( +
+ +
+ )} +
+ + {/* Center: Content */} +
+
+
+ {ann.pin_to_top && } +

{ann.title}

+ {statusCfg.label} + + {PriorityIcon && } + {priorityCfg.label} + +
+ {/* Actions */} +
+ + {ann.status === "active" ? ( + + ) : ann.status === "paused" || ann.status === "draft" || ann.status === "scheduled" ? ( + + ) : null} + + +
+
+ + {/* Meta row */} +
+ + + {(ann.audience || []).includes("all") ? "Everyone" : (ann.audience || []).join(", ")} + + {ann.specific_recipients?.length > 0 && ( + + + +{ann.specific_recipients.length} specific people + + )} + {ann.publish_date && ( + + + {format(new Date(ann.publish_date), "MMM d, yyyy h:mm a")} + + )} + {ann.expire_date && ( + + + Expires {format(new Date(ann.expire_date), "MMM d, yyyy")} + + )} + {ann.view_count || 0} views + {ann.send_email && Email} + {ann.send_push && Push} +
+ + {/* Body preview / expand */} +
+

+ {ann.body} +

+ {ann.body?.length > 120 && ( + + )} +
+ + {/* Tags */} + {ann.tags?.length > 0 && ( +
+ {ann.tags.map(t => ( + #{t} + ))} +
+ )} +
+
+
+
+ ); + })} +
+ )} + + {/* Create / Edit Modal */} + { if (!v) { setShowForm(false); setEditingAnnouncement(null); setForm(EMPTY_FORM); } }}> + + +
+
+ +
+
+ {editingAnnouncement ? "Edit Announcement" : "New Announcement"} + Broadcast to your entire network +
+
+
+ +
+ {/* Title */} +
+ + setForm({ ...form, title: e.target.value })} + /> +
+ + {/* Body */} +
+ +