From 4448bccc9b0201b0d73c7c0c7dff4b8dbf899aa0 Mon Sep 17 00:00:00 2001 From: MrPiglr Date: Mon, 26 Jan 2026 03:46:43 +0000 Subject: [PATCH] new file: contribute/plugins/utils/ast-utils.js --- contribute/.nvmrc | 1 + contribute/.version | 1 + contribute/eslint.config.mjs | 53 + contribute/index.html | 14 + contribute/package-lock.json | 10836 ++++++++++++++ contribute/package.json | 59 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + contribute/plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + contribute/postcss.config.js | 6 + contribute/public/.htaccess | 19 + contribute/public/aethex-icon.svg | 9 + contribute/public/llms.txt | 16 + contribute/src/App.jsx | 109 + contribute/src/components/AeThexLogo.jsx | 18 + contribute/src/components/AuthModal.jsx | 192 + contribute/src/components/CallToAction.jsx | 17 + contribute/src/components/EventCard.jsx | 103 + .../src/components/EventCardSkeleton.jsx | 40 + .../src/components/EventDetailModal.jsx | 162 + contribute/src/components/EventList.jsx | 120 + contribute/src/components/Footer.jsx | 160 + contribute/src/components/Header.jsx | 133 + contribute/src/components/HeroImage.jsx | 31 + contribute/src/components/LoadingScreen.jsx | 130 + .../src/components/MaintenanceScreen.jsx | 39 + .../src/components/NotificationBell.jsx | 130 + contribute/src/components/PageLayout.jsx | 36 + contribute/src/components/PassportModal.jsx | 144 + contribute/src/components/ProtectedRoute.jsx | 31 + contribute/src/components/WelcomeMessage.jsx | 17 + contribute/src/components/ui/accordion.jsx | 43 + contribute/src/components/ui/badge.jsx | 36 + contribute/src/components/ui/button.jsx | 47 + contribute/src/components/ui/card.jsx | 60 + contribute/src/components/ui/checkbox.jsx | 22 + contribute/src/components/ui/dialog.jsx | 94 + .../src/components/ui/dropdown-menu.jsx | 172 + contribute/src/components/ui/input.jsx | 19 + contribute/src/components/ui/label.jsx | 16 + contribute/src/components/ui/select.jsx | 120 + contribute/src/components/ui/switch.jsx | 23 + contribute/src/components/ui/table.jsx | 83 + contribute/src/components/ui/textarea.jsx | 18 + contribute/src/components/ui/toast.jsx | 104 + contribute/src/components/ui/toaster.jsx | 34 + contribute/src/components/ui/use-toast.js | 103 + .../src/contexts/NotificationContext.jsx | 105 + contribute/src/contexts/SiteContext.jsx | 92 + .../src/contexts/SupabaseAuthContext.jsx | 195 + contribute/src/hooks/useEvents.js | 172 + contribute/src/hooks/useForm.js | 18 + contribute/src/index.css | 120 + contribute/src/lib/customSupabaseClient.js | 13 + contribute/src/lib/utils.js | 61 + contribute/src/main.jsx | 28 + contribute/src/pages/AboutPage.jsx | 119 + contribute/src/pages/ContactPage.jsx | 148 + contribute/src/pages/GetInvolvedPage.jsx | 210 + contribute/src/pages/HomePage.jsx | 154 + contribute/src/pages/JobApplicationPage.jsx | 245 + contribute/src/pages/JobDetailPage.jsx | 227 + contribute/src/pages/MyApplicationsPage.jsx | 146 + contribute/src/pages/MyEventsPage.jsx | 151 + contribute/src/pages/MyProfilePage.jsx | 121 + contribute/src/pages/MyTicketsPage.jsx | 223 + contribute/src/pages/NewsPage.jsx | 34 + contribute/src/pages/NotificationsPage.jsx | 138 + contribute/src/pages/PrivacyPolicyPage.jsx | 78 + contribute/src/pages/TeamPage.jsx | 112 + contribute/src/pages/TechnologyPage.jsx | 34 + .../src/pages/TermsAndConditionsPage.jsx | 73 + .../pages/admin/AdminAnnouncementsPage.jsx | 7 + .../src/pages/admin/AdminApplicationsPage.jsx | 7 + contribute/src/pages/admin/AdminBlogPage.jsx | 7 + .../src/pages/admin/AdminCandidatesPage.jsx | 7 + .../src/pages/admin/AdminContributorsPage.jsx | 96 + .../src/pages/admin/AdminDashboardPage.jsx | 68 + .../src/pages/admin/AdminDocumentsPage.jsx | 7 + .../src/pages/admin/AdminEventsPage.jsx | 7 + contribute/src/pages/admin/AdminJobsPage.jsx | 7 + contribute/src/pages/admin/AdminLayout.jsx | 104 + contribute/src/pages/admin/AdminPagesPage.jsx | 7 + .../src/pages/admin/AdminProjectsPage.jsx | 103 + .../src/pages/admin/AdminProspectsPage.jsx | 7 + .../src/pages/admin/AdminSettingsPage.jsx | 151 + contribute/src/pages/admin/AdminTeamPage.jsx | 7 + .../src/pages/admin/AdminTicketsPage.jsx | 120 + .../src/pages/admin/AdminTimeOffPage.jsx | 118 + contribute/src/pages/admin/AdminUsersPage.jsx | 7 + .../src/pages/admin/AdminWaitlistPage.jsx | 7 + contribute/src/pages/admin/EventFormModal.jsx | 7 + contribute/src/pages/admin/JobFormModal.jsx | 7 + contribute/tailwind.config.js | 87 + contribute/tools/generate-llms.js | 184 + contribute/vite.config.js | 266 + events/.nvmrc | 1 + events/.version | 1 + events/eslint.config.mjs | 53 + events/index.html | 14 + events/package-lock.json | 11827 ++++++++++++++++ events/package.json | 59 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + events/plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + events/postcss.config.js | 6 + events/public/.htaccess | 19 + events/public/aethex-icon.svg | 9 + events/public/aethex-logo.png | 1 + events/public/llms.txt | 10 + events/src/App.jsx | 110 + events/src/components/AeThexLogo.jsx | 29 + events/src/components/AuthModal.jsx | 114 + events/src/components/CallToAction.jsx | 17 + events/src/components/DeveloperResources.jsx | 80 + events/src/components/EventCard.jsx | 100 + events/src/components/EventCardSkeleton.jsx | 35 + events/src/components/EventDetailModal.jsx | 224 + events/src/components/EventList.jsx | 120 + events/src/components/FeaturedSpeakers.jsx | 139 + events/src/components/Footer.jsx | 114 + events/src/components/Header.jsx | 208 + events/src/components/HeroImage.jsx | 31 + events/src/components/LoadingScreen.jsx | 117 + events/src/components/PageHeader.jsx | 68 + events/src/components/PageLayout.jsx | 26 + events/src/components/PassportModal.jsx | 119 + events/src/components/ProtectedRoute.jsx | 25 + events/src/components/Sponsors.jsx | 96 + events/src/components/Testimonials.jsx | 89 + events/src/components/WelcomeMessage.jsx | 17 + events/src/components/ui/accordion.jsx | 40 + events/src/components/ui/badge.jsx | 31 + events/src/components/ui/button.jsx | 51 + events/src/components/ui/card.jsx | 65 + events/src/components/ui/dialog.jsx | 94 + events/src/components/ui/dropdown-menu.jsx | 161 + events/src/components/ui/input.jsx | 20 + events/src/components/ui/label.jsx | 16 + events/src/components/ui/select.jsx | 120 + events/src/components/ui/table.jsx | 83 + events/src/components/ui/textarea.jsx | 18 + events/src/components/ui/toast.jsx | 104 + events/src/components/ui/toaster.jsx | 34 + events/src/components/ui/use-toast.js | 103 + events/src/contexts/SiteIdContext.jsx | 93 + events/src/contexts/SupabaseAuthContext.jsx | 168 + events/src/hooks/useEvents.js | 166 + events/src/index.css | 88 + events/src/lib/customSupabaseClient.js | 13 + events/src/lib/utils.js | 31 + events/src/main.jsx | 22 + events/src/pages/AboutPage.jsx | 116 + events/src/pages/BlogPage.jsx | 133 + events/src/pages/ContactPage.jsx | 120 + events/src/pages/DeveloperResourcesPage.jsx | 26 + events/src/pages/FaqPage.jsx | 76 + events/src/pages/HomePage.jsx | 155 + events/src/pages/MaintenancePage.jsx | 212 + events/src/pages/MyAchievementsPage.jsx | 165 + events/src/pages/MyEventsPage.jsx | 151 + events/src/pages/SponsorsPage.jsx | 38 + events/src/pages/admin/AdminDashboardPage.jsx | 75 + events/src/pages/admin/AdminEventsPage.jsx | 162 + events/src/pages/admin/AdminLayout.jsx | 87 + events/src/pages/admin/AdminUsersPage.jsx | 114 + events/src/pages/admin/EventFormModal.jsx | 266 + events/tailwind.config.js | 71 + events/tools/generate-llms.js | 184 + events/vite.config.js | 266 + gameforge/.nvmrc | 1 + gameforge/.version | 1 + gameforge/eslint.config.mjs | 53 + gameforge/index.html | 14 + gameforge/package-lock.json | 10580 ++++++++++++++ gameforge/package.json | 55 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + gameforge/plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + gameforge/postcss.config.js | 6 + gameforge/public/.htaccess | 19 + gameforge/public/favicon.svg | 4 + gameforge/src/App.jsx | 125 + gameforge/src/components/AdminPanel.jsx | 221 + gameforge/src/components/AssetManager.jsx | 235 + gameforge/src/components/CallToAction.jsx | 17 + gameforge/src/components/Dashboard.jsx | 152 + gameforge/src/components/GamesListPage.jsx | 116 + gameforge/src/components/GamesPage.jsx | 192 + gameforge/src/components/HeroImage.jsx | 31 + gameforge/src/components/HomePage.jsx | 105 + gameforge/src/components/LoadingScreen.jsx | 102 + gameforge/src/components/MainApp.jsx | 350 + gameforge/src/components/MaintenancePage.jsx | 47 + .../src/components/PageTransitionWrapper.jsx | 44 + gameforge/src/components/ProfilePage.jsx | 273 + gameforge/src/components/ProjectManager.jsx | 255 + gameforge/src/components/Settings.jsx | 133 + gameforge/src/components/UsersManager.jsx | 381 + gameforge/src/components/VersionControl.jsx | 266 + gameforge/src/components/WelcomeMessage.jsx | 17 + .../components/admin/MaintenanceManager.jsx | 144 + gameforge/src/components/assets/AssetCard.jsx | 88 + gameforge/src/components/assets/AssetRow.jsx | 55 + .../src/components/assets/assetUtils.jsx | 29 + gameforge/src/components/auth/Login.jsx | 86 + gameforge/src/components/auth/Signup.jsx | 117 + .../components/modals/ConfirmationModal.jsx | 41 + .../components/modals/CreateProjectModal.jsx | 123 + .../src/components/modals/DomainFormModal.jsx | 79 + .../modals/InviteDeveloperModal.jsx | 163 + .../src/components/modals/InviteTeamModal.jsx | 89 + .../src/components/modals/InviteUserModal.jsx | 110 + .../components/modals/MessageUserModal.jsx | 276 + .../components/modals/ProjectDetailModal.jsx | 140 + .../components/modals/ProjectTeamModal.jsx | 131 + .../components/modals/UploadAssetsModal.jsx | 182 + .../modals/admin/BroadcastMessageModal.jsx | 54 + .../modals/admin/ManagePermissionsModal.jsx | 108 + .../modals/admin/ManageUsersModal.jsx | 132 + .../modals/admin/SystemLogsModal.jsx | 45 + .../components/modals/admin/UserFormModal.jsx | 97 + .../src/components/projects/ProjectCard.jsx | 114 + .../components/projects/ProjectFilters.jsx | 59 + .../src/components/projects/ProjectHeader.jsx | 33 + .../settings/AppearanceSettings.jsx | 92 + .../components/settings/DomainSettings.jsx | 132 + .../settings/IntegrationSettings.jsx | 61 + .../settings/NotificationSettings.jsx | 48 + .../components/settings/ProfileSettings.jsx | 98 + .../components/settings/ProjectSettings.jsx | 150 + .../components/settings/SecuritySettings.jsx | 91 + gameforge/src/components/ui/button.jsx | 47 + gameforge/src/components/ui/dropdown-menu.jsx | 176 + gameforge/src/components/ui/toast.jsx | 100 + gameforge/src/components/ui/toaster.jsx | 34 + gameforge/src/components/ui/tooltip.jsx | 25 + gameforge/src/components/ui/use-toast.js | 103 + gameforge/src/context/AchievementsContext.jsx | 164 + gameforge/src/context/AppearanceContext.jsx | 83 + gameforge/src/context/AuthContext.jsx | 159 + gameforge/src/context/PresenceContext.jsx | 155 + gameforge/src/hooks/useActivity.jsx | 57 + gameforge/src/hooks/useDataFetching.js | 60 + gameforge/src/hooks/useDebounce.js | 17 + gameforge/src/hooks/useTeamPresence.jsx | 95 + gameforge/src/index.css | 224 + gameforge/src/lib/customSupabaseClient.js | 13 + gameforge/src/lib/utils.js | 6 + gameforge/src/main.jsx | 13 + gameforge/tailwind.config.js | 76 + gameforge/tools/generate-llms.js | 182 + gameforge/vite.config.js | 266 + ...t-1edbdcc3-df77-45f9-bc30-9f11766aa973.zip | Bin 0 -> 200909 bytes .../.nvmrc | 1 + .../.version | 1 + .../eslint.config.mjs | 53 + .../index.html | 14 + .../package-lock.json | 10836 ++++++++++++++ .../package.json | 59 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + .../plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + .../postcss.config.js | 6 + .../public/.htaccess | 19 + .../public/aethex-icon.svg | 9 + .../public/llms.txt | 16 + .../src/App.jsx | 109 + .../src/components/AeThexLogo.jsx | 18 + .../src/components/AuthModal.jsx | 192 + .../src/components/CallToAction.jsx | 17 + .../src/components/EventCard.jsx | 103 + .../src/components/EventCardSkeleton.jsx | 40 + .../src/components/EventDetailModal.jsx | 162 + .../src/components/EventList.jsx | 120 + .../src/components/Footer.jsx | 160 + .../src/components/Header.jsx | 133 + .../src/components/HeroImage.jsx | 31 + .../src/components/LoadingScreen.jsx | 130 + .../src/components/MaintenanceScreen.jsx | 39 + .../src/components/NotificationBell.jsx | 130 + .../src/components/PageLayout.jsx | 36 + .../src/components/PassportModal.jsx | 144 + .../src/components/ProtectedRoute.jsx | 31 + .../src/components/WelcomeMessage.jsx | 17 + .../src/components/ui/accordion.jsx | 43 + .../src/components/ui/badge.jsx | 36 + .../src/components/ui/button.jsx | 47 + .../src/components/ui/card.jsx | 60 + .../src/components/ui/checkbox.jsx | 22 + .../src/components/ui/dialog.jsx | 94 + .../src/components/ui/dropdown-menu.jsx | 172 + .../src/components/ui/input.jsx | 19 + .../src/components/ui/label.jsx | 16 + .../src/components/ui/select.jsx | 120 + .../src/components/ui/switch.jsx | 23 + .../src/components/ui/table.jsx | 83 + .../src/components/ui/textarea.jsx | 18 + .../src/components/ui/toast.jsx | 104 + .../src/components/ui/toaster.jsx | 34 + .../src/components/ui/use-toast.js | 103 + .../src/contexts/NotificationContext.jsx | 105 + .../src/contexts/SiteContext.jsx | 92 + .../src/contexts/SupabaseAuthContext.jsx | 195 + .../src/hooks/useEvents.js | 172 + .../src/hooks/useForm.js | 18 + .../src/index.css | 120 + .../src/lib/customSupabaseClient.js | 13 + .../src/lib/utils.js | 61 + .../src/main.jsx | 28 + .../src/pages/AboutPage.jsx | 119 + .../src/pages/ContactPage.jsx | 148 + .../src/pages/GetInvolvedPage.jsx | 210 + .../src/pages/HomePage.jsx | 154 + .../src/pages/JobApplicationPage.jsx | 245 + .../src/pages/JobDetailPage.jsx | 227 + .../src/pages/MyApplicationsPage.jsx | 146 + .../src/pages/MyEventsPage.jsx | 151 + .../src/pages/MyProfilePage.jsx | 121 + .../src/pages/MyTicketsPage.jsx | 223 + .../src/pages/NewsPage.jsx | 34 + .../src/pages/NotificationsPage.jsx | 138 + .../src/pages/PrivacyPolicyPage.jsx | 78 + .../src/pages/TeamPage.jsx | 112 + .../src/pages/TechnologyPage.jsx | 34 + .../src/pages/TermsAndConditionsPage.jsx | 73 + .../pages/admin/AdminAnnouncementsPage.jsx | 7 + .../src/pages/admin/AdminApplicationsPage.jsx | 7 + .../src/pages/admin/AdminBlogPage.jsx | 7 + .../src/pages/admin/AdminCandidatesPage.jsx | 7 + .../src/pages/admin/AdminContributorsPage.jsx | 96 + .../src/pages/admin/AdminDashboardPage.jsx | 68 + .../src/pages/admin/AdminDocumentsPage.jsx | 7 + .../src/pages/admin/AdminEventsPage.jsx | 7 + .../src/pages/admin/AdminJobsPage.jsx | 7 + .../src/pages/admin/AdminLayout.jsx | 104 + .../src/pages/admin/AdminPagesPage.jsx | 7 + .../src/pages/admin/AdminProjectsPage.jsx | 103 + .../src/pages/admin/AdminProspectsPage.jsx | 7 + .../src/pages/admin/AdminSettingsPage.jsx | 151 + .../src/pages/admin/AdminTeamPage.jsx | 7 + .../src/pages/admin/AdminTicketsPage.jsx | 120 + .../src/pages/admin/AdminTimeOffPage.jsx | 118 + .../src/pages/admin/AdminUsersPage.jsx | 7 + .../src/pages/admin/AdminWaitlistPage.jsx | 7 + .../src/pages/admin/EventFormModal.jsx | 7 + .../src/pages/admin/JobFormModal.jsx | 7 + .../tailwind.config.js | 87 + .../tools/generate-llms.js | 182 + .../vite.config.js | 266 + ...t-8a999a65-f56d-49a8-ac7d-6a79d2d13573.zip | Bin 0 -> 213188 bytes .../.nvmrc | 1 + .../.version | 1 + .../eslint.config.mjs | 53 + .../index.html | 14 + .../package-lock.json | 10580 ++++++++++++++ .../package.json | 55 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + .../plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + .../postcss.config.js | 6 + .../public/.htaccess | 19 + .../public/favicon.svg | 4 + .../src/App.jsx | 125 + .../src/components/AdminPanel.jsx | 221 + .../src/components/AssetManager.jsx | 235 + .../src/components/CallToAction.jsx | 17 + .../src/components/Dashboard.jsx | 152 + .../src/components/GamesListPage.jsx | 116 + .../src/components/GamesPage.jsx | 192 + .../src/components/HeroImage.jsx | 31 + .../src/components/HomePage.jsx | 105 + .../src/components/LoadingScreen.jsx | 102 + .../src/components/MainApp.jsx | 350 + .../src/components/MaintenancePage.jsx | 47 + .../src/components/PageTransitionWrapper.jsx | 44 + .../src/components/ProfilePage.jsx | 273 + .../src/components/ProjectManager.jsx | 255 + .../src/components/Settings.jsx | 133 + .../src/components/UsersManager.jsx | 381 + .../src/components/VersionControl.jsx | 266 + .../src/components/WelcomeMessage.jsx | 17 + .../components/admin/MaintenanceManager.jsx | 144 + .../src/components/assets/AssetCard.jsx | 88 + .../src/components/assets/AssetRow.jsx | 55 + .../src/components/assets/assetUtils.jsx | 29 + .../src/components/auth/Login.jsx | 86 + .../src/components/auth/Signup.jsx | 117 + .../components/modals/ConfirmationModal.jsx | 41 + .../components/modals/CreateProjectModal.jsx | 123 + .../src/components/modals/DomainFormModal.jsx | 79 + .../modals/InviteDeveloperModal.jsx | 163 + .../src/components/modals/InviteTeamModal.jsx | 89 + .../src/components/modals/InviteUserModal.jsx | 110 + .../components/modals/MessageUserModal.jsx | 276 + .../components/modals/ProjectDetailModal.jsx | 140 + .../components/modals/ProjectTeamModal.jsx | 131 + .../components/modals/UploadAssetsModal.jsx | 182 + .../modals/admin/BroadcastMessageModal.jsx | 54 + .../modals/admin/ManagePermissionsModal.jsx | 108 + .../modals/admin/ManageUsersModal.jsx | 132 + .../modals/admin/SystemLogsModal.jsx | 45 + .../components/modals/admin/UserFormModal.jsx | 97 + .../src/components/projects/ProjectCard.jsx | 114 + .../components/projects/ProjectFilters.jsx | 59 + .../src/components/projects/ProjectHeader.jsx | 33 + .../settings/AppearanceSettings.jsx | 92 + .../components/settings/DomainSettings.jsx | 132 + .../settings/IntegrationSettings.jsx | 61 + .../settings/NotificationSettings.jsx | 48 + .../components/settings/ProfileSettings.jsx | 98 + .../components/settings/ProjectSettings.jsx | 150 + .../components/settings/SecuritySettings.jsx | 91 + .../src/components/ui/button.jsx | 47 + .../src/components/ui/dropdown-menu.jsx | 176 + .../src/components/ui/toast.jsx | 100 + .../src/components/ui/toaster.jsx | 34 + .../src/components/ui/tooltip.jsx | 25 + .../src/components/ui/use-toast.js | 103 + .../src/context/AchievementsContext.jsx | 164 + .../src/context/AppearanceContext.jsx | 83 + .../src/context/AuthContext.jsx | 159 + .../src/context/PresenceContext.jsx | 155 + .../src/hooks/useActivity.jsx | 57 + .../src/hooks/useDataFetching.js | 60 + .../src/hooks/useDebounce.js | 17 + .../src/hooks/useTeamPresence.jsx | 95 + .../src/index.css | 224 + .../src/lib/customSupabaseClient.js | 13 + .../src/lib/utils.js | 6 + .../src/main.jsx | 13 + .../tailwind.config.js | 76 + .../tools/generate-llms.js | 182 + .../vite.config.js | 266 + ...t-dd582fba-3b13-4502-bbc3-c6c66a980f8a.zip | Bin 0 -> 190570 bytes .../.nvmrc | 1 + .../.version | 1 + .../eslint.config.mjs | 53 + .../index.html | 14 + .../package-lock.json | 11827 ++++++++++++++++ .../package.json | 59 + .../selection-mode/selection-mode-script.js | 430 + .../vite-plugin-selection-mode.js | 27 + .../plugins/utils/ast-utils.js | 279 + .../plugins/visual-editor/edit-mode-script.js | 357 + .../visual-editor/visual-editor-config.js | 137 + .../visual-editor/vite-plugin-edit-mode.js | 32 + .../vite-plugin-react-inline-editor.js | 365 + .../vite-plugin-iframe-route-restoration.js | 125 + .../postcss.config.js | 6 + .../public/.htaccess | 19 + .../public/aethex-icon.svg | 9 + .../public/aethex-logo.png | 1 + .../public/llms.txt | 10 + .../src/App.jsx | 110 + .../src/components/AeThexLogo.jsx | 29 + .../src/components/AuthModal.jsx | 114 + .../src/components/CallToAction.jsx | 17 + .../src/components/DeveloperResources.jsx | 80 + .../src/components/EventCard.jsx | 100 + .../src/components/EventCardSkeleton.jsx | 35 + .../src/components/EventDetailModal.jsx | 224 + .../src/components/EventList.jsx | 120 + .../src/components/FeaturedSpeakers.jsx | 139 + .../src/components/Footer.jsx | 114 + .../src/components/Header.jsx | 208 + .../src/components/HeroImage.jsx | 31 + .../src/components/LoadingScreen.jsx | 117 + .../src/components/PageHeader.jsx | 68 + .../src/components/PageLayout.jsx | 26 + .../src/components/PassportModal.jsx | 119 + .../src/components/ProtectedRoute.jsx | 25 + .../src/components/Sponsors.jsx | 96 + .../src/components/Testimonials.jsx | 89 + .../src/components/WelcomeMessage.jsx | 17 + .../src/components/ui/accordion.jsx | 40 + .../src/components/ui/badge.jsx | 31 + .../src/components/ui/button.jsx | 51 + .../src/components/ui/card.jsx | 65 + .../src/components/ui/dialog.jsx | 94 + .../src/components/ui/dropdown-menu.jsx | 161 + .../src/components/ui/input.jsx | 20 + .../src/components/ui/label.jsx | 16 + .../src/components/ui/select.jsx | 120 + .../src/components/ui/table.jsx | 83 + .../src/components/ui/textarea.jsx | 18 + .../src/components/ui/toast.jsx | 104 + .../src/components/ui/toaster.jsx | 34 + .../src/components/ui/use-toast.js | 103 + .../src/contexts/SiteIdContext.jsx | 93 + .../src/contexts/SupabaseAuthContext.jsx | 168 + .../src/hooks/useEvents.js | 166 + .../src/index.css | 88 + .../src/lib/customSupabaseClient.js | 13 + .../src/lib/utils.js | 31 + .../src/main.jsx | 22 + .../src/pages/AboutPage.jsx | 116 + .../src/pages/BlogPage.jsx | 133 + .../src/pages/ContactPage.jsx | 120 + .../src/pages/DeveloperResourcesPage.jsx | 26 + .../src/pages/FaqPage.jsx | 76 + .../src/pages/HomePage.jsx | 155 + .../src/pages/MaintenancePage.jsx | 212 + .../src/pages/MyAchievementsPage.jsx | 165 + .../src/pages/MyEventsPage.jsx | 151 + .../src/pages/SponsorsPage.jsx | 38 + .../src/pages/admin/AdminDashboardPage.jsx | 75 + .../src/pages/admin/AdminEventsPage.jsx | 162 + .../src/pages/admin/AdminLayout.jsx | 87 + .../src/pages/admin/AdminUsersPage.jsx | 114 + .../src/pages/admin/EventFormModal.jsx | 266 + .../tailwind.config.js | 71 + .../tools/generate-llms.js | 182 + .../vite.config.js | 266 + src/components/FooterSection.astro | 50 +- src/components/FooterSection.astro.bak | 21 + src/components/PassportSSODemoModal.jsx | 33 + src/components/ui/AeThexLogo.jsx | 18 + src/components/ui/EventCard.jsx | 64 + src/components/ui/accordion.jsx | 24 + src/components/ui/appearanceSettings.jsx | 24 + src/components/ui/authModal.jsx | 30 + src/components/ui/badge.jsx | 16 + src/components/ui/button.jsx | 22 + src/components/ui/callToAction.jsx | 11 + src/components/ui/card.jsx | 9 + src/components/ui/cardSkeleton.jsx | 11 + src/components/ui/checkbox.jsx | 10 + src/components/ui/confirmationModal.jsx | 14 + src/components/ui/createProjectModal.jsx | 25 + src/components/ui/developerResources.jsx | 15 + src/components/ui/dialog.jsx | 15 + src/components/ui/domainFormModal.jsx | 22 + src/components/ui/dropdown-menu.jsx | 17 + src/components/ui/eventCardSkeleton.jsx | 12 + src/components/ui/eventDetailModal.jsx | 14 + src/components/ui/featuredSpeakers.jsx | 15 + src/components/ui/heroImage.jsx | 7 + src/components/ui/input.jsx | 13 + src/components/ui/inviteUserModal.jsx | 22 + src/components/ui/label.jsx | 7 + src/components/ui/loadingScreen.jsx | 50 + src/components/ui/maintenanceScreen.jsx | 11 + src/components/ui/messageUserModal.jsx | 22 + src/components/ui/notificationBell.jsx | 15 + src/components/ui/pageHeader.jsx | 10 + src/components/ui/pageLayout.jsx | 9 + src/components/ui/passportModal.jsx | 11 + src/components/ui/profileSettings.jsx | 21 + src/components/ui/projectCard.jsx | 11 + src/components/ui/projectFilters.jsx | 11 + src/components/ui/projectHeader.jsx | 10 + src/components/ui/protectedRoute.jsx | 10 + src/components/ui/securitySettings.jsx | 20 + src/components/ui/select.jsx | 9 + src/components/ui/sponsors.jsx | 14 + src/components/ui/switch.jsx | 13 + src/components/ui/table.jsx | 20 + src/components/ui/testimonials.jsx | 14 + src/components/ui/textarea.jsx | 13 + src/components/ui/toast.jsx | 18 + src/components/ui/toaster.jsx | 25 + src/components/ui/use-toast.js | 6 + src/components/ui/welcomeMessage.jsx | 9 + src/layouts/MainLayout.astro | 15 + src/pages/contribute.astro | 21 + src/pages/events.astro | 19 + src/pages/gameforge.astro | 12 + src/pages/horizons-1.astro | 12 + src/pages/horizons-2.astro | 12 + src/pages/horizons-3.astro | 12 + src/pages/random-site.astro | 49 +- src/pages/sso-demo.astro | 11 +- src/pages/theme-switcher.astro | 58 +- src/pages/universal-search.astro | 44 +- 600 files changed, 121282 insertions(+), 114 deletions(-) create mode 100644 contribute/.nvmrc create mode 100644 contribute/.version create mode 100644 contribute/eslint.config.mjs create mode 100644 contribute/index.html create mode 100644 contribute/package-lock.json create mode 100644 contribute/package.json create mode 100644 contribute/plugins/selection-mode/selection-mode-script.js create mode 100644 contribute/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 contribute/plugins/utils/ast-utils.js create mode 100644 contribute/plugins/visual-editor/edit-mode-script.js create mode 100644 contribute/plugins/visual-editor/visual-editor-config.js create mode 100644 contribute/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 contribute/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 contribute/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 contribute/postcss.config.js create mode 100644 contribute/public/.htaccess create mode 100644 contribute/public/aethex-icon.svg create mode 100644 contribute/public/llms.txt create mode 100644 contribute/src/App.jsx create mode 100644 contribute/src/components/AeThexLogo.jsx create mode 100644 contribute/src/components/AuthModal.jsx create mode 100644 contribute/src/components/CallToAction.jsx create mode 100644 contribute/src/components/EventCard.jsx create mode 100644 contribute/src/components/EventCardSkeleton.jsx create mode 100644 contribute/src/components/EventDetailModal.jsx create mode 100644 contribute/src/components/EventList.jsx create mode 100644 contribute/src/components/Footer.jsx create mode 100644 contribute/src/components/Header.jsx create mode 100644 contribute/src/components/HeroImage.jsx create mode 100644 contribute/src/components/LoadingScreen.jsx create mode 100644 contribute/src/components/MaintenanceScreen.jsx create mode 100644 contribute/src/components/NotificationBell.jsx create mode 100644 contribute/src/components/PageLayout.jsx create mode 100644 contribute/src/components/PassportModal.jsx create mode 100644 contribute/src/components/ProtectedRoute.jsx create mode 100644 contribute/src/components/WelcomeMessage.jsx create mode 100644 contribute/src/components/ui/accordion.jsx create mode 100644 contribute/src/components/ui/badge.jsx create mode 100644 contribute/src/components/ui/button.jsx create mode 100644 contribute/src/components/ui/card.jsx create mode 100644 contribute/src/components/ui/checkbox.jsx create mode 100644 contribute/src/components/ui/dialog.jsx create mode 100644 contribute/src/components/ui/dropdown-menu.jsx create mode 100644 contribute/src/components/ui/input.jsx create mode 100644 contribute/src/components/ui/label.jsx create mode 100644 contribute/src/components/ui/select.jsx create mode 100644 contribute/src/components/ui/switch.jsx create mode 100644 contribute/src/components/ui/table.jsx create mode 100644 contribute/src/components/ui/textarea.jsx create mode 100644 contribute/src/components/ui/toast.jsx create mode 100644 contribute/src/components/ui/toaster.jsx create mode 100644 contribute/src/components/ui/use-toast.js create mode 100644 contribute/src/contexts/NotificationContext.jsx create mode 100644 contribute/src/contexts/SiteContext.jsx create mode 100644 contribute/src/contexts/SupabaseAuthContext.jsx create mode 100644 contribute/src/hooks/useEvents.js create mode 100644 contribute/src/hooks/useForm.js create mode 100644 contribute/src/index.css create mode 100644 contribute/src/lib/customSupabaseClient.js create mode 100644 contribute/src/lib/utils.js create mode 100644 contribute/src/main.jsx create mode 100644 contribute/src/pages/AboutPage.jsx create mode 100644 contribute/src/pages/ContactPage.jsx create mode 100644 contribute/src/pages/GetInvolvedPage.jsx create mode 100644 contribute/src/pages/HomePage.jsx create mode 100644 contribute/src/pages/JobApplicationPage.jsx create mode 100644 contribute/src/pages/JobDetailPage.jsx create mode 100644 contribute/src/pages/MyApplicationsPage.jsx create mode 100644 contribute/src/pages/MyEventsPage.jsx create mode 100644 contribute/src/pages/MyProfilePage.jsx create mode 100644 contribute/src/pages/MyTicketsPage.jsx create mode 100644 contribute/src/pages/NewsPage.jsx create mode 100644 contribute/src/pages/NotificationsPage.jsx create mode 100644 contribute/src/pages/PrivacyPolicyPage.jsx create mode 100644 contribute/src/pages/TeamPage.jsx create mode 100644 contribute/src/pages/TechnologyPage.jsx create mode 100644 contribute/src/pages/TermsAndConditionsPage.jsx create mode 100644 contribute/src/pages/admin/AdminAnnouncementsPage.jsx create mode 100644 contribute/src/pages/admin/AdminApplicationsPage.jsx create mode 100644 contribute/src/pages/admin/AdminBlogPage.jsx create mode 100644 contribute/src/pages/admin/AdminCandidatesPage.jsx create mode 100644 contribute/src/pages/admin/AdminContributorsPage.jsx create mode 100644 contribute/src/pages/admin/AdminDashboardPage.jsx create mode 100644 contribute/src/pages/admin/AdminDocumentsPage.jsx create mode 100644 contribute/src/pages/admin/AdminEventsPage.jsx create mode 100644 contribute/src/pages/admin/AdminJobsPage.jsx create mode 100644 contribute/src/pages/admin/AdminLayout.jsx create mode 100644 contribute/src/pages/admin/AdminPagesPage.jsx create mode 100644 contribute/src/pages/admin/AdminProjectsPage.jsx create mode 100644 contribute/src/pages/admin/AdminProspectsPage.jsx create mode 100644 contribute/src/pages/admin/AdminSettingsPage.jsx create mode 100644 contribute/src/pages/admin/AdminTeamPage.jsx create mode 100644 contribute/src/pages/admin/AdminTicketsPage.jsx create mode 100644 contribute/src/pages/admin/AdminTimeOffPage.jsx create mode 100644 contribute/src/pages/admin/AdminUsersPage.jsx create mode 100644 contribute/src/pages/admin/AdminWaitlistPage.jsx create mode 100644 contribute/src/pages/admin/EventFormModal.jsx create mode 100644 contribute/src/pages/admin/JobFormModal.jsx create mode 100644 contribute/tailwind.config.js create mode 100644 contribute/tools/generate-llms.js create mode 100644 contribute/vite.config.js create mode 100644 events/.nvmrc create mode 100644 events/.version create mode 100644 events/eslint.config.mjs create mode 100644 events/index.html create mode 100644 events/package-lock.json create mode 100644 events/package.json create mode 100644 events/plugins/selection-mode/selection-mode-script.js create mode 100644 events/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 events/plugins/utils/ast-utils.js create mode 100644 events/plugins/visual-editor/edit-mode-script.js create mode 100644 events/plugins/visual-editor/visual-editor-config.js create mode 100644 events/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 events/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 events/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 events/postcss.config.js create mode 100644 events/public/.htaccess create mode 100644 events/public/aethex-icon.svg create mode 100644 events/public/aethex-logo.png create mode 100644 events/public/llms.txt create mode 100644 events/src/App.jsx create mode 100644 events/src/components/AeThexLogo.jsx create mode 100644 events/src/components/AuthModal.jsx create mode 100644 events/src/components/CallToAction.jsx create mode 100644 events/src/components/DeveloperResources.jsx create mode 100644 events/src/components/EventCard.jsx create mode 100644 events/src/components/EventCardSkeleton.jsx create mode 100644 events/src/components/EventDetailModal.jsx create mode 100644 events/src/components/EventList.jsx create mode 100644 events/src/components/FeaturedSpeakers.jsx create mode 100644 events/src/components/Footer.jsx create mode 100644 events/src/components/Header.jsx create mode 100644 events/src/components/HeroImage.jsx create mode 100644 events/src/components/LoadingScreen.jsx create mode 100644 events/src/components/PageHeader.jsx create mode 100644 events/src/components/PageLayout.jsx create mode 100644 events/src/components/PassportModal.jsx create mode 100644 events/src/components/ProtectedRoute.jsx create mode 100644 events/src/components/Sponsors.jsx create mode 100644 events/src/components/Testimonials.jsx create mode 100644 events/src/components/WelcomeMessage.jsx create mode 100644 events/src/components/ui/accordion.jsx create mode 100644 events/src/components/ui/badge.jsx create mode 100644 events/src/components/ui/button.jsx create mode 100644 events/src/components/ui/card.jsx create mode 100644 events/src/components/ui/dialog.jsx create mode 100644 events/src/components/ui/dropdown-menu.jsx create mode 100644 events/src/components/ui/input.jsx create mode 100644 events/src/components/ui/label.jsx create mode 100644 events/src/components/ui/select.jsx create mode 100644 events/src/components/ui/table.jsx create mode 100644 events/src/components/ui/textarea.jsx create mode 100644 events/src/components/ui/toast.jsx create mode 100644 events/src/components/ui/toaster.jsx create mode 100644 events/src/components/ui/use-toast.js create mode 100644 events/src/contexts/SiteIdContext.jsx create mode 100644 events/src/contexts/SupabaseAuthContext.jsx create mode 100644 events/src/hooks/useEvents.js create mode 100644 events/src/index.css create mode 100644 events/src/lib/customSupabaseClient.js create mode 100644 events/src/lib/utils.js create mode 100644 events/src/main.jsx create mode 100644 events/src/pages/AboutPage.jsx create mode 100644 events/src/pages/BlogPage.jsx create mode 100644 events/src/pages/ContactPage.jsx create mode 100644 events/src/pages/DeveloperResourcesPage.jsx create mode 100644 events/src/pages/FaqPage.jsx create mode 100644 events/src/pages/HomePage.jsx create mode 100644 events/src/pages/MaintenancePage.jsx create mode 100644 events/src/pages/MyAchievementsPage.jsx create mode 100644 events/src/pages/MyEventsPage.jsx create mode 100644 events/src/pages/SponsorsPage.jsx create mode 100644 events/src/pages/admin/AdminDashboardPage.jsx create mode 100644 events/src/pages/admin/AdminEventsPage.jsx create mode 100644 events/src/pages/admin/AdminLayout.jsx create mode 100644 events/src/pages/admin/AdminUsersPage.jsx create mode 100644 events/src/pages/admin/EventFormModal.jsx create mode 100644 events/tailwind.config.js create mode 100644 events/tools/generate-llms.js create mode 100644 events/vite.config.js create mode 100644 gameforge/.nvmrc create mode 100644 gameforge/.version create mode 100644 gameforge/eslint.config.mjs create mode 100644 gameforge/index.html create mode 100644 gameforge/package-lock.json create mode 100644 gameforge/package.json create mode 100644 gameforge/plugins/selection-mode/selection-mode-script.js create mode 100644 gameforge/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 gameforge/plugins/utils/ast-utils.js create mode 100644 gameforge/plugins/visual-editor/edit-mode-script.js create mode 100644 gameforge/plugins/visual-editor/visual-editor-config.js create mode 100644 gameforge/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 gameforge/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 gameforge/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 gameforge/postcss.config.js create mode 100644 gameforge/public/.htaccess create mode 100644 gameforge/public/favicon.svg create mode 100644 gameforge/src/App.jsx create mode 100644 gameforge/src/components/AdminPanel.jsx create mode 100644 gameforge/src/components/AssetManager.jsx create mode 100644 gameforge/src/components/CallToAction.jsx create mode 100644 gameforge/src/components/Dashboard.jsx create mode 100644 gameforge/src/components/GamesListPage.jsx create mode 100644 gameforge/src/components/GamesPage.jsx create mode 100644 gameforge/src/components/HeroImage.jsx create mode 100644 gameforge/src/components/HomePage.jsx create mode 100644 gameforge/src/components/LoadingScreen.jsx create mode 100644 gameforge/src/components/MainApp.jsx create mode 100644 gameforge/src/components/MaintenancePage.jsx create mode 100644 gameforge/src/components/PageTransitionWrapper.jsx create mode 100644 gameforge/src/components/ProfilePage.jsx create mode 100644 gameforge/src/components/ProjectManager.jsx create mode 100644 gameforge/src/components/Settings.jsx create mode 100644 gameforge/src/components/UsersManager.jsx create mode 100644 gameforge/src/components/VersionControl.jsx create mode 100644 gameforge/src/components/WelcomeMessage.jsx create mode 100644 gameforge/src/components/admin/MaintenanceManager.jsx create mode 100644 gameforge/src/components/assets/AssetCard.jsx create mode 100644 gameforge/src/components/assets/AssetRow.jsx create mode 100644 gameforge/src/components/assets/assetUtils.jsx create mode 100644 gameforge/src/components/auth/Login.jsx create mode 100644 gameforge/src/components/auth/Signup.jsx create mode 100644 gameforge/src/components/modals/ConfirmationModal.jsx create mode 100644 gameforge/src/components/modals/CreateProjectModal.jsx create mode 100644 gameforge/src/components/modals/DomainFormModal.jsx create mode 100644 gameforge/src/components/modals/InviteDeveloperModal.jsx create mode 100644 gameforge/src/components/modals/InviteTeamModal.jsx create mode 100644 gameforge/src/components/modals/InviteUserModal.jsx create mode 100644 gameforge/src/components/modals/MessageUserModal.jsx create mode 100644 gameforge/src/components/modals/ProjectDetailModal.jsx create mode 100644 gameforge/src/components/modals/ProjectTeamModal.jsx create mode 100644 gameforge/src/components/modals/UploadAssetsModal.jsx create mode 100644 gameforge/src/components/modals/admin/BroadcastMessageModal.jsx create mode 100644 gameforge/src/components/modals/admin/ManagePermissionsModal.jsx create mode 100644 gameforge/src/components/modals/admin/ManageUsersModal.jsx create mode 100644 gameforge/src/components/modals/admin/SystemLogsModal.jsx create mode 100644 gameforge/src/components/modals/admin/UserFormModal.jsx create mode 100644 gameforge/src/components/projects/ProjectCard.jsx create mode 100644 gameforge/src/components/projects/ProjectFilters.jsx create mode 100644 gameforge/src/components/projects/ProjectHeader.jsx create mode 100644 gameforge/src/components/settings/AppearanceSettings.jsx create mode 100644 gameforge/src/components/settings/DomainSettings.jsx create mode 100644 gameforge/src/components/settings/IntegrationSettings.jsx create mode 100644 gameforge/src/components/settings/NotificationSettings.jsx create mode 100644 gameforge/src/components/settings/ProfileSettings.jsx create mode 100644 gameforge/src/components/settings/ProjectSettings.jsx create mode 100644 gameforge/src/components/settings/SecuritySettings.jsx create mode 100644 gameforge/src/components/ui/button.jsx create mode 100644 gameforge/src/components/ui/dropdown-menu.jsx create mode 100644 gameforge/src/components/ui/toast.jsx create mode 100644 gameforge/src/components/ui/toaster.jsx create mode 100644 gameforge/src/components/ui/tooltip.jsx create mode 100644 gameforge/src/components/ui/use-toast.js create mode 100644 gameforge/src/context/AchievementsContext.jsx create mode 100644 gameforge/src/context/AppearanceContext.jsx create mode 100644 gameforge/src/context/AuthContext.jsx create mode 100644 gameforge/src/context/PresenceContext.jsx create mode 100644 gameforge/src/hooks/useActivity.jsx create mode 100644 gameforge/src/hooks/useDataFetching.js create mode 100644 gameforge/src/hooks/useDebounce.js create mode 100644 gameforge/src/hooks/useTeamPresence.jsx create mode 100644 gameforge/src/index.css create mode 100644 gameforge/src/lib/customSupabaseClient.js create mode 100644 gameforge/src/lib/utils.js create mode 100644 gameforge/src/main.jsx create mode 100644 gameforge/tailwind.config.js create mode 100644 gameforge/tools/generate-llms.js create mode 100644 gameforge/vite.config.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973.zip create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/.nvmrc create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/.version create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/eslint.config.mjs create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/index.html create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/package-lock.json create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/package.json create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/selection-mode/selection-mode-script.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/utils/ast-utils.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/edit-mode-script.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/visual-editor-config.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/postcss.config.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/public/.htaccess create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/public/aethex-icon.svg create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/public/llms.txt create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/App.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/AeThexLogo.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/AuthModal.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/CallToAction.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCard.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCardSkeleton.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventDetailModal.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventList.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Footer.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Header.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/HeroImage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/LoadingScreen.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/MaintenanceScreen.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/NotificationBell.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PageLayout.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PassportModal.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ProtectedRoute.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/WelcomeMessage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/accordion.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/badge.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/button.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/card.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/checkbox.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dialog.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dropdown-menu.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/input.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/label.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/select.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/switch.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/table.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/textarea.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/toast.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/toaster.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/use-toast.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/contexts/NotificationContext.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/contexts/SiteContext.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/contexts/SupabaseAuthContext.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/hooks/useEvents.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/hooks/useForm.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/index.css create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/lib/customSupabaseClient.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/lib/utils.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/main.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/AboutPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/ContactPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/GetInvolvedPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/HomePage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/JobApplicationPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/JobDetailPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/MyApplicationsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/MyEventsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/MyProfilePage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/MyTicketsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/NewsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/NotificationsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/PrivacyPolicyPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/TeamPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/TechnologyPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/TermsAndConditionsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminAnnouncementsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminApplicationsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminBlogPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminCandidatesPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminContributorsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminDashboardPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminDocumentsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminEventsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminJobsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminLayout.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminPagesPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminProjectsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminProspectsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminSettingsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminTeamPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminTicketsPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminTimeOffPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminUsersPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/AdminWaitlistPage.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/EventFormModal.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/pages/admin/JobFormModal.jsx create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/tailwind.config.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/tools/generate-llms.js create mode 100644 horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/vite.config.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573.zip create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/.nvmrc create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/.version create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/eslint.config.mjs create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/index.html create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/package-lock.json create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/package.json create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/selection-mode/selection-mode-script.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/utils/ast-utils.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/edit-mode-script.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/visual-editor-config.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/postcss.config.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/public/.htaccess create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/public/favicon.svg create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/App.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/AdminPanel.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/AssetManager.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/CallToAction.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Dashboard.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesListPage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesPage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HeroImage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HomePage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/LoadingScreen.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MainApp.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MaintenancePage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/PageTransitionWrapper.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProfilePage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProjectManager.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Settings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/UsersManager.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/VersionControl.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/WelcomeMessage.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/admin/MaintenanceManager.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/assets/AssetCard.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/assets/AssetRow.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/assets/assetUtils.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/auth/Login.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/auth/Signup.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/ConfirmationModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/CreateProjectModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/DomainFormModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/InviteDeveloperModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/InviteTeamModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/InviteUserModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/MessageUserModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/ProjectDetailModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/ProjectTeamModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/UploadAssetsModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/admin/BroadcastMessageModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/admin/ManagePermissionsModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/admin/ManageUsersModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/admin/SystemLogsModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/modals/admin/UserFormModal.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/projects/ProjectCard.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/projects/ProjectFilters.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/projects/ProjectHeader.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/AppearanceSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/DomainSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/IntegrationSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/NotificationSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/ProfileSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/ProjectSettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/settings/SecuritySettings.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/button.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/dropdown-menu.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/toast.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/toaster.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/tooltip.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ui/use-toast.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/context/AchievementsContext.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/context/AppearanceContext.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/context/AuthContext.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/context/PresenceContext.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/hooks/useActivity.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/hooks/useDataFetching.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/hooks/useDebounce.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/hooks/useTeamPresence.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/index.css create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/lib/customSupabaseClient.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/lib/utils.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/main.jsx create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/tailwind.config.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/tools/generate-llms.js create mode 100644 horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/vite.config.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a.zip create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/.nvmrc create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/.version create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/eslint.config.mjs create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/index.html create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/package-lock.json create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/package.json create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/selection-mode/selection-mode-script.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/selection-mode/vite-plugin-selection-mode.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/utils/ast-utils.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/edit-mode-script.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/visual-editor-config.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-edit-mode.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-react-inline-editor.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/vite-plugin-iframe-route-restoration.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/postcss.config.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/public/.htaccess create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/public/aethex-icon.svg create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/public/aethex-logo.png create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/public/llms.txt create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/App.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/AeThexLogo.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/AuthModal.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/CallToAction.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/DeveloperResources.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCard.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCardSkeleton.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventDetailModal.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventList.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/FeaturedSpeakers.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Footer.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Header.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/HeroImage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/LoadingScreen.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageHeader.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageLayout.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PassportModal.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ProtectedRoute.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Sponsors.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Testimonials.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/WelcomeMessage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/accordion.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/badge.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/button.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/card.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dialog.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dropdown-menu.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/input.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/label.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/select.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/table.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/textarea.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/toast.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/toaster.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/use-toast.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/contexts/SiteIdContext.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/contexts/SupabaseAuthContext.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/hooks/useEvents.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/index.css create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/lib/customSupabaseClient.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/lib/utils.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/main.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/AboutPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/BlogPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/ContactPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/DeveloperResourcesPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/FaqPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/HomePage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/MaintenancePage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/MyAchievementsPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/MyEventsPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/SponsorsPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/admin/AdminDashboardPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/admin/AdminEventsPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/admin/AdminLayout.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/admin/AdminUsersPage.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/pages/admin/EventFormModal.jsx create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/tailwind.config.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/tools/generate-llms.js create mode 100644 horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/vite.config.js create mode 100644 src/components/FooterSection.astro.bak create mode 100644 src/components/PassportSSODemoModal.jsx create mode 100644 src/components/ui/AeThexLogo.jsx create mode 100644 src/components/ui/EventCard.jsx create mode 100644 src/components/ui/accordion.jsx create mode 100644 src/components/ui/appearanceSettings.jsx create mode 100644 src/components/ui/authModal.jsx create mode 100644 src/components/ui/badge.jsx create mode 100644 src/components/ui/button.jsx create mode 100644 src/components/ui/callToAction.jsx create mode 100644 src/components/ui/card.jsx create mode 100644 src/components/ui/cardSkeleton.jsx create mode 100644 src/components/ui/checkbox.jsx create mode 100644 src/components/ui/confirmationModal.jsx create mode 100644 src/components/ui/createProjectModal.jsx create mode 100644 src/components/ui/developerResources.jsx create mode 100644 src/components/ui/dialog.jsx create mode 100644 src/components/ui/domainFormModal.jsx create mode 100644 src/components/ui/dropdown-menu.jsx create mode 100644 src/components/ui/eventCardSkeleton.jsx create mode 100644 src/components/ui/eventDetailModal.jsx create mode 100644 src/components/ui/featuredSpeakers.jsx create mode 100644 src/components/ui/heroImage.jsx create mode 100644 src/components/ui/input.jsx create mode 100644 src/components/ui/inviteUserModal.jsx create mode 100644 src/components/ui/label.jsx create mode 100644 src/components/ui/loadingScreen.jsx create mode 100644 src/components/ui/maintenanceScreen.jsx create mode 100644 src/components/ui/messageUserModal.jsx create mode 100644 src/components/ui/notificationBell.jsx create mode 100644 src/components/ui/pageHeader.jsx create mode 100644 src/components/ui/pageLayout.jsx create mode 100644 src/components/ui/passportModal.jsx create mode 100644 src/components/ui/profileSettings.jsx create mode 100644 src/components/ui/projectCard.jsx create mode 100644 src/components/ui/projectFilters.jsx create mode 100644 src/components/ui/projectHeader.jsx create mode 100644 src/components/ui/protectedRoute.jsx create mode 100644 src/components/ui/securitySettings.jsx create mode 100644 src/components/ui/select.jsx create mode 100644 src/components/ui/sponsors.jsx create mode 100644 src/components/ui/switch.jsx create mode 100644 src/components/ui/table.jsx create mode 100644 src/components/ui/testimonials.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/use-toast.js create mode 100644 src/components/ui/welcomeMessage.jsx create mode 100644 src/pages/contribute.astro create mode 100644 src/pages/events.astro create mode 100644 src/pages/gameforge.astro create mode 100644 src/pages/horizons-1.astro create mode 100644 src/pages/horizons-2.astro create mode 100644 src/pages/horizons-3.astro diff --git a/contribute/.nvmrc b/contribute/.nvmrc new file mode 100644 index 0000000..7949534 --- /dev/null +++ b/contribute/.nvmrc @@ -0,0 +1 @@ +20.19.1 diff --git a/contribute/.version b/contribute/.version new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/contribute/.version @@ -0,0 +1 @@ +20 diff --git a/contribute/eslint.config.mjs b/contribute/eslint.config.mjs new file mode 100644 index 0000000..8f4ae41 --- /dev/null +++ b/contribute/eslint.config.mjs @@ -0,0 +1,53 @@ +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import importPlugin from 'eslint-plugin-import'; +import globals from 'globals'; + +export default [ + { ignores: ['node_modules/**', 'dist/**', 'build/**', 'vite.config.js'] }, + { + files: ['**/*.js', '**/*.jsx'], + plugins: { react, 'react-hooks': reactHooks, import: importPlugin }, + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parserOptions: { ecmaFeatures: { jsx: true } }, + globals: { ...globals.browser, React: 'readonly', Intl: 'readonly' }, + }, + settings: { + react: { version: 'detect' }, + 'import/resolver': { + node: { extensions: ['.js', '.jsx'] }, + alias: { map: [['@', './src']], extensions: ['.js', '.jsx'] }, + }, + }, + rules: { + ...react.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + ...importPlugin.flatConfigs.recommended.rules, + + // Non-critical rules - disabled since code works fine without them + 'react/prop-types': 'off', + 'react/no-unescaped-entities': 'off', + 'react/display-name': 'off', // Non-critical, component works without displayName + 'react/jsx-uses-react': 'off', // Not needed in React 17+, non-critical + 'react/react-in-jsx-scope': 'off', // Not needed in React 17+, non-critical + 'react/jsx-uses-vars': 'off', // Non-critical, code works fine + 'react/jsx-no-comment-textnodes': 'off', // Non-critical, comments could be visible if put inside the JSX, most cases are just rendering text like '///' + + 'no-unused-vars': 'off', // Non-critical, code works fine with unused vars + 'import/no-named-as-default': 'off', // Can cause runtime import errors, usually fine to leave as is + 'import/no-named-as-default-member': 'off', // Can cause runtime import errors + + // Critical rules that prevent runtime errors + 'no-undef': 'error', // Undefined variables cause runtime errors + + // Override recommended import rules for stricter checking + 'import/no-self-import': 'error', // Extremely fast rule, breaking results in infinite loop/bundling error + + // Disable expensive rules for performance + 'import/no-cycle': 'off', // AI rarely makes this error, and the rule is very slow to run + }, + }, + { files: ['tools/**/*.js', 'tailwind.config.js'], languageOptions: { globals: globals.node } }, +]; diff --git a/contribute/index.html b/contribute/index.html new file mode 100644 index 0000000..f726ba4 --- /dev/null +++ b/contribute/index.html @@ -0,0 +1,14 @@ + + + + + + + + AeThex + + +
+ + + \ No newline at end of file diff --git a/contribute/package-lock.json b/contribute/package-lock.json new file mode 100644 index 0000000..e615364 --- /dev/null +++ b/contribute/package-lock.json @@ -0,0 +1,10836 @@ +{ + "name": "web-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web-app", + "version": "0.0.0", + "dependencies": { + "@babel/traverse": "^7.26.4", + "@emotion/is-prop-valid": "^1.2.1", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.3", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@supabase/supabase-js": "2.30.0", + "@tailwindcss/typography": "^0.5.10", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "framer-motion": "^10.16.4", + "lucide-react": "^0.285.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-helmet": "^6.1.0", + "react-hot-toast": "^2.4.1", + "react-qrcode-logo": "^2.9.0", + "react-router-dom": "^6.16.0", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@types/node": "^20.8.3", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.1", + "eslint-config-react-app": "^7.0.1", + "postcss": "^8.4.31", + "tailwindcss": "^3.3.3", + "terser": "^5.39.0", + "vite": "^4.4.5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "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.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "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/eslint-parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", + "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@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-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "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/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.6.tgz", + "integrity": "sha512-RVdFPPyY9fCRAX68haPmOk2iyKW8PKJFthmm8NeSI3paNxKWGZIn99+VbIf0FrtCpFnPgnpF/L48tadi617ULg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "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-async-generator-functions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "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-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "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-duplicate-named-capturing-groups-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "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-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "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-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "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-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "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-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "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-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "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-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "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-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "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": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "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-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "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-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "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-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "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-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "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-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "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-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "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/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/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "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-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-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/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/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "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/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "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-accordion/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/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-accordion/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-accordion/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-accordion/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-accordion/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-accordion/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-accordion/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-accordion/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-accordion/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-alert-dialog": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.4.tgz", + "integrity": "sha512-A6Kh23qZDLy3PSU4bh2UJZznOrUdHImIXqF8YtUa6CN73f8EOO9XlXSCd9IHyPvIquTaa/kwaSWzZTtUvgXVGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dialog": "1.1.4", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "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-arrow": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz", + "integrity": "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.2.tgz", + "integrity": "sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz", + "integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-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-collapsible/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-collapsible/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-collapsible/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/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-collapsible/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-collapsible/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-collapsible/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-collection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "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-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz", + "integrity": "sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "^2.6.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-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz", + "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "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.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.4.tgz", + "integrity": "sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.4", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz", + "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.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-label": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", + "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.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-menu": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.4.tgz", + "integrity": "sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.1", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-roving-focus": "1.1.1", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "^2.6.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-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", + "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz", + "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/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/react-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/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-select/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-select/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-select/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-select/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-select/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-select/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-select/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/react-select/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/@radix-ui/react-slider": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.2.tgz", + "integrity": "sha512-sNlU06ii1/ZcbHf8I9En54ZPW0Vil/yPVg4vQMcFNjrIx51jsHbFl1HYHQvCIWJSr1q0ZmA+iIs/ZTv8h7HHSA==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "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-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-switch/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-switch/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-switch/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-switch/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-switch/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/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-switch/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-switch/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-switch/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-tabs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", + "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-roving-focus": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.4.tgz", + "integrity": "sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "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-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.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-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-effect-event/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-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "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.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.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-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.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-visually-hidden": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz", + "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.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/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", + "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@supabase/functions-js": { + "version": "2.91.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.91.1.tgz", + "integrity": "sha512-xKepd3HZ6K6rKibriehKggIegsoz+jjV67tikN51q/YQq3AlUAkjUMSnMrqs8t5LMlAi+a3dJU812acXanR0cw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/gotrue-js": { + "version": "2.43.1", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.43.1.tgz", + "integrity": "sha512-HVjjElEPbM5sDoK1pXry/H181X7A1a9G9O68PZwN276y/EUwWOw3pA8KKKSRTaTSiK+41BPC8HUfsfbe7470RQ==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.21.4.tgz", + "integrity": "sha512-TxZCIjxk6/dP9abAi89VQbWWMBbybpGWyvmIzTd79OeravM13OjR/YEYeyUOPcM1C3QyvXkvPZhUfItvmhY1IQ==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.91.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.91.1.tgz", + "integrity": "sha512-Y4rifuvzekFgd2hUfiEvcMoh/JU3s1hmpWYS7tNGL2QHuFfWg8a4w/qg5qoSMVDvgGRz6G4L6yB1FaQRTplENQ==", + "license": "MIT", + "dependencies": { + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "tslib": "2.8.1", + "ws": "^8.18.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.91.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.91.1.tgz", + "integrity": "sha512-hMJNT2tSleOrWwx4FmHTpihIA2PRDixAsWflECuQ4YDkeduBZGX5m2txnstMnteWW+H+mm+92WRRFLuidXqbfA==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.30.0.tgz", + "integrity": "sha512-waAcD6U+fBwCfCyloShdBo3ifFKvBDS2jq/S/Dj4HQT0WNsZich7b1NIpN5EZxbNQTDMbmUthXil7fRpnSErKQ==", + "license": "MIT", + "dependencies": { + "@supabase/functions-js": "^2.1.0", + "@supabase/gotrue-js": "2.43.1", + "@supabase/postgrest-js": "^1.7.0", + "@supabase/realtime-js": "^2.7.3", + "@supabase/storage-js": "^2.5.1", + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "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.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "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/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/phoenix": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.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", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "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", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "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/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "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.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.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/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "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.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "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.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "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/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT", + "peer": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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/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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "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/electron-to-chromium": { + "version": "1.5.278", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", + "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.8", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz", + "integrity": "sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==", + "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.3", + "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.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "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-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.0", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^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.18" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "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.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "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": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-config-react-app/node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "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" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "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.8", + "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/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/eslint-plugin-react/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/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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.4" + }, + "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.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": "10.18.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.18.0.tgz", + "integrity": "sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.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-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": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "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/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/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/goober": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", + "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/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.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "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/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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.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.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "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.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "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/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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "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.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "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/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.285.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.285.0.tgz", + "integrity": "sha512-TvWtS0Zc2lT0wTMyD+sEB7x9TM/38MQMJfJbQMMWJOsPx+lEaWBk1aKalqhCZj/Vbl2r00Uqln7xTTY2T7R63g==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "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/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "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" + } + }, + "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.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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/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-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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", + "peer": true, + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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/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/qrcode-generator": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.5.2.tgz", + "integrity": "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "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", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.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", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.8", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", + "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-hot-toast": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", + "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "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-qrcode-logo": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-qrcode-logo/-/react-qrcode-logo-2.10.0.tgz", + "integrity": "sha512-Q1+jLtcyDl5rLR29YdkXVLzYk62p3+541x00HxURVBQhs6SqFyEZZVhvkU/VQ082ytXa3GdCmGWMLK5z0Vhe7g==", + "license": "MIT", + "dependencies": { + "lodash.isequal": "^4.5.0", + "qrcode-generator": "^1.4.1" + }, + "peerDependencies": { + "react": ">=16.4.1", + "react-dom": ">=16.4.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.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/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/reflect.getprototypeof": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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/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-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/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/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "dev": true, + "license": "MIT" + }, + "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/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/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/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/sucrase/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/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": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==", + "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", + "peer": true, + "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/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "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/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/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "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/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "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/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "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/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.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "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" + } + } + } +} diff --git a/contribute/package.json b/contribute/package.json new file mode 100644 index 0000000..d11b9b9 --- /dev/null +++ b/contribute/package.json @@ -0,0 +1,59 @@ +{ + "name": "web-app", + "type": "module", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite --host :: --port 3000", + "build": "node tools/generate-llms.js || true && vite build", + "preview": "vite preview --host :: --port 3000" + }, + "dependencies": { + "@babel/traverse": "^7.26.4", + "@emotion/is-prop-valid": "^1.2.1", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.3", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@supabase/supabase-js": "2.30.0", + "@tailwindcss/typography": "^0.5.10", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "framer-motion": "^10.16.4", + "lucide-react": "^0.285.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-helmet": "^6.1.0", + "react-hot-toast": "^2.4.1", + "react-qrcode-logo": "^2.9.0", + "react-router-dom": "^6.16.0", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@types/node": "^20.8.3", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.57.1", + "eslint-config-react-app": "^7.0.1", + "postcss": "^8.4.31", + "tailwindcss": "^3.3.3", + "terser": "^5.39.0", + "vite": "^4.4.5" + } +} \ No newline at end of file diff --git a/contribute/plugins/selection-mode/selection-mode-script.js b/contribute/plugins/selection-mode/selection-mode-script.js new file mode 100644 index 0000000..82afab5 --- /dev/null +++ b/contribute/plugins/selection-mode/selection-mode-script.js @@ -0,0 +1,430 @@ +const ALLOWED_PARENT_ORIGINS = [ + 'https://horizons.hostinger.com', + 'https://horizons.hostinger.dev', + 'https://horizons-frontend-local.hostinger.dev', + 'http://localhost:4000', +]; + +const IMPORTANT_STYLES = [ + 'display', + 'position', + 'flex-direction', + 'justify-content', + 'align-items', + 'width', + 'height', + 'padding', + 'margin', + 'border', + 'background-color', + 'color', + 'font-size', + 'font-weight', + 'font-family', + 'border-radius', + 'box-shadow', + 'gap', + 'grid-template-columns', +]; + +const PRIMARY_400_COLOR = '#7B68EE'; +const TEXT_CONTEXT_MAX_LENGTH = 500; +const DATA_SELECTION_MODE_ENABLED_ATTRIBUTE = 'data-selection-mode-enabled'; +const MESSAGE_TYPE_ENABLE_SELECTION_MODE = 'enableSelectionMode'; +const MESSAGE_TYPE_DISABLE_SELECTION_MODE = 'disableSelectionMode'; + +let selectionModeEnabled = false; +let currentHoverElement = null; +let overlayDiv = null; +let selectedOverlayDiv = null; +let selectedElement = null; + + +function injectStyles() { + if (document.getElementById('selection-mode-styles')) { + return; + } + + const style = document.createElement('style'); + style.id = 'selection-mode-styles'; + style.textContent = ` + #selection-mode-overlay { + position: absolute; + border: 2px dashed ${PRIMARY_400_COLOR}; + pointer-events: none; + z-index: 999999; + } + #selection-mode-selected-overlay { + position: absolute; + border: 3px solid ${PRIMARY_400_COLOR}; + pointer-events: none; + z-index: 999998; + } + `; + document.head.appendChild(style); +} + +function getParentOrigin() { + if ( + window.location.ancestorOrigins + && window.location.ancestorOrigins.length > 0 + ) { + return window.location.ancestorOrigins[0]; + } + + if (document.referrer) { + try { + return new URL(document.referrer).origin; + } catch { + console.warn('[SELECTION MODE] Invalid referrer URL:', document.referrer); + } + } + + return null; +} + +/** + * Extract file path from React Fiber metadata (simplified - only for filePath) + * @param {*} node - DOM node + * @returns {string|null} - File path if found, null otherwise + */ +function getFilePathFromNode(node) { + const fiberKey = Object.keys(node).find(k => k.startsWith('__reactFiber')); + if (!fiberKey) { + return null; + } + + const fiber = node[fiberKey]; + if (!fiber) { + return null; + } + + // Traverse up the fiber tree to find source metadata + let currentFiber = fiber; + while (currentFiber) { + const source = currentFiber._debugSource + || currentFiber.memoizedProps?.__source + || currentFiber.pendingProps?.__source; + + if (source?.fileName) { + return source.fileName; + } + + currentFiber = currentFiber.return; + } + + return null; +} + +/** + * Generate a CSS selector path to uniquely identify the element + * @param {*} element + * @returns {string} CSS selector path + */ +function getPathToElement(element) { + const path = []; + let current = element; + let depth = 0; + const maxDepth = 20; // Prevent infinite loops + + while (current && current.nodeType === Node.ELEMENT_NODE && depth < maxDepth) { + let selector = current.nodeName.toLowerCase(); + + if (current.id) { + selector += `#${current.id}`; + path.unshift(selector); + break; // ID is unique, stop here + } + + if (current.className && typeof current.className === 'string') { + const classes = current.className.trim().split(/\s+/).filter(c => c.length > 0); + if (classes.length > 0) { + selector += `.${classes.join('.')}`; + } + } + + if (current.parentElement) { + const siblings = Array.from(current.parentElement.children); + const sameTypeSiblings = siblings.filter(s => s.nodeName === current.nodeName); + if (sameTypeSiblings.length > 1) { + const index = sameTypeSiblings.indexOf(current) + 1; + selector += `:nth-of-type(${index})`; + } + } + + path.unshift(selector); + current = current.parentElement; + depth++; + } + + return path.join(' > '); +} + +function getComputedStyles(element) { + const computedStyles = window.getComputedStyle(element); + + return Object.fromEntries(IMPORTANT_STYLES.map((style) => { + const styleValue = computedStyles.getPropertyValue(style)?.trim(); + + return styleValue && styleValue !== 'none' && styleValue !== 'normal' + ? [style, styleValue] + : null; + }) + .filter(Boolean)); +} + +function extractDOMContext(element) { + if (!element) { + return null; + } + + const textContent = element.textContent?.trim(); + + return { + outerHTML: element.outerHTML, + selector: getPathToElement(element), + attributes: (element.attributes && element.attributes.length > 0) + ? Object.fromEntries(Array.from(element.attributes).map((attr) => [attr.name, attr.value])) + : {}, + computedStyles: getComputedStyles(element), + textContent: (textContent && textContent.length > 0 && textContent.length < TEXT_CONTEXT_MAX_LENGTH) + ? element.textContent?.trim() + : null + }; +} + +function createOverlay() { + if (overlayDiv) { + return; + } + + injectStyles(); + + overlayDiv = document.createElement('div'); + overlayDiv.id = 'selection-mode-overlay'; + document.body.appendChild(overlayDiv); +} + +function createSelectedOverlay() { + if (selectedOverlayDiv) { + return; + } + + injectStyles(); + + selectedOverlayDiv = document.createElement('div'); + selectedOverlayDiv.id = 'selection-mode-selected-overlay'; + document.body.appendChild(selectedOverlayDiv); +} + +function removeOverlay() { + if (overlayDiv && overlayDiv.parentNode) { + overlayDiv.parentNode.removeChild(overlayDiv); + overlayDiv = null; + } + if (selectedOverlayDiv && selectedOverlayDiv.parentNode) { + selectedOverlayDiv.parentNode.removeChild(selectedOverlayDiv); + selectedOverlayDiv = null; + } +} + +function showOverlay(element) { + if (!overlayDiv) { + createOverlay(); + } + + const rect = element.getBoundingClientRect(); + overlayDiv.style.left = `${rect.left + window.scrollX}px`; + overlayDiv.style.top = `${rect.top + window.scrollY}px`; + overlayDiv.style.width = `${rect.width}px`; + overlayDiv.style.height = `${rect.height}px`; + overlayDiv.style.display = 'block'; +} + +function showSelectedOverlay(element) { + if (!selectedOverlayDiv) { + createSelectedOverlay(); + } + + const rect = element.getBoundingClientRect(); + selectedOverlayDiv.style.left = `${rect.left + window.scrollX}px`; + selectedOverlayDiv.style.top = `${rect.top + window.scrollY}px`; + selectedOverlayDiv.style.width = `${rect.width}px`; + selectedOverlayDiv.style.height = `${rect.height}px`; + selectedOverlayDiv.style.display = 'block'; +} + +function hideOverlay() { + if (overlayDiv) { + overlayDiv.style.display = 'none'; + } +} + +function handleMouseMove(event) { + if (!selectionModeEnabled) { + return; + } + + const element = document.elementFromPoint(event.clientX, event.clientY); + if (!element) { + hideOverlay(); + currentHoverElement = null; + return; + } + + if (element === overlayDiv || element === selectedOverlayDiv) { + return; + } + + // Only update if we're hovering a different element + if (currentHoverElement !== element) { + currentHoverElement = element; + + // Show outline on the element + showOverlay(element); + } +} + +function handleTouchStart(event) { + if (!selectionModeEnabled) { + return; + } + + const touch = event.touches[0]; + if (!touch) { + return; + } + + const element = document.elementFromPoint(touch.clientX, touch.clientY); + if (!element) { + currentHoverElement = null; + return; + } + + if (element === overlayDiv || element === selectedOverlayDiv) { + return; + } + + currentHoverElement = element; + + showOverlay(element); +} + +function stripFilePath(filePath) { + if (!filePath) { + return filePath; + } + + const publicHtmlIndex = filePath.indexOf('public_html/'); + if (publicHtmlIndex !== -1) { + return filePath.substring(publicHtmlIndex + 'public_html/'.length); + } + + return filePath; +} + +function handleClick(event) { + if (!selectionModeEnabled) { + return; + } + + if (!currentHoverElement) { + const element = document.elementFromPoint(event.clientX, event.clientY); + + if (!element || element === overlayDiv || element === selectedOverlayDiv) { + return; + } + + currentHoverElement = element; + } + + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + + const domContext = extractDOMContext(currentHoverElement); + + if (!domContext) { + return; + } + + selectedElement = currentHoverElement; + if (selectedElement) { + showSelectedOverlay(selectedElement); + } + + // Extract file path from React Fiber (if available) + const filePath = getFilePathFromNode(currentHoverElement); + const strippedFilePath = filePath ? stripFilePath(filePath) : undefined; + + // Send domContext and filePath to parent window + const parentOrigin = getParentOrigin(); + if (parentOrigin && ALLOWED_PARENT_ORIGINS.includes(parentOrigin)) { + window.parent.postMessage( + { + type: 'elementSelected', + payload: { + filePath: strippedFilePath, + domContext, + }, + }, + parentOrigin, + ); + } +} + +function handleMouseLeave() { + if (!selectionModeEnabled) { + return; + } + + hideOverlay(); + currentHoverElement = null; +} + +function enableSelectionMode() { + if (selectionModeEnabled) { + return; + } + + selectionModeEnabled = true; + document.getElementById('root')?.setAttribute(DATA_SELECTION_MODE_ENABLED_ATTRIBUTE, 'true'); + + document.body.style.userSelect = 'none'; + + createOverlay(); + document.addEventListener('mousemove', handleMouseMove, true); + document.addEventListener('touchstart', handleTouchStart, true); + document.addEventListener('click', handleClick, true); + document.addEventListener('mouseleave', handleMouseLeave, true); +} + +function disableSelectionMode() { + if (!selectionModeEnabled) { + return; + } + + selectionModeEnabled = false; + document.getElementById('root')?.removeAttribute(DATA_SELECTION_MODE_ENABLED_ATTRIBUTE); + + document.body.style.userSelect = ''; + + hideOverlay(); + removeOverlay(); + currentHoverElement = null; + selectedElement = null; + + document.removeEventListener('mousemove', handleMouseMove, true); + document.removeEventListener('touchstart', handleTouchStart, true); + document.removeEventListener('click', handleClick, true); + document.removeEventListener('mouseleave', handleMouseLeave, true); +} + +window.addEventListener('message', (event) => { + if (event.data?.type === MESSAGE_TYPE_ENABLE_SELECTION_MODE) { + enableSelectionMode(); + } + if (event.data?.type === MESSAGE_TYPE_DISABLE_SELECTION_MODE) { + disableSelectionMode(); + } +}); diff --git a/contribute/plugins/selection-mode/vite-plugin-selection-mode.js b/contribute/plugins/selection-mode/vite-plugin-selection-mode.js new file mode 100644 index 0000000..aa0c627 --- /dev/null +++ b/contribute/plugins/selection-mode/vite-plugin-selection-mode.js @@ -0,0 +1,27 @@ +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function selectionModePlugin() { + return { + name: 'vite:selection-mode', + apply: 'serve', + + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'selection-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body', + }, + ]; + }, + }; +} diff --git a/contribute/plugins/utils/ast-utils.js b/contribute/plugins/utils/ast-utils.js new file mode 100644 index 0000000..9013ab7 --- /dev/null +++ b/contribute/plugins/utils/ast-utils.js @@ -0,0 +1,279 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import generate from '@babel/generator'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import { + isJSXIdentifier, + isJSXMemberExpression, +} from '@babel/types'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const VITE_PROJECT_ROOT = path.resolve(__dirname, '../..'); + +// Blacklist of components that should not be extracted (utility/non-visual components) +const COMPONENT_BLACKLIST = new Set([ + 'Helmet', + 'HelmetProvider', + 'Head', + 'head', + 'Meta', + 'meta', + 'Script', + 'script', + 'NoScript', + 'noscript', + 'Style', + 'style', + 'title', + 'Title', + 'link', + 'Link', +]); + +/** + * Validates that a file path is safe to access + * @param {string} filePath - Relative file path + * @returns {{ isValid: boolean, absolutePath?: string, error?: string }} - Object containing validation result + */ +export function validateFilePath(filePath) { + if (!filePath) { + return { isValid: false, error: 'Missing filePath' }; + } + + const absoluteFilePath = path.resolve(VITE_PROJECT_ROOT, filePath); + + if (filePath.includes('..') + || !absoluteFilePath.startsWith(VITE_PROJECT_ROOT) + || absoluteFilePath.includes('node_modules')) { + return { isValid: false, error: 'Invalid path' }; + } + + if (!fs.existsSync(absoluteFilePath)) { + return { isValid: false, error: 'File not found' }; + } + + return { isValid: true, absolutePath: absoluteFilePath }; +} + +/** + * Parses a file into a Babel AST + * @param {string} absoluteFilePath - Absolute path to file + * @returns {object} Babel AST + */ +export function parseFileToAST(absoluteFilePath) { + const content = fs.readFileSync(absoluteFilePath, 'utf-8'); + + return parse(content, { + sourceType: 'module', + plugins: ['jsx', 'typescript'], + errorRecovery: true, + }); +} + +/** + * Finds a JSX opening element at a specific line and column + * @param {object} ast - Babel AST + * @param {number} line - Line number (1-indexed) + * @param {number} column - Column number (0-indexed for get-code-block, 1-indexed for apply-edit) + * @returns {object | null} Babel path to the JSX opening element + */ +export function findJSXElementAtPosition(ast, line, column) { + let targetNodePath = null; + let closestNodePath = null; + let closestDistance = Infinity; + const allNodesOnLine = []; + + const visitor = { + JSXOpeningElement(path) { + const node = path.node; + if (node.loc) { + // Exact match (with tolerance for off-by-one column differences) + if (node.loc.start.line === line + && Math.abs(node.loc.start.column - column) <= 1) { + targetNodePath = path; + path.stop(); + return; + } + + // Track all nodes on the same line + if (node.loc.start.line === line) { + allNodesOnLine.push({ + path, + column: node.loc.start.column, + distance: Math.abs(node.loc.start.column - column), + }); + } + + // Track closest match on the same line for fallback + if (node.loc.start.line === line) { + const distance = Math.abs(node.loc.start.column - column); + if (distance < closestDistance) { + closestDistance = distance; + closestNodePath = path; + } + } + } + }, + // Also check JSXElement nodes that contain the position + JSXElement(path) { + const node = path.node; + if (!node.loc) { + return; + } + + // Check if this element spans the target line (for multi-line elements) + if (node.loc.start.line > line || node.loc.end.line < line) { + return; + } + + // If we're inside this element's range, consider its opening element + if (!path.node.openingElement?.loc) { + return; + } + + const openingLine = path.node.openingElement.loc.start.line; + const openingCol = path.node.openingElement.loc.start.column; + + // Prefer elements that start on the exact line + if (openingLine === line) { + const distance = Math.abs(openingCol - column); + if (distance < closestDistance) { + closestDistance = distance; + closestNodePath = path.get('openingElement'); + } + return; + } + + // Handle elements that start before the target line + if (openingLine < line) { + const distance = (line - openingLine) * 100; // Penalize by line distance + if (distance < closestDistance) { + closestDistance = distance; + closestNodePath = path.get('openingElement'); + } + } + }, + }; + + traverseBabel.default(ast, visitor); + + // Return exact match if found, otherwise return closest match if within reasonable distance + // Use larger threshold (50 chars) for same-line elements, 5 lines for multi-line elements + const threshold = closestDistance < 100 ? 50 : 500; + return targetNodePath || (closestDistance <= threshold ? closestNodePath : null); +} + +/** + * Checks if a JSX element name is blacklisted + * @param {object} jsxOpeningElement - Babel JSX opening element node + * @returns {boolean} True if blacklisted + */ +function isBlacklistedComponent(jsxOpeningElement) { + if (!jsxOpeningElement || !jsxOpeningElement.name) { + return false; + } + + // Handle JSXIdentifier (e.g., ) + if (isJSXIdentifier(jsxOpeningElement.name)) { + return COMPONENT_BLACKLIST.has(jsxOpeningElement.name.name); + } + + // Handle JSXMemberExpression (e.g., ) + if (isJSXMemberExpression(jsxOpeningElement.name)) { + let current = jsxOpeningElement.name; + while (isJSXMemberExpression(current)) { + current = current.property; + } + if (isJSXIdentifier(current)) { + return COMPONENT_BLACKLIST.has(current.name); + } + } + + return false; +} + +/** + * Generates code from an AST node + * @param {object} node - Babel AST node + * @param {object} options - Generator options + * @returns {string} Generated code + */ +export function generateCode(node, options = {}) { + const generateFunction = generate.default || generate; + const output = generateFunction(node, options); + return output.code; +} + +/** + * Generates a full source file from AST with source maps + * @param {object} ast - Babel AST + * @param {string} sourceFileName - Source file name for source map + * @param {string} originalCode - Original source code + * @returns {{code: string, map: object}} - Object containing generated code and source map + */ +export function generateSourceWithMap(ast, sourceFileName, originalCode) { + const generateFunction = generate.default || generate; + return generateFunction(ast, { + sourceMaps: true, + sourceFileName, + }, originalCode); +} + +/** + * Extracts code blocks from a JSX element at a specific location + * @param {string} filePath - Relative file path + * @param {number} line - Line number + * @param {number} column - Column number + * @param {object} [domContext] - Optional DOM context to return on failure + * @returns {{success: boolean, filePath?: string, specificLine?: string, error?: string, domContext?: object}} - Object with metadata for LLM + */ +export function extractCodeBlocks(filePath, line, column, domContext) { + try { + // Validate file path + const validation = validateFilePath(filePath); + if (!validation.isValid) { + return { success: false, error: validation.error, domContext }; + } + + // Parse AST + const ast = parseFileToAST(validation.absolutePath); + + // Find target node + const targetNodePath = findJSXElementAtPosition(ast, line, column); + + if (!targetNodePath) { + return { success: false, error: 'Target node not found at specified line/column', domContext }; + } + + // Check if the target node is a blacklisted component + const isBlacklisted = isBlacklistedComponent(targetNodePath.node); + + if (isBlacklisted) { + return { + success: true, + filePath, + specificLine: '', + }; + } + + // Get specific line code + const specificLine = generateCode(targetNodePath.parentPath?.node || targetNodePath.node); + + return { + success: true, + filePath, + specificLine, + }; + } catch (error) { + console.error('[ast-utils] Error extracting code blocks:', error); + return { success: false, error: 'Failed to extract code blocks', domContext }; + } +} + +/** + * Project root path + */ +export { VITE_PROJECT_ROOT }; diff --git a/contribute/plugins/visual-editor/edit-mode-script.js b/contribute/plugins/visual-editor/edit-mode-script.js new file mode 100644 index 0000000..57ed8c6 --- /dev/null +++ b/contribute/plugins/visual-editor/edit-mode-script.js @@ -0,0 +1,357 @@ +// eslint-disable-next-line import/no-unresolved +import { POPUP_STYLES } from "./plugins/visual-editor/visual-editor-config.js"; + +const PLUGIN_APPLY_EDIT_API_URL = "/api/apply-edit"; + +const ALLOWED_PARENT_ORIGINS = [ + "https://horizons.hostinger.com", + "https://horizons.hostinger.dev", + "https://horizons-frontend-local.hostinger.dev", + "http://localhost:4000", +]; + +let disabledTooltipElement = null; +let currentDisabledHoverElement = null; + +let translations = { + disabledTooltipText: "This text can be changed only through chat.", + disabledTooltipTextImage: "This image can only be changed through chat.", +}; + +let areStylesInjected = false; + +let globalEventHandlers = null; + +let currentEditingInfo = null; + +function injectPopupStyles() { + if (areStylesInjected) return; + + const styleElement = document.createElement("style"); + styleElement.id = "inline-editor-styles"; + styleElement.textContent = POPUP_STYLES; + document.head.appendChild(styleElement); + areStylesInjected = true; +} + +function findEditableElementAtPoint(event) { + let editableElement = event.target.closest("[data-edit-id]"); + + if (editableElement) { + return editableElement; + } + + const elementsAtPoint = document.elementsFromPoint( + event.clientX, + event.clientY + ); + + const found = elementsAtPoint.find( + (el) => el !== event.target && el.hasAttribute("data-edit-id") + ); + if (found) return found; + + return null; +} + +function findDisabledElementAtPoint(event) { + const direct = event.target.closest("[data-edit-disabled]"); + if (direct) return direct; + const elementsAtPoint = document.elementsFromPoint( + event.clientX, + event.clientY + ); + const found = elementsAtPoint.find( + (el) => el !== event.target && el.hasAttribute("data-edit-disabled") + ); + if (found) return found; + return null; +} + +function showPopup(targetElement, editId, currentContent, isImage = false) { + currentEditingInfo = { editId, targetElement }; + + const parentOrigin = getParentOrigin(); + + if (parentOrigin && ALLOWED_PARENT_ORIGINS.includes(parentOrigin)) { + const eventType = isImage ? "imageEditEnter" : "editEnter"; + + window.parent.postMessage( + { + type: eventType, + payload: { currentText: currentContent }, + }, + parentOrigin + ); + } +} + +function handleGlobalEvent(event) { + if ( + !document.getElementById("root")?.getAttribute("data-edit-mode-enabled") + ) { + return; + } + + // Don't handle if selection mode is active + if (document.getElementById("root")?.getAttribute("data-selection-mode-enabled") === "true") { + return; + } + + if (event.target.closest("#inline-editor-popup")) { + return; + } + + const editableElement = findEditableElementAtPoint(event); + + if (editableElement) { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + + if (event.type === "click") { + const editId = editableElement.getAttribute("data-edit-id"); + if (!editId) { + console.warn("[INLINE EDITOR] Clicked element missing data-edit-id"); + return; + } + + const isImage = editableElement.tagName.toLowerCase() === "img"; + let currentContent = ""; + + if (isImage) { + currentContent = editableElement.getAttribute("src") || ""; + } else { + currentContent = editableElement.textContent || ""; + } + + showPopup(editableElement, editId, currentContent, isImage); + } + } else { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + } +} + +function getParentOrigin() { + if ( + window.location.ancestorOrigins && + window.location.ancestorOrigins.length > 0 + ) { + return window.location.ancestorOrigins[0]; + } + + if (document.referrer) { + try { + return new URL(document.referrer).origin; + } catch (e) { + console.warn("Invalid referrer URL:", document.referrer); + } + } + + return null; +} + +async function handleEditSave(updatedText) { + const newText = updatedText + // Replacing characters that cause Babel parser to crash + .replace(//g, ">") + .replace(/{/g, "{") + .replace(/}/g, "}"); + + const { editId } = currentEditingInfo; + + try { + const response = await fetch(PLUGIN_APPLY_EDIT_API_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + editId: editId, + newFullText: newText, + }), + }); + + const result = await response.json(); + if (result.success) { + const parentOrigin = getParentOrigin(); + if (parentOrigin && ALLOWED_PARENT_ORIGINS.includes(parentOrigin)) { + window.parent.postMessage( + { + type: "editApplied", + payload: { + editId: editId, + fileContent: result.newFileContent, + beforeCode: result.beforeCode, + afterCode: result.afterCode, + }, + }, + parentOrigin + ); + } else { + console.error("Unauthorized parent origin:", parentOrigin); + } + } else { + console.error( + `[vite][visual-editor] Error saving changes: ${result.error}` + ); + } + } catch (error) { + console.error( + `[vite][visual-editor] Error during fetch for ${editId}:`, + error + ); + } +} + +function createDisabledTooltip() { + if (disabledTooltipElement) return; + + disabledTooltipElement = document.createElement("div"); + disabledTooltipElement.id = "inline-editor-disabled-tooltip"; + document.body.appendChild(disabledTooltipElement); +} + +function showDisabledTooltip(targetElement, isImage = false) { + if (!disabledTooltipElement) createDisabledTooltip(); + + disabledTooltipElement.textContent = isImage + ? translations.disabledTooltipTextImage + : translations.disabledTooltipText; + + if (!disabledTooltipElement.isConnected) { + document.body.appendChild(disabledTooltipElement); + } + disabledTooltipElement.classList.add("tooltip-active"); + + const tooltipWidth = disabledTooltipElement.offsetWidth; + const tooltipHeight = disabledTooltipElement.offsetHeight; + const rect = targetElement.getBoundingClientRect(); + + // Ensures that tooltip is not off the screen with 5px margin + let newLeft = rect.left + window.scrollX + rect.width / 2 - tooltipWidth / 2; + let newTop = rect.bottom + window.scrollY + 5; + + if (newLeft < window.scrollX) { + newLeft = window.scrollX + 5; + } + if (newLeft + tooltipWidth > window.innerWidth + window.scrollX) { + newLeft = window.innerWidth + window.scrollX - tooltipWidth - 5; + } + if (newTop + tooltipHeight > window.innerHeight + window.scrollY) { + newTop = rect.top + window.scrollY - tooltipHeight - 5; + } + if (newTop < window.scrollY) { + newTop = window.scrollY + 5; + } + + disabledTooltipElement.style.left = `${newLeft}px`; + disabledTooltipElement.style.top = `${newTop}px`; +} + +function hideDisabledTooltip() { + if (disabledTooltipElement) { + disabledTooltipElement.classList.remove("tooltip-active"); + } +} + +function handleDisabledElementHover(event) { + const isImage = event.currentTarget.tagName.toLowerCase() === "img"; + + showDisabledTooltip(event.currentTarget, isImage); +} + +function handleDisabledElementLeave() { + hideDisabledTooltip(); +} + +function handleDisabledGlobalHover(event) { + const disabledElement = findDisabledElementAtPoint(event); + if (disabledElement) { + if (currentDisabledHoverElement !== disabledElement) { + currentDisabledHoverElement = disabledElement; + const isImage = disabledElement.tagName.toLowerCase() === "img"; + showDisabledTooltip(disabledElement, isImage); + } + } else { + if (currentDisabledHoverElement) { + currentDisabledHoverElement = null; + hideDisabledTooltip(); + } + } +} + +function enableEditMode() { + // Don't enable if selection mode is active + if (document.getElementById("root")?.getAttribute("data-selection-mode-enabled") === "true") { + console.warn("[EDIT MODE] Cannot enable edit mode while selection mode is active"); + return; + } + + document + .getElementById("root") + ?.setAttribute("data-edit-mode-enabled", "true"); + + injectPopupStyles(); + + if (!globalEventHandlers) { + globalEventHandlers = { + mousedown: handleGlobalEvent, + pointerdown: handleGlobalEvent, + click: handleGlobalEvent, + }; + + Object.entries(globalEventHandlers).forEach(([eventType, handler]) => { + document.addEventListener(eventType, handler, true); + }); + } + + document.addEventListener("mousemove", handleDisabledGlobalHover, true); + + document.querySelectorAll("[data-edit-disabled]").forEach((el) => { + el.removeEventListener("mouseenter", handleDisabledElementHover); + el.addEventListener("mouseenter", handleDisabledElementHover); + el.removeEventListener("mouseleave", handleDisabledElementLeave); + el.addEventListener("mouseleave", handleDisabledElementLeave); + }); +} + +function disableEditMode() { + document.getElementById("root")?.removeAttribute("data-edit-mode-enabled"); + + hideDisabledTooltip(); + + if (globalEventHandlers) { + Object.entries(globalEventHandlers).forEach(([eventType, handler]) => { + document.removeEventListener(eventType, handler, true); + }); + globalEventHandlers = null; + } + + document.removeEventListener("mousemove", handleDisabledGlobalHover, true); + currentDisabledHoverElement = null; + + document.querySelectorAll("[data-edit-disabled]").forEach((el) => { + el.removeEventListener("mouseenter", handleDisabledElementHover); + el.removeEventListener("mouseleave", handleDisabledElementLeave); + }); +} + +window.addEventListener("message", function (event) { + if (event.data?.type === "edit-save") { + handleEditSave(event.data?.payload?.newText); + } + if (event.data?.type === "enable-edit-mode") { + if (event.data?.translations) { + translations = { ...translations, ...event.data.translations }; + } + + enableEditMode(); + } + if (event.data?.type === "disable-edit-mode") { + disableEditMode(); + } +}); diff --git a/contribute/plugins/visual-editor/visual-editor-config.js b/contribute/plugins/visual-editor/visual-editor-config.js new file mode 100644 index 0000000..a5fa052 --- /dev/null +++ b/contribute/plugins/visual-editor/visual-editor-config.js @@ -0,0 +1,137 @@ +export const POPUP_STYLES = ` +#inline-editor-popup { + width: 360px; + position: fixed; + z-index: 10000; + background: #161718; + color: white; + border: 1px solid #4a5568; + border-radius: 16px; + padding: 8px; + box-shadow: 0 4px 12px rgba(0,0,0,0.2); + flex-direction: column; + gap: 10px; + display: none; +} + +@media (max-width: 768px) { + #inline-editor-popup { + width: calc(100% - 20px); + } +} + +#inline-editor-popup.is-active { + display: flex; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +#inline-editor-popup.is-disabled-view { + padding: 10px 15px; +} + +#inline-editor-popup textarea { + height: 100px; + padding: 4px 8px; + background: transparent; + color: white; + font-family: inherit; + font-size: 0.875rem; + line-height: 1.42; + resize: none; + outline: none; +} + +#inline-editor-popup .button-container { + display: flex; + justify-content: flex-end; + gap: 10px; +} + +#inline-editor-popup .popup-button { + border: none; + padding: 6px 16px; + border-radius: 8px; + cursor: pointer; + font-size: 0.75rem; + font-weight: 700; + height: 34px; + outline: none; +} + +#inline-editor-popup .save-button { + background: #673de6; + color: white; +} + +#inline-editor-popup .cancel-button { + background: transparent; + border: 1px solid #3b3d4a; + color: white; + + &:hover { + background:#474958; + } +} +`; + +export function getPopupHTMLTemplate(saveLabel, cancelLabel) { + return ` + +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/contribute/plugins/visual-editor/vite-plugin-edit-mode.js b/contribute/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/contribute/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/contribute/plugins/visual-editor/vite-plugin-react-inline-editor.js b/contribute/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/contribute/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + +

+ Remembered your password?{' '} + +

+ + ); + case 'sign_up': + case 'sign_in': + default: + return ( + <> +
+
+ +
+
+

+ {view === 'sign_in' ? 'Welcome Back' : 'Become a Contributor'} +

+

+ {view === 'sign_in' ? 'Sign in to your AeThex account' : 'Create an account to start contributing'} +

+ + + + +
+
+ OR CONTINUE WITH EMAIL +
+
+ +
+
+ +
+ + setEmail(e.target.value)} required className="pl-10" placeholder="Enter your email" /> +
+
+
+ +
+ + setPassword(e.target.value)} required className="pl-10" placeholder="Enter your password" /> +
+
+ + {view === 'sign_in' && ( +
+
+ + +
+ +
+ )} + + +
+

+ {view === 'sign_in' ? "Don't have an account?" : "Already have an account?"}{' '} + +

+ + ); + } + }; + + return ( + + e.stopPropagation()} + > +
+ + + {renderContent()} + +
+
+
+ ); +}; + +export default AuthModal; \ No newline at end of file diff --git a/contribute/src/components/CallToAction.jsx b/contribute/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/contribute/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/contribute/src/components/EventCard.jsx b/contribute/src/components/EventCard.jsx new file mode 100644 index 0000000..098c16f --- /dev/null +++ b/contribute/src/components/EventCard.jsx @@ -0,0 +1,103 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Calendar, MapPin, Star, ArrowRight } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate } from '@/lib/utils'; + +const cardVariants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, ease: "easeOut" } + }, + exit: { + opacity: 0, + y: -30, + transition: { duration: 0.3, ease: "easeIn" } + } +}; + +const EventCard = ({ event, onSelectEvent, getCategoryColor, getCategoryLabel }) => { + const eventUrl = `https://events.aethex.biz/event/${event.id}`; + + return ( + +
+
+
+ +
+ + {getCategoryLabel(event.category)} + +
+ {event.featured && ( + +
+ + Featured +
+
+ )} +
+ +
+

+ {event.title} +

+

+ {event.description} +

+ +
+
+ + {formatDate(event.date)} +
+
+ + {event.location} +
+
+ +
+
+ {event.price === 0 ? 'Free' : `$${event.price}`} +
+ +
+
+
+
+ ); +}; + +export default EventCard; \ No newline at end of file diff --git a/contribute/src/components/EventCardSkeleton.jsx b/contribute/src/components/EventCardSkeleton.jsx new file mode 100644 index 0000000..ae4e3be --- /dev/null +++ b/contribute/src/components/EventCardSkeleton.jsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const EventCardSkeleton = () => { + return ( + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ ); +}; + +export default EventCardSkeleton; \ No newline at end of file diff --git a/contribute/src/components/EventDetailModal.jsx b/contribute/src/components/EventDetailModal.jsx new file mode 100644 index 0000000..d8f34f7 --- /dev/null +++ b/contribute/src/components/EventDetailModal.jsx @@ -0,0 +1,162 @@ +import React from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Calendar, Clock, MapPin, Users, X, Loader2, ExternalLink } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate, formatTime } from '@/lib/utils'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const EventDetailModal = ({ event, onClose, onRegister, onUnregister, isRegistered, getCategoryColor, getCategoryLabel, isLoading }) => { + const eventUrl = `https://events.aethex.biz/event/${event.id}`; + + return ( + + e.stopPropagation()} + > +
+ + +
+
+ + + + {getCategoryLabel(event.category)} + + +
+ +
+
+
+

{event.title}

+

{event.full_description}

+ +
+
+

Event Details

+
+
{formatDate(event.date)}
+
{formatTime(event.time)}
+
{event.location}
+
{event.registered_count}/{event.capacity} registered
+
+
+
+

Speakers

+
    + {event.speakers && event.speakers.map((speaker, index) =>
  • {speaker}
  • )} +
+
+
+ +
+

Agenda

+
+ {event.agenda && event.agenda.map((item, index) => ( +
+
{item.time}
+
{item.title}
+
+ ))} +
+
+
+ +
+
+
+
{event.price === 0 ? 'Free' : `$${event.price}`}
+
per person
+
+
+
+ Availability + {event.capacity - event.registered_count} spots left +
+
+ +
+
+ {isRegistered ? ( +
+
+
✓ Registered
+
You're all set!
+
+ +
+ ) : ( + + )} +
Registration and details are managed on our dedicated events platform.
+
+
+
+
+
+
+
+ ); +}; + +export default EventDetailModal; \ No newline at end of file diff --git a/contribute/src/components/EventList.jsx b/contribute/src/components/EventList.jsx new file mode 100644 index 0000000..67aa811 --- /dev/null +++ b/contribute/src/components/EventList.jsx @@ -0,0 +1,120 @@ +import React, { useState } from 'react'; +import { AnimatePresence, motion } from 'framer-motion'; +import EventCard from '@/components/EventCard'; +import EventCardSkeleton from '@/components/EventCardSkeleton'; +import { Search, SlidersHorizontal } from 'lucide-react'; +import { useEvents } from '@/hooks/useEvents'; + +const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + }, + }, +}; + +const EventList = ({ loading, filteredEvents, onSelectEvent, getCategoryColor, getCategoryLabel, setSearchTerm, setSelectedCategory }) => { + const { categories } = useEvents(); + const [showFilters, setShowFilters] = useState(false); + + return ( + <> +
+

AeThex Events

+

+ Explore our upcoming conferences, workshops, and networking opportunities. +

+
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + + {showFilters && ( + + {categories.map(category => ( + + ))} + + )} + +
+
+ + {loading ? ( +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+ ) : ( + + + {filteredEvents.map((event) => ( + + ))} + + + )} + + {filteredEvents.length === 0 && !loading && ( + + + 🔍 + +

No events found

+

Try adjusting your search or filter criteria.

+
+ )} + + ); +}; + +export default EventList; \ No newline at end of file diff --git a/contribute/src/components/Footer.jsx b/contribute/src/components/Footer.jsx new file mode 100644 index 0000000..83e89ef --- /dev/null +++ b/contribute/src/components/Footer.jsx @@ -0,0 +1,160 @@ +import React, { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { Button } from '@/components/ui/button'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuGroup } from '@/components/ui/dropdown-menu'; +import { User, LogOut, Shield, Mail, Loader2 } from 'lucide-react'; +import AeThexLogo from './AeThexLogo'; +import { Input } from './ui/input'; +import { supabase } from '@/lib/customSupabaseClient'; +import { useToast } from './ui/use-toast'; + +const NewsletterForm = () => { + const [email, setEmail] = useState(''); + const [loading, setLoading] = useState(false); + const { toast } = useToast(); + + const handleSubmit = async (e) => { + e.preventDefault(); + setLoading(true); + const { error } = await supabase.from('newsletter_subscribers').insert({ email }); + if (error) { + toast({ + variant: 'destructive', + title: 'Subscription Failed', + description: error.code === '23505' ? 'This email is already subscribed.' : error.message, + }); + } else { + toast({ + title: 'Subscribed!', + description: 'Thank you for subscribing to the AeThex newsletter.', + }); + setEmail(''); + } + setLoading(false); + }; + + return ( +
+

Stay Updated

+

Join our newsletter for updates on our progress and new opportunities.

+
+ setEmail(e.target.value)} + required + disabled={loading} + className="bg-slate-800/50 border-slate-700" + /> + +
+
+ ); +}; + +const Footer = ({ onAuthClick }) => { + const { user, profile, signOut } = useAuth(); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id}`; + + const UserMenu = () => ( + + + + {profile?.username + + + + +
+

{profile?.full_name || profile?.username}

+

{profile?.email}

+
+
+ + + + + + My Profile + + + {isAdmin && ( + + + + Admin Panel + + + )} + + + + + Log out + +
+
+ ); + + return ( +
+
+
+
+ +

Engineering the foundational layers for the next digital epoch.

+
+
+

Company

+
    +
  • About Us
  • +
  • Get Involved
  • +
  • Our Team
  • +
  • News
  • +
+
+
+

Resources

+
    +
  • Technology
  • +
  • Contact
  • +
  • Privacy Policy
  • +
  • Terms & Conditions
  • +
+
+
+ +
+
+
+

© {new Date().getFullYear()} AeThex. All rights reserved.

+
+ {user ? ( + + ) : ( + + )} +
+
+
+
+ ); +}; + +export default Footer; \ No newline at end of file diff --git a/contribute/src/components/Header.jsx b/contribute/src/components/Header.jsx new file mode 100644 index 0000000..9de1596 --- /dev/null +++ b/contribute/src/components/Header.jsx @@ -0,0 +1,133 @@ +import React from 'react'; +import { Link, NavLink } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Button } from '@/components/ui/button'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import AeThexLogo from '@/components/AeThexLogo'; +import NotificationBell from '@/components/NotificationBell'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { LayoutDashboard, User, LogOut, Ticket, Bell } from 'lucide-react'; + +const navLinks = [ + { name: 'Home', path: '/' }, + { name: 'About', path: '/about' }, + { name: 'Get Involved', path: '/get-involved' }, + { name: 'Team', path: '/team' }, + { name: 'Technology', path: '/technology' }, + { name: 'News', path: '/news' }, + { name: 'Contact', path: '/contact' }, +]; + +const Header = () => { + const { user, profile, signOut, setShowAuthModal } = useAuth(); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id}`; + + return ( + +
+ + + + AeThex + + + +
+ {user ? ( + <> + + + + + + + +
+

{profile?.username}

+

+ {user.email} +

+
+
+ + {isAdmin && ( + + + + Admin Dashboard + + + )} + + + + My Profile + + + + + + Notifications + + + + + + My Tickets + + + + + + Log out + +
+
+ + ) : ( + + )} +
+
+
+ ); +}; + +export default Header; \ No newline at end of file diff --git a/contribute/src/components/HeroImage.jsx b/contribute/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/contribute/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/contribute/src/components/LoadingScreen.jsx b/contribute/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..c7e894f --- /dev/null +++ b/contribute/src/components/LoadingScreen.jsx @@ -0,0 +1,130 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; + +const BinaryDigit = () => { + const [position, setPosition] = useState({ + top: `${Math.random() * 100}%`, + left: `${Math.random() * 100}%`, + }); + const duration = Math.random() * 5 + 5; // 5 to 10 seconds + + return ( + + {Math.round(Math.random())} + + ); +}; + +const DataFallBar = ({ i }) => { + const height = Math.random() * 24 + 8; + const duration = Math.random() * 0.5 + 0.8; + + return ( + + ); +}; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [text, setText] = useState("Initializing AeThex OS..."); + + useEffect(() => { + let currentProgress = 0; + const interval = setInterval(() => { + currentProgress += 1; + + if (currentProgress > 98) { + currentProgress = 98; + } + setProgress(currentProgress); + + if (currentProgress > 60 && currentProgress < 80) { + setText("Calibrating systems..."); + } else if (currentProgress >= 80) { + setText("Booting interface..."); + } + + }, 40); + + return () => clearInterval(interval); + }, []); + + return ( +
+ + <> + {Array.from({ length: 30 }).map((_, i) => ( + + ))} + + + +
+
+ +
+
+ +
+
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ +
+
+ +
+

{progress}%

+
+ +
+

{text}

+

Please wait while we prepare your experience...

+
+
+ +
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/contribute/src/components/MaintenanceScreen.jsx b/contribute/src/components/MaintenanceScreen.jsx new file mode 100644 index 0000000..ff1df21 --- /dev/null +++ b/contribute/src/components/MaintenanceScreen.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; +import { HardDrive } from 'lucide-react'; + +const MaintenanceScreen = ({ message }) => { + const defaultMessage = "We're currently performing scheduled maintenance. We'll be back online shortly. Thank you for your patience!"; + + return ( +
+ +
+
+
+ +
+
+ +

+ + Under Maintenance +

+

+ Our site is temporarily unavailable. +

+

+ {message || defaultMessage} +

+
+
+ ); +}; + +export default MaintenanceScreen; \ No newline at end of file diff --git a/contribute/src/components/NotificationBell.jsx b/contribute/src/components/NotificationBell.jsx new file mode 100644 index 0000000..040440c --- /dev/null +++ b/contribute/src/components/NotificationBell.jsx @@ -0,0 +1,130 @@ +import React from 'react'; +import { Bell, MessageSquare, Briefcase, UserPlus } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuFooter +} from "@/components/ui/dropdown-menu"; +import { Button } from './ui/button'; +import { useNotifications } from '@/contexts/NotificationContext'; +import { timeAgo } from '@/lib/utils'; +import { Link, useNavigate } from 'react-router-dom'; + +const NotificationIcon = ({ type }) => { + switch (type) { + case 'new_message': + return ; + case 'new_job_application': + return ; + case 'user_joined': + return ; + default: + return ; + } +} + +const getNotificationDetails = (notification) => { + const { type, data } = notification; + switch(type) { + case 'new_message': + return { + text:

New message from {data.sender_username}: "{data.message_preview}..."

, + link: `/messages/${data.conversation_id}` + }; + case 'new_job_application': + return { + text:

New application for {data.job_title} from {data.applicant_username}.

, + link: `/admin/applications/${data.application_id}` + }; + case 'user_joined': + return { + text:

{data.username} just joined the platform!

, + link: `/profile/${data.user_id}` + }; + default: + return { + text:

{data.message || 'New notification'}

, + link: '#' + }; + } +}; + +const NotificationItem = ({ notification }) => { + const { markAsRead } = useNotifications(); + const navigate = useNavigate(); + const { text, link } = getNotificationDetails(notification); + + const handleClick = (e) => { + e.preventDefault(); + markAsRead(notification.id); + navigate(link); + } + + return ( + +
+ +
+
+
{text}
+

{timeAgo(notification.created_at)}

+
+
+ ) +} + +const NotificationBell = () => { + const { notifications, unreadCount, markAllAsRead } = useNotifications(); + + return ( + + + + + +
+ Notifications + {unreadCount > 0 && ( + + )} +
+ + +
+ {notifications.length > 0 ? ( + notifications.slice(0, 5).map(notification => ( + + )) + ) : ( +
+

No new notifications

+
+ )} +
+ + + + + + +
+
+ ); +}; + +export default NotificationBell; \ No newline at end of file diff --git a/contribute/src/components/PageLayout.jsx b/contribute/src/components/PageLayout.jsx new file mode 100644 index 0000000..cfe2e5f --- /dev/null +++ b/contribute/src/components/PageLayout.jsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Outlet, useLocation } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import Header from '@/components/Header'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; + +const PageLayout = () => { + const location = useLocation(); + const { setShowAuthModal } = useAuth(); + + const handleAuthClick = () => { + if (setShowAuthModal) { + setShowAuthModal(true); + } + }; + + return ( +
+
+
+ + + +
+
+ ); +}; + +export default PageLayout; \ No newline at end of file diff --git a/contribute/src/components/PassportModal.jsx b/contribute/src/components/PassportModal.jsx new file mode 100644 index 0000000..b84c577 --- /dev/null +++ b/contribute/src/components/PassportModal.jsx @@ -0,0 +1,144 @@ +import React, { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; +import { X, Copy, Check, Loader2 } from 'lucide-react'; +import { QRCode } from 'react-qrcode-logo'; +import AeThexLogo from './AeThexLogo'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { supabase } from '@/lib/customSupabaseClient'; +import toast from 'react-hot-toast'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const PassportModal = ({ onClose }) => { + const { user } = useAuth(); + const [profile, setProfile] = useState(null); + const [loading, setLoading] = useState(true); + const [copied, setCopied] = useState(false); + + useEffect(() => { + const fetchProfile = async () => { + if (user) { + setLoading(true); + const { data, error } = await supabase + .from('profiles') + .select('username, avatar_url, aethex_passport_id, created_at') + .eq('id', user.id) + .single(); + + if (error) { + console.error('Error fetching profile:', error); + toast.error("Failed to load Passport data."); + } else { + setProfile(data); + } + setLoading(false); + } + }; + fetchProfile(); + }, [user]); + + const handleCopy = () => { + if (profile?.aethex_passport_id) { + navigator.clipboard.writeText(profile.aethex_passport_id); + setCopied(true); + toast.success("Passport ID Copied!"); + setTimeout(() => setCopied(false), 2000); + } + }; + + return ( + + e.stopPropagation()} + > + + +
+
+
+ User Avatar +

{profile?.username || 'Loading...'}

+

{user?.email}

+
+
+ +
+ {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+

Passport ID

+
+

{profile?.aethex_passport_id}

+ +
+
+
+

Member Since

+

{profile ? new Date(profile.created_at).toLocaleDateString() : '...'}

+
+
+ )} +
+
+ +
+
+
+ ); +}; + +export default PassportModal; \ No newline at end of file diff --git a/contribute/src/components/ProtectedRoute.jsx b/contribute/src/components/ProtectedRoute.jsx new file mode 100644 index 0000000..44091db --- /dev/null +++ b/contribute/src/components/ProtectedRoute.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import LoadingScreen from '@/components/LoadingScreen'; + +const ProtectedRoute = ({ children, adminOnly = false }) => { + const { user, profile, loading } = useAuth(); + const location = useLocation(); + + if (loading) { + return ; + } + + if (!user) { + return ; + } + + if (adminOnly) { + if (!profile) { + return ; + } + if (!['admin', 'site_owner', 'oversee'].includes(profile?.role)) { + return ; + } + } + + + return children; +}; + +export default ProtectedRoute; \ No newline at end of file diff --git a/contribute/src/components/WelcomeMessage.jsx b/contribute/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/contribute/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/contribute/src/components/ui/accordion.jsx b/contribute/src/components/ui/accordion.jsx new file mode 100644 index 0000000..aadc552 --- /dev/null +++ b/contribute/src/components/ui/accordion.jsx @@ -0,0 +1,43 @@ +import React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + svg]:rotate-180 text-lg", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } \ No newline at end of file diff --git a/contribute/src/components/ui/badge.jsx b/contribute/src/components/ui/badge.jsx new file mode 100644 index 0000000..60948b4 --- /dev/null +++ b/contribute/src/components/ui/badge.jsx @@ -0,0 +1,36 @@ +import React from "react" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + success: + "border-transparent bg-green-500 text-white hover:bg-green-500/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + ...props +}) { + return (
); +} + +export { Badge, badgeVariants } \ No newline at end of file diff --git a/contribute/src/components/ui/button.jsx b/contribute/src/components/ui/button.jsx new file mode 100644 index 0000000..d09cecb --- /dev/null +++ b/contribute/src/components/ui/button.jsx @@ -0,0 +1,47 @@ +import { cn } from '@/lib/utils'; +import { Slot } from '@radix-ui/react-slot'; +import { cva } from 'class-variance-authority'; +import React from 'react'; + +const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden group', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow-lg shadow-primary/20 hover:bg-primary/90 hover:scale-105 transform', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90 hover:scale-105 transform', + outline: + 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8 text-base', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button'; + return ( + + ); +}); +Button.displayName = 'Button'; + +export { Button, buttonVariants }; \ No newline at end of file diff --git a/contribute/src/components/ui/card.jsx b/contribute/src/components/ui/card.jsx new file mode 100644 index 0000000..8118ef6 --- /dev/null +++ b/contribute/src/components/ui/card.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { cn } from '@/lib/utils'; + +const Card = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +Card.displayName = 'Card'; + +const CardHeader = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = 'CardHeader'; + +const CardTitle = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardTitle.displayName = 'CardTitle'; + +const CardDescription = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = 'CardDescription'; + +const CardContent = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = 'CardContent'; + +const CardFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = 'CardFooter'; + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +}; \ No newline at end of file diff --git a/contribute/src/components/ui/checkbox.jsx b/contribute/src/components/ui/checkbox.jsx new file mode 100644 index 0000000..841dc32 --- /dev/null +++ b/contribute/src/components/ui/checkbox.jsx @@ -0,0 +1,22 @@ +import React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } \ No newline at end of file diff --git a/contribute/src/components/ui/dialog.jsx b/contribute/src/components/ui/dialog.jsx new file mode 100644 index 0000000..640205c --- /dev/null +++ b/contribute/src/components/ui/dialog.jsx @@ -0,0 +1,94 @@ +import React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} \ No newline at end of file diff --git a/contribute/src/components/ui/dropdown-menu.jsx b/contribute/src/components/ui/dropdown-menu.jsx new file mode 100644 index 0000000..9bb6dad --- /dev/null +++ b/contribute/src/components/ui/dropdown-menu.jsx @@ -0,0 +1,172 @@ +import React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}) => { + return ( + () + ); +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +const DropdownMenuFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +DropdownMenuFooter.displayName = "DropdownMenuFooter"; + + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, + DropdownMenuFooter, +} \ No newline at end of file diff --git a/contribute/src/components/ui/input.jsx b/contribute/src/components/ui/input.jsx new file mode 100644 index 0000000..7db2411 --- /dev/null +++ b/contribute/src/components/ui/input.jsx @@ -0,0 +1,19 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + () + ); +}) +Input.displayName = "Input" + +export { Input } \ No newline at end of file diff --git a/contribute/src/components/ui/label.jsx b/contribute/src/components/ui/label.jsx new file mode 100644 index 0000000..49d53b1 --- /dev/null +++ b/contribute/src/components/ui/label.jsx @@ -0,0 +1,16 @@ +import React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-gray-300" +) + +const Label = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } \ No newline at end of file diff --git a/contribute/src/components/ui/select.jsx b/contribute/src/components/ui/select.jsx new file mode 100644 index 0000000..b0ec089 --- /dev/null +++ b/contribute/src/components/ui/select.jsx @@ -0,0 +1,120 @@ +import React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} \ No newline at end of file diff --git a/contribute/src/components/ui/switch.jsx b/contribute/src/components/ui/switch.jsx new file mode 100644 index 0000000..d2eea14 --- /dev/null +++ b/contribute/src/components/ui/switch.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import * as SwitchPrimitives from "@radix-ui/react-switch"; +import { cn } from "@/lib/utils"; + +const Switch = React.forwardRef(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; \ No newline at end of file diff --git a/contribute/src/components/ui/table.jsx b/contribute/src/components/ui/table.jsx new file mode 100644 index 0000000..01b3f6e --- /dev/null +++ b/contribute/src/components/ui/table.jsx @@ -0,0 +1,83 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} \ No newline at end of file diff --git a/contribute/src/components/ui/textarea.jsx b/contribute/src/components/ui/textarea.jsx new file mode 100644 index 0000000..6bf3ebc --- /dev/null +++ b/contribute/src/components/ui/textarea.jsx @@ -0,0 +1,18 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Textarea = React.forwardRef(({ className, ...props }, ref) => { + return ( + ( +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/events/plugins/visual-editor/vite-plugin-edit-mode.js b/events/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/events/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/events/plugins/visual-editor/vite-plugin-react-inline-editor.js b/events/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/events/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + +

{isLogin ? 'Sign In' : 'Create Account'}

+

to continue to AeThex Events

+ +
+
+ + setEmail(e.target.value)} + required + className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-3 py-2 focus:ring-primary focus:border-primary transition" + placeholder="you@example.com" + /> +
+
+ + setPassword(e.target.value)} + required + className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-3 py-2 focus:ring-primary focus:border-primary transition" + placeholder="••••••••" + /> +
+ +
+ +

+ {isLogin ? "Don't have an account?" : "Already have an account?"}{' '} + +

+ + + + ); +}; + +export default AuthModal; \ No newline at end of file diff --git a/events/src/components/CallToAction.jsx b/events/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/events/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/events/src/components/DeveloperResources.jsx b/events/src/components/DeveloperResources.jsx new file mode 100644 index 0000000..c32d625 --- /dev/null +++ b/events/src/components/DeveloperResources.jsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Card, CardHeader, CardTitle, CardContent } from './ui/card'; +import { ArrowUpRight, Book, Github, Palette } from 'lucide-react'; + +const resources = [ + { + title: 'Awesome Developer Tools', + description: 'A curated list of fantastic tools and utilities for modern developers.', + link: 'https://github.com/topics/developer-tools', + icon: , + color: 'from-purple-500 to-indigo-500', + }, + { + title: 'Design Resources for Devs', + description: 'A collection of design assets, UI kits, and inspiration for developers.', + link: 'https://github.com/bradtraversy/design-resources-for-developers', + icon: , + color: 'from-pink-500 to-rose-500', + }, + { + title: 'Free Programming Books', + description: 'Access a huge library of free programming books on various topics.', + link: 'https://github.com/EbookFoundation/free-programming-books', + icon: , + color: 'from-green-500 to-emerald-500', + }, +]; + +const ResourceCard = ({ title, description, link, icon, color, delay }) => ( + + + +
+ {icon} +
+ +
+ + {title} +

{description}

+
+
+
+); + +const DeveloperResources = () => { + return ( + <> + +

Developer's Toolkit

+

+ A curated collection of essential tools and resources to boost your productivity and skills. +

+
+
+ {resources.map((resource, index) => ( + + ))} +
+ + ); +}; + +export default DeveloperResources; \ No newline at end of file diff --git a/events/src/components/EventCard.jsx b/events/src/components/EventCard.jsx new file mode 100644 index 0000000..e5063e5 --- /dev/null +++ b/events/src/components/EventCard.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Calendar, MapPin, Star, ArrowRight } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate } from '@/lib/utils'; + +const cardVariants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, ease: "easeOut" } + }, + exit: { + opacity: 0, + y: -30, + transition: { duration: 0.3, ease: "easeIn" } + } +}; + +const EventCard = ({ event, onSelectEvent, getCategoryColor, getCategoryLabel }) => { + return ( + +
+
+
+ {`${event.title} +
+ + {getCategoryLabel(event.category)} + +
+ {event.featured && ( + +
+ + Featured +
+
+ )} +
+ +
+

+ {event.title} +

+

+ {event.description} +

+ +
+
+ + {formatDate(event.date)} +
+
+ + {event.location} +
+
+ +
+
+ {event.price === 0 ? 'Free' : `$${event.price}`} +
+ +
+
+
+
+ ); +}; + +export default EventCard; \ No newline at end of file diff --git a/events/src/components/EventCardSkeleton.jsx b/events/src/components/EventCardSkeleton.jsx new file mode 100644 index 0000000..768d423 --- /dev/null +++ b/events/src/components/EventCardSkeleton.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const EventCardSkeleton = () => { + return ( +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ ); +}; + +export default EventCardSkeleton; \ No newline at end of file diff --git a/events/src/components/EventDetailModal.jsx b/events/src/components/EventDetailModal.jsx new file mode 100644 index 0000000..349b50d --- /dev/null +++ b/events/src/components/EventDetailModal.jsx @@ -0,0 +1,224 @@ +import React, {useState} from 'react'; + import { motion, AnimatePresence } from 'framer-motion'; + import { Calendar, Clock, MapPin, Users, X, Loader2, Mic, List, Navigation, Ticket, Star, CheckCircle } from 'lucide-react'; + import { Button } from '@/components/ui/button'; + import { formatDate, formatTime } from '@/lib/utils'; + import ReactMarkdown from 'react-markdown'; + import { Card, CardContent } from '@/components/ui/card'; + + const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } + }; + + const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } + }; + + const TicketTypeCard = ({ ticket, onSelect, isSelected }) => ( + +
+
+

{ticket.name}

+

{ticket.benefits.split('\n')[0]}

+
+
${ticket.price}
+
+ + {isSelected && ( + + {ticket.benefits.split('\n').map((benefit, i) => ( +
+ + {benefit} +
+ ))} +
+ )} +
+
+ ); + + const EventDetailModal = ({ event, onClose, onRegister, onUnregister, isRegistered, getCategoryColor, getCategoryLabel, isLoading }) => { + const [selectedTicket, setSelectedTicket] = useState(event.ticket_types && event.ticket_types.length > 0 ? event.ticket_types[0] : { price: event.price }); + + const handleRegisterClick = () => { + // Here you would pass which ticket type is being purchased + onRegister(event.id, selectedTicket); + }; + + return ( + + e.stopPropagation()} + > +
+ + +
+
+ {`${event.title} + + + {getCategoryLabel(event.category)} + + +
+ +
+
+
+

{event.title}

+

{event.description}

+ +
+
+
{formatDate(event.date)}
+
{formatTime(event.time)}
+
{event.location}
+
{event.aethex_event_registrations[0]?.count || 0}/{event.capacity} registered
+ {event.map_url && ( + View on Map + )} +
+ + {event.speakers && event.speakers.length > 0 && ( +
+

Speakers

+
    + {event.speakers.map((speaker, index) =>
  • {speaker}
  • )} +
+
+ )} +
+ +
+ {event.full_description} +
+ + {event.agenda && event.agenda.length > 0 && ( +
+

Agenda

+
+ {event.agenda.map((item, index) => ( +
+
{item.time}
+
{item.title}
+
+ ))} +
+
+ )} +
+ +
+ + +

Get Your Ticket

+ +
+ {event.ticket_types && event.ticket_types.length > 0 ? ( + event.ticket_types.map(ticket => ( + setSelectedTicket(ticket)} + isSelected={selectedTicket?.name === ticket.name} + /> + )) + ) : ( +
+
{event.price === 0 ? 'Free' : `$${event.price}`}
+
+ )} +
+ +
+
+ Availability + {event.capacity - (event.aethex_event_registrations[0]?.count || 0)} spots left +
+
+ +
+
+ + {isRegistered ? ( +
+
+
✓ Registered
+
You're all set!
+
+ +
+ ) : ( + + )} +
Registration confirmation will be sent via email.
+
+
+
+
+
+
+
+
+ ); + }; + + export default EventDetailModal; \ No newline at end of file diff --git a/events/src/components/EventList.jsx b/events/src/components/EventList.jsx new file mode 100644 index 0000000..67aa811 --- /dev/null +++ b/events/src/components/EventList.jsx @@ -0,0 +1,120 @@ +import React, { useState } from 'react'; +import { AnimatePresence, motion } from 'framer-motion'; +import EventCard from '@/components/EventCard'; +import EventCardSkeleton from '@/components/EventCardSkeleton'; +import { Search, SlidersHorizontal } from 'lucide-react'; +import { useEvents } from '@/hooks/useEvents'; + +const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + }, + }, +}; + +const EventList = ({ loading, filteredEvents, onSelectEvent, getCategoryColor, getCategoryLabel, setSearchTerm, setSelectedCategory }) => { + const { categories } = useEvents(); + const [showFilters, setShowFilters] = useState(false); + + return ( + <> +
+

AeThex Events

+

+ Explore our upcoming conferences, workshops, and networking opportunities. +

+
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + + {showFilters && ( + + {categories.map(category => ( + + ))} + + )} + +
+
+ + {loading ? ( +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+ ) : ( + + + {filteredEvents.map((event) => ( + + ))} + + + )} + + {filteredEvents.length === 0 && !loading && ( + + + 🔍 + +

No events found

+

Try adjusting your search or filter criteria.

+
+ )} + + ); +}; + +export default EventList; \ No newline at end of file diff --git a/events/src/components/FeaturedSpeakers.jsx b/events/src/components/FeaturedSpeakers.jsx new file mode 100644 index 0000000..494d72c --- /dev/null +++ b/events/src/components/FeaturedSpeakers.jsx @@ -0,0 +1,139 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Card, CardContent } from './ui/card'; +import { Linkedin, Twitter } from 'lucide-react'; + +const speakers = [ + { + name: 'Dr. Evelyn Reed', + title: 'Lead AI Ethicist, QuantumLeap', + topic: 'The Future of Ethical AI', + image: 'https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Jaxon "Glitch" Hayes', + title: 'Principal Security Engineer, Cyberia', + topic: 'Next-Gen Cyber Defense', + image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Kenji Tanaka', + title: 'Head of Robotics, InnovateX', + topic: 'Human-Robot Collaboration', + image: 'https://images.unsplash.com/photo-1548142813-c348350df52b?q=80&w=1889&auto=format&fit=crop', + }, + { + name: 'Lena Petrova', + title: 'Quantum Computing Pioneer, FutureForge', + topic: 'The Quantum Revolution', + image: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Marco Diaz', + title: 'Senior AR/VR Architect, NexusPrime', + topic: 'Building the Metaverse', + image: 'https://images.unsplash.com/photo-1583195764338-23e08c6954b3?q=80&w=2070&auto=format&fit=crop', + }, +]; + +const variants = { + enter: (direction) => ({ + x: direction > 0 ? 1000 : -1000, + opacity: 0, + }), + center: { + zIndex: 1, + x: 0, + opacity: 1, + }, + exit: (direction) => ({ + zIndex: 0, + x: direction < 0 ? 1000 : -1000, + opacity: 0, + }), +}; + +const FeaturedSpeakers = () => { + const [[page, direction], setPage] = useState([0, 0]); + + const paginate = (newDirection) => { + setPage([(page + newDirection + speakers.length) % speakers.length, newDirection]); + }; + + useEffect(() => { + const interval = setInterval(() => { + paginate(1); + }, 5000); + return () => clearInterval(interval); + }, [page]); + + + return ( +
+ +

Featured Speakers

+

+ Learn from the brightest minds in technology. Our speakers are pioneers, researchers, and visionaries shaping the future. +

+
+ +
+ + + + +
+ {speakers[page].name} +
+
+

{speakers[page].topic}

+

{speakers[page].name}

+

{speakers[page].title}

+
+ + +
+
+
+
+
+
+
+ {speakers.map((_, i) => ( +
+
+
+ ); +}; + +export default FeaturedSpeakers; \ No newline at end of file diff --git a/events/src/components/Footer.jsx b/events/src/components/Footer.jsx new file mode 100644 index 0000000..02e61c3 --- /dev/null +++ b/events/src/components/Footer.jsx @@ -0,0 +1,114 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Link } from 'react-router-dom'; +import AeThexLogo from './AeThexLogo'; +import { Github, Twitter, Mail, Send } from 'lucide-react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { useToast } from './ui/use-toast'; + +const NewsletterSignup = () => { + const { toast } = useToast(); + + const handleSubmit = (e) => { + e.preventDefault(); + toast({ + title: "🚧 Feature In Progress", + description: "Newsletter signup isn't implemented yet, but stay tuned!", + }); + }; + + return ( +
+

Stay Updated

+

+ Subscribe to our newsletter to get the latest news, updates, and event announcements. +

+
+ + +
+
+ ); +}; + + +const Footer = () => { + const footerSections = { + 'Company': [ + { name: 'About', path: '/about' }, + { name: 'News', path: '/blog' }, + { name: 'Sponsors', path: '/sponsors' }, + ], + 'Resources': [ + { name: 'Developer Toolkit', path: '/resources' }, + { name: 'FAQ', path: '/faq' }, + { name: 'Contact', path: '/contact' }, + ] + }; + + const socialLinks = [ + { name: 'Twitter', icon: , path: '#' }, + { name: 'GitHub', icon: , path: '#' }, + { name: 'Email', icon: , path: 'mailto:hello@aethex.events' }, + ]; + + return ( + +
+
+
+ +

The premier destination for tech innovators and creators.

+
+ +
+ {Object.entries(footerSections).map(([title, links]) => ( +
+

{title}

+
    + {links.map((link) => ( +
  • + + {link.name} + +
  • + ))} +
+
+ ))} + +
+
+ +
+

+ © {new Date().getFullYear()} AeThex Events. A division of AeThex, Inc. All rights reserved. +

+
+ {socialLinks.map((social) => ( + + {social.name} + {social.icon} + + ))} +
+
+
+
+ ); +}; + +export default Footer; \ No newline at end of file diff --git a/events/src/components/Header.jsx b/events/src/components/Header.jsx new file mode 100644 index 0000000..b90f9b1 --- /dev/null +++ b/events/src/components/Header.jsx @@ -0,0 +1,208 @@ +import React, { useState } from 'react'; +import { Link, NavLink, useNavigate } from 'react-router-dom'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { Button } from '@/components/ui/button'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; +import { LogIn, User, LogOut, Ticket, Gem, UserPlus, Sparkles, X, Menu, Shield, Trophy, HelpCircle, Mail, BookOpen, HeartHandshake as Handshake, Users, Code } from 'lucide-react'; +import AeThexLogo from '@/components/AeThexLogo'; + +const Header = ({ onAuthClick, onPassportClick }) => { + const { user, profile, signOut } = useAuth(); + const navigate = useNavigate(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id || 'guest'}`; + + const handleSignOut = async () => { + await signOut(); + navigate('/'); + }; + + const navLinks = [ + { to: '/about', text: 'About', icon: }, + { to: '/sponsors', text: 'Sponsors', icon: }, + { to: '/resources', text: 'Resources', icon: }, + { to: '/blog', text: 'News', icon: }, + ]; + + const MobileNavLink = ({ to, children }) => ( + + `flex items-center w-full px-4 py-3 text-lg rounded-md transition-colors ${ + isActive ? 'bg-primary/10 text-primary' : 'text-gray-300 hover:bg-primary/10 hover:text-primary' + }` + } + onClick={() => setIsMenuOpen(false)} + > + {children} + + ); + + const DesktopNavLink = ({ to, children }) => ( + + ) + + const UserMenu = ({ isMobile = false }) => ( +
+ +
+ + + + + + +

{profile?.username}

+

{profile?.email}

+
+ + + + + My Events + + + + + + My Achievements + + + + + My Passport + + {isAdmin && ( + + + + Admin Dashboard + + + )} + + + + Log out + +
+
+
+
+
+ ); + + const AuthButtons = ({ isMobile = false }) => ( + + + + + ); + + return ( + <> +
+
+ setIsMenuOpen(false)}> + +
+

Events

+
+ + +
+ +
+
+
+ + + {isMenuOpen && ( + setIsMenuOpen(false)} + > + e.stopPropagation()} + > +
+ +
+
+ {user ? : } +
+
+
+
+ )} +
+ + ); +}; + +export default Header; \ No newline at end of file diff --git a/events/src/components/HeroImage.jsx b/events/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/events/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/events/src/components/LoadingScreen.jsx b/events/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..af5922f --- /dev/null +++ b/events/src/components/LoadingScreen.jsx @@ -0,0 +1,117 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [message, setMessage] = useState('Booting up core systems...'); + + const messages = [ + 'Connecting to the AeThex network...', + 'Calibrating event streams...', + 'Unlocking achievements cache...', + 'Polishing pixels...', + 'Finalizing experience...', + ]; + + useEffect(() => { + const interval = setInterval(() => { + setProgress(prev => { + if (prev >= 100) { + clearInterval(interval); + return 100; + } + const next = prev + Math.random() * 10; + return Math.min(next, 100); + }); + }, 400); + + return () => clearInterval(interval); + }, []); + + useEffect(() => { + let messageIndex = 0; + const messageInterval = setInterval(() => { + if (messageIndex < messages.length - 1) { + messageIndex++; + setMessage(messages[messageIndex]); + } else { + clearInterval(messageInterval); + } + }, 1000); + + return () => clearInterval(messageInterval); + }, [messages]); + + const barVariants = { + initial: { + y: "50%", + opacity: 0.5 + }, + animate: { + y: ["50%", "-50%", "50%"], + opacity: [0.5, 1, 0.5], + transition: { + duration: 1.5, + repeat: Infinity, + ease: "easeInOut" + } + } + }; + + return ( +
+
+ +
+ +
+
+
+ +
+ {[...Array(7)].map((_, i) => ( + + ))} +
+ +
+ +
+

{Math.round(progress)}%

+ + + + {message} + + + +
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/events/src/components/PageHeader.jsx b/events/src/components/PageHeader.jsx new file mode 100644 index 0000000..e1dd4d5 --- /dev/null +++ b/events/src/components/PageHeader.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Sparkles } from 'lucide-react'; + +const PageHeader = ({ title, subtitle, children }) => { + return ( + +
+ +
+ + + + + {title} + + {subtitle && ( + + {subtitle} + + )} + {children && ( + + {children} + + )} +
+
+ ); +}; + +export default PageHeader; \ No newline at end of file diff --git a/events/src/components/PageLayout.jsx b/events/src/components/PageLayout.jsx new file mode 100644 index 0000000..7cf73de --- /dev/null +++ b/events/src/components/PageLayout.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Outlet } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import Header from '@/components/Header'; +import Footer from '@/components/Footer'; + +const PageLayout = ({ onAuthClick, onPassportClick }) => { + return ( +
+
+
+ + + +
+
+
+ ); +}; + +export default PageLayout; \ No newline at end of file diff --git a/events/src/components/PassportModal.jsx b/events/src/components/PassportModal.jsx new file mode 100644 index 0000000..ad8ab3b --- /dev/null +++ b/events/src/components/PassportModal.jsx @@ -0,0 +1,119 @@ +import React, { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; +import { X, Copy, Check, Loader2 } from 'lucide-react'; +import { QRCode } from 'react-qrcode-logo'; +import AeThexLogo from './AeThexLogo'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import toast from 'react-hot-toast'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const PassportModal = ({ onClose }) => { + const { user, profile, loading: authLoading } = useAuth(); + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + if (profile?.aethex_passport_id) { + navigator.clipboard.writeText(profile.aethex_passport_id); + setCopied(true); + toast.success("Passport ID Copied!"); + setTimeout(() => setCopied(false), 2000); + } + }; + + return ( + + e.stopPropagation()} + > + + +
+
+
+ User Avatar +

{profile?.username || 'Loading...'}

+

{user?.email}

+
+
+ +
+ {authLoading ? ( +
+ +
+ ) : ( +
+
+ +
+
+

Passport ID

+
+

{profile?.aethex_passport_id}

+ +
+
+
+

Member Since

+

{profile ? new Date(profile.created_at).toLocaleDateString() : '...'}

+
+
+ )} +
+
+ +
+
+
+ ); +}; + +export default PassportModal; \ No newline at end of file diff --git a/events/src/components/ProtectedRoute.jsx b/events/src/components/ProtectedRoute.jsx new file mode 100644 index 0000000..0438dd4 --- /dev/null +++ b/events/src/components/ProtectedRoute.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import LoadingScreen from '@/components/LoadingScreen'; + +const ProtectedRoute = ({ children, adminOnly = false }) => { + const { user, profile, loading } = useAuth(); + const location = useLocation(); + + if (loading) { + return ; + } + + if (!user) { + return ; + } + + if (adminOnly && !['admin', 'site_owner', 'oversee'].includes(profile?.role)) { + return ; + } + + return children; +}; + +export default ProtectedRoute; \ No newline at end of file diff --git a/events/src/components/Sponsors.jsx b/events/src/components/Sponsors.jsx new file mode 100644 index 0000000..19aa9bf --- /dev/null +++ b/events/src/components/Sponsors.jsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const sponsors = [ + { name: "QuantumLeap", description: "QuantumLeap logo" }, + { name: "Cyberia", description: "Cyberia logo" }, + { name: "InnovateX", description: "InnovateX logo" }, + { name: "FutureForge", description: "FutureForge logo" }, + { name: "NexusPrime", description: "NexusPrime logo" }, +]; + +const Sponsors = () => { + return ( +
+
+

+ Proudly sponsored by the leaders in tech innovation +

+
+ + QuantumLeap logo + + + Cyberia logo + + + InnovateX logo + + + FutureForge logo + + + NexusPrime logo + +
+
+
+ ); +}; + +export default Sponsors; \ No newline at end of file diff --git a/events/src/components/Testimonials.jsx b/events/src/components/Testimonials.jsx new file mode 100644 index 0000000..d02062c --- /dev/null +++ b/events/src/components/Testimonials.jsx @@ -0,0 +1,89 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Quote } from 'lucide-react'; + +const testimonials = [ + { + quote: "AeThex Events are a game-changer. The quality of speakers and networking opportunities is unmatched. I left inspired and with a notebook full of ideas.", + name: 'Elena Rodriguez', + title: 'Lead Developer, Nova Solutions', + avatar: 'https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=1961&auto=format&fit=crop' + }, + { + quote: "The workshops alone were worth the price of admission. Truly hands-on, practical knowledge I could apply to my projects the very next day.", + name: 'Ben Carter', + title: 'UX/UI Designer, Creative Canvas', + avatar: 'https://images.unsplash.com/photo-1544723795-3fb6469f5b39?q=80&w=1889&auto=format&fit=crop' + }, + { + quote: "I've been to many tech conferences, but AeThex has a special energy. It feels less like a conference and more like a community of innovators.", + name: 'Aisha Khan', + title: 'Data Scientist, Apex Analytics', + avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?q=80&w=1964&auto=format&fit=crop' + }, +]; + +const Testimonials = () => { + const [index, setIndex] = useState(0); + + useEffect(() => { + const timer = setTimeout(() => { + setIndex((prevIndex) => (prevIndex + 1) % testimonials.length); + }, 7000); + return () => clearTimeout(timer); + }, [index]); + + return ( +
+ +

What Our Community Says

+

+ Hear from past attendees who have experienced the magic of an AeThex event. +

+
+ +
+ + + +

+ "{testimonials[index].quote}" +

+
+ {testimonials[index].name} +
+

{testimonials[index].name}

+

{testimonials[index].title}

+
+
+
+
+
+
+ {testimonials.map((_, i) => ( +
+
+ ); +}; + +export default Testimonials; \ No newline at end of file diff --git a/events/src/components/WelcomeMessage.jsx b/events/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/events/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/events/src/components/ui/accordion.jsx b/events/src/components/ui/accordion.jsx new file mode 100644 index 0000000..ae135a8 --- /dev/null +++ b/events/src/components/ui/accordion.jsx @@ -0,0 +1,40 @@ +import React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + svg]:rotate-180 text-white", + className + )} + {...props}> + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } \ No newline at end of file diff --git a/events/src/components/ui/badge.jsx b/events/src/components/ui/badge.jsx new file mode 100644 index 0000000..059f6ca --- /dev/null +++ b/events/src/components/ui/badge.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + import { cva } from 'class-variance-authority'; + import { cn } from '@/lib/utils'; + + const badgeVariants = cva( + 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + } + ); + + function Badge({ className, variant, ...props }) { + return ( +
+ ); + } + + export { Badge, badgeVariants }; \ No newline at end of file diff --git a/events/src/components/ui/button.jsx b/events/src/components/ui/button.jsx new file mode 100644 index 0000000..489e3d1 --- /dev/null +++ b/events/src/components/ui/button.jsx @@ -0,0 +1,51 @@ +import { cn } from '@/lib/utils'; + import { Slot } from '@radix-ui/react-slot'; + import { cva } from 'class-variance-authority'; + import React from 'react'; + import { motion } from 'framer-motion'; + + const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-bold ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden group', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow-lg shadow-primary/20 hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8 text-base', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, + ); + + const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : motion.button; + return ( + + ); + }); + Button.displayName = 'Button'; + + export { Button, buttonVariants }; \ No newline at end of file diff --git a/events/src/components/ui/card.jsx b/events/src/components/ui/card.jsx new file mode 100644 index 0000000..041f6fc --- /dev/null +++ b/events/src/components/ui/card.jsx @@ -0,0 +1,65 @@ +import React from 'react'; + import { cn } from '@/lib/utils'; + import { motion } from 'framer-motion'; + + const MotionDiv = motion.div; + + const Card = React.forwardRef(({ className, ...props }, ref) => ( + + )); + Card.displayName = 'Card'; + + const CardHeader = React.forwardRef(({ className, ...props }, ref) => ( +
+ )); + CardHeader.displayName = 'CardHeader'; + + const CardTitle = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardTitle.displayName = 'CardTitle'; + + const CardDescription = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardDescription.displayName = 'CardDescription'; + + const CardContent = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardContent.displayName = 'CardContent'; + + const CardFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+ )); + CardFooter.displayName = 'CardFooter'; + + export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, + }; \ No newline at end of file diff --git a/events/src/components/ui/dialog.jsx b/events/src/components/ui/dialog.jsx new file mode 100644 index 0000000..959f314 --- /dev/null +++ b/events/src/components/ui/dialog.jsx @@ -0,0 +1,94 @@ +import React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} \ No newline at end of file diff --git a/events/src/components/ui/dropdown-menu.jsx b/events/src/components/ui/dropdown-menu.jsx new file mode 100644 index 0000000..3cdcf9d --- /dev/null +++ b/events/src/components/ui/dropdown-menu.jsx @@ -0,0 +1,161 @@ +import React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}) => { + return ( + () + ); +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} \ No newline at end of file diff --git a/events/src/components/ui/input.jsx b/events/src/components/ui/input.jsx new file mode 100644 index 0000000..301d837 --- /dev/null +++ b/events/src/components/ui/input.jsx @@ -0,0 +1,20 @@ +import React from 'react'; + import { cn } from '@/lib/utils'; + import { motion } from 'framer-motion'; + + const inputVariants = + 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors duration-300'; + + const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + + ); + }); + Input.displayName = 'Input'; + + export { Input }; \ No newline at end of file diff --git a/events/src/components/ui/label.jsx b/events/src/components/ui/label.jsx new file mode 100644 index 0000000..49d53b1 --- /dev/null +++ b/events/src/components/ui/label.jsx @@ -0,0 +1,16 @@ +import React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-gray-300" +) + +const Label = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } \ No newline at end of file diff --git a/events/src/components/ui/select.jsx b/events/src/components/ui/select.jsx new file mode 100644 index 0000000..46c2bc3 --- /dev/null +++ b/events/src/components/ui/select.jsx @@ -0,0 +1,120 @@ +import React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} \ No newline at end of file diff --git a/events/src/components/ui/table.jsx b/events/src/components/ui/table.jsx new file mode 100644 index 0000000..01b3f6e --- /dev/null +++ b/events/src/components/ui/table.jsx @@ -0,0 +1,83 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} \ No newline at end of file diff --git a/events/src/components/ui/textarea.jsx b/events/src/components/ui/textarea.jsx new file mode 100644 index 0000000..9bac976 --- /dev/null +++ b/events/src/components/ui/textarea.jsx @@ -0,0 +1,18 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Textarea = React.forwardRef(({ className, ...props }, ref) => { + return ( + ( +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/gameforge/plugins/visual-editor/vite-plugin-edit-mode.js b/gameforge/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/gameforge/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/gameforge/plugins/visual-editor/vite-plugin-react-inline-editor.js b/gameforge/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/gameforge/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + ))} + + + + +

> SYSTEM_HEALTH

+
+
+ API Status + OPERATIONAL +
+
+ Database + CONNECTED +
+
+ Cloud Storage + SYNCED +
+
+ Build Queue + 3 PENDING +
+
+ + + + setManageUsersModalOpen(false)} + users={users || []} + onAddUser={handleAddUser} + onEditUser={handleEditUser} + onDeleteUser={handleDeleteUser} + /> + setSystemLogsModalOpen(false)} /> + setBroadcastMessageModalOpen(false)} /> + setManagePermissionsModalOpen(false)} users={users || []} /> + setMaintenanceManagerOpen(false)} /> + setInviteDeveloperModalOpen(false)} /> + + ); +}; + +export default AdminPanel; \ No newline at end of file diff --git a/gameforge/src/components/AssetManager.jsx b/gameforge/src/components/AssetManager.jsx new file mode 100644 index 0000000..57932c6 --- /dev/null +++ b/gameforge/src/components/AssetManager.jsx @@ -0,0 +1,235 @@ +import React, { useState, useEffect, useCallback } from 'react'; +import { motion } from 'framer-motion'; +import { Upload, Search, Filter, Grid, List, Loader2, Archive } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import { supabase } from '@/lib/customSupabaseClient'; +import AssetCard from '@/components/assets/AssetCard'; +import AssetRow from '@/components/assets/AssetRow'; +import { formatBytes } from '@/components/assets/assetUtils'; +import useDataFetching from '@/hooks/useDataFetching'; + +const fetchAssetsFunction = async (user) => { + const { data: projectIdsData, error: projectIdsError } = await supabase + .from('project_team_members') + .select('project_id') + .eq('user_id', user.id); + + if (projectIdsError) { + console.error("Error fetching project IDs for assets:", projectIdsError); + throw projectIdsError; + } + + const projectIds = projectIdsData.map(p => p.project_id); + + if(projectIds.length === 0) { + return []; + } + + const { data, error } = await supabase + .from('assets') + .select(` + *, + projects (title) + `) + .in('project_id', projectIds); + + if (error) { + console.error("Error fetching assets:", error); + throw error; + } + + return data.map(asset => ({ + ...asset, + project_title: asset.projects?.title + })); +}; + +const AssetManager = ({ onOpenUploadAssets }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { data: assets, loading } = useDataFetching(fetchAssetsFunction); + + const [stats, setStats] = useState({ totalAssets: 0, storageUsed: 0 }); + const [searchTerm, setSearchTerm] = useState(''); + const [filterType, setFilterType] = useState('all'); + const [viewMode, setViewMode] = useState('grid'); + + useEffect(() => { + if (assets) { + const totalAssets = assets.length; + const storageUsed = assets.reduce((acc, asset) => acc + (asset.size || 0), 0); + setStats({ totalAssets, storageUsed }); + } + }, [assets]); + + const handleAction = (action, assetName = '') => { + addActivity({ type: 'asset', message: `${action}: ${assetName}` }); + toast({ + title: `> ASSET ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + }); + }; + + const filteredAssets = (assets || []).filter(asset => { + const matchesSearch = asset.name.toLowerCase().includes(searchTerm.toLowerCase()) || + (asset.tags && asset.tags.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase()))); + const matchesFilter = filterType === 'all' || (asset.file_type && asset.file_type.startsWith(filterType)); + return matchesSearch && matchesFilter; + }); + + return ( +
+ +
+

+ > ASSET_MANAGER +

+

+ Secure cloud storage for game assets with version control and backup +

+
+ +
+ + +
+
+ + setSearchTerm(e.target.value)} + className="w-full bg-black/50 cyber-border rounded px-10 py-2 text-green-400 font-mono placeholder-green-400/50 focus:outline-none focus:ring-2 focus:ring-green-400/50" + /> +
+
+ + + +
+
+
+ + + {[ + { label: 'Total Assets', value: stats.totalAssets, color: 'text-green-400' }, + { label: 'Storage Used', value: formatBytes(stats.storageUsed), color: 'text-cyan-400' }, + { label: 'Active Backups', value: '3', color: 'text-purple-400' }, + { label: 'Version History', value: '247', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + {loading ? ( +
+ +
+ ) : viewMode === 'grid' ? ( +
+ {filteredAssets.map((asset, index) => ( + + ))} +
+ ) : ( + +
+
+ Name + Type + Size + Project + Modified + Actions +
+
+
+ {filteredAssets.map((asset, index) => ( + + ))} +
+
+ )} + + {!loading && filteredAssets.length === 0 && ( + + +

+ NO_ASSETS_FOUND +

+

+ There are no assets in the projects you are a part of. +

+ +
+ )} +
+ ); +}; + +export default AssetManager; \ No newline at end of file diff --git a/gameforge/src/components/CallToAction.jsx b/gameforge/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/gameforge/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/gameforge/src/components/Dashboard.jsx b/gameforge/src/components/Dashboard.jsx new file mode 100644 index 0000000..aa65b36 --- /dev/null +++ b/gameforge/src/components/Dashboard.jsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Loader2, FileText, Users, Database, GitBranch, ArrowRight, Upload, UserPlus, FolderPlus } from 'lucide-react'; +import { useAuth } from '@/context/AuthContext'; +import { Button } from '@/components/ui/button'; +import useDataFetching from '@/hooks/useDataFetching.js'; +import { supabase } from '@/lib/customSupabaseClient'; + +const fetchDashboardData = async (user) => { + if (!user) return null; + + const { data: projectIdsData, error: projectIdsError } = await supabase + .from('project_team_members') + .select('project_id') + .eq('user_id', user.id); + + if (projectIdsError) { + console.error('Error fetching project IDs:', projectIdsError); + throw projectIdsError; + } + + const projectIds = projectIdsData.map(p => p.project_id); + + let projectsCount = 0; + let teamMembersCount = 0; + let assetsCount = 0; + + if (projectIds.length > 0) { + const { count: pc, error: projectsError } = await supabase + .from('projects') + .select('id', { count: 'exact', head: true }) + .in('id', projectIds); + if (projectsError) console.error('Error fetching projects count:', projectsError); + projectsCount = pc || 0; + + const { data: teamData, error: teamMembersError } = await supabase + .from('project_team_members') + .select('user_id', { count: 'exact' }) + .in('project_id', projectIds); + if (teamMembersError) console.error('Error fetching team members count:', teamMembersError); + teamMembersCount = teamData?.length || 0; + + const { count: ac, error: assetsError } = await supabase + .from('assets') + .select('id', { count: 'exact', head: true }) + .in('project_id', projectIds); + if (assetsError) console.error('Error fetching assets count:', assetsError); + assetsCount = ac || 0; + } + + return { + projectsCount, + teamMembersCount, + assetsCount, + }; +}; + +const StatCard = ({ icon, label, value, color }) => ( + +
+ {icon} +
+
+

{label}

+

{value}

+
+
+); + +const ActionButton = ({ icon, label, onClick }) => ( + +); + +const Dashboard = ({ onOpenCreateProject, onOpenUploadAssets, onOpenInviteTeam }) => { + const { profile } = useAuth(); + const { data, loading, error } = useDataFetching(fetchDashboardData, false, []); + + if (loading) { + return ( +
+ +
+ ); + } + + if (error) { + return ( +
+ Error loading dashboard data. Please try again later. +
+ ); + } + + const quickActions = [ + { icon: , label: "Create New Project", onClick: onOpenCreateProject }, + { icon: , label: "Upload Assets", onClick: onOpenUploadAssets }, + { icon: , label: "Invite Team Member", onClick: onOpenInviteTeam }, + ]; + + return ( +
+ +

Welcome back, {profile?.username}.

+

System status: All modules operational. Ready for deployment.

+
+ +
+ } label="Projects" value={data?.projectsCount || 0} color="#00ffff" /> + } label="Team Members" value={data?.teamMembersCount || 0} color="#ff00ff" /> + } label="Total Assets" value={data?.assetsCount || 0} color="#ffff00" /> + } label="Active Branches" value="0" color="#ff4500" /> +
+ +
+ +

Recent Activity

+ {/* Placeholder for recent activity feed */} +
+

//TODO: Activity Feed Implementation

+

Awaiting data stream from neural link...

+
+
+ + +

Quick Actions

+
+ {quickActions.map(action => )} +
+
+
+
+ ); +}; + +export default Dashboard; \ No newline at end of file diff --git a/gameforge/src/components/GamesListPage.jsx b/gameforge/src/components/GamesListPage.jsx new file mode 100644 index 0000000..89b7b10 --- /dev/null +++ b/gameforge/src/components/GamesListPage.jsx @@ -0,0 +1,116 @@ +import React, { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Helmet } from 'react-helmet'; +import { supabase } from '@/lib/customSupabaseClient'; +import LoadingScreen from '@/components/LoadingScreen'; +import { useToast } from '@/components/ui/use-toast'; +import { Users, ThumbsUp, Gamepad2 } from 'lucide-react'; + +const GameCard = ({ game }) => { + const ratingPercentage = (game.likes + game.dislikes > 0) ? Math.round((game.likes / (game.likes + game.dislikes)) * 100) : 0; + + return ( + + +
+ {`${game.title} +
+ {game.status} +
+
+

{game.title}

+

{game.genre}

+

{game.description}

+
+
+ + {game.active_users.toLocaleString()} +
+
+ + {ratingPercentage}% +
+
+
+
+ + ); +}; + +const GamesListPage = () => { + const { toast } = useToast(); + const [games, setGames] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchGames = async () => { + setLoading(true); + const { data, error } = await supabase + .from('games') + .select('*') + .order('active_users', { ascending: false }); + + if (error) { + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch games list.' }); + console.error(error); + } else { + setGames(data); + } + setLoading(false); + }; + fetchGames(); + }, [toast]); + + if (loading) return ; + + return ( +
+ + Explore Games - GameForge + + + + +
+ +
+

Explore Experiences

+

Discover games and worlds created by the community.

+
+
+ + {games.length > 0 ? ( +
+ {games.map((game, index) => ( + + + + ))} +
+ ) : ( +
+

No Games Found

+

The universe is quiet... for now. Check back soon for new experiences!

+
+ )} +
+
+ ); +}; + +export default GamesListPage; \ No newline at end of file diff --git a/gameforge/src/components/GamesPage.jsx b/gameforge/src/components/GamesPage.jsx new file mode 100644 index 0000000..c983808 --- /dev/null +++ b/gameforge/src/components/GamesPage.jsx @@ -0,0 +1,192 @@ +import React, { useState, useEffect } from 'react'; +import { useParams, Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Helmet } from 'react-helmet'; +import { supabase } from '@/lib/customSupabaseClient'; +import LoadingScreen from '@/components/LoadingScreen'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { + Users, Play, Info, Book, ThumbsUp, ThumbsDown, Share2, Bookmark, Bell, Flag, + ShoppingBag, Award, Music, Server, Calendar, Mic, Camera, Link as LinkIcon, Save, Tag, Activity, + Laptop, Apple, Tablet, Smartphone, Box, Wifi, HardDrive +} from 'lucide-react'; + +const StatCard = ({ icon, label, value }) => ( +
+ {icon} + {value} + {label} +
+); + +const InfoPill = ({ icon, label, value }) => ( +
+ {icon} + {label}: + {value} +
+); + +const PlatformIcon = ({ platform }) => { + switch (platform.toLowerCase()) { + case 'pc/windows': return ; + case 'mac': return ; + case 'ios/ipados': return ; + case 'android': return ; + case 'vr': return ; + default: return null; + } +}; + +const GamesPage = () => { + const { gameId } = useParams(); + const { toast } = useToast(); + const [game, setGame] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchGame = async () => { + if (!gameId) { + setLoading(false); + return; + } + setLoading(true); + const { data, error } = await supabase + .from('games') + .select('*') + .eq('id', gameId) + .single(); + + if (error) { + if (error.code !== 'PGRST116') { // Ignore "no rows found" error for the toast + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch game data.' }); + } + console.error(error); + } else { + setGame(data); + } + setLoading(false); + }; + fetchGame(); + }, [gameId, toast]); + + const handleNotImplemented = (feature) => { + toast({ + title: `> ${feature.toUpperCase()}`, + description: "🚧 This feature isn't implemented yet—but don't worry! You can request it in your next prompt! 🚀", + }); + }; + + const ratingPercentage = game && (game.likes + game.dislikes > 0) ? Math.round((game.likes / (game.likes + game.dislikes)) * 100) : 0; + + if (loading) return ; + if (!game) return
Game not found.
; + + return ( +
+ + {game.title} - GameForge + + + + < Back to Dashboard + + +
+ {`${game.title} +
+
+ {`${game.title} +
+ {game.status} +

{game.title}

+

by AeThex Studios

+
+
+
+ +
+ } label="Active" value={game.active_users.toLocaleString()} /> + } label="Visits" value={game.total_visits.toLocaleString()} /> + } label="Rating" value={`${ratingPercentage}%`} /> + } label="Servers" value="15" /> +
+ +
+ + +
+ + +
+
+
+ + + + +
+
+ +
+
+
+

> About

+

{game.long_description}

+
+ {game.hashtags?.map(tag => {tag})} +
+
+ + {/* Tabs for more details */} +
+

> Shop

+

Shop implementation coming soon.

+
+
+

> Servers

+

Server browser coming soon.

+
+
+

> Recommended

+

Recommendations coming soon.

+
+ +
+
+
+

> Game Info

+
+ } label="Genre" value={`${game.genre} / ${game.subgenre}`} /> + } label="Created" value={new Date(game.created_at).toLocaleDateString()} /> + } label="Updated" value={new Date(game.updated_at).toLocaleDateString()} /> + } label="Max Players" value={game.server_size} /> + } label="Voice Chat" value={game.voice_chat_enabled ? 'Enabled' : 'Disabled'} /> + } label="Camera" value={game.camera_enabled ? 'Enabled' : 'Disabled'} /> + } label="Memory" value={game.memory_requirements} /> +
+ {game.platforms?.map(p => )} +
+
+
+
+

> Badges

+

Badges list coming soon.

+
+
+

> Social Links

+
+ + +
+
+
+
+ +
+
+ ); +}; + +export default GamesPage; \ No newline at end of file diff --git a/gameforge/src/components/HeroImage.jsx b/gameforge/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/gameforge/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/gameforge/src/components/HomePage.jsx b/gameforge/src/components/HomePage.jsx new file mode 100644 index 0000000..be79b1f --- /dev/null +++ b/gameforge/src/components/HomePage.jsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Code, LogIn, UserPlus, AlertTriangle } from 'lucide-react'; +import Login from '@/components/auth/Login'; +import Signup from '@/components/auth/Signup'; +import { Button } from '@/components/ui/button'; + +const HomePage = ({ maintenanceMode = false }) => { + const [activeView, setActiveView] = useState(maintenanceMode ? 'login' : 'intro'); // intro, login, signup + const [matrixChars, setMatrixChars] = useState([]); + + React.useEffect(() => { + const chars = Array.from({ length: 100 }, (_, i) => ({ + id: i, + char: String.fromCharCode(0x30A0 + Math.random() * 96), + x: Math.random() * 100, + y: Math.random() * -100, + delay: Math.random() * 10 + })); + setMatrixChars(chars); + }, []); + + const IntroView = () => ( + + + + +

GAMEFORGE

+

+ Powered by AeThex OS +

+
+ + +
+
+ ); + + return ( +
+
+ {matrixChars.map((char) => ( +
+ {char.char} +
+ ))} +
+
+
+ +
+ {maintenanceMode && activeView !== 'intro' && ( + + + System is in maintenance mode. Only administrators can log in. + + )} + + {activeView === 'intro' && } + {activeView === 'login' && setActiveView('signup')} onSwitchToIntro={() => setActiveView('intro')} maintenanceMode={maintenanceMode} />} + {activeView === 'signup' && setActiveView('login')} onSwitchToIntro={() => setActiveView('intro')} maintenanceMode={maintenanceMode}/>} + +
+ + +
+ © {new Date().getFullYear()} GameForge by + AETHEX.BIZ +
+
+
+ ); +}; + +export default HomePage; \ No newline at end of file diff --git a/gameforge/src/components/LoadingScreen.jsx b/gameforge/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..2ba8331 --- /dev/null +++ b/gameforge/src/components/LoadingScreen.jsx @@ -0,0 +1,102 @@ +import React, { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { Code } from 'lucide-react'; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [loadingText, setLoadingText] = useState('Initializing kernel...'); + + const loadingSteps = [ + 'Initializing kernel...', + 'Loading neural modules...', + 'Syncing with data stream...', + 'Establishing secure connection...', + 'Booting GameForge OS...', + 'Finalizing...' + ]; + + useEffect(() => { + const interval = setInterval(() => { + setProgress(prev => { + const newProgress = prev + 1; + if (newProgress >= 100) { + clearInterval(interval); + setLoadingText('System ready.'); + return 100; + } + + const stepIndex = Math.floor((newProgress / 100) * (loadingSteps.length -1)); + setLoadingText(loadingSteps[stepIndex]); + + return newProgress; + }); + }, 40); + + return () => clearInterval(interval); + }, []); + + return ( + +
+ + + + +
+
+ +
+ + {loadingText} + +
+ + +

+ Powered by AeThex OS +

+

+ © {new Date().getFullYear()} AETHEX.BIZ +

+
+
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/gameforge/src/components/MainApp.jsx b/gameforge/src/components/MainApp.jsx new file mode 100644 index 0000000..fcf4ecf --- /dev/null +++ b/gameforge/src/components/MainApp.jsx @@ -0,0 +1,350 @@ +import React, { useState, useEffect, useCallback, useContext } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { + Monitor, + GitBranch, + Users, + Settings as SettingsIcon, + Activity, + Database, + Code, + FileText, + User, + LogOut, + LayoutDashboard, + ShieldCheck, + Menu, + Trophy, + Coffee, + Circle, + Moon, + Loader2, + Gamepad2 +} from 'lucide-react'; +import { useToast } from '@/components/ui/use-toast'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, +} from "@/components/ui/dropdown-menu"; +import Dashboard from '@/components/Dashboard'; +import ProjectManager from '@/components/ProjectManager'; +import AssetManager from '@/components/AssetManager'; +import UsersManager from '@/components/UsersManager'; +import VersionControl from '@/components/VersionControl'; +import SettingsPage from '@/components/Settings'; +import ProfilePage from '@/components/ProfilePage'; +import AdminPanel from '@/components/AdminPanel'; +import PageTransitionWrapper from '@/components/PageTransitionWrapper'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import UploadAssetsModal from '@/components/modals/UploadAssetsModal'; +import CreateProjectModal from '@/components/modals/CreateProjectModal'; +import { AppearanceContext } from '@/context/AppearanceContext'; +import { useAuth } from '@/context/AuthContext'; +import { AchievementsContext } from '@/context/AchievementsContext'; +import { usePresence } from '@/context/PresenceContext'; +import LoadingScreen from '@/components/LoadingScreen'; +import { Link, useNavigate } from 'react-router-dom'; + +const MainApp = () => { + const [activeTab, setActiveTab] = useState('dashboard'); + const [viewedProfileId, setViewedProfileId] = useState(null); + const [isPageLoading, setIsPageLoading] = useState(true); + const [currentTime, setCurrentTime] = useState(new Date()); + const [matrixChars, setMatrixChars] = useState([]); + const { addActivity } = useActivity(); + const { toast } = useToast(); + const navigate = useNavigate(); + + const { appearance } = useContext(AppearanceContext); + const { profile, logout, loading: authLoading, isOwnerOrAdmin } = useAuth(); + const { unlockAchievement } = useContext(AchievementsContext); + const { onlineCount, userStatus, setUserStatus, isSubscribed } = usePresence(); + + const [isUploadAssetsModalOpen, setUploadAssetsModalOpen] = useState(false); + const [isCreateProjectModalOpen, setCreateProjectModalOpen] = useState(false); + + useEffect(() => { + const timer = setInterval(() => setCurrentTime(new Date()), 1000); + return () => clearInterval(timer); + }, []); + + useEffect(() => { + const chars = Array.from({ length: 50 }, (_, i) => ({ + id: i, + char: String.fromCharCode(0x30A0 + Math.random() * 96), + x: Math.random() * 100, + delay: Math.random() * 10 + })); + setMatrixChars(chars); + }, []); + + useEffect(() => { + const currentHour = new Date().getHours(); + if (currentHour >= 2 && currentHour < 5) { + unlockAchievement('night_owl'); + } + }, [unlockAchievement]); + + const formatTime = (date) => date.toLocaleTimeString('en-US', { hour12: false, timeZone: 'UTC' }); + + const handleTabChange = useCallback((tab, profileId = null) => { + if (tab === 'games') { + navigate('/games'); + return; + } + + if (tab !== activeTab || profileId !== viewedProfileId) { + setActiveTab(tab); + setViewedProfileId(profileId); + addActivity({ type: 'navigation', message: `Navigated to ${tab} module` }); + if (tab === 'admin' && isOwnerOrAdmin) { + unlockAchievement('admin_power'); + } + } + }, [activeTab, viewedProfileId, addActivity, unlockAchievement, isOwnerOrAdmin, navigate]); + + const handleLogoutClick = () => { + addActivity({ type: 'auth', message: 'User logged out' }); + logout(); + }; + + const handleProjectCreated = () => { + unlockAchievement('first_project'); + setCreateProjectModalOpen(false); + }; + + const handleAssetsUploaded = () => { + unlockAchievement('first_asset'); + setUploadAssetsModalOpen(false); + } + + const renderActiveComponent = () => { + const props = { + onOpenCreateProject: () => setCreateProjectModalOpen(true), + onOpenUploadAssets: () => setUploadAssetsModalOpen(true), + setIsLoading: setIsPageLoading, + onViewProfile: (profileId) => handleTabChange('profile', profileId), + }; + switch (activeTab) { + case 'dashboard': return ; + case 'projects': return ; + case 'assets': return ; + case 'users': return ; + case 'version': return ; + case 'settings': return ; + case 'profile': return ; + case 'admin': return isOwnerOrAdmin ? : ; + default: return ; + } + }; + + const mainAppClasses = ` + min-h-screen bg-black text-green-400 relative overflow-hidden font-mono flex flex-col + theme-${appearance.theme} + font-size-${appearance.fontSize} + `; + + const navItems = [ + { id: 'dashboard', label: 'Dashboard', icon: Monitor }, + { id: 'projects', label: 'Projects', icon: FileText }, + { id: 'assets', label: 'Assets', icon: Database }, + { id: 'users', label: 'Users', icon: Users }, + { id: 'version', label: 'Version', icon: GitBranch }, + { id: 'games', label: 'Games', icon: Gamepad2 }, + ]; + + const statusOptions = { + online: { icon: Circle, color: 'text-green-400', label: 'Online' }, + away: { icon: Coffee, color: 'text-yellow-400', label: 'Away' }, + busy: { icon: Moon, color: 'text-red-400', label: 'Busy' }, + offline: { icon: Circle, color: 'text-gray-400', label: 'Offline' }, + }; + + const CurrentStatusIcon = statusOptions[userStatus]?.icon || Circle; + const currentStatusColor = statusOptions[userStatus]?.color || 'text-gray-400'; + + if (authLoading || !profile) { + return ; + } + + return ( +
+
+ {matrixChars.map((char) => ( +
+ {char.char} +
+ ))} +
+
+
+ + +
+ + +
+ +
+
+

GAMEFORGE

+

Neural Dev Toolkit

+
+ +
+ + + +
+
+
UTC: {formatTime(currentTime)}
+
NEURAL_LINK: ACTIVE
+
+ + + + {!isSubscribed ? : } + {profile?.username || 'USER'} + + + + My Account + + + handleTabChange('dashboard')}> + + Dashboard + + handleTabChange('profile')}> + + Profile + + handleTabChange('settings')}> + + Settings + + + + Set Status + + {Object.entries(statusOptions).filter(([key]) => key !== 'offline').map(([key, { icon: Icon, color, label }]) => ( + + + {label} + + ))} + + {isOwnerOrAdmin && ( + <> + + + handleTabChange('admin')}> + + Admin Panel + + + + )} + + + + Log out + + + +
+ + + + + + + + Navigation + + {navItems.map((item) => { + const Icon = item.icon; + return ( + handleTabChange(item.id)}> + + {item.label} + + ); + })} + + +
+
+
+
+ +
+ + + {renderActiveComponent()} + + +
+ + +
+
+
+ + SYSTEM_STATUS: ONLINE +
+
+
+ {onlineCount} ONLINE +
+
+
+ © {new Date().getFullYear()} GameForge by + AETHEX.BIZ +
+
+
+ setCreateProjectModalOpen(false)} onSave={handleProjectCreated} /> + setUploadAssetsModalOpen(false)} onAssetsUploaded={handleAssetsUploaded}/> +
+ ); +}; +export default MainApp; \ No newline at end of file diff --git a/gameforge/src/components/MaintenancePage.jsx b/gameforge/src/components/MaintenancePage.jsx new file mode 100644 index 0000000..51d1518 --- /dev/null +++ b/gameforge/src/components/MaintenancePage.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Wrench, Code } from 'lucide-react'; + +const MaintenancePage = ({ message }) => { + return ( +
+
+
+ + +
+ +
+ +

+ > SYSTEM_MAINTENANCE +

+ +

+ {message || "Our systems are currently undergoing scheduled maintenance to improve performance and security. We'll be back online shortly."} +

+ +
+
+ +
+
+

GAMEFORGE

+

Neural Dev Toolkit

+
+
+ +

+ © {new Date().getFullYear()} GameForge by AETHEX.BIZ +

+
+
+ ); +}; + +export default MaintenancePage; \ No newline at end of file diff --git a/gameforge/src/components/PageTransitionWrapper.jsx b/gameforge/src/components/PageTransitionWrapper.jsx new file mode 100644 index 0000000..29dea8a --- /dev/null +++ b/gameforge/src/components/PageTransitionWrapper.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const pageVariants = { + initial: { + opacity: 0, + y: 20, + scale: 0.98, + }, + in: { + opacity: 1, + y: 0, + scale: 1, + }, + out: { + opacity: 0, + y: -20, + scale: 1.02, + }, +}; + +const pageTransition = { + type: 'tween', + ease: 'anticipate', + duration: 0.5, +}; + +const PageTransitionWrapper = ({ children }) => { + + return ( + + {children} + + ); +}; + +export default PageTransitionWrapper; \ No newline at end of file diff --git a/gameforge/src/components/ProfilePage.jsx b/gameforge/src/components/ProfilePage.jsx new file mode 100644 index 0000000..6e9963f --- /dev/null +++ b/gameforge/src/components/ProfilePage.jsx @@ -0,0 +1,273 @@ +import React, { useContext, useState, useMemo, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { User, Mail, Shield, Code, Gamepad2, Calendar, Award, Clock, Copy, Check, Fingerprint, Trophy, Zap, Star, Loader2 } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useAuth } from '@/context/AuthContext'; +import { useToast } from '@/components/ui/use-toast'; +import { AchievementsContext } from '@/context/AchievementsContext'; +import { supabase } from '@/lib/customSupabaseClient'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +const AeThexPassport = ({ user, isCopied, handleCopy }) => ( + +
+
+
+

> AETHEX PASSPORT

+ +
+
+
+ {user.avatar} +
+
+

{user.displayName}

+
+

{user.passportId}

+ +
+
+
+
+
+); + +const AchievementsDisplay = ({ achievements, unlockedAchievements }) => { + const getRarityColor = (rarity) => { + switch (rarity) { + case 'Common': return 'border-gray-500 text-gray-400'; + case 'Rare': return 'border-blue-500 text-blue-400'; + case 'Epic': return 'border-purple-500 text-purple-400'; + case 'Legendary': return 'border-yellow-500 text-yellow-400'; + default: return 'border-gray-600'; + } + }; + + const getIcon = (iconName) => { + switch(iconName) { + case 'Trophy': return ; + case 'Zap': return ; + case 'Star': return ; + case 'Shield': return ; + default: return ; + } + }; + + return ( +
+

> ACHIEVEMENTS

+
+ + {achievements.map((ach) => { + const isUnlocked = unlockedAchievements.has(ach.id); + return ( + + + +
+ {getIcon(ach.icon)} +
+

{ach.name}

+
+
+ +

{ach.name} ({ach.rarity})

+

{ach.description}

+ {!isUnlocked &&

LOCKED

} +
+
+ ); + })} +
+
+
+ ); +}; + + +const ProfilePage = ({ setIsLoading, profileId }) => { + const { profile: ownProfile } = useAuth(); + const { toast } = useToast(); + const { achievements, unlockedAchievements } = useContext(AchievementsContext); + const [isCopied, setIsCopied] = useState(false); + const [viewedProfile, setViewedProfile] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchProfile = async () => { + setLoading(true); + let profileData = null; + if (profileId) { + const { data, error } = await supabase + .from('profiles') + .select('*') + .eq('id', profileId) + .single(); + if (error) { + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch profile.' }); + } else { + profileData = data; + } + } else { + profileData = ownProfile; + } + setViewedProfile(profileData); + setLoading(false); + if (setIsLoading) setIsLoading(false); + }; + + fetchProfile(); + }, [profileId, ownProfile, toast, setIsLoading]); + + const user = useMemo(() => { + if (!viewedProfile) return null; + const joinDate = viewedProfile?.created_at ? new Date(viewedProfile.created_at).toISOString().split('T')[0] : '2023-01-15'; + + return { + id: viewedProfile.id, + name: viewedProfile.username || 'AGENT', + displayName: viewedProfile.username || 'Agent', + email: viewedProfile?.email || 'agent@aethex.biz', + passportId: viewedProfile.aethex_passport_id || 'N/A', + role: viewedProfile.role || 'Member', + avatar: viewedProfile.username?.substring(0, 2).toUpperCase() || 'AG', + joinDate, + lastActive: 'Now', + bio: viewedProfile.bio || 'A mysterious agent of GameForge, operating in the shadows of cyberspace.', + skills: viewedProfile.skills || ['Stealth', 'Hacking', 'Data Analysis'], + projects: ['Project Chimera', 'Operation Ghost', 'Neural Grid'], + }; + }, [viewedProfile]); + + const handleCopy = () => { + if (user?.passportId) { + navigator.clipboard.writeText(user.passportId); + setIsCopied(true); + toast({ + title: '> PASSPORT ID COPIED', + description: 'Your AeThex Passport ID is now in your clipboard.', + }); + setTimeout(() => setIsCopied(false), 2000); + } + }; + + if (loading) { + return
; + } + + if (!user) { + return
Error loading profile.
; + } + + const isOwnProfile = user.id === ownProfile.id; + + return ( +
+ +
+

+ > USER_PROFILE +

+

+ Viewing personal information and activity for {user.name} +

+
+ {isOwnProfile && } +
+ +
+ +
+
+
+ {user.avatar} +
+
+ +
+
+

{user.displayName}

+

@{user.name}

+

{user.role}

+
+ + + +
+

> CONTACT_INFO

+
+
{user.email}
+
Joined: {user.joinDate}
+
Last Active: {user.lastActive}
+
+
+
+ + +
+

> BIO

+

{user.bio}

+
+ +
+

> SKILLS

+
+ {user.skills.map((skill, index) => ( + + + {skill} + + ))} +
+
+ + + +
+

> ACTIVE_PROJECTS

+
+ {user.projects.map((project, index) => ( + + + {project} + + ))} +
+
+
+
+
+ ); +}; + +export default ProfilePage; \ No newline at end of file diff --git a/gameforge/src/components/ProjectManager.jsx b/gameforge/src/components/ProjectManager.jsx new file mode 100644 index 0000000..853e6f5 --- /dev/null +++ b/gameforge/src/components/ProjectManager.jsx @@ -0,0 +1,255 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { motion } from 'framer-motion'; +import { Plus, Loader2, Folder } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import ConfirmationModal from '@/components/modals/ConfirmationModal'; +import CreateProjectModal from '@/components/modals/CreateProjectModal'; +import ProjectDetailModal from '@/components/modals/ProjectDetailModal'; +import ProjectTeamModal from '@/components/modals/ProjectTeamModal'; +import { supabase } from '@/lib/customSupabaseClient'; +import useDataFetching from '@/hooks/useDataFetching'; +import { useAuth } from '@/context/AuthContext'; +import ProjectHeader from '@/components/projects/ProjectHeader'; +import ProjectFilters from '@/components/projects/ProjectFilters'; +import ProjectCard from '@/components/projects/ProjectCard'; + +const fetchProjectsFunction = async (user) => { + const { data, error } = await supabase + .from('projects') + .select(` + *, + project_team_members!inner(user_id) + `) + .eq('project_team_members.user_id', user.id); + + if (error) throw error; + + const projectsWithCounts = await Promise.all(data.map(async (project) => { + const { count, error: countError } = await supabase + .from('project_team_members') + .select('user_id', { count: 'exact', head: true }) + .eq('project_id', project.id); + + if (countError) { + console.error('Error fetching team count for project', project.id, countError); + return { ...project, team: 1, lastUpdate: new Date(project.updated_at).toLocaleString() }; + } + + return { ...project, team: count || 1, lastUpdate: new Date(project.updated_at).toLocaleString() }; + })); + + return projectsWithCounts; +}; + +const ProjectManager = () => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { user } = useAuth(); + const { data: projects, loading, refetch } = useDataFetching( + fetchProjectsFunction, + false, + [] + ); + + const [searchTerm, setSearchTerm] = useState(''); + const [filterStatus, setFilterStatus] = useState('all'); + + const [isCreateModalOpen, setCreateModalOpen] = useState(false); + const [isConfirmModalOpen, setConfirmModalOpen] = useState(false); + const [editingProject, setEditingProject] = useState(null); + const [deletingProjectId, setDeletingProjectId] = useState(null); + + const [selectedProject, setSelectedProject] = useState(null); + const [isDetailModalOpen, setDetailModalOpen] = useState(false); + const [isTeamModalOpen, setTeamModalOpen] = useState(false); + + useEffect(() => { + const channel = supabase.channel('public:projects') + .on('postgres_changes', { event: '*', schema: 'public', table: 'projects' }, () => refetch()) + .subscribe(); + + const teamChannel = supabase.channel('public:project_team_members') + .on('postgres_changes', { event: '*', schema: 'public', table: 'project_team_members' }, () => refetch()) + .subscribe(); + + return () => { + supabase.removeChannel(channel); + supabase.removeChannel(teamChannel); + }; + }, [refetch]); + + const handleCreateOrUpdateProject = async (projectData) => { + if (!user) { + toast({ variant: 'destructive', title: 'Authentication Error', description: 'User not found.' }); + return; + } + try { + if (editingProject) { + const { data, error } = await supabase + .from('projects') + .update({ ...projectData, updated_at: new Date() }) + .eq('id', editingProject.id) + .select() + .single(); + if (error) throw error; + addActivity({ type: 'project', message: `Updated project: ${data.title}` }); + toast({ title: '> PROJECT UPDATED', description: `Project ${data.title} details have been saved.` }); + } else { + const { data, error } = await supabase + .from('projects') + .insert({ ...projectData, owner_id: user.id, user_id: user.id }) + .select() + .single(); + if (error) throw error; + + await supabase.from('project_team_members').insert({ project_id: data.id, user_id: user.id, role: 'owner' }); + + addActivity({ type: 'project', message: `Created new project: ${data.title}` }); + toast({ title: '> PROJECT CREATED', description: `New project ${data.title} has been initialized.` }); + } + refetch(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error saving project', description: error.message }); + } + setEditingProject(null); + setCreateModalOpen(false); + }; + + const handleEdit = (project) => { + setEditingProject(project); + setCreateModalOpen(true); + }; + + const openDeleteConfirm = (projectId) => { + setDeletingProjectId(projectId); + setConfirmModalOpen(true); + }; + + const confirmDelete = async () => { + const projectToDelete = projects.find(p => p.id === deletingProjectId); + try { + await supabase.from('project_team_members').delete().eq('project_id', deletingProjectId); + const { error } = await supabase.from('projects').delete().eq('id', deletingProjectId); + if (error) throw error; + addActivity({ type: 'project', message: `Deleted project: ${projectToDelete.title}` }); + toast({ title: '> PROJECT DELETED', description: `Project ${projectToDelete.title} has been deleted.`, variant: 'destructive' }); + refetch(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error deleting project', description: error.message }); + } + setConfirmModalOpen(false); + setDeletingProjectId(null); + }; + + const handleViewProject = (project) => { + setSelectedProject(project); + setDetailModalOpen(true); + addActivity({ type: 'project', message: `Viewed project details: ${project.title}` }); + }; + + const handleViewRepo = (project) => { + addActivity({ type: 'project', message: `Viewed repository for: ${project.title}` }); + if (project.github_url) { + window.open(project.github_url, '_blank', 'noopener,noreferrer'); + } else { + toast({ + variant: 'destructive', + title: 'Repository Not Found', + description: 'No GitHub repository URL is linked to this project.', + }); + } + }; + + const handleViewTeam = (project) => { + setSelectedProject(project); + setTeamModalOpen(true); + addActivity({ type: 'project', message: `Viewed team for: ${project.title}` }); + }; + + const filteredProjects = useMemo(() => (projects || []).filter(project => { + const matchesSearch = project.title.toLowerCase().includes(searchTerm.toLowerCase()) || + (project.description && project.description.toLowerCase().includes(searchTerm.toLowerCase())); + const matchesFilter = filterStatus === 'all' || project.status === filterStatus; + return matchesSearch && matchesFilter; + }), [projects, searchTerm, filterStatus]); + + return ( + <> +
+ { setEditingProject(null); setCreateModalOpen(true); }} /> + + + {loading ? ( +
+ +
+ ) : ( + <> +
+ {filteredProjects.map((project, index) => ( + + ))} +
+ + {filteredProjects.length === 0 && ( + + +

NO_PROJECTS_FOUND

+

No projects match your current search criteria

+ +
+ )} + + )} +
+ { setCreateModalOpen(false); setEditingProject(null); }} + onSave={handleCreateOrUpdateProject} + project={editingProject} + /> + setConfirmModalOpen(false)} + onConfirm={confirmDelete} + title="> CONFIRM_DELETION" + > +

Are you sure you want to delete this project?

+

This action cannot be undone.

+
+ setDetailModalOpen(false)} + project={selectedProject} + /> + setTeamModalOpen(false)} + project={selectedProject} + /> + + ); +}; + +export default ProjectManager; \ No newline at end of file diff --git a/gameforge/src/components/Settings.jsx b/gameforge/src/components/Settings.jsx new file mode 100644 index 0000000..87da072 --- /dev/null +++ b/gameforge/src/components/Settings.jsx @@ -0,0 +1,133 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { + User, + Shield, + Bell, + Palette, + Globe, + Save, + RotateCcw, + FileCog, + Network +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import ProfileSettings from '@/components/settings/ProfileSettings'; +import SecuritySettings from '@/components/settings/SecuritySettings'; +import NotificationSettings from '@/components/settings/NotificationSettings'; +import AppearanceSettings from '@/components/settings/AppearanceSettings'; +import IntegrationSettings from '@/components/settings/IntegrationSettings'; +import ProjectSettings from '@/components/settings/ProjectSettings'; +import DomainSettings from '@/components/settings/DomainSettings'; +import { AppearanceContext } from '@/context/AppearanceContext'; + +const SettingsPage = ({ setIsLoading }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const [activeSection, setActiveSection] = useState('profile'); + const { settings, updateSettings, resetSettings, initialSettings } = useContext(AppearanceContext); + + useEffect(() => { + setIsLoading(false); + }, [activeSection, setIsLoading]); + + const handleSave = () => { + localStorage.setItem('gameforge_settings', JSON.stringify(settings)); + addActivity({ type: 'settings', message: 'Saved all settings changes' }); + toast({ + title: '> SETTINGS SAVED', + description: 'All your changes have been successfully saved.', + }); + }; + + const handleReset = () => { + resetSettings(); + addActivity({ type: 'settings', message: 'Reset all settings to default' }); + toast({ + title: '> SETTINGS RESET', + description: 'All settings have been reset to their default values.', + variant: 'destructive' + }); + }; + + const handleAction = (action, setting = '') => { + addActivity({ type: 'settings', message: `Performed settings action: ${action} ${setting}` }); + toast({ + title: `> SETTINGS ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + variant: 'destructive' + }); + }; + + const sections = [ + { id: 'profile', label: 'Profile', icon: User }, + { id: 'security', label: 'Security', icon: Shield }, + { id: 'notifications', label: 'Notifications', icon: Bell }, + { id: 'appearance', label: 'Appearance', icon: Palette }, + { id: 'integrations', label: 'Integrations', icon: Globe }, + { id: 'domains', label: 'Domains', icon: Network }, + { id: 'project', label: 'Project Settings', icon: FileCog }, + ]; + + const renderContent = () => { + switch (activeSection) { + case 'profile': return ; + case 'security': return ; + case 'notifications': return ; + case 'appearance': return ; + case 'integrations': return ; + case 'domains': return ; + case 'project': return ; + default: return ; + } + }; + + return ( +
+ +
+

> SETTINGS

+

Configure your GameForge environment and preferences

+
+
+ + +
+
+ +
+ + + + + + + + {renderContent()} + + + +
+
+ ); +}; + +export default SettingsPage; \ No newline at end of file diff --git a/gameforge/src/components/UsersManager.jsx b/gameforge/src/components/UsersManager.jsx new file mode 100644 index 0000000..f44e875 --- /dev/null +++ b/gameforge/src/components/UsersManager.jsx @@ -0,0 +1,381 @@ +import React, { useState, useMemo, useContext } from 'react'; +import { motion } from 'framer-motion'; +import { + UserPlus, + Search, + Filter, + MoreVertical, + Mail, + Clock, + Shield, + Star, + Activity, + Users, + Crown, + Code, + Palette, + Music, + Gamepad2, + Calendar, + Loader2, + Circle, + Coffee, + Moon, + UserCog, + Eye, + Award, + BarChart, + Slash, + Trash2, + UserX +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import { usePresence } from '@/context/PresenceContext'; +import { useAuth } from '@/context/AuthContext'; +import MessageUserModal from '@/components/modals/MessageUserModal'; +import ManagePermissionsModal from '@/components/modals/admin/ManagePermissionsModal'; +import ConfirmationModal from '@/components/modals/ConfirmationModal'; +import InviteUserModal from '@/components/modals/InviteUserModal'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, + DropdownMenuGroup, +} from "@/components/ui/dropdown-menu"; + +const UsersManager = ({ onViewProfile }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { teamMembers: allUsers, onlineCount, loading } = usePresence(); + const { profile: currentUserProfile } = useAuth(); + + const [searchTerm, setSearchTerm] = useState(''); + const [filterRole, setFilterRole] = useState('all'); + const [isMessageModalOpen, setMessageModalOpen] = useState(false); + const [isPermissionsModalOpen, setPermissionsModalOpen] = useState(false); + const [isInviteUserModalOpen, setInviteUserModalOpen] = useState(false); + const [selectedUser, setSelectedUser] = useState(null); + const [isConfirmModalOpen, setConfirmModalOpen] = useState(false); + const [confirmModalContent, setConfirmModalContent] = useState({ title: '', onConfirm: () => {} }); + + const isOwnerOrAdmin = currentUserProfile?.role === 'admin' || currentUserProfile?.role === 'owner'; + + const handleMessageUser = (user) => { + setSelectedUser(user); + setMessageModalOpen(true); + addActivity({ type: 'team', message: `Initiated message with ${user.username}` }); + }; + + const handleViewProfile = (userId) => { + onViewProfile(userId); + }; + + const handleManagePermissions = (user) => { + if (isOwnerOrAdmin) { + setSelectedUser(user); + setPermissionsModalOpen(true); + addActivity({ type: 'team', message: `Managing permissions for ${user.username}` }); + } else { + toast({ + variant: 'destructive', + title: 'ACCESS DENIED', + description: 'You do not have permission to manage roles.', + }); + } + }; + + const handleAdminAction = (action, user) => { + addActivity({ type: 'admin', message: `${action} on user ${user.username}` }); + toast({ + title: `> ADMIN ACTION: ${action.toUpperCase()}`, + description: "🚧 This feature isn't implemented yet—but don't worry! You can request it in your next prompt! 🚀", + }); + }; + + const handleSuspendUser = (user) => { + setConfirmModalContent({ + title: `> CONFIRM SUSPENSION`, + onConfirm: () => { + handleAdminAction('Suspend User', user); + setConfirmModalOpen(false); + }, + children:

Are you sure you want to suspend {user.username}?

+ }); + setConfirmModalOpen(true); + }; + + const handleDeleteUser = (user) => { + setConfirmModalContent({ + title: `> CONFIRM DELETION`, + icon: , + onConfirm: () => { + handleAdminAction('Delete User', user); + setConfirmModalOpen(false); + }, + children: ( + <> +

Are you sure you want to delete {user.username}?

+

This action is irreversible.

+ + ) + }); + setConfirmModalOpen(true); + }; + + const getStatusInfo = (status) => { + switch (status) { + case 'online': return { color: 'bg-green-400', text: 'ONLINE', icon: }; + case 'away': return { color: 'bg-yellow-400', text: 'AWAY', icon: }; + case 'busy': return { color: 'bg-red-400', text: 'BUSY', icon: }; + default: return { color: 'bg-gray-400', text: 'OFFLINE', icon: }; + } + }; + + const getRoleIcon = (role) => { + if (!role) return ; + if (role.toLowerCase().includes('developer')) return ; + if (role.toLowerCase().includes('artist')) return ; + if (role.toLowerCase().includes('audio')) return ; + if (role.toLowerCase().includes('designer')) return ; + return ; + }; + + const getPermissionIcon = (permission) => { + switch (permission) { + case 'owner': return ; + case 'oversee': return ; + case 'admin': return ; + case 'editor': return ; + case 'member': return ; + default: return ; + } + }; + + const filteredUsers = useMemo(() => allUsers.filter(user => { + const matchesSearch = user.username.toLowerCase().includes(searchTerm.toLowerCase()) || + user.email.toLowerCase().includes(searchTerm.toLowerCase()) || + (user.role && user.role.toLowerCase().includes(searchTerm.toLowerCase())); + const matchesFilter = filterRole === 'all' || (user.role && user.role.toLowerCase().includes(filterRole.toLowerCase())); + return matchesSearch && matchesFilter; + }), [allUsers, searchTerm, filterRole]); + + return ( + <> +
+ +
+

+ > USERS +

+

+ Browse all users on the platform. +

+
+ +
+ + +
+
+ + setSearchTerm(e.target.value)} + className="w-full bg-black/50 cyber-border rounded px-10 py-2 text-green-400 font-mono placeholder-green-400/50 focus:outline-none focus:ring-2 focus:ring-green-400/50" + /> +
+
+ + +
+
+
+ + + {[ + { label: 'Total Users', value: allUsers.length, color: 'text-green-400' }, + { label: 'Online Now', value: onlineCount, color: 'text-cyan-400' }, + { label: 'Avg Projects', value: '2.1', color: 'text-purple-400' }, + { label: 'New This Week', value: '12', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + {loading ? ( +
+ +
+ ) : ( + <> +
+ {filteredUsers.map((user, index) => { + const statusInfo = getStatusInfo(user.status); + const isSelf = user.id === currentUserProfile.id; + + return ( + +
+
+
+
+ {user.avatar} +
+
+
+
+

{user.username}

{getPermissionIcon(user.role)}
+
{user.role || 'Member'}
+
+
+ + + + + + {(isOwnerOrAdmin && !isSelf) ? ( + <> + Admin Actions + + handleManagePermissions(user)}> + Manage Permissions + + handleAdminAction('Add Loyalty Points', user)}> + Add Loyalty Points + + handleAdminAction('View Activity Log', user)}> + View Activity + + + handleSuspendUser(user)}> + Suspend User + + handleDeleteUser(user)}> + Delete User + + + ) : ( + <> + User Snapshot + + +

Loyalty: {user.loyalty_points || 0} pts

+

XP: {user.total_xp || 0}

+

Level: {user.level || 1}

+
+ + )} +
+
+
+ +
+
{user.email}
+
Status:{statusInfo.text}
+
Last Active:{new Date(user.last_seen).toLocaleString()}
+
+ +
+ + +
+
+ )})} +
+ + {filteredUsers.length === 0 && !loading && ( + + +

NO_USERS_FOUND

+

No users match your current search criteria

+ +
+ )} + + )} +
+ {selectedUser && ( + <> + setMessageModalOpen(false)} + recipient={selectedUser} + /> + setPermissionsModalOpen(false)} + user={selectedUser} + /> + + )} + setConfirmModalOpen(false)} + onConfirm={confirmModalContent.onConfirm} + title={confirmModalContent.title} + icon={confirmModalContent.icon} + > + {confirmModalContent.children} + + setInviteUserModalOpen(false)} /> + + ); +}; + +export default UsersManager; \ No newline at end of file diff --git a/gameforge/src/components/VersionControl.jsx b/gameforge/src/components/VersionControl.jsx new file mode 100644 index 0000000..9d84f41 --- /dev/null +++ b/gameforge/src/components/VersionControl.jsx @@ -0,0 +1,266 @@ +import React, { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { + GitBranch, + GitCommit, + GitMerge, + Plus, + Eye, + Copy, + Trash2, + ArrowRight +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; + +const getBranchTypeColor = (type) => { + switch (type) { + case 'main': return 'text-green-400 border-green-400/30'; + case 'feature': return 'text-blue-400 border-blue-400/30'; + case 'bugfix': return 'text-red-400 border-red-400/30'; + case 'hotfix': return 'text-yellow-400 border-yellow-400/30'; + default: return 'text-gray-400 border-gray-400/30'; + } +}; + +const getPRStatusColor = (status) => { + switch (status) { + case 'open': return 'text-green-400 border-green-400/30'; + case 'review': return 'text-yellow-400 border-yellow-400/30'; + case 'approved': return 'text-blue-400 border-blue-400/30'; + case 'merged': return 'text-purple-400 border-purple-400/30'; + case 'closed': return 'text-red-400 border-red-400/30'; + default: return 'text-gray-400 border-gray-400/30'; + } +}; + +const CommitList = ({ commits, handleAction }) => ( +
+ {commits.map((commit, index) => ( + +
+
+
+
+ +
+
+

{commit.message}

+
+ {commit.hash} + {commit.author} + {commit.timestamp} +
+
+
+
+ {commit.branch} + {commit.files} files + +{commit.additions} + -{commit.deletions} +
+
+
+ + +
+
+
+ ))} +
+); + +const BranchList = ({ branches, handleAction }) => ( +
+ {branches.map((branch, index) => ( + +
+
+
+ +
+
+
+

{branch.name}

+ {branch.type} + {branch.protected && PROTECTED} +
+
+ {branch.lastCommit} + {branch.author} + {branch.lastUpdate} + {branch.ahead > 0 && ↑{branch.ahead}} + {branch.behind > 0 && ↓{branch.behind}} +
+
+
+
+ + + {!branch.protected && } +
+
+
+ ))} +
+); + +const PullRequestList = ({ pullRequests, handleAction }) => ( +
+ {pullRequests.map((pr, index) => ( + +
+
+
+
+ +
+
+

{pr.title}

+

{pr.description}

+
+
+
+ {pr.author} + {pr.created} + {pr.status.toUpperCase()} +
+
+
+
+
+ + {pr.source} + + {pr.target} + + {pr.commits} commits + {pr.files} files + {pr.reviews} reviews +
+
+ + {pr.status === 'approved' && } +
+
+
+ ))} +
+); + +const VersionControl = ({ setIsLoading = () => {} }) => { + const [activeTab, setActiveTab] = useState('commits'); + const { toast } = useToast(); + + useEffect(() => { + setIsLoading(false); + }, [setIsLoading]); + + const [commits] = useState([ + { id: 1, hash: 'a7f3d2e', message: 'Updated player movement system with neural controls', author: 'MRPIGLR', timestamp: '2 hours ago', branch: 'feature/neural-controls', files: 12, additions: 45, deletions: 8 }, + { id: 2, hash: 'b9e1c4f', message: 'Added cyberpunk UI elements and animations', author: 'UI_CYBER', timestamp: '5 hours ago', branch: 'feature/ui-overhaul', files: 8, additions: 127, deletions: 23 }, + { id: 3, hash: 'c2d5a8b', message: 'Implemented quantum physics engine', author: 'CODE_PHANTOM', timestamp: '1 day ago', branch: 'feature/quantum-physics', files: 15, additions: 234, deletions: 67 }, + { id: 4, hash: 'd8f2b1c', message: 'Fixed audio synchronization issues', author: 'SOUND_MATRIX', timestamp: '2 days ago', branch: 'bugfix/audio-sync', files: 3, additions: 18, deletions: 12 } + ]); + + const [branches] = useState([ + { id: 1, name: 'main', type: 'main', lastCommit: 'a7f3d2e', lastUpdate: '2 hours ago', author: 'MRPIGLR', ahead: 0, behind: 0, protected: true }, + { id: 2, name: 'feature/neural-controls', type: 'feature', lastCommit: 'a7f3d2e', lastUpdate: '2 hours ago', author: 'MRPIGLR', ahead: 3, behind: 0, protected: false }, + { id: 3, name: 'feature/ui-overhaul', type: 'feature', lastCommit: 'b9e1c4f', lastUpdate: '5 hours ago', author: 'UI_CYBER', ahead: 2, behind: 1, protected: false }, + { id: 4, name: 'feature/quantum-physics', type: 'feature', lastCommit: 'c2d5a8b', lastUpdate: '1 day ago', author: 'CODE_PHANTOM', ahead: 5, behind: 2, protected: false } + ]); + + const [pullRequests] = useState([ + { id: 1, title: 'Neural Controls Integration', description: 'Implements advanced neural interface controls for player movement', author: 'MRPIGLR', source: 'feature/neural-controls', target: 'main', status: 'open', commits: 3, files: 12, created: '2 hours ago', reviews: 2 }, + { id: 2, title: 'UI Overhaul with Cyberpunk Theme', description: 'Complete redesign of user interface with cyberpunk aesthetics', author: 'UI_CYBER', source: 'feature/ui-overhaul', target: 'main', status: 'review', commits: 8, files: 25, created: '1 day ago', reviews: 1 }, + { id: 3, title: 'Quantum Physics Engine', description: 'Advanced physics simulation for quantum mechanics gameplay', author: 'CODE_PHANTOM', source: 'feature/quantum-physics', target: 'main', status: 'approved', commits: 15, files: 42, created: '3 days ago', reviews: 3 } + ]); + + const handleAction = (action, item = '') => { + toast({ + title: `> VC ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + variant: 'destructive', + }); + }; + + const renderContent = () => { + switch (activeTab) { + case 'commits': return ; + case 'branches': return ; + case 'pulls': return ; + default: return null; + } + }; + + return ( +
+ +
+

> VERSION_CONTROL

+

Git integration with automated build pipelines and webhook support

+
+
+ + +
+
+ + + {[ + { label: 'Commits Today', value: '47', color: 'text-green-400' }, + { label: 'Active Branches', value: '12', color: 'text-cyan-400' }, + { label: 'Open PRs', value: '3', color: 'text-purple-400' }, + { label: 'Sync Status', value: 'LIVE', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + +
+ {[ + { id: 'commits', label: 'Commits', icon: GitCommit }, + { id: 'branches', label: 'Branches', icon: GitBranch }, + { id: 'pulls', label: 'Pull Requests', icon: GitMerge } + ].map((tab) => { + const Icon = tab.icon; + return ( + + ); + })} +
+
+ + + {renderContent()} + +
+ ); +}; + +export default VersionControl; \ No newline at end of file diff --git a/gameforge/src/components/WelcomeMessage.jsx b/gameforge/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/gameforge/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/gameforge/src/components/admin/MaintenanceManager.jsx b/gameforge/src/components/admin/MaintenanceManager.jsx new file mode 100644 index 0000000..eaa96fb --- /dev/null +++ b/gameforge/src/components/admin/MaintenanceManager.jsx @@ -0,0 +1,144 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { X, Save, Loader2, AlertTriangle, Power, PowerOff } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { supabase } from '@/lib/customSupabaseClient'; + +const MaintenanceManager = ({ isOpen, onClose }) => { + const { toast } = useToast(); + const [maintenanceStatus, setMaintenanceStatus] = useState({ enabled: false, message: '' }); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + + useEffect(() => { + if (isOpen) { + const fetchStatus = async () => { + setLoading(true); + try { + const { data, error } = await supabase + .from('system_settings') + .select('value') + .eq('key', 'maintenance_status') + .single(); + + if (error && error.code !== 'PGRST116') throw error; + + if (data) { + setMaintenanceStatus(data.value); + } else { + setMaintenanceStatus({ enabled: false, message: "System is currently under maintenance. We'll be back shortly." }); + } + } catch (error) { + toast({ variant: 'destructive', title: 'Error fetching status', description: error.message }); + } finally { + setLoading(false); + } + }; + fetchStatus(); + } + }, [isOpen, toast]); + + const handleSave = async () => { + setSaving(true); + try { + const { error } = await supabase + .from('system_settings') + .upsert({ key: 'maintenance_status', value: maintenanceStatus }, { onConflict: 'key' }); + + if (error) throw error; + + toast({ + title: '> MAINTENANCE MODE UPDATED', + description: `System maintenance mode is now ${maintenanceStatus.enabled ? 'ENABLED' : 'DISABLED'}.`, + }); + onClose(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error saving status', description: error.message }); + } finally { + setSaving(false); + } + }; + + const toggleMaintenanceMode = () => { + setMaintenanceStatus(prev => ({ ...prev, enabled: !prev.enabled })); + }; + + return ( + + {isOpen && ( + + e.stopPropagation()} + > + +

> MAINTENANCE_CONTROL

+

Enable or disable system-wide maintenance mode.

+ + {loading ? ( +
+ +
+ ) : ( +
+
+
+

+ System Status: + {maintenanceStatus.enabled ? 'MAINTENANCE' : 'OPERATIONAL'} + +

+

+ {maintenanceStatus.enabled ? 'Users will see the maintenance page.' : 'The application is live.'} +

+
+ +
+ +
+ + +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-edit-mode.js b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-react-inline-editor.js b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + +

+ Remembered your password?{' '} + +

+ + ); + case 'sign_up': + case 'sign_in': + default: + return ( + <> +
+
+ +
+
+

+ {view === 'sign_in' ? 'Welcome Back' : 'Become a Contributor'} +

+

+ {view === 'sign_in' ? 'Sign in to your AeThex account' : 'Create an account to start contributing'} +

+ + + + +
+
+ OR CONTINUE WITH EMAIL +
+
+ +
+
+ +
+ + setEmail(e.target.value)} required className="pl-10" placeholder="Enter your email" /> +
+
+
+ +
+ + setPassword(e.target.value)} required className="pl-10" placeholder="Enter your password" /> +
+
+ + {view === 'sign_in' && ( +
+
+ + +
+ +
+ )} + + +
+

+ {view === 'sign_in' ? "Don't have an account?" : "Already have an account?"}{' '} + +

+ + ); + } + }; + + return ( + + e.stopPropagation()} + > +
+ + + {renderContent()} + +
+
+
+ ); +}; + +export default AuthModal; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/CallToAction.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCard.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCard.jsx new file mode 100644 index 0000000..098c16f --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCard.jsx @@ -0,0 +1,103 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Calendar, MapPin, Star, ArrowRight } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate } from '@/lib/utils'; + +const cardVariants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, ease: "easeOut" } + }, + exit: { + opacity: 0, + y: -30, + transition: { duration: 0.3, ease: "easeIn" } + } +}; + +const EventCard = ({ event, onSelectEvent, getCategoryColor, getCategoryLabel }) => { + const eventUrl = `https://events.aethex.biz/event/${event.id}`; + + return ( + +
+
+
+ +
+ + {getCategoryLabel(event.category)} + +
+ {event.featured && ( + +
+ + Featured +
+
+ )} +
+ +
+

+ {event.title} +

+

+ {event.description} +

+ +
+
+ + {formatDate(event.date)} +
+
+ + {event.location} +
+
+ +
+
+ {event.price === 0 ? 'Free' : `$${event.price}`} +
+ +
+
+
+
+ ); +}; + +export default EventCard; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCardSkeleton.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCardSkeleton.jsx new file mode 100644 index 0000000..ae4e3be --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventCardSkeleton.jsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const EventCardSkeleton = () => { + return ( + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ ); +}; + +export default EventCardSkeleton; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventDetailModal.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventDetailModal.jsx new file mode 100644 index 0000000..d8f34f7 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventDetailModal.jsx @@ -0,0 +1,162 @@ +import React from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Calendar, Clock, MapPin, Users, X, Loader2, ExternalLink } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate, formatTime } from '@/lib/utils'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const EventDetailModal = ({ event, onClose, onRegister, onUnregister, isRegistered, getCategoryColor, getCategoryLabel, isLoading }) => { + const eventUrl = `https://events.aethex.biz/event/${event.id}`; + + return ( + + e.stopPropagation()} + > +
+ + +
+
+ + + + {getCategoryLabel(event.category)} + + +
+ +
+
+
+

{event.title}

+

{event.full_description}

+ +
+
+

Event Details

+
+
{formatDate(event.date)}
+
{formatTime(event.time)}
+
{event.location}
+
{event.registered_count}/{event.capacity} registered
+
+
+
+

Speakers

+
    + {event.speakers && event.speakers.map((speaker, index) =>
  • {speaker}
  • )} +
+
+
+ +
+

Agenda

+
+ {event.agenda && event.agenda.map((item, index) => ( +
+
{item.time}
+
{item.title}
+
+ ))} +
+
+
+ +
+
+
+
{event.price === 0 ? 'Free' : `$${event.price}`}
+
per person
+
+
+
+ Availability + {event.capacity - event.registered_count} spots left +
+
+ +
+
+ {isRegistered ? ( +
+
+
✓ Registered
+
You're all set!
+
+ +
+ ) : ( + + )} +
Registration and details are managed on our dedicated events platform.
+
+
+
+
+
+
+
+ ); +}; + +export default EventDetailModal; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventList.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventList.jsx new file mode 100644 index 0000000..67aa811 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/EventList.jsx @@ -0,0 +1,120 @@ +import React, { useState } from 'react'; +import { AnimatePresence, motion } from 'framer-motion'; +import EventCard from '@/components/EventCard'; +import EventCardSkeleton from '@/components/EventCardSkeleton'; +import { Search, SlidersHorizontal } from 'lucide-react'; +import { useEvents } from '@/hooks/useEvents'; + +const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + }, + }, +}; + +const EventList = ({ loading, filteredEvents, onSelectEvent, getCategoryColor, getCategoryLabel, setSearchTerm, setSelectedCategory }) => { + const { categories } = useEvents(); + const [showFilters, setShowFilters] = useState(false); + + return ( + <> +
+

AeThex Events

+

+ Explore our upcoming conferences, workshops, and networking opportunities. +

+
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + + {showFilters && ( + + {categories.map(category => ( + + ))} + + )} + +
+
+ + {loading ? ( +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+ ) : ( + + + {filteredEvents.map((event) => ( + + ))} + + + )} + + {filteredEvents.length === 0 && !loading && ( + + + 🔍 + +

No events found

+

Try adjusting your search or filter criteria.

+
+ )} + + ); +}; + +export default EventList; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Footer.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Footer.jsx new file mode 100644 index 0000000..83e89ef --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Footer.jsx @@ -0,0 +1,160 @@ +import React, { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { Button } from '@/components/ui/button'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuGroup } from '@/components/ui/dropdown-menu'; +import { User, LogOut, Shield, Mail, Loader2 } from 'lucide-react'; +import AeThexLogo from './AeThexLogo'; +import { Input } from './ui/input'; +import { supabase } from '@/lib/customSupabaseClient'; +import { useToast } from './ui/use-toast'; + +const NewsletterForm = () => { + const [email, setEmail] = useState(''); + const [loading, setLoading] = useState(false); + const { toast } = useToast(); + + const handleSubmit = async (e) => { + e.preventDefault(); + setLoading(true); + const { error } = await supabase.from('newsletter_subscribers').insert({ email }); + if (error) { + toast({ + variant: 'destructive', + title: 'Subscription Failed', + description: error.code === '23505' ? 'This email is already subscribed.' : error.message, + }); + } else { + toast({ + title: 'Subscribed!', + description: 'Thank you for subscribing to the AeThex newsletter.', + }); + setEmail(''); + } + setLoading(false); + }; + + return ( +
+

Stay Updated

+

Join our newsletter for updates on our progress and new opportunities.

+
+ setEmail(e.target.value)} + required + disabled={loading} + className="bg-slate-800/50 border-slate-700" + /> + +
+
+ ); +}; + +const Footer = ({ onAuthClick }) => { + const { user, profile, signOut } = useAuth(); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id}`; + + const UserMenu = () => ( + + + + {profile?.username + + + + +
+

{profile?.full_name || profile?.username}

+

{profile?.email}

+
+
+ + + + + + My Profile + + + {isAdmin && ( + + + + Admin Panel + + + )} + + + + + Log out + +
+
+ ); + + return ( +
+
+
+
+ +

Engineering the foundational layers for the next digital epoch.

+
+
+

Company

+
    +
  • About Us
  • +
  • Get Involved
  • +
  • Our Team
  • +
  • News
  • +
+
+
+

Resources

+
    +
  • Technology
  • +
  • Contact
  • +
  • Privacy Policy
  • +
  • Terms & Conditions
  • +
+
+
+ +
+
+
+

© {new Date().getFullYear()} AeThex. All rights reserved.

+
+ {user ? ( + + ) : ( + + )} +
+
+
+
+ ); +}; + +export default Footer; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Header.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Header.jsx new file mode 100644 index 0000000..9de1596 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/Header.jsx @@ -0,0 +1,133 @@ +import React from 'react'; +import { Link, NavLink } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Button } from '@/components/ui/button'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import AeThexLogo from '@/components/AeThexLogo'; +import NotificationBell from '@/components/NotificationBell'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { LayoutDashboard, User, LogOut, Ticket, Bell } from 'lucide-react'; + +const navLinks = [ + { name: 'Home', path: '/' }, + { name: 'About', path: '/about' }, + { name: 'Get Involved', path: '/get-involved' }, + { name: 'Team', path: '/team' }, + { name: 'Technology', path: '/technology' }, + { name: 'News', path: '/news' }, + { name: 'Contact', path: '/contact' }, +]; + +const Header = () => { + const { user, profile, signOut, setShowAuthModal } = useAuth(); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id}`; + + return ( + +
+ + + + AeThex + + + +
+ {user ? ( + <> + + + + + + + +
+

{profile?.username}

+

+ {user.email} +

+
+
+ + {isAdmin && ( + + + + Admin Dashboard + + + )} + + + + My Profile + + + + + + Notifications + + + + + + My Tickets + + + + + + Log out + +
+
+ + ) : ( + + )} +
+
+
+ ); +}; + +export default Header; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/HeroImage.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/LoadingScreen.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..c7e894f --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/LoadingScreen.jsx @@ -0,0 +1,130 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; + +const BinaryDigit = () => { + const [position, setPosition] = useState({ + top: `${Math.random() * 100}%`, + left: `${Math.random() * 100}%`, + }); + const duration = Math.random() * 5 + 5; // 5 to 10 seconds + + return ( + + {Math.round(Math.random())} + + ); +}; + +const DataFallBar = ({ i }) => { + const height = Math.random() * 24 + 8; + const duration = Math.random() * 0.5 + 0.8; + + return ( + + ); +}; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [text, setText] = useState("Initializing AeThex OS..."); + + useEffect(() => { + let currentProgress = 0; + const interval = setInterval(() => { + currentProgress += 1; + + if (currentProgress > 98) { + currentProgress = 98; + } + setProgress(currentProgress); + + if (currentProgress > 60 && currentProgress < 80) { + setText("Calibrating systems..."); + } else if (currentProgress >= 80) { + setText("Booting interface..."); + } + + }, 40); + + return () => clearInterval(interval); + }, []); + + return ( +
+ + <> + {Array.from({ length: 30 }).map((_, i) => ( + + ))} + + + +
+
+ +
+
+ +
+
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ +
+
+ +
+

{progress}%

+
+ +
+

{text}

+

Please wait while we prepare your experience...

+
+
+ +
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/MaintenanceScreen.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/MaintenanceScreen.jsx new file mode 100644 index 0000000..ff1df21 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/MaintenanceScreen.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; +import { HardDrive } from 'lucide-react'; + +const MaintenanceScreen = ({ message }) => { + const defaultMessage = "We're currently performing scheduled maintenance. We'll be back online shortly. Thank you for your patience!"; + + return ( +
+ +
+
+
+ +
+
+ +

+ + Under Maintenance +

+

+ Our site is temporarily unavailable. +

+

+ {message || defaultMessage} +

+
+
+ ); +}; + +export default MaintenanceScreen; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/NotificationBell.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/NotificationBell.jsx new file mode 100644 index 0000000..040440c --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/NotificationBell.jsx @@ -0,0 +1,130 @@ +import React from 'react'; +import { Bell, MessageSquare, Briefcase, UserPlus } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuFooter +} from "@/components/ui/dropdown-menu"; +import { Button } from './ui/button'; +import { useNotifications } from '@/contexts/NotificationContext'; +import { timeAgo } from '@/lib/utils'; +import { Link, useNavigate } from 'react-router-dom'; + +const NotificationIcon = ({ type }) => { + switch (type) { + case 'new_message': + return ; + case 'new_job_application': + return ; + case 'user_joined': + return ; + default: + return ; + } +} + +const getNotificationDetails = (notification) => { + const { type, data } = notification; + switch(type) { + case 'new_message': + return { + text:

New message from {data.sender_username}: "{data.message_preview}..."

, + link: `/messages/${data.conversation_id}` + }; + case 'new_job_application': + return { + text:

New application for {data.job_title} from {data.applicant_username}.

, + link: `/admin/applications/${data.application_id}` + }; + case 'user_joined': + return { + text:

{data.username} just joined the platform!

, + link: `/profile/${data.user_id}` + }; + default: + return { + text:

{data.message || 'New notification'}

, + link: '#' + }; + } +}; + +const NotificationItem = ({ notification }) => { + const { markAsRead } = useNotifications(); + const navigate = useNavigate(); + const { text, link } = getNotificationDetails(notification); + + const handleClick = (e) => { + e.preventDefault(); + markAsRead(notification.id); + navigate(link); + } + + return ( + +
+ +
+
+
{text}
+

{timeAgo(notification.created_at)}

+
+
+ ) +} + +const NotificationBell = () => { + const { notifications, unreadCount, markAllAsRead } = useNotifications(); + + return ( + + + + + +
+ Notifications + {unreadCount > 0 && ( + + )} +
+ + +
+ {notifications.length > 0 ? ( + notifications.slice(0, 5).map(notification => ( + + )) + ) : ( +
+

No new notifications

+
+ )} +
+ + + + + + +
+
+ ); +}; + +export default NotificationBell; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PageLayout.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PageLayout.jsx new file mode 100644 index 0000000..cfe2e5f --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PageLayout.jsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Outlet, useLocation } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import Header from '@/components/Header'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; + +const PageLayout = () => { + const location = useLocation(); + const { setShowAuthModal } = useAuth(); + + const handleAuthClick = () => { + if (setShowAuthModal) { + setShowAuthModal(true); + } + }; + + return ( +
+
+
+ + + +
+
+ ); +}; + +export default PageLayout; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PassportModal.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PassportModal.jsx new file mode 100644 index 0000000..b84c577 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/PassportModal.jsx @@ -0,0 +1,144 @@ +import React, { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; +import { X, Copy, Check, Loader2 } from 'lucide-react'; +import { QRCode } from 'react-qrcode-logo'; +import AeThexLogo from './AeThexLogo'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { supabase } from '@/lib/customSupabaseClient'; +import toast from 'react-hot-toast'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const PassportModal = ({ onClose }) => { + const { user } = useAuth(); + const [profile, setProfile] = useState(null); + const [loading, setLoading] = useState(true); + const [copied, setCopied] = useState(false); + + useEffect(() => { + const fetchProfile = async () => { + if (user) { + setLoading(true); + const { data, error } = await supabase + .from('profiles') + .select('username, avatar_url, aethex_passport_id, created_at') + .eq('id', user.id) + .single(); + + if (error) { + console.error('Error fetching profile:', error); + toast.error("Failed to load Passport data."); + } else { + setProfile(data); + } + setLoading(false); + } + }; + fetchProfile(); + }, [user]); + + const handleCopy = () => { + if (profile?.aethex_passport_id) { + navigator.clipboard.writeText(profile.aethex_passport_id); + setCopied(true); + toast.success("Passport ID Copied!"); + setTimeout(() => setCopied(false), 2000); + } + }; + + return ( + + e.stopPropagation()} + > + + +
+
+
+ User Avatar +

{profile?.username || 'Loading...'}

+

{user?.email}

+
+
+ +
+ {loading ? ( +
+ +
+ ) : ( +
+
+ +
+
+

Passport ID

+
+

{profile?.aethex_passport_id}

+ +
+
+
+

Member Since

+

{profile ? new Date(profile.created_at).toLocaleDateString() : '...'}

+
+
+ )} +
+
+ +
+
+
+ ); +}; + +export default PassportModal; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ProtectedRoute.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ProtectedRoute.jsx new file mode 100644 index 0000000..44091db --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ProtectedRoute.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import LoadingScreen from '@/components/LoadingScreen'; + +const ProtectedRoute = ({ children, adminOnly = false }) => { + const { user, profile, loading } = useAuth(); + const location = useLocation(); + + if (loading) { + return ; + } + + if (!user) { + return ; + } + + if (adminOnly) { + if (!profile) { + return ; + } + if (!['admin', 'site_owner', 'oversee'].includes(profile?.role)) { + return ; + } + } + + + return children; +}; + +export default ProtectedRoute; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/WelcomeMessage.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/accordion.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/accordion.jsx new file mode 100644 index 0000000..aadc552 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/accordion.jsx @@ -0,0 +1,43 @@ +import React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + svg]:rotate-180 text-lg", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/badge.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/badge.jsx new file mode 100644 index 0000000..60948b4 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/badge.jsx @@ -0,0 +1,36 @@ +import React from "react" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + success: + "border-transparent bg-green-500 text-white hover:bg-green-500/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + ...props +}) { + return (
); +} + +export { Badge, badgeVariants } \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/button.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/button.jsx new file mode 100644 index 0000000..d09cecb --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/button.jsx @@ -0,0 +1,47 @@ +import { cn } from '@/lib/utils'; +import { Slot } from '@radix-ui/react-slot'; +import { cva } from 'class-variance-authority'; +import React from 'react'; + +const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden group', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow-lg shadow-primary/20 hover:bg-primary/90 hover:scale-105 transform', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90 hover:scale-105 transform', + outline: + 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8 text-base', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button'; + return ( + + ); +}); +Button.displayName = 'Button'; + +export { Button, buttonVariants }; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/card.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/card.jsx new file mode 100644 index 0000000..8118ef6 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/card.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { cn } from '@/lib/utils'; + +const Card = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +Card.displayName = 'Card'; + +const CardHeader = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = 'CardHeader'; + +const CardTitle = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardTitle.displayName = 'CardTitle'; + +const CardDescription = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = 'CardDescription'; + +const CardContent = React.forwardRef(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = 'CardContent'; + +const CardFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = 'CardFooter'; + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +}; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/checkbox.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/checkbox.jsx new file mode 100644 index 0000000..841dc32 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/checkbox.jsx @@ -0,0 +1,22 @@ +import React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dialog.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dialog.jsx new file mode 100644 index 0000000..640205c --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dialog.jsx @@ -0,0 +1,94 @@ +import React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dropdown-menu.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dropdown-menu.jsx new file mode 100644 index 0000000..9bb6dad --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/dropdown-menu.jsx @@ -0,0 +1,172 @@ +import React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}) => { + return ( + () + ); +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +const DropdownMenuFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+)); +DropdownMenuFooter.displayName = "DropdownMenuFooter"; + + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, + DropdownMenuFooter, +} \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/input.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/input.jsx new file mode 100644 index 0000000..7db2411 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/input.jsx @@ -0,0 +1,19 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + () + ); +}) +Input.displayName = "Input" + +export { Input } \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/label.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/label.jsx new file mode 100644 index 0000000..49d53b1 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/label.jsx @@ -0,0 +1,16 @@ +import React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-gray-300" +) + +const Label = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/select.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/select.jsx new file mode 100644 index 0000000..b0ec089 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/select.jsx @@ -0,0 +1,120 @@ +import React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/switch.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/switch.jsx new file mode 100644 index 0000000..d2eea14 --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/switch.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import * as SwitchPrimitives from "@radix-ui/react-switch"; +import { cn } from "@/lib/utils"; + +const Switch = React.forwardRef(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/table.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/table.jsx new file mode 100644 index 0000000..01b3f6e --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/table.jsx @@ -0,0 +1,83 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} \ No newline at end of file diff --git a/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/textarea.jsx b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/textarea.jsx new file mode 100644 index 0000000..6bf3ebc --- /dev/null +++ b/horizons-export-1edbdcc3-df77-45f9-bc30-9f11766aa973/src/components/ui/textarea.jsx @@ -0,0 +1,18 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Textarea = React.forwardRef(({ className, ...props }, ref) => { + return ( + ( +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-edit-mode.js b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-react-inline-editor.js b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + ))} + + + + +

> SYSTEM_HEALTH

+
+
+ API Status + OPERATIONAL +
+
+ Database + CONNECTED +
+
+ Cloud Storage + SYNCED +
+
+ Build Queue + 3 PENDING +
+
+ + + + setManageUsersModalOpen(false)} + users={users || []} + onAddUser={handleAddUser} + onEditUser={handleEditUser} + onDeleteUser={handleDeleteUser} + /> + setSystemLogsModalOpen(false)} /> + setBroadcastMessageModalOpen(false)} /> + setManagePermissionsModalOpen(false)} users={users || []} /> + setMaintenanceManagerOpen(false)} /> + setInviteDeveloperModalOpen(false)} /> + + ); +}; + +export default AdminPanel; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/AssetManager.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/AssetManager.jsx new file mode 100644 index 0000000..57932c6 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/AssetManager.jsx @@ -0,0 +1,235 @@ +import React, { useState, useEffect, useCallback } from 'react'; +import { motion } from 'framer-motion'; +import { Upload, Search, Filter, Grid, List, Loader2, Archive } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import { supabase } from '@/lib/customSupabaseClient'; +import AssetCard from '@/components/assets/AssetCard'; +import AssetRow from '@/components/assets/AssetRow'; +import { formatBytes } from '@/components/assets/assetUtils'; +import useDataFetching from '@/hooks/useDataFetching'; + +const fetchAssetsFunction = async (user) => { + const { data: projectIdsData, error: projectIdsError } = await supabase + .from('project_team_members') + .select('project_id') + .eq('user_id', user.id); + + if (projectIdsError) { + console.error("Error fetching project IDs for assets:", projectIdsError); + throw projectIdsError; + } + + const projectIds = projectIdsData.map(p => p.project_id); + + if(projectIds.length === 0) { + return []; + } + + const { data, error } = await supabase + .from('assets') + .select(` + *, + projects (title) + `) + .in('project_id', projectIds); + + if (error) { + console.error("Error fetching assets:", error); + throw error; + } + + return data.map(asset => ({ + ...asset, + project_title: asset.projects?.title + })); +}; + +const AssetManager = ({ onOpenUploadAssets }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { data: assets, loading } = useDataFetching(fetchAssetsFunction); + + const [stats, setStats] = useState({ totalAssets: 0, storageUsed: 0 }); + const [searchTerm, setSearchTerm] = useState(''); + const [filterType, setFilterType] = useState('all'); + const [viewMode, setViewMode] = useState('grid'); + + useEffect(() => { + if (assets) { + const totalAssets = assets.length; + const storageUsed = assets.reduce((acc, asset) => acc + (asset.size || 0), 0); + setStats({ totalAssets, storageUsed }); + } + }, [assets]); + + const handleAction = (action, assetName = '') => { + addActivity({ type: 'asset', message: `${action}: ${assetName}` }); + toast({ + title: `> ASSET ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + }); + }; + + const filteredAssets = (assets || []).filter(asset => { + const matchesSearch = asset.name.toLowerCase().includes(searchTerm.toLowerCase()) || + (asset.tags && asset.tags.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase()))); + const matchesFilter = filterType === 'all' || (asset.file_type && asset.file_type.startsWith(filterType)); + return matchesSearch && matchesFilter; + }); + + return ( +
+ +
+

+ > ASSET_MANAGER +

+

+ Secure cloud storage for game assets with version control and backup +

+
+ +
+ + +
+
+ + setSearchTerm(e.target.value)} + className="w-full bg-black/50 cyber-border rounded px-10 py-2 text-green-400 font-mono placeholder-green-400/50 focus:outline-none focus:ring-2 focus:ring-green-400/50" + /> +
+
+ + + +
+
+
+ + + {[ + { label: 'Total Assets', value: stats.totalAssets, color: 'text-green-400' }, + { label: 'Storage Used', value: formatBytes(stats.storageUsed), color: 'text-cyan-400' }, + { label: 'Active Backups', value: '3', color: 'text-purple-400' }, + { label: 'Version History', value: '247', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + {loading ? ( +
+ +
+ ) : viewMode === 'grid' ? ( +
+ {filteredAssets.map((asset, index) => ( + + ))} +
+ ) : ( + +
+
+ Name + Type + Size + Project + Modified + Actions +
+
+
+ {filteredAssets.map((asset, index) => ( + + ))} +
+
+ )} + + {!loading && filteredAssets.length === 0 && ( + + +

+ NO_ASSETS_FOUND +

+

+ There are no assets in the projects you are a part of. +

+ +
+ )} +
+ ); +}; + +export default AssetManager; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/CallToAction.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Dashboard.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Dashboard.jsx new file mode 100644 index 0000000..aa65b36 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Dashboard.jsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Loader2, FileText, Users, Database, GitBranch, ArrowRight, Upload, UserPlus, FolderPlus } from 'lucide-react'; +import { useAuth } from '@/context/AuthContext'; +import { Button } from '@/components/ui/button'; +import useDataFetching from '@/hooks/useDataFetching.js'; +import { supabase } from '@/lib/customSupabaseClient'; + +const fetchDashboardData = async (user) => { + if (!user) return null; + + const { data: projectIdsData, error: projectIdsError } = await supabase + .from('project_team_members') + .select('project_id') + .eq('user_id', user.id); + + if (projectIdsError) { + console.error('Error fetching project IDs:', projectIdsError); + throw projectIdsError; + } + + const projectIds = projectIdsData.map(p => p.project_id); + + let projectsCount = 0; + let teamMembersCount = 0; + let assetsCount = 0; + + if (projectIds.length > 0) { + const { count: pc, error: projectsError } = await supabase + .from('projects') + .select('id', { count: 'exact', head: true }) + .in('id', projectIds); + if (projectsError) console.error('Error fetching projects count:', projectsError); + projectsCount = pc || 0; + + const { data: teamData, error: teamMembersError } = await supabase + .from('project_team_members') + .select('user_id', { count: 'exact' }) + .in('project_id', projectIds); + if (teamMembersError) console.error('Error fetching team members count:', teamMembersError); + teamMembersCount = teamData?.length || 0; + + const { count: ac, error: assetsError } = await supabase + .from('assets') + .select('id', { count: 'exact', head: true }) + .in('project_id', projectIds); + if (assetsError) console.error('Error fetching assets count:', assetsError); + assetsCount = ac || 0; + } + + return { + projectsCount, + teamMembersCount, + assetsCount, + }; +}; + +const StatCard = ({ icon, label, value, color }) => ( + +
+ {icon} +
+
+

{label}

+

{value}

+
+
+); + +const ActionButton = ({ icon, label, onClick }) => ( + +); + +const Dashboard = ({ onOpenCreateProject, onOpenUploadAssets, onOpenInviteTeam }) => { + const { profile } = useAuth(); + const { data, loading, error } = useDataFetching(fetchDashboardData, false, []); + + if (loading) { + return ( +
+ +
+ ); + } + + if (error) { + return ( +
+ Error loading dashboard data. Please try again later. +
+ ); + } + + const quickActions = [ + { icon: , label: "Create New Project", onClick: onOpenCreateProject }, + { icon: , label: "Upload Assets", onClick: onOpenUploadAssets }, + { icon: , label: "Invite Team Member", onClick: onOpenInviteTeam }, + ]; + + return ( +
+ +

Welcome back, {profile?.username}.

+

System status: All modules operational. Ready for deployment.

+
+ +
+ } label="Projects" value={data?.projectsCount || 0} color="#00ffff" /> + } label="Team Members" value={data?.teamMembersCount || 0} color="#ff00ff" /> + } label="Total Assets" value={data?.assetsCount || 0} color="#ffff00" /> + } label="Active Branches" value="0" color="#ff4500" /> +
+ +
+ +

Recent Activity

+ {/* Placeholder for recent activity feed */} +
+

//TODO: Activity Feed Implementation

+

Awaiting data stream from neural link...

+
+
+ + +

Quick Actions

+
+ {quickActions.map(action => )} +
+
+
+
+ ); +}; + +export default Dashboard; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesListPage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesListPage.jsx new file mode 100644 index 0000000..89b7b10 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesListPage.jsx @@ -0,0 +1,116 @@ +import React, { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Helmet } from 'react-helmet'; +import { supabase } from '@/lib/customSupabaseClient'; +import LoadingScreen from '@/components/LoadingScreen'; +import { useToast } from '@/components/ui/use-toast'; +import { Users, ThumbsUp, Gamepad2 } from 'lucide-react'; + +const GameCard = ({ game }) => { + const ratingPercentage = (game.likes + game.dislikes > 0) ? Math.round((game.likes / (game.likes + game.dislikes)) * 100) : 0; + + return ( + + +
+ {`${game.title} +
+ {game.status} +
+
+

{game.title}

+

{game.genre}

+

{game.description}

+
+
+ + {game.active_users.toLocaleString()} +
+
+ + {ratingPercentage}% +
+
+
+
+ + ); +}; + +const GamesListPage = () => { + const { toast } = useToast(); + const [games, setGames] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchGames = async () => { + setLoading(true); + const { data, error } = await supabase + .from('games') + .select('*') + .order('active_users', { ascending: false }); + + if (error) { + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch games list.' }); + console.error(error); + } else { + setGames(data); + } + setLoading(false); + }; + fetchGames(); + }, [toast]); + + if (loading) return ; + + return ( +
+ + Explore Games - GameForge + + + + +
+ +
+

Explore Experiences

+

Discover games and worlds created by the community.

+
+
+ + {games.length > 0 ? ( +
+ {games.map((game, index) => ( + + + + ))} +
+ ) : ( +
+

No Games Found

+

The universe is quiet... for now. Check back soon for new experiences!

+
+ )} +
+
+ ); +}; + +export default GamesListPage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesPage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesPage.jsx new file mode 100644 index 0000000..c983808 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/GamesPage.jsx @@ -0,0 +1,192 @@ +import React, { useState, useEffect } from 'react'; +import { useParams, Link } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { Helmet } from 'react-helmet'; +import { supabase } from '@/lib/customSupabaseClient'; +import LoadingScreen from '@/components/LoadingScreen'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { + Users, Play, Info, Book, ThumbsUp, ThumbsDown, Share2, Bookmark, Bell, Flag, + ShoppingBag, Award, Music, Server, Calendar, Mic, Camera, Link as LinkIcon, Save, Tag, Activity, + Laptop, Apple, Tablet, Smartphone, Box, Wifi, HardDrive +} from 'lucide-react'; + +const StatCard = ({ icon, label, value }) => ( +
+ {icon} + {value} + {label} +
+); + +const InfoPill = ({ icon, label, value }) => ( +
+ {icon} + {label}: + {value} +
+); + +const PlatformIcon = ({ platform }) => { + switch (platform.toLowerCase()) { + case 'pc/windows': return ; + case 'mac': return ; + case 'ios/ipados': return ; + case 'android': return ; + case 'vr': return ; + default: return null; + } +}; + +const GamesPage = () => { + const { gameId } = useParams(); + const { toast } = useToast(); + const [game, setGame] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchGame = async () => { + if (!gameId) { + setLoading(false); + return; + } + setLoading(true); + const { data, error } = await supabase + .from('games') + .select('*') + .eq('id', gameId) + .single(); + + if (error) { + if (error.code !== 'PGRST116') { // Ignore "no rows found" error for the toast + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch game data.' }); + } + console.error(error); + } else { + setGame(data); + } + setLoading(false); + }; + fetchGame(); + }, [gameId, toast]); + + const handleNotImplemented = (feature) => { + toast({ + title: `> ${feature.toUpperCase()}`, + description: "🚧 This feature isn't implemented yet—but don't worry! You can request it in your next prompt! 🚀", + }); + }; + + const ratingPercentage = game && (game.likes + game.dislikes > 0) ? Math.round((game.likes / (game.likes + game.dislikes)) * 100) : 0; + + if (loading) return ; + if (!game) return
Game not found.
; + + return ( +
+ + {game.title} - GameForge + + + + < Back to Dashboard + + +
+ {`${game.title} +
+
+ {`${game.title} +
+ {game.status} +

{game.title}

+

by AeThex Studios

+
+
+
+ +
+ } label="Active" value={game.active_users.toLocaleString()} /> + } label="Visits" value={game.total_visits.toLocaleString()} /> + } label="Rating" value={`${ratingPercentage}%`} /> + } label="Servers" value="15" /> +
+ +
+ + +
+ + +
+
+
+ + + + +
+
+ +
+
+
+

> About

+

{game.long_description}

+
+ {game.hashtags?.map(tag => {tag})} +
+
+ + {/* Tabs for more details */} +
+

> Shop

+

Shop implementation coming soon.

+
+
+

> Servers

+

Server browser coming soon.

+
+
+

> Recommended

+

Recommendations coming soon.

+
+ +
+
+
+

> Game Info

+
+ } label="Genre" value={`${game.genre} / ${game.subgenre}`} /> + } label="Created" value={new Date(game.created_at).toLocaleDateString()} /> + } label="Updated" value={new Date(game.updated_at).toLocaleDateString()} /> + } label="Max Players" value={game.server_size} /> + } label="Voice Chat" value={game.voice_chat_enabled ? 'Enabled' : 'Disabled'} /> + } label="Camera" value={game.camera_enabled ? 'Enabled' : 'Disabled'} /> + } label="Memory" value={game.memory_requirements} /> +
+ {game.platforms?.map(p => )} +
+
+
+
+

> Badges

+

Badges list coming soon.

+
+
+

> Social Links

+
+ + +
+
+
+
+ +
+
+ ); +}; + +export default GamesPage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HeroImage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HomePage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HomePage.jsx new file mode 100644 index 0000000..be79b1f --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/HomePage.jsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Code, LogIn, UserPlus, AlertTriangle } from 'lucide-react'; +import Login from '@/components/auth/Login'; +import Signup from '@/components/auth/Signup'; +import { Button } from '@/components/ui/button'; + +const HomePage = ({ maintenanceMode = false }) => { + const [activeView, setActiveView] = useState(maintenanceMode ? 'login' : 'intro'); // intro, login, signup + const [matrixChars, setMatrixChars] = useState([]); + + React.useEffect(() => { + const chars = Array.from({ length: 100 }, (_, i) => ({ + id: i, + char: String.fromCharCode(0x30A0 + Math.random() * 96), + x: Math.random() * 100, + y: Math.random() * -100, + delay: Math.random() * 10 + })); + setMatrixChars(chars); + }, []); + + const IntroView = () => ( + + + + +

GAMEFORGE

+

+ Powered by AeThex OS +

+
+ + +
+
+ ); + + return ( +
+
+ {matrixChars.map((char) => ( +
+ {char.char} +
+ ))} +
+
+
+ +
+ {maintenanceMode && activeView !== 'intro' && ( + + + System is in maintenance mode. Only administrators can log in. + + )} + + {activeView === 'intro' && } + {activeView === 'login' && setActiveView('signup')} onSwitchToIntro={() => setActiveView('intro')} maintenanceMode={maintenanceMode} />} + {activeView === 'signup' && setActiveView('login')} onSwitchToIntro={() => setActiveView('intro')} maintenanceMode={maintenanceMode}/>} + +
+ + +
+ © {new Date().getFullYear()} GameForge by + AETHEX.BIZ +
+
+
+ ); +}; + +export default HomePage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/LoadingScreen.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..2ba8331 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/LoadingScreen.jsx @@ -0,0 +1,102 @@ +import React, { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { Code } from 'lucide-react'; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [loadingText, setLoadingText] = useState('Initializing kernel...'); + + const loadingSteps = [ + 'Initializing kernel...', + 'Loading neural modules...', + 'Syncing with data stream...', + 'Establishing secure connection...', + 'Booting GameForge OS...', + 'Finalizing...' + ]; + + useEffect(() => { + const interval = setInterval(() => { + setProgress(prev => { + const newProgress = prev + 1; + if (newProgress >= 100) { + clearInterval(interval); + setLoadingText('System ready.'); + return 100; + } + + const stepIndex = Math.floor((newProgress / 100) * (loadingSteps.length -1)); + setLoadingText(loadingSteps[stepIndex]); + + return newProgress; + }); + }, 40); + + return () => clearInterval(interval); + }, []); + + return ( + +
+ + + + +
+
+ +
+ + {loadingText} + +
+ + +

+ Powered by AeThex OS +

+

+ © {new Date().getFullYear()} AETHEX.BIZ +

+
+
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MainApp.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MainApp.jsx new file mode 100644 index 0000000..fcf4ecf --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MainApp.jsx @@ -0,0 +1,350 @@ +import React, { useState, useEffect, useCallback, useContext } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { + Monitor, + GitBranch, + Users, + Settings as SettingsIcon, + Activity, + Database, + Code, + FileText, + User, + LogOut, + LayoutDashboard, + ShieldCheck, + Menu, + Trophy, + Coffee, + Circle, + Moon, + Loader2, + Gamepad2 +} from 'lucide-react'; +import { useToast } from '@/components/ui/use-toast'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, +} from "@/components/ui/dropdown-menu"; +import Dashboard from '@/components/Dashboard'; +import ProjectManager from '@/components/ProjectManager'; +import AssetManager from '@/components/AssetManager'; +import UsersManager from '@/components/UsersManager'; +import VersionControl from '@/components/VersionControl'; +import SettingsPage from '@/components/Settings'; +import ProfilePage from '@/components/ProfilePage'; +import AdminPanel from '@/components/AdminPanel'; +import PageTransitionWrapper from '@/components/PageTransitionWrapper'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import UploadAssetsModal from '@/components/modals/UploadAssetsModal'; +import CreateProjectModal from '@/components/modals/CreateProjectModal'; +import { AppearanceContext } from '@/context/AppearanceContext'; +import { useAuth } from '@/context/AuthContext'; +import { AchievementsContext } from '@/context/AchievementsContext'; +import { usePresence } from '@/context/PresenceContext'; +import LoadingScreen from '@/components/LoadingScreen'; +import { Link, useNavigate } from 'react-router-dom'; + +const MainApp = () => { + const [activeTab, setActiveTab] = useState('dashboard'); + const [viewedProfileId, setViewedProfileId] = useState(null); + const [isPageLoading, setIsPageLoading] = useState(true); + const [currentTime, setCurrentTime] = useState(new Date()); + const [matrixChars, setMatrixChars] = useState([]); + const { addActivity } = useActivity(); + const { toast } = useToast(); + const navigate = useNavigate(); + + const { appearance } = useContext(AppearanceContext); + const { profile, logout, loading: authLoading, isOwnerOrAdmin } = useAuth(); + const { unlockAchievement } = useContext(AchievementsContext); + const { onlineCount, userStatus, setUserStatus, isSubscribed } = usePresence(); + + const [isUploadAssetsModalOpen, setUploadAssetsModalOpen] = useState(false); + const [isCreateProjectModalOpen, setCreateProjectModalOpen] = useState(false); + + useEffect(() => { + const timer = setInterval(() => setCurrentTime(new Date()), 1000); + return () => clearInterval(timer); + }, []); + + useEffect(() => { + const chars = Array.from({ length: 50 }, (_, i) => ({ + id: i, + char: String.fromCharCode(0x30A0 + Math.random() * 96), + x: Math.random() * 100, + delay: Math.random() * 10 + })); + setMatrixChars(chars); + }, []); + + useEffect(() => { + const currentHour = new Date().getHours(); + if (currentHour >= 2 && currentHour < 5) { + unlockAchievement('night_owl'); + } + }, [unlockAchievement]); + + const formatTime = (date) => date.toLocaleTimeString('en-US', { hour12: false, timeZone: 'UTC' }); + + const handleTabChange = useCallback((tab, profileId = null) => { + if (tab === 'games') { + navigate('/games'); + return; + } + + if (tab !== activeTab || profileId !== viewedProfileId) { + setActiveTab(tab); + setViewedProfileId(profileId); + addActivity({ type: 'navigation', message: `Navigated to ${tab} module` }); + if (tab === 'admin' && isOwnerOrAdmin) { + unlockAchievement('admin_power'); + } + } + }, [activeTab, viewedProfileId, addActivity, unlockAchievement, isOwnerOrAdmin, navigate]); + + const handleLogoutClick = () => { + addActivity({ type: 'auth', message: 'User logged out' }); + logout(); + }; + + const handleProjectCreated = () => { + unlockAchievement('first_project'); + setCreateProjectModalOpen(false); + }; + + const handleAssetsUploaded = () => { + unlockAchievement('first_asset'); + setUploadAssetsModalOpen(false); + } + + const renderActiveComponent = () => { + const props = { + onOpenCreateProject: () => setCreateProjectModalOpen(true), + onOpenUploadAssets: () => setUploadAssetsModalOpen(true), + setIsLoading: setIsPageLoading, + onViewProfile: (profileId) => handleTabChange('profile', profileId), + }; + switch (activeTab) { + case 'dashboard': return ; + case 'projects': return ; + case 'assets': return ; + case 'users': return ; + case 'version': return ; + case 'settings': return ; + case 'profile': return ; + case 'admin': return isOwnerOrAdmin ? : ; + default: return ; + } + }; + + const mainAppClasses = ` + min-h-screen bg-black text-green-400 relative overflow-hidden font-mono flex flex-col + theme-${appearance.theme} + font-size-${appearance.fontSize} + `; + + const navItems = [ + { id: 'dashboard', label: 'Dashboard', icon: Monitor }, + { id: 'projects', label: 'Projects', icon: FileText }, + { id: 'assets', label: 'Assets', icon: Database }, + { id: 'users', label: 'Users', icon: Users }, + { id: 'version', label: 'Version', icon: GitBranch }, + { id: 'games', label: 'Games', icon: Gamepad2 }, + ]; + + const statusOptions = { + online: { icon: Circle, color: 'text-green-400', label: 'Online' }, + away: { icon: Coffee, color: 'text-yellow-400', label: 'Away' }, + busy: { icon: Moon, color: 'text-red-400', label: 'Busy' }, + offline: { icon: Circle, color: 'text-gray-400', label: 'Offline' }, + }; + + const CurrentStatusIcon = statusOptions[userStatus]?.icon || Circle; + const currentStatusColor = statusOptions[userStatus]?.color || 'text-gray-400'; + + if (authLoading || !profile) { + return ; + } + + return ( +
+
+ {matrixChars.map((char) => ( +
+ {char.char} +
+ ))} +
+
+
+ + +
+ + +
+ +
+
+

GAMEFORGE

+

Neural Dev Toolkit

+
+ +
+ + + +
+
+
UTC: {formatTime(currentTime)}
+
NEURAL_LINK: ACTIVE
+
+ + + + {!isSubscribed ? : } + {profile?.username || 'USER'} + + + + My Account + + + handleTabChange('dashboard')}> + + Dashboard + + handleTabChange('profile')}> + + Profile + + handleTabChange('settings')}> + + Settings + + + + Set Status + + {Object.entries(statusOptions).filter(([key]) => key !== 'offline').map(([key, { icon: Icon, color, label }]) => ( + + + {label} + + ))} + + {isOwnerOrAdmin && ( + <> + + + handleTabChange('admin')}> + + Admin Panel + + + + )} + + + + Log out + + + +
+ + + + + + + + Navigation + + {navItems.map((item) => { + const Icon = item.icon; + return ( + handleTabChange(item.id)}> + + {item.label} + + ); + })} + + +
+
+
+
+ +
+ + + {renderActiveComponent()} + + +
+ + +
+
+
+ + SYSTEM_STATUS: ONLINE +
+
+
+ {onlineCount} ONLINE +
+
+
+ © {new Date().getFullYear()} GameForge by + AETHEX.BIZ +
+
+
+ setCreateProjectModalOpen(false)} onSave={handleProjectCreated} /> + setUploadAssetsModalOpen(false)} onAssetsUploaded={handleAssetsUploaded}/> +
+ ); +}; +export default MainApp; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MaintenancePage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MaintenancePage.jsx new file mode 100644 index 0000000..51d1518 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/MaintenancePage.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Wrench, Code } from 'lucide-react'; + +const MaintenancePage = ({ message }) => { + return ( +
+
+
+ + +
+ +
+ +

+ > SYSTEM_MAINTENANCE +

+ +

+ {message || "Our systems are currently undergoing scheduled maintenance to improve performance and security. We'll be back online shortly."} +

+ +
+
+ +
+
+

GAMEFORGE

+

Neural Dev Toolkit

+
+
+ +

+ © {new Date().getFullYear()} GameForge by AETHEX.BIZ +

+
+
+ ); +}; + +export default MaintenancePage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/PageTransitionWrapper.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/PageTransitionWrapper.jsx new file mode 100644 index 0000000..29dea8a --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/PageTransitionWrapper.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const pageVariants = { + initial: { + opacity: 0, + y: 20, + scale: 0.98, + }, + in: { + opacity: 1, + y: 0, + scale: 1, + }, + out: { + opacity: 0, + y: -20, + scale: 1.02, + }, +}; + +const pageTransition = { + type: 'tween', + ease: 'anticipate', + duration: 0.5, +}; + +const PageTransitionWrapper = ({ children }) => { + + return ( + + {children} + + ); +}; + +export default PageTransitionWrapper; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProfilePage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProfilePage.jsx new file mode 100644 index 0000000..6e9963f --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProfilePage.jsx @@ -0,0 +1,273 @@ +import React, { useContext, useState, useMemo, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { User, Mail, Shield, Code, Gamepad2, Calendar, Award, Clock, Copy, Check, Fingerprint, Trophy, Zap, Star, Loader2 } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useAuth } from '@/context/AuthContext'; +import { useToast } from '@/components/ui/use-toast'; +import { AchievementsContext } from '@/context/AchievementsContext'; +import { supabase } from '@/lib/customSupabaseClient'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +const AeThexPassport = ({ user, isCopied, handleCopy }) => ( + +
+
+
+

> AETHEX PASSPORT

+ +
+
+
+ {user.avatar} +
+
+

{user.displayName}

+
+

{user.passportId}

+ +
+
+
+
+
+); + +const AchievementsDisplay = ({ achievements, unlockedAchievements }) => { + const getRarityColor = (rarity) => { + switch (rarity) { + case 'Common': return 'border-gray-500 text-gray-400'; + case 'Rare': return 'border-blue-500 text-blue-400'; + case 'Epic': return 'border-purple-500 text-purple-400'; + case 'Legendary': return 'border-yellow-500 text-yellow-400'; + default: return 'border-gray-600'; + } + }; + + const getIcon = (iconName) => { + switch(iconName) { + case 'Trophy': return ; + case 'Zap': return ; + case 'Star': return ; + case 'Shield': return ; + default: return ; + } + }; + + return ( +
+

> ACHIEVEMENTS

+
+ + {achievements.map((ach) => { + const isUnlocked = unlockedAchievements.has(ach.id); + return ( + + + +
+ {getIcon(ach.icon)} +
+

{ach.name}

+
+
+ +

{ach.name} ({ach.rarity})

+

{ach.description}

+ {!isUnlocked &&

LOCKED

} +
+
+ ); + })} +
+
+
+ ); +}; + + +const ProfilePage = ({ setIsLoading, profileId }) => { + const { profile: ownProfile } = useAuth(); + const { toast } = useToast(); + const { achievements, unlockedAchievements } = useContext(AchievementsContext); + const [isCopied, setIsCopied] = useState(false); + const [viewedProfile, setViewedProfile] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchProfile = async () => { + setLoading(true); + let profileData = null; + if (profileId) { + const { data, error } = await supabase + .from('profiles') + .select('*') + .eq('id', profileId) + .single(); + if (error) { + toast({ variant: 'destructive', title: 'Error', description: 'Could not fetch profile.' }); + } else { + profileData = data; + } + } else { + profileData = ownProfile; + } + setViewedProfile(profileData); + setLoading(false); + if (setIsLoading) setIsLoading(false); + }; + + fetchProfile(); + }, [profileId, ownProfile, toast, setIsLoading]); + + const user = useMemo(() => { + if (!viewedProfile) return null; + const joinDate = viewedProfile?.created_at ? new Date(viewedProfile.created_at).toISOString().split('T')[0] : '2023-01-15'; + + return { + id: viewedProfile.id, + name: viewedProfile.username || 'AGENT', + displayName: viewedProfile.username || 'Agent', + email: viewedProfile?.email || 'agent@aethex.biz', + passportId: viewedProfile.aethex_passport_id || 'N/A', + role: viewedProfile.role || 'Member', + avatar: viewedProfile.username?.substring(0, 2).toUpperCase() || 'AG', + joinDate, + lastActive: 'Now', + bio: viewedProfile.bio || 'A mysterious agent of GameForge, operating in the shadows of cyberspace.', + skills: viewedProfile.skills || ['Stealth', 'Hacking', 'Data Analysis'], + projects: ['Project Chimera', 'Operation Ghost', 'Neural Grid'], + }; + }, [viewedProfile]); + + const handleCopy = () => { + if (user?.passportId) { + navigator.clipboard.writeText(user.passportId); + setIsCopied(true); + toast({ + title: '> PASSPORT ID COPIED', + description: 'Your AeThex Passport ID is now in your clipboard.', + }); + setTimeout(() => setIsCopied(false), 2000); + } + }; + + if (loading) { + return
; + } + + if (!user) { + return
Error loading profile.
; + } + + const isOwnProfile = user.id === ownProfile.id; + + return ( +
+ +
+

+ > USER_PROFILE +

+

+ Viewing personal information and activity for {user.name} +

+
+ {isOwnProfile && } +
+ +
+ +
+
+
+ {user.avatar} +
+
+ +
+
+

{user.displayName}

+

@{user.name}

+

{user.role}

+
+ + + +
+

> CONTACT_INFO

+
+
{user.email}
+
Joined: {user.joinDate}
+
Last Active: {user.lastActive}
+
+
+
+ + +
+

> BIO

+

{user.bio}

+
+ +
+

> SKILLS

+
+ {user.skills.map((skill, index) => ( + + + {skill} + + ))} +
+
+ + + +
+

> ACTIVE_PROJECTS

+
+ {user.projects.map((project, index) => ( + + + {project} + + ))} +
+
+
+
+
+ ); +}; + +export default ProfilePage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProjectManager.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProjectManager.jsx new file mode 100644 index 0000000..853e6f5 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/ProjectManager.jsx @@ -0,0 +1,255 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { motion } from 'framer-motion'; +import { Plus, Loader2, Folder } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import ConfirmationModal from '@/components/modals/ConfirmationModal'; +import CreateProjectModal from '@/components/modals/CreateProjectModal'; +import ProjectDetailModal from '@/components/modals/ProjectDetailModal'; +import ProjectTeamModal from '@/components/modals/ProjectTeamModal'; +import { supabase } from '@/lib/customSupabaseClient'; +import useDataFetching from '@/hooks/useDataFetching'; +import { useAuth } from '@/context/AuthContext'; +import ProjectHeader from '@/components/projects/ProjectHeader'; +import ProjectFilters from '@/components/projects/ProjectFilters'; +import ProjectCard from '@/components/projects/ProjectCard'; + +const fetchProjectsFunction = async (user) => { + const { data, error } = await supabase + .from('projects') + .select(` + *, + project_team_members!inner(user_id) + `) + .eq('project_team_members.user_id', user.id); + + if (error) throw error; + + const projectsWithCounts = await Promise.all(data.map(async (project) => { + const { count, error: countError } = await supabase + .from('project_team_members') + .select('user_id', { count: 'exact', head: true }) + .eq('project_id', project.id); + + if (countError) { + console.error('Error fetching team count for project', project.id, countError); + return { ...project, team: 1, lastUpdate: new Date(project.updated_at).toLocaleString() }; + } + + return { ...project, team: count || 1, lastUpdate: new Date(project.updated_at).toLocaleString() }; + })); + + return projectsWithCounts; +}; + +const ProjectManager = () => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { user } = useAuth(); + const { data: projects, loading, refetch } = useDataFetching( + fetchProjectsFunction, + false, + [] + ); + + const [searchTerm, setSearchTerm] = useState(''); + const [filterStatus, setFilterStatus] = useState('all'); + + const [isCreateModalOpen, setCreateModalOpen] = useState(false); + const [isConfirmModalOpen, setConfirmModalOpen] = useState(false); + const [editingProject, setEditingProject] = useState(null); + const [deletingProjectId, setDeletingProjectId] = useState(null); + + const [selectedProject, setSelectedProject] = useState(null); + const [isDetailModalOpen, setDetailModalOpen] = useState(false); + const [isTeamModalOpen, setTeamModalOpen] = useState(false); + + useEffect(() => { + const channel = supabase.channel('public:projects') + .on('postgres_changes', { event: '*', schema: 'public', table: 'projects' }, () => refetch()) + .subscribe(); + + const teamChannel = supabase.channel('public:project_team_members') + .on('postgres_changes', { event: '*', schema: 'public', table: 'project_team_members' }, () => refetch()) + .subscribe(); + + return () => { + supabase.removeChannel(channel); + supabase.removeChannel(teamChannel); + }; + }, [refetch]); + + const handleCreateOrUpdateProject = async (projectData) => { + if (!user) { + toast({ variant: 'destructive', title: 'Authentication Error', description: 'User not found.' }); + return; + } + try { + if (editingProject) { + const { data, error } = await supabase + .from('projects') + .update({ ...projectData, updated_at: new Date() }) + .eq('id', editingProject.id) + .select() + .single(); + if (error) throw error; + addActivity({ type: 'project', message: `Updated project: ${data.title}` }); + toast({ title: '> PROJECT UPDATED', description: `Project ${data.title} details have been saved.` }); + } else { + const { data, error } = await supabase + .from('projects') + .insert({ ...projectData, owner_id: user.id, user_id: user.id }) + .select() + .single(); + if (error) throw error; + + await supabase.from('project_team_members').insert({ project_id: data.id, user_id: user.id, role: 'owner' }); + + addActivity({ type: 'project', message: `Created new project: ${data.title}` }); + toast({ title: '> PROJECT CREATED', description: `New project ${data.title} has been initialized.` }); + } + refetch(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error saving project', description: error.message }); + } + setEditingProject(null); + setCreateModalOpen(false); + }; + + const handleEdit = (project) => { + setEditingProject(project); + setCreateModalOpen(true); + }; + + const openDeleteConfirm = (projectId) => { + setDeletingProjectId(projectId); + setConfirmModalOpen(true); + }; + + const confirmDelete = async () => { + const projectToDelete = projects.find(p => p.id === deletingProjectId); + try { + await supabase.from('project_team_members').delete().eq('project_id', deletingProjectId); + const { error } = await supabase.from('projects').delete().eq('id', deletingProjectId); + if (error) throw error; + addActivity({ type: 'project', message: `Deleted project: ${projectToDelete.title}` }); + toast({ title: '> PROJECT DELETED', description: `Project ${projectToDelete.title} has been deleted.`, variant: 'destructive' }); + refetch(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error deleting project', description: error.message }); + } + setConfirmModalOpen(false); + setDeletingProjectId(null); + }; + + const handleViewProject = (project) => { + setSelectedProject(project); + setDetailModalOpen(true); + addActivity({ type: 'project', message: `Viewed project details: ${project.title}` }); + }; + + const handleViewRepo = (project) => { + addActivity({ type: 'project', message: `Viewed repository for: ${project.title}` }); + if (project.github_url) { + window.open(project.github_url, '_blank', 'noopener,noreferrer'); + } else { + toast({ + variant: 'destructive', + title: 'Repository Not Found', + description: 'No GitHub repository URL is linked to this project.', + }); + } + }; + + const handleViewTeam = (project) => { + setSelectedProject(project); + setTeamModalOpen(true); + addActivity({ type: 'project', message: `Viewed team for: ${project.title}` }); + }; + + const filteredProjects = useMemo(() => (projects || []).filter(project => { + const matchesSearch = project.title.toLowerCase().includes(searchTerm.toLowerCase()) || + (project.description && project.description.toLowerCase().includes(searchTerm.toLowerCase())); + const matchesFilter = filterStatus === 'all' || project.status === filterStatus; + return matchesSearch && matchesFilter; + }), [projects, searchTerm, filterStatus]); + + return ( + <> +
+ { setEditingProject(null); setCreateModalOpen(true); }} /> + + + {loading ? ( +
+ +
+ ) : ( + <> +
+ {filteredProjects.map((project, index) => ( + + ))} +
+ + {filteredProjects.length === 0 && ( + + +

NO_PROJECTS_FOUND

+

No projects match your current search criteria

+ +
+ )} + + )} +
+ { setCreateModalOpen(false); setEditingProject(null); }} + onSave={handleCreateOrUpdateProject} + project={editingProject} + /> + setConfirmModalOpen(false)} + onConfirm={confirmDelete} + title="> CONFIRM_DELETION" + > +

Are you sure you want to delete this project?

+

This action cannot be undone.

+
+ setDetailModalOpen(false)} + project={selectedProject} + /> + setTeamModalOpen(false)} + project={selectedProject} + /> + + ); +}; + +export default ProjectManager; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Settings.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Settings.jsx new file mode 100644 index 0000000..87da072 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/Settings.jsx @@ -0,0 +1,133 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { + User, + Shield, + Bell, + Palette, + Globe, + Save, + RotateCcw, + FileCog, + Network +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import ProfileSettings from '@/components/settings/ProfileSettings'; +import SecuritySettings from '@/components/settings/SecuritySettings'; +import NotificationSettings from '@/components/settings/NotificationSettings'; +import AppearanceSettings from '@/components/settings/AppearanceSettings'; +import IntegrationSettings from '@/components/settings/IntegrationSettings'; +import ProjectSettings from '@/components/settings/ProjectSettings'; +import DomainSettings from '@/components/settings/DomainSettings'; +import { AppearanceContext } from '@/context/AppearanceContext'; + +const SettingsPage = ({ setIsLoading }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const [activeSection, setActiveSection] = useState('profile'); + const { settings, updateSettings, resetSettings, initialSettings } = useContext(AppearanceContext); + + useEffect(() => { + setIsLoading(false); + }, [activeSection, setIsLoading]); + + const handleSave = () => { + localStorage.setItem('gameforge_settings', JSON.stringify(settings)); + addActivity({ type: 'settings', message: 'Saved all settings changes' }); + toast({ + title: '> SETTINGS SAVED', + description: 'All your changes have been successfully saved.', + }); + }; + + const handleReset = () => { + resetSettings(); + addActivity({ type: 'settings', message: 'Reset all settings to default' }); + toast({ + title: '> SETTINGS RESET', + description: 'All settings have been reset to their default values.', + variant: 'destructive' + }); + }; + + const handleAction = (action, setting = '') => { + addActivity({ type: 'settings', message: `Performed settings action: ${action} ${setting}` }); + toast({ + title: `> SETTINGS ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + variant: 'destructive' + }); + }; + + const sections = [ + { id: 'profile', label: 'Profile', icon: User }, + { id: 'security', label: 'Security', icon: Shield }, + { id: 'notifications', label: 'Notifications', icon: Bell }, + { id: 'appearance', label: 'Appearance', icon: Palette }, + { id: 'integrations', label: 'Integrations', icon: Globe }, + { id: 'domains', label: 'Domains', icon: Network }, + { id: 'project', label: 'Project Settings', icon: FileCog }, + ]; + + const renderContent = () => { + switch (activeSection) { + case 'profile': return ; + case 'security': return ; + case 'notifications': return ; + case 'appearance': return ; + case 'integrations': return ; + case 'domains': return ; + case 'project': return ; + default: return ; + } + }; + + return ( +
+ +
+

> SETTINGS

+

Configure your GameForge environment and preferences

+
+
+ + +
+
+ +
+ + + + + + + + {renderContent()} + + + +
+
+ ); +}; + +export default SettingsPage; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/UsersManager.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/UsersManager.jsx new file mode 100644 index 0000000..f44e875 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/UsersManager.jsx @@ -0,0 +1,381 @@ +import React, { useState, useMemo, useContext } from 'react'; +import { motion } from 'framer-motion'; +import { + UserPlus, + Search, + Filter, + MoreVertical, + Mail, + Clock, + Shield, + Star, + Activity, + Users, + Crown, + Code, + Palette, + Music, + Gamepad2, + Calendar, + Loader2, + Circle, + Coffee, + Moon, + UserCog, + Eye, + Award, + BarChart, + Slash, + Trash2, + UserX +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { useActivity } from '@/hooks/useActivity.jsx'; +import { usePresence } from '@/context/PresenceContext'; +import { useAuth } from '@/context/AuthContext'; +import MessageUserModal from '@/components/modals/MessageUserModal'; +import ManagePermissionsModal from '@/components/modals/admin/ManagePermissionsModal'; +import ConfirmationModal from '@/components/modals/ConfirmationModal'; +import InviteUserModal from '@/components/modals/InviteUserModal'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, + DropdownMenuGroup, +} from "@/components/ui/dropdown-menu"; + +const UsersManager = ({ onViewProfile }) => { + const { toast } = useToast(); + const { addActivity } = useActivity(); + const { teamMembers: allUsers, onlineCount, loading } = usePresence(); + const { profile: currentUserProfile } = useAuth(); + + const [searchTerm, setSearchTerm] = useState(''); + const [filterRole, setFilterRole] = useState('all'); + const [isMessageModalOpen, setMessageModalOpen] = useState(false); + const [isPermissionsModalOpen, setPermissionsModalOpen] = useState(false); + const [isInviteUserModalOpen, setInviteUserModalOpen] = useState(false); + const [selectedUser, setSelectedUser] = useState(null); + const [isConfirmModalOpen, setConfirmModalOpen] = useState(false); + const [confirmModalContent, setConfirmModalContent] = useState({ title: '', onConfirm: () => {} }); + + const isOwnerOrAdmin = currentUserProfile?.role === 'admin' || currentUserProfile?.role === 'owner'; + + const handleMessageUser = (user) => { + setSelectedUser(user); + setMessageModalOpen(true); + addActivity({ type: 'team', message: `Initiated message with ${user.username}` }); + }; + + const handleViewProfile = (userId) => { + onViewProfile(userId); + }; + + const handleManagePermissions = (user) => { + if (isOwnerOrAdmin) { + setSelectedUser(user); + setPermissionsModalOpen(true); + addActivity({ type: 'team', message: `Managing permissions for ${user.username}` }); + } else { + toast({ + variant: 'destructive', + title: 'ACCESS DENIED', + description: 'You do not have permission to manage roles.', + }); + } + }; + + const handleAdminAction = (action, user) => { + addActivity({ type: 'admin', message: `${action} on user ${user.username}` }); + toast({ + title: `> ADMIN ACTION: ${action.toUpperCase()}`, + description: "🚧 This feature isn't implemented yet—but don't worry! You can request it in your next prompt! 🚀", + }); + }; + + const handleSuspendUser = (user) => { + setConfirmModalContent({ + title: `> CONFIRM SUSPENSION`, + onConfirm: () => { + handleAdminAction('Suspend User', user); + setConfirmModalOpen(false); + }, + children:

Are you sure you want to suspend {user.username}?

+ }); + setConfirmModalOpen(true); + }; + + const handleDeleteUser = (user) => { + setConfirmModalContent({ + title: `> CONFIRM DELETION`, + icon: , + onConfirm: () => { + handleAdminAction('Delete User', user); + setConfirmModalOpen(false); + }, + children: ( + <> +

Are you sure you want to delete {user.username}?

+

This action is irreversible.

+ + ) + }); + setConfirmModalOpen(true); + }; + + const getStatusInfo = (status) => { + switch (status) { + case 'online': return { color: 'bg-green-400', text: 'ONLINE', icon: }; + case 'away': return { color: 'bg-yellow-400', text: 'AWAY', icon: }; + case 'busy': return { color: 'bg-red-400', text: 'BUSY', icon: }; + default: return { color: 'bg-gray-400', text: 'OFFLINE', icon: }; + } + }; + + const getRoleIcon = (role) => { + if (!role) return ; + if (role.toLowerCase().includes('developer')) return ; + if (role.toLowerCase().includes('artist')) return ; + if (role.toLowerCase().includes('audio')) return ; + if (role.toLowerCase().includes('designer')) return ; + return ; + }; + + const getPermissionIcon = (permission) => { + switch (permission) { + case 'owner': return ; + case 'oversee': return ; + case 'admin': return ; + case 'editor': return ; + case 'member': return ; + default: return ; + } + }; + + const filteredUsers = useMemo(() => allUsers.filter(user => { + const matchesSearch = user.username.toLowerCase().includes(searchTerm.toLowerCase()) || + user.email.toLowerCase().includes(searchTerm.toLowerCase()) || + (user.role && user.role.toLowerCase().includes(searchTerm.toLowerCase())); + const matchesFilter = filterRole === 'all' || (user.role && user.role.toLowerCase().includes(filterRole.toLowerCase())); + return matchesSearch && matchesFilter; + }), [allUsers, searchTerm, filterRole]); + + return ( + <> +
+ +
+

+ > USERS +

+

+ Browse all users on the platform. +

+
+ +
+ + +
+
+ + setSearchTerm(e.target.value)} + className="w-full bg-black/50 cyber-border rounded px-10 py-2 text-green-400 font-mono placeholder-green-400/50 focus:outline-none focus:ring-2 focus:ring-green-400/50" + /> +
+
+ + +
+
+
+ + + {[ + { label: 'Total Users', value: allUsers.length, color: 'text-green-400' }, + { label: 'Online Now', value: onlineCount, color: 'text-cyan-400' }, + { label: 'Avg Projects', value: '2.1', color: 'text-purple-400' }, + { label: 'New This Week', value: '12', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + {loading ? ( +
+ +
+ ) : ( + <> +
+ {filteredUsers.map((user, index) => { + const statusInfo = getStatusInfo(user.status); + const isSelf = user.id === currentUserProfile.id; + + return ( + +
+
+
+
+ {user.avatar} +
+
+
+
+

{user.username}

{getPermissionIcon(user.role)}
+
{user.role || 'Member'}
+
+
+ + + + + + {(isOwnerOrAdmin && !isSelf) ? ( + <> + Admin Actions + + handleManagePermissions(user)}> + Manage Permissions + + handleAdminAction('Add Loyalty Points', user)}> + Add Loyalty Points + + handleAdminAction('View Activity Log', user)}> + View Activity + + + handleSuspendUser(user)}> + Suspend User + + handleDeleteUser(user)}> + Delete User + + + ) : ( + <> + User Snapshot + + +

Loyalty: {user.loyalty_points || 0} pts

+

XP: {user.total_xp || 0}

+

Level: {user.level || 1}

+
+ + )} +
+
+
+ +
+
{user.email}
+
Status:{statusInfo.text}
+
Last Active:{new Date(user.last_seen).toLocaleString()}
+
+ +
+ + +
+
+ )})} +
+ + {filteredUsers.length === 0 && !loading && ( + + +

NO_USERS_FOUND

+

No users match your current search criteria

+ +
+ )} + + )} +
+ {selectedUser && ( + <> + setMessageModalOpen(false)} + recipient={selectedUser} + /> + setPermissionsModalOpen(false)} + user={selectedUser} + /> + + )} + setConfirmModalOpen(false)} + onConfirm={confirmModalContent.onConfirm} + title={confirmModalContent.title} + icon={confirmModalContent.icon} + > + {confirmModalContent.children} + + setInviteUserModalOpen(false)} /> + + ); +}; + +export default UsersManager; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/VersionControl.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/VersionControl.jsx new file mode 100644 index 0000000..9d84f41 --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/VersionControl.jsx @@ -0,0 +1,266 @@ +import React, { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { + GitBranch, + GitCommit, + GitMerge, + Plus, + Eye, + Copy, + Trash2, + ArrowRight +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; + +const getBranchTypeColor = (type) => { + switch (type) { + case 'main': return 'text-green-400 border-green-400/30'; + case 'feature': return 'text-blue-400 border-blue-400/30'; + case 'bugfix': return 'text-red-400 border-red-400/30'; + case 'hotfix': return 'text-yellow-400 border-yellow-400/30'; + default: return 'text-gray-400 border-gray-400/30'; + } +}; + +const getPRStatusColor = (status) => { + switch (status) { + case 'open': return 'text-green-400 border-green-400/30'; + case 'review': return 'text-yellow-400 border-yellow-400/30'; + case 'approved': return 'text-blue-400 border-blue-400/30'; + case 'merged': return 'text-purple-400 border-purple-400/30'; + case 'closed': return 'text-red-400 border-red-400/30'; + default: return 'text-gray-400 border-gray-400/30'; + } +}; + +const CommitList = ({ commits, handleAction }) => ( +
+ {commits.map((commit, index) => ( + +
+
+
+
+ +
+
+

{commit.message}

+
+ {commit.hash} + {commit.author} + {commit.timestamp} +
+
+
+
+ {commit.branch} + {commit.files} files + +{commit.additions} + -{commit.deletions} +
+
+
+ + +
+
+
+ ))} +
+); + +const BranchList = ({ branches, handleAction }) => ( +
+ {branches.map((branch, index) => ( + +
+
+
+ +
+
+
+

{branch.name}

+ {branch.type} + {branch.protected && PROTECTED} +
+
+ {branch.lastCommit} + {branch.author} + {branch.lastUpdate} + {branch.ahead > 0 && ↑{branch.ahead}} + {branch.behind > 0 && ↓{branch.behind}} +
+
+
+
+ + + {!branch.protected && } +
+
+
+ ))} +
+); + +const PullRequestList = ({ pullRequests, handleAction }) => ( +
+ {pullRequests.map((pr, index) => ( + +
+
+
+
+ +
+
+

{pr.title}

+

{pr.description}

+
+
+
+ {pr.author} + {pr.created} + {pr.status.toUpperCase()} +
+
+
+
+
+ + {pr.source} + + {pr.target} + + {pr.commits} commits + {pr.files} files + {pr.reviews} reviews +
+
+ + {pr.status === 'approved' && } +
+
+
+ ))} +
+); + +const VersionControl = ({ setIsLoading = () => {} }) => { + const [activeTab, setActiveTab] = useState('commits'); + const { toast } = useToast(); + + useEffect(() => { + setIsLoading(false); + }, [setIsLoading]); + + const [commits] = useState([ + { id: 1, hash: 'a7f3d2e', message: 'Updated player movement system with neural controls', author: 'MRPIGLR', timestamp: '2 hours ago', branch: 'feature/neural-controls', files: 12, additions: 45, deletions: 8 }, + { id: 2, hash: 'b9e1c4f', message: 'Added cyberpunk UI elements and animations', author: 'UI_CYBER', timestamp: '5 hours ago', branch: 'feature/ui-overhaul', files: 8, additions: 127, deletions: 23 }, + { id: 3, hash: 'c2d5a8b', message: 'Implemented quantum physics engine', author: 'CODE_PHANTOM', timestamp: '1 day ago', branch: 'feature/quantum-physics', files: 15, additions: 234, deletions: 67 }, + { id: 4, hash: 'd8f2b1c', message: 'Fixed audio synchronization issues', author: 'SOUND_MATRIX', timestamp: '2 days ago', branch: 'bugfix/audio-sync', files: 3, additions: 18, deletions: 12 } + ]); + + const [branches] = useState([ + { id: 1, name: 'main', type: 'main', lastCommit: 'a7f3d2e', lastUpdate: '2 hours ago', author: 'MRPIGLR', ahead: 0, behind: 0, protected: true }, + { id: 2, name: 'feature/neural-controls', type: 'feature', lastCommit: 'a7f3d2e', lastUpdate: '2 hours ago', author: 'MRPIGLR', ahead: 3, behind: 0, protected: false }, + { id: 3, name: 'feature/ui-overhaul', type: 'feature', lastCommit: 'b9e1c4f', lastUpdate: '5 hours ago', author: 'UI_CYBER', ahead: 2, behind: 1, protected: false }, + { id: 4, name: 'feature/quantum-physics', type: 'feature', lastCommit: 'c2d5a8b', lastUpdate: '1 day ago', author: 'CODE_PHANTOM', ahead: 5, behind: 2, protected: false } + ]); + + const [pullRequests] = useState([ + { id: 1, title: 'Neural Controls Integration', description: 'Implements advanced neural interface controls for player movement', author: 'MRPIGLR', source: 'feature/neural-controls', target: 'main', status: 'open', commits: 3, files: 12, created: '2 hours ago', reviews: 2 }, + { id: 2, title: 'UI Overhaul with Cyberpunk Theme', description: 'Complete redesign of user interface with cyberpunk aesthetics', author: 'UI_CYBER', source: 'feature/ui-overhaul', target: 'main', status: 'review', commits: 8, files: 25, created: '1 day ago', reviews: 1 }, + { id: 3, title: 'Quantum Physics Engine', description: 'Advanced physics simulation for quantum mechanics gameplay', author: 'CODE_PHANTOM', source: 'feature/quantum-physics', target: 'main', status: 'approved', commits: 15, files: 42, created: '3 days ago', reviews: 3 } + ]); + + const handleAction = (action, item = '') => { + toast({ + title: `> VC ACTION: ${action.toUpperCase()}`, + description: `Looks like MrPiglr hasn't wired this up yet. Give him a nudge! 🐷`, + variant: 'destructive', + }); + }; + + const renderContent = () => { + switch (activeTab) { + case 'commits': return ; + case 'branches': return ; + case 'pulls': return ; + default: return null; + } + }; + + return ( +
+ +
+

> VERSION_CONTROL

+

Git integration with automated build pipelines and webhook support

+
+
+ + +
+
+ + + {[ + { label: 'Commits Today', value: '47', color: 'text-green-400' }, + { label: 'Active Branches', value: '12', color: 'text-cyan-400' }, + { label: 'Open PRs', value: '3', color: 'text-purple-400' }, + { label: 'Sync Status', value: 'LIVE', color: 'text-yellow-400' } + ].map((stat, index) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ + +
+ {[ + { id: 'commits', label: 'Commits', icon: GitCommit }, + { id: 'branches', label: 'Branches', icon: GitBranch }, + { id: 'pulls', label: 'Pull Requests', icon: GitMerge } + ].map((tab) => { + const Icon = tab.icon; + return ( + + ); + })} +
+
+ + + {renderContent()} + +
+ ); +}; + +export default VersionControl; \ No newline at end of file diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/WelcomeMessage.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/admin/MaintenanceManager.jsx b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/admin/MaintenanceManager.jsx new file mode 100644 index 0000000..eaa96fb --- /dev/null +++ b/horizons-export-8a999a65-f56d-49a8-ac7d-6a79d2d13573/src/components/admin/MaintenanceManager.jsx @@ -0,0 +1,144 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { X, Save, Loader2, AlertTriangle, Power, PowerOff } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useToast } from '@/components/ui/use-toast'; +import { supabase } from '@/lib/customSupabaseClient'; + +const MaintenanceManager = ({ isOpen, onClose }) => { + const { toast } = useToast(); + const [maintenanceStatus, setMaintenanceStatus] = useState({ enabled: false, message: '' }); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + + useEffect(() => { + if (isOpen) { + const fetchStatus = async () => { + setLoading(true); + try { + const { data, error } = await supabase + .from('system_settings') + .select('value') + .eq('key', 'maintenance_status') + .single(); + + if (error && error.code !== 'PGRST116') throw error; + + if (data) { + setMaintenanceStatus(data.value); + } else { + setMaintenanceStatus({ enabled: false, message: "System is currently under maintenance. We'll be back shortly." }); + } + } catch (error) { + toast({ variant: 'destructive', title: 'Error fetching status', description: error.message }); + } finally { + setLoading(false); + } + }; + fetchStatus(); + } + }, [isOpen, toast]); + + const handleSave = async () => { + setSaving(true); + try { + const { error } = await supabase + .from('system_settings') + .upsert({ key: 'maintenance_status', value: maintenanceStatus }, { onConflict: 'key' }); + + if (error) throw error; + + toast({ + title: '> MAINTENANCE MODE UPDATED', + description: `System maintenance mode is now ${maintenanceStatus.enabled ? 'ENABLED' : 'DISABLED'}.`, + }); + onClose(); + } catch (error) { + toast({ variant: 'destructive', title: 'Error saving status', description: error.message }); + } finally { + setSaving(false); + } + }; + + const toggleMaintenanceMode = () => { + setMaintenanceStatus(prev => ({ ...prev, enabled: !prev.enabled })); + }; + + return ( + + {isOpen && ( + + e.stopPropagation()} + > + +

> MAINTENANCE_CONTROL

+

Enable or disable system-wide maintenance mode.

+ + {loading ? ( +
+ +
+ ) : ( +
+
+
+

+ System Status: + {maintenanceStatus.enabled ? 'MAINTENANCE' : 'OPERATIONAL'} + +

+

+ {maintenanceStatus.enabled ? 'Users will see the maintenance page.' : 'The application is live.'} +

+
+ +
+ +
+ + +
+ + +
+ `; +} + +export const EDIT_MODE_STYLES = ` + #root[data-edit-mode-enabled="true"] [data-edit-id] { + cursor: pointer; + outline: 2px dashed #357DF9; + outline-offset: 2px; + min-height: 1em; + } + #root[data-edit-mode-enabled="true"] img[data-edit-id] { + outline-offset: -2px; + } + #root[data-edit-mode-enabled="true"] { + cursor: pointer; + } + #root[data-edit-mode-enabled="true"] [data-edit-id]:hover { + background-color: #357DF933; + outline-color: #357DF9; + } + + @keyframes fadeInTooltip { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #inline-editor-disabled-tooltip { + display: none; + opacity: 0; + position: absolute; + background-color: #1D1E20; + color: white; + padding: 4px 8px; + border-radius: 8px; + z-index: 10001; + font-size: 14px; + border: 1px solid #3B3D4A; + max-width: 184px; + text-align: center; + } + + #inline-editor-disabled-tooltip.tooltip-active { + display: block; + animation: fadeInTooltip 0.2s ease-out forwards; + } +`; diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-edit-mode.js b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-edit-mode.js new file mode 100644 index 0000000..58790b8 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-edit-mode.js @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { EDIT_MODE_STYLES } from './visual-editor-config'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = resolve(__filename, '..'); + +export default function inlineEditDevPlugin() { + return { + name: 'vite:inline-edit-dev', + apply: 'serve', + transformIndexHtml() { + const scriptPath = resolve(__dirname, 'edit-mode-script.js'); + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: scriptContent, + injectTo: 'body' + }, + { + tag: 'style', + children: EDIT_MODE_STYLES, + injectTo: 'head' + } + ]; + } + }; +} diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-react-inline-editor.js b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-react-inline-editor.js new file mode 100644 index 0000000..315afea --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/plugins/visual-editor/vite-plugin-react-inline-editor.js @@ -0,0 +1,365 @@ +import path from 'path'; +import { parse } from '@babel/parser'; +import traverseBabel from '@babel/traverse'; +import * as t from '@babel/types'; +import fs from 'fs'; +import { + validateFilePath, + parseFileToAST, + findJSXElementAtPosition, + generateCode, + generateSourceWithMap, + VITE_PROJECT_ROOT +} from '../utils/ast-utils.js'; + +const EDITABLE_HTML_TAGS = ["a", "Button", "button", "p", "span", "h1", "h2", "h3", "h4", "h5", "h6", "label", "Label", "img"]; + +function parseEditId(editId) { + const parts = editId.split(':'); + + if (parts.length < 3) { + return null; + } + + const column = parseInt(parts.at(-1), 10); + const line = parseInt(parts.at(-2), 10); + const filePath = parts.slice(0, -2).join(':'); + + if (!filePath || isNaN(line) || isNaN(column)) { + return null; + } + + return { filePath, line, column }; +} + +function checkTagNameEditable(openingElementNode, editableTagsList) { + if (!openingElementNode || !openingElementNode.name) return false; + const nameNode = openingElementNode.name; + + // Check 1: Direct name (for

, + +

{isLogin ? 'Sign In' : 'Create Account'}

+

to continue to AeThex Events

+ +
+
+ + setEmail(e.target.value)} + required + className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-3 py-2 focus:ring-primary focus:border-primary transition" + placeholder="you@example.com" + /> +
+
+ + setPassword(e.target.value)} + required + className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-3 py-2 focus:ring-primary focus:border-primary transition" + placeholder="••••••••" + /> +
+ +
+ +

+ {isLogin ? "Don't have an account?" : "Already have an account?"}{' '} + +

+
+ + + ); +}; + +export default AuthModal; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/CallToAction.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/CallToAction.jsx new file mode 100644 index 0000000..d2203da --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/CallToAction.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const CallToAction = () => { + return ( + + Let's turn your ideas into reality + + ); +}; + +export default CallToAction; diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/DeveloperResources.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/DeveloperResources.jsx new file mode 100644 index 0000000..c32d625 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/DeveloperResources.jsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Card, CardHeader, CardTitle, CardContent } from './ui/card'; +import { ArrowUpRight, Book, Github, Palette } from 'lucide-react'; + +const resources = [ + { + title: 'Awesome Developer Tools', + description: 'A curated list of fantastic tools and utilities for modern developers.', + link: 'https://github.com/topics/developer-tools', + icon: , + color: 'from-purple-500 to-indigo-500', + }, + { + title: 'Design Resources for Devs', + description: 'A collection of design assets, UI kits, and inspiration for developers.', + link: 'https://github.com/bradtraversy/design-resources-for-developers', + icon: , + color: 'from-pink-500 to-rose-500', + }, + { + title: 'Free Programming Books', + description: 'Access a huge library of free programming books on various topics.', + link: 'https://github.com/EbookFoundation/free-programming-books', + icon: , + color: 'from-green-500 to-emerald-500', + }, +]; + +const ResourceCard = ({ title, description, link, icon, color, delay }) => ( + + + +
+ {icon} +
+ +
+ + {title} +

{description}

+
+
+
+); + +const DeveloperResources = () => { + return ( + <> + +

Developer's Toolkit

+

+ A curated collection of essential tools and resources to boost your productivity and skills. +

+
+
+ {resources.map((resource, index) => ( + + ))} +
+ + ); +}; + +export default DeveloperResources; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCard.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCard.jsx new file mode 100644 index 0000000..e5063e5 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCard.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Calendar, MapPin, Star, ArrowRight } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { formatDate } from '@/lib/utils'; + +const cardVariants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, ease: "easeOut" } + }, + exit: { + opacity: 0, + y: -30, + transition: { duration: 0.3, ease: "easeIn" } + } +}; + +const EventCard = ({ event, onSelectEvent, getCategoryColor, getCategoryLabel }) => { + return ( + +
+
+
+ {`${event.title} +
+ + {getCategoryLabel(event.category)} + +
+ {event.featured && ( + +
+ + Featured +
+
+ )} +
+ +
+

+ {event.title} +

+

+ {event.description} +

+ +
+
+ + {formatDate(event.date)} +
+
+ + {event.location} +
+
+ +
+
+ {event.price === 0 ? 'Free' : `$${event.price}`} +
+ +
+
+
+
+ ); +}; + +export default EventCard; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCardSkeleton.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCardSkeleton.jsx new file mode 100644 index 0000000..768d423 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventCardSkeleton.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const EventCardSkeleton = () => { + return ( +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ ); +}; + +export default EventCardSkeleton; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventDetailModal.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventDetailModal.jsx new file mode 100644 index 0000000..349b50d --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventDetailModal.jsx @@ -0,0 +1,224 @@ +import React, {useState} from 'react'; + import { motion, AnimatePresence } from 'framer-motion'; + import { Calendar, Clock, MapPin, Users, X, Loader2, Mic, List, Navigation, Ticket, Star, CheckCircle } from 'lucide-react'; + import { Button } from '@/components/ui/button'; + import { formatDate, formatTime } from '@/lib/utils'; + import ReactMarkdown from 'react-markdown'; + import { Card, CardContent } from '@/components/ui/card'; + + const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } + }; + + const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } + }; + + const TicketTypeCard = ({ ticket, onSelect, isSelected }) => ( + +
+
+

{ticket.name}

+

{ticket.benefits.split('\n')[0]}

+
+
${ticket.price}
+
+ + {isSelected && ( + + {ticket.benefits.split('\n').map((benefit, i) => ( +
+ + {benefit} +
+ ))} +
+ )} +
+
+ ); + + const EventDetailModal = ({ event, onClose, onRegister, onUnregister, isRegistered, getCategoryColor, getCategoryLabel, isLoading }) => { + const [selectedTicket, setSelectedTicket] = useState(event.ticket_types && event.ticket_types.length > 0 ? event.ticket_types[0] : { price: event.price }); + + const handleRegisterClick = () => { + // Here you would pass which ticket type is being purchased + onRegister(event.id, selectedTicket); + }; + + return ( + + e.stopPropagation()} + > +
+ + +
+
+ {`${event.title} + + + {getCategoryLabel(event.category)} + + +
+ +
+
+
+

{event.title}

+

{event.description}

+ +
+
+
{formatDate(event.date)}
+
{formatTime(event.time)}
+
{event.location}
+
{event.aethex_event_registrations[0]?.count || 0}/{event.capacity} registered
+ {event.map_url && ( + View on Map + )} +
+ + {event.speakers && event.speakers.length > 0 && ( +
+

Speakers

+
    + {event.speakers.map((speaker, index) =>
  • {speaker}
  • )} +
+
+ )} +
+ +
+ {event.full_description} +
+ + {event.agenda && event.agenda.length > 0 && ( +
+

Agenda

+
+ {event.agenda.map((item, index) => ( +
+
{item.time}
+
{item.title}
+
+ ))} +
+
+ )} +
+ +
+ + +

Get Your Ticket

+ +
+ {event.ticket_types && event.ticket_types.length > 0 ? ( + event.ticket_types.map(ticket => ( + setSelectedTicket(ticket)} + isSelected={selectedTicket?.name === ticket.name} + /> + )) + ) : ( +
+
{event.price === 0 ? 'Free' : `$${event.price}`}
+
+ )} +
+ +
+
+ Availability + {event.capacity - (event.aethex_event_registrations[0]?.count || 0)} spots left +
+
+ +
+
+ + {isRegistered ? ( +
+
+
✓ Registered
+
You're all set!
+
+ +
+ ) : ( + + )} +
Registration confirmation will be sent via email.
+
+
+
+
+
+
+
+
+ ); + }; + + export default EventDetailModal; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventList.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventList.jsx new file mode 100644 index 0000000..67aa811 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/EventList.jsx @@ -0,0 +1,120 @@ +import React, { useState } from 'react'; +import { AnimatePresence, motion } from 'framer-motion'; +import EventCard from '@/components/EventCard'; +import EventCardSkeleton from '@/components/EventCardSkeleton'; +import { Search, SlidersHorizontal } from 'lucide-react'; +import { useEvents } from '@/hooks/useEvents'; + +const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + }, + }, +}; + +const EventList = ({ loading, filteredEvents, onSelectEvent, getCategoryColor, getCategoryLabel, setSearchTerm, setSelectedCategory }) => { + const { categories } = useEvents(); + const [showFilters, setShowFilters] = useState(false); + + return ( + <> +
+

AeThex Events

+

+ Explore our upcoming conferences, workshops, and networking opportunities. +

+
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + + {showFilters && ( + + {categories.map(category => ( + + ))} + + )} + +
+
+ + {loading ? ( +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+ ) : ( + + + {filteredEvents.map((event) => ( + + ))} + + + )} + + {filteredEvents.length === 0 && !loading && ( + + + 🔍 + +

No events found

+

Try adjusting your search or filter criteria.

+
+ )} + + ); +}; + +export default EventList; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/FeaturedSpeakers.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/FeaturedSpeakers.jsx new file mode 100644 index 0000000..494d72c --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/FeaturedSpeakers.jsx @@ -0,0 +1,139 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Card, CardContent } from './ui/card'; +import { Linkedin, Twitter } from 'lucide-react'; + +const speakers = [ + { + name: 'Dr. Evelyn Reed', + title: 'Lead AI Ethicist, QuantumLeap', + topic: 'The Future of Ethical AI', + image: 'https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Jaxon "Glitch" Hayes', + title: 'Principal Security Engineer, Cyberia', + topic: 'Next-Gen Cyber Defense', + image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Kenji Tanaka', + title: 'Head of Robotics, InnovateX', + topic: 'Human-Robot Collaboration', + image: 'https://images.unsplash.com/photo-1548142813-c348350df52b?q=80&w=1889&auto=format&fit=crop', + }, + { + name: 'Lena Petrova', + title: 'Quantum Computing Pioneer, FutureForge', + topic: 'The Quantum Revolution', + image: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=1887&auto=format&fit=crop', + }, + { + name: 'Marco Diaz', + title: 'Senior AR/VR Architect, NexusPrime', + topic: 'Building the Metaverse', + image: 'https://images.unsplash.com/photo-1583195764338-23e08c6954b3?q=80&w=2070&auto=format&fit=crop', + }, +]; + +const variants = { + enter: (direction) => ({ + x: direction > 0 ? 1000 : -1000, + opacity: 0, + }), + center: { + zIndex: 1, + x: 0, + opacity: 1, + }, + exit: (direction) => ({ + zIndex: 0, + x: direction < 0 ? 1000 : -1000, + opacity: 0, + }), +}; + +const FeaturedSpeakers = () => { + const [[page, direction], setPage] = useState([0, 0]); + + const paginate = (newDirection) => { + setPage([(page + newDirection + speakers.length) % speakers.length, newDirection]); + }; + + useEffect(() => { + const interval = setInterval(() => { + paginate(1); + }, 5000); + return () => clearInterval(interval); + }, [page]); + + + return ( +
+ +

Featured Speakers

+

+ Learn from the brightest minds in technology. Our speakers are pioneers, researchers, and visionaries shaping the future. +

+
+ +
+ + + + +
+ {speakers[page].name} +
+
+

{speakers[page].topic}

+

{speakers[page].name}

+

{speakers[page].title}

+
+ + +
+
+
+
+
+
+
+ {speakers.map((_, i) => ( +
+
+
+ ); +}; + +export default FeaturedSpeakers; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Footer.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Footer.jsx new file mode 100644 index 0000000..02e61c3 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Footer.jsx @@ -0,0 +1,114 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Link } from 'react-router-dom'; +import AeThexLogo from './AeThexLogo'; +import { Github, Twitter, Mail, Send } from 'lucide-react'; +import { Button } from './ui/button'; +import { Input } from './ui/input'; +import { useToast } from './ui/use-toast'; + +const NewsletterSignup = () => { + const { toast } = useToast(); + + const handleSubmit = (e) => { + e.preventDefault(); + toast({ + title: "🚧 Feature In Progress", + description: "Newsletter signup isn't implemented yet, but stay tuned!", + }); + }; + + return ( +
+

Stay Updated

+

+ Subscribe to our newsletter to get the latest news, updates, and event announcements. +

+
+ + +
+
+ ); +}; + + +const Footer = () => { + const footerSections = { + 'Company': [ + { name: 'About', path: '/about' }, + { name: 'News', path: '/blog' }, + { name: 'Sponsors', path: '/sponsors' }, + ], + 'Resources': [ + { name: 'Developer Toolkit', path: '/resources' }, + { name: 'FAQ', path: '/faq' }, + { name: 'Contact', path: '/contact' }, + ] + }; + + const socialLinks = [ + { name: 'Twitter', icon: , path: '#' }, + { name: 'GitHub', icon: , path: '#' }, + { name: 'Email', icon: , path: 'mailto:hello@aethex.events' }, + ]; + + return ( + +
+
+
+ +

The premier destination for tech innovators and creators.

+
+ +
+ {Object.entries(footerSections).map(([title, links]) => ( +
+

{title}

+
    + {links.map((link) => ( +
  • + + {link.name} + +
  • + ))} +
+
+ ))} + +
+
+ +
+

+ © {new Date().getFullYear()} AeThex Events. A division of AeThex, Inc. All rights reserved. +

+
+ {socialLinks.map((social) => ( + + {social.name} + {social.icon} + + ))} +
+
+
+
+ ); +}; + +export default Footer; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Header.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Header.jsx new file mode 100644 index 0000000..b90f9b1 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Header.jsx @@ -0,0 +1,208 @@ +import React, { useState } from 'react'; +import { Link, NavLink, useNavigate } from 'react-router-dom'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import { Button } from '@/components/ui/button'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; +import { LogIn, User, LogOut, Ticket, Gem, UserPlus, Sparkles, X, Menu, Shield, Trophy, HelpCircle, Mail, BookOpen, HeartHandshake as Handshake, Users, Code } from 'lucide-react'; +import AeThexLogo from '@/components/AeThexLogo'; + +const Header = ({ onAuthClick, onPassportClick }) => { + const { user, profile, signOut } = useAuth(); + const navigate = useNavigate(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const isAdmin = profile && ['admin', 'site_owner', 'oversee'].includes(profile.role); + const avatarUrl = profile?.avatar_url || `https://api.dicebear.com/7.x/bottts/svg?seed=${user?.id || 'guest'}`; + + const handleSignOut = async () => { + await signOut(); + navigate('/'); + }; + + const navLinks = [ + { to: '/about', text: 'About', icon: }, + { to: '/sponsors', text: 'Sponsors', icon: }, + { to: '/resources', text: 'Resources', icon: }, + { to: '/blog', text: 'News', icon: }, + ]; + + const MobileNavLink = ({ to, children }) => ( + + `flex items-center w-full px-4 py-3 text-lg rounded-md transition-colors ${ + isActive ? 'bg-primary/10 text-primary' : 'text-gray-300 hover:bg-primary/10 hover:text-primary' + }` + } + onClick={() => setIsMenuOpen(false)} + > + {children} + + ); + + const DesktopNavLink = ({ to, children }) => ( + + ) + + const UserMenu = ({ isMobile = false }) => ( +
+ +
+ + + + + + +

{profile?.username}

+

{profile?.email}

+
+ + + + + My Events + + + + + + My Achievements + + + + + My Passport + + {isAdmin && ( + + + + Admin Dashboard + + + )} + + + + Log out + +
+
+
+
+
+ ); + + const AuthButtons = ({ isMobile = false }) => ( + + + + + ); + + return ( + <> +
+
+ setIsMenuOpen(false)}> + +
+

Events

+
+ + +
+ +
+
+
+ + + {isMenuOpen && ( + setIsMenuOpen(false)} + > + e.stopPropagation()} + > +
+ +
+
+ {user ? : } +
+
+
+
+ )} +
+ + ); +}; + +export default Header; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/HeroImage.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/HeroImage.jsx new file mode 100644 index 0000000..61163a9 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/HeroImage.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + +const HeroImage = () => { + return ( +
+ + + + + +
+ ); +}; + +export default HeroImage; diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/LoadingScreen.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/LoadingScreen.jsx new file mode 100644 index 0000000..af5922f --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/LoadingScreen.jsx @@ -0,0 +1,117 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import AeThexLogo from '@/components/AeThexLogo'; + +const LoadingScreen = () => { + const [progress, setProgress] = useState(0); + const [message, setMessage] = useState('Booting up core systems...'); + + const messages = [ + 'Connecting to the AeThex network...', + 'Calibrating event streams...', + 'Unlocking achievements cache...', + 'Polishing pixels...', + 'Finalizing experience...', + ]; + + useEffect(() => { + const interval = setInterval(() => { + setProgress(prev => { + if (prev >= 100) { + clearInterval(interval); + return 100; + } + const next = prev + Math.random() * 10; + return Math.min(next, 100); + }); + }, 400); + + return () => clearInterval(interval); + }, []); + + useEffect(() => { + let messageIndex = 0; + const messageInterval = setInterval(() => { + if (messageIndex < messages.length - 1) { + messageIndex++; + setMessage(messages[messageIndex]); + } else { + clearInterval(messageInterval); + } + }, 1000); + + return () => clearInterval(messageInterval); + }, [messages]); + + const barVariants = { + initial: { + y: "50%", + opacity: 0.5 + }, + animate: { + y: ["50%", "-50%", "50%"], + opacity: [0.5, 1, 0.5], + transition: { + duration: 1.5, + repeat: Infinity, + ease: "easeInOut" + } + } + }; + + return ( +
+
+ +
+ +
+
+
+ +
+ {[...Array(7)].map((_, i) => ( + + ))} +
+ +
+ +
+

{Math.round(progress)}%

+ + + + {message} + + + +
+
+ ); +}; + +export default LoadingScreen; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageHeader.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageHeader.jsx new file mode 100644 index 0000000..e1dd4d5 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageHeader.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { Sparkles } from 'lucide-react'; + +const PageHeader = ({ title, subtitle, children }) => { + return ( + +
+ +
+ + + + + {title} + + {subtitle && ( + + {subtitle} + + )} + {children && ( + + {children} + + )} +
+
+ ); +}; + +export default PageHeader; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageLayout.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageLayout.jsx new file mode 100644 index 0000000..7cf73de --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PageLayout.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Outlet } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import Header from '@/components/Header'; +import Footer from '@/components/Footer'; + +const PageLayout = ({ onAuthClick, onPassportClick }) => { + return ( +
+
+
+ + + +
+
+
+ ); +}; + +export default PageLayout; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PassportModal.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PassportModal.jsx new file mode 100644 index 0000000..ad8ab3b --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/PassportModal.jsx @@ -0,0 +1,119 @@ +import React, { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; +import { X, Copy, Check, Loader2 } from 'lucide-react'; +import { QRCode } from 'react-qrcode-logo'; +import AeThexLogo from './AeThexLogo'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import toast from 'react-hot-toast'; + +const backdropVariants = { + visible: { opacity: 1 }, + hidden: { opacity: 0 } +}; + +const modalVariants = { + hidden: { opacity: 0, scale: 0.9, y: 50 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { type: 'spring', damping: 25, stiffness: 200 } + }, + exit: { + opacity: 0, + scale: 0.9, + y: 50, + transition: { duration: 0.2 } + } +}; + +const PassportModal = ({ onClose }) => { + const { user, profile, loading: authLoading } = useAuth(); + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + if (profile?.aethex_passport_id) { + navigator.clipboard.writeText(profile.aethex_passport_id); + setCopied(true); + toast.success("Passport ID Copied!"); + setTimeout(() => setCopied(false), 2000); + } + }; + + return ( + + e.stopPropagation()} + > + + +
+
+
+ User Avatar +

{profile?.username || 'Loading...'}

+

{user?.email}

+
+
+ +
+ {authLoading ? ( +
+ +
+ ) : ( +
+
+ +
+
+

Passport ID

+
+

{profile?.aethex_passport_id}

+ +
+
+
+

Member Since

+

{profile ? new Date(profile.created_at).toLocaleDateString() : '...'}

+
+
+ )} +
+
+ +
+
+
+ ); +}; + +export default PassportModal; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ProtectedRoute.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ProtectedRoute.jsx new file mode 100644 index 0000000..0438dd4 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ProtectedRoute.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/contexts/SupabaseAuthContext'; +import LoadingScreen from '@/components/LoadingScreen'; + +const ProtectedRoute = ({ children, adminOnly = false }) => { + const { user, profile, loading } = useAuth(); + const location = useLocation(); + + if (loading) { + return ; + } + + if (!user) { + return ; + } + + if (adminOnly && !['admin', 'site_owner', 'oversee'].includes(profile?.role)) { + return ; + } + + return children; +}; + +export default ProtectedRoute; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Sponsors.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Sponsors.jsx new file mode 100644 index 0000000..19aa9bf --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Sponsors.jsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const sponsors = [ + { name: "QuantumLeap", description: "QuantumLeap logo" }, + { name: "Cyberia", description: "Cyberia logo" }, + { name: "InnovateX", description: "InnovateX logo" }, + { name: "FutureForge", description: "FutureForge logo" }, + { name: "NexusPrime", description: "NexusPrime logo" }, +]; + +const Sponsors = () => { + return ( +
+
+

+ Proudly sponsored by the leaders in tech innovation +

+
+ + QuantumLeap logo + + + Cyberia logo + + + InnovateX logo + + + FutureForge logo + + + NexusPrime logo + +
+
+
+ ); +}; + +export default Sponsors; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Testimonials.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Testimonials.jsx new file mode 100644 index 0000000..d02062c --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/Testimonials.jsx @@ -0,0 +1,89 @@ +import React, { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Quote } from 'lucide-react'; + +const testimonials = [ + { + quote: "AeThex Events are a game-changer. The quality of speakers and networking opportunities is unmatched. I left inspired and with a notebook full of ideas.", + name: 'Elena Rodriguez', + title: 'Lead Developer, Nova Solutions', + avatar: 'https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=1961&auto=format&fit=crop' + }, + { + quote: "The workshops alone were worth the price of admission. Truly hands-on, practical knowledge I could apply to my projects the very next day.", + name: 'Ben Carter', + title: 'UX/UI Designer, Creative Canvas', + avatar: 'https://images.unsplash.com/photo-1544723795-3fb6469f5b39?q=80&w=1889&auto=format&fit=crop' + }, + { + quote: "I've been to many tech conferences, but AeThex has a special energy. It feels less like a conference and more like a community of innovators.", + name: 'Aisha Khan', + title: 'Data Scientist, Apex Analytics', + avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?q=80&w=1964&auto=format&fit=crop' + }, +]; + +const Testimonials = () => { + const [index, setIndex] = useState(0); + + useEffect(() => { + const timer = setTimeout(() => { + setIndex((prevIndex) => (prevIndex + 1) % testimonials.length); + }, 7000); + return () => clearTimeout(timer); + }, [index]); + + return ( +
+ +

What Our Community Says

+

+ Hear from past attendees who have experienced the magic of an AeThex event. +

+
+ +
+ + + +

+ "{testimonials[index].quote}" +

+
+ {testimonials[index].name} +
+

{testimonials[index].name}

+

{testimonials[index].title}

+
+
+
+
+
+
+ {testimonials.map((_, i) => ( +
+
+ ); +}; + +export default Testimonials; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/WelcomeMessage.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/WelcomeMessage.jsx new file mode 100644 index 0000000..c518b3c --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/WelcomeMessage.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +const WelcomeMessage = () => { + return ( + + Write in the chat what you want to create. + + ); +}; + +export default WelcomeMessage; diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/accordion.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/accordion.jsx new file mode 100644 index 0000000..ae135a8 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/accordion.jsx @@ -0,0 +1,40 @@ +import React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + svg]:rotate-180 text-white", + className + )} + {...props}> + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/badge.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/badge.jsx new file mode 100644 index 0000000..059f6ca --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/badge.jsx @@ -0,0 +1,31 @@ +import React from 'react'; + import { cva } from 'class-variance-authority'; + import { cn } from '@/lib/utils'; + + const badgeVariants = cva( + 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + } + ); + + function Badge({ className, variant, ...props }) { + return ( +
+ ); + } + + export { Badge, badgeVariants }; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/button.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/button.jsx new file mode 100644 index 0000000..489e3d1 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/button.jsx @@ -0,0 +1,51 @@ +import { cn } from '@/lib/utils'; + import { Slot } from '@radix-ui/react-slot'; + import { cva } from 'class-variance-authority'; + import React from 'react'; + import { motion } from 'framer-motion'; + + const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-bold ring-offset-background transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden group', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow-lg shadow-primary/20 hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8 text-base', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, + ); + + const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : motion.button; + return ( + + ); + }); + Button.displayName = 'Button'; + + export { Button, buttonVariants }; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/card.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/card.jsx new file mode 100644 index 0000000..041f6fc --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/card.jsx @@ -0,0 +1,65 @@ +import React from 'react'; + import { cn } from '@/lib/utils'; + import { motion } from 'framer-motion'; + + const MotionDiv = motion.div; + + const Card = React.forwardRef(({ className, ...props }, ref) => ( + + )); + Card.displayName = 'Card'; + + const CardHeader = React.forwardRef(({ className, ...props }, ref) => ( +
+ )); + CardHeader.displayName = 'CardHeader'; + + const CardTitle = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardTitle.displayName = 'CardTitle'; + + const CardDescription = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardDescription.displayName = 'CardDescription'; + + const CardContent = React.forwardRef(({ className, ...props }, ref) => ( +

+ )); + CardContent.displayName = 'CardContent'; + + const CardFooter = React.forwardRef(({ className, ...props }, ref) => ( +
+ )); + CardFooter.displayName = 'CardFooter'; + + export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, + }; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dialog.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dialog.jsx new file mode 100644 index 0000000..959f314 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dialog.jsx @@ -0,0 +1,94 @@ +import React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dropdown-menu.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dropdown-menu.jsx new file mode 100644 index 0000000..3cdcf9d --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/dropdown-menu.jsx @@ -0,0 +1,161 @@ +import React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}) => { + return ( + () + ); +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/input.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/input.jsx new file mode 100644 index 0000000..301d837 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/input.jsx @@ -0,0 +1,20 @@ +import React from 'react'; + import { cn } from '@/lib/utils'; + import { motion } from 'framer-motion'; + + const inputVariants = + 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors duration-300'; + + const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + + ); + }); + Input.displayName = 'Input'; + + export { Input }; \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/label.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/label.jsx new file mode 100644 index 0000000..49d53b1 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/label.jsx @@ -0,0 +1,16 @@ +import React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-gray-300" +) + +const Label = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/select.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/select.jsx new file mode 100644 index 0000000..46c2bc3 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/select.jsx @@ -0,0 +1,120 @@ +import React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => ( + + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/table.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/table.jsx new file mode 100644 index 0000000..01b3f6e --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/table.jsx @@ -0,0 +1,83 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} \ No newline at end of file diff --git a/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/textarea.jsx b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/textarea.jsx new file mode 100644 index 0000000..9bac976 --- /dev/null +++ b/horizons-export-dd582fba-3b13-4502-bbc3-c6c66a980f8a/src/components/ui/textarea.jsx @@ -0,0 +1,18 @@ +import React from "react" + +import { cn } from "@/lib/utils" + +const Textarea = React.forwardRef(({ className, ...props }, ref) => { + return ( + (