From 35be3c029b7ec5ff87487bd00f1b2624e46664d3 Mon Sep 17 00:00:00 2001 From: PhaseOfficial Date: Thu, 4 Jun 2026 14:13:19 +0200 Subject: [PATCH] Initial commit --- .gitignore | 65 +- .vscode/extensions.json | 1 + .vscode/settings.json | 7 + README.md | 107 +- app.json | 68 + assets/images/Artboard 1 logo.png | Bin 0 -> 485173 bytes assets/images/android-icon-background.png | Bin 0 -> 17549 bytes assets/images/android-icon-foreground.png | Bin 0 -> 76721 bytes assets/images/android-icon-monochrome.png | Bin 0 -> 4140 bytes assets/images/calendar_design.png | Bin 0 -> 21740 bytes assets/images/dashboard_design.png | Bin 0 -> 22667 bytes assets/images/favicon.png | Bin 0 -> 17115 bytes assets/images/habits_design.png | Bin 0 -> 19831 bytes assets/images/icon.png | Bin 0 -> 76721 bytes assets/images/partial-react-logo.png | Bin 0 -> 5075 bytes assets/images/react-logo.png | Bin 0 -> 6341 bytes assets/images/react-logo@2x.png | Bin 0 -> 14225 bytes assets/images/react-logo@3x.png | Bin 0 -> 21252 bytes assets/images/splash-icon.png | Bin 0 -> 17547 bytes assets/ui/mobile/ai.html | 230 + assets/ui/mobile/ai.png | Bin 0 -> 32452 bytes assets/ui/mobile/calendar.html | 267 + assets/ui/mobile/calendar.png | Bin 0 -> 24864 bytes assets/ui/mobile/dashboard.html | 239 + assets/ui/mobile/dashboard.png | Bin 0 -> 23983 bytes assets/ui/mobile/habits.html | 323 + assets/ui/mobile/habits.png | Bin 0 -> 24896 bytes assets/ui/mobile/library.html | 287 + assets/ui/mobile/library.png | Bin 0 -> 30121 bytes assets/ui/mobile/sprint.html | 259 + assets/ui/mobile/sprint.png | Bin 0 -> 28388 bytes assets/ui/web/ai.html | 316 + assets/ui/web/calendar.html | 364 + assets/ui/web/dashboard.html | 350 + assets/ui/web/habits.html | 347 + assets/ui/web/sprint.html | 303 + babel.config.js | 6 + components/external-link.tsx | 25 + components/haptic-tab.tsx | 18 + components/hello-wave.tsx | 19 + components/parallax-scroll-view.tsx | 80 + components/themed-text.tsx | 60 + components/themed-view.tsx | 14 + components/ui/collapsible.tsx | 45 + components/ui/icon-symbol.ios.tsx | 32 + components/ui/icon-symbol.tsx | 41 + constants/theme.ts | 53 + eas.json | 24 + eslint.config.js | 10 + hooks/use-color-scheme.ts | 1 + hooks/use-color-scheme.web.ts | 21 + hooks/use-theme-color.ts | 21 + metro.config.js | 21 + package-lock.json | 14482 ++++++++++++++++ package.json | 78 + ...D_q-2-Nu-kn7eViVb2lHdu0L6LI5-jogE7lgzsx8pU | 58 + patches/@bildau+rn-pdf-reader+4.2.7.patch | 186 + patches/@supabase+supabase-js+2.106.1.patch | 26 + scripts/reset-project.js | 112 + src/app/(tabs)/_layout.tsx | 71 + src/app/(tabs)/aa_ai.tsx | 3 + src/app/(tabs)/calendar.tsx | 2982 ++++ src/app/(tabs)/hh_habits.tsx | 1081 ++ src/app/(tabs)/history.tsx | 646 + src/app/(tabs)/index.tsx | 843 + src/app/(tabs)/library.tsx | 371 + src/app/(tabs)/sprint.tsx | 1408 ++ src/app/_layout.tsx | 139 + src/app/add-habit.tsx | 571 + src/app/add-shortcut.tsx | 192 + src/app/add-task.tsx | 280 + src/app/index.tsx | 23 + src/app/login.tsx | 313 + src/app/menu.tsx | 260 + src/app/modal.tsx | 662 + src/app/reader/[id].tsx | 169 + .../AutoHideFloatingActionButton.tsx | 127 + src/components/AutoHideScrollView.tsx | 25 + src/components/ErrorBoundary.tsx | 70 + src/components/FloatingAIDock.tsx | 141 + src/components/GlassBottomTabBar.tsx | 309 + src/components/Library/AddBookModal.tsx | 178 + src/components/Library/BookCard.tsx | 128 + src/components/Library/BookDetailsModal.tsx | 391 + src/components/Library/BookGrid.tsx | 90 + src/components/Library/LibraryHeader.tsx | 74 + src/components/Library/LibraryStats.tsx | 67 + src/components/Library/NoteEditorModal.tsx | 138 + src/components/Library/NotesPanel.tsx | 140 + src/components/Library/PdfReader.tsx | 464 + src/components/animated-splash-screen.tsx | 125 + src/components/chat/ChatHeader.tsx | 77 + src/components/chat/ChatInput.tsx | 106 + src/components/chat/MessageBubble.tsx | 155 + src/components/chat/SuggestionChips.tsx | 87 + src/components/chat/TypingIndicator.tsx | 48 + src/components/ui/CalendarStrip.tsx | 390 + src/components/ui/TimeInput.tsx | 285 + src/constants/Theme.ts | 132 + src/db/database.ts | 195 + src/db/database.web.ts | 12 + src/hooks/useAIChat.ts | 118 + src/hooks/useAuth.ts | 41 + src/hooks/useAutoHideTabBar.tsx | 120 + src/hooks/useChatHistory.ts | 87 + src/hooks/useData.ts | 108 + src/hooks/useHabitSummary.ts | 33 + src/hooks/useRequireAuth.ts | 13 + src/hooks/useSync.ts | 34 + src/hooks/useSync.web.ts | 7 + src/hooks/useTheme.tsx | 245 + src/lib/ai.ts | 26 + src/lib/date-utils.ts | 18 + src/lib/file-utils.ts | 135 + src/lib/habit-logic.ts | 195 + src/lib/supabase.ts | 18 + src/lib/sync.ts | 602 + src/lib/sync.web.ts | 35 + src/screens/AIScreen.tsx | 286 + src/services/aiService.ts | 47 + src/services/chatService.ts | 85 + src/types/chat.ts | 11 + src/utils/formatTime.ts | 5 + supabase/functions/chat-ai/index.ts | 121 + supabase/functions/process-book-ai/index.ts | 50 + supabase/schema.sql | 407 + tsconfig.json | 17 + webpack.config.js | 27 + 128 files changed, 35795 insertions(+), 30 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 app.json create mode 100644 assets/images/Artboard 1 logo.png create mode 100644 assets/images/android-icon-background.png create mode 100644 assets/images/android-icon-foreground.png create mode 100644 assets/images/android-icon-monochrome.png create mode 100644 assets/images/calendar_design.png create mode 100644 assets/images/dashboard_design.png create mode 100644 assets/images/favicon.png create mode 100644 assets/images/habits_design.png create mode 100644 assets/images/icon.png create mode 100644 assets/images/partial-react-logo.png create mode 100644 assets/images/react-logo.png create mode 100644 assets/images/react-logo@2x.png create mode 100644 assets/images/react-logo@3x.png create mode 100644 assets/images/splash-icon.png create mode 100644 assets/ui/mobile/ai.html create mode 100644 assets/ui/mobile/ai.png create mode 100644 assets/ui/mobile/calendar.html create mode 100644 assets/ui/mobile/calendar.png create mode 100644 assets/ui/mobile/dashboard.html create mode 100644 assets/ui/mobile/dashboard.png create mode 100644 assets/ui/mobile/habits.html create mode 100644 assets/ui/mobile/habits.png create mode 100644 assets/ui/mobile/library.html create mode 100644 assets/ui/mobile/library.png create mode 100644 assets/ui/mobile/sprint.html create mode 100644 assets/ui/mobile/sprint.png create mode 100644 assets/ui/web/ai.html create mode 100644 assets/ui/web/calendar.html create mode 100644 assets/ui/web/dashboard.html create mode 100644 assets/ui/web/habits.html create mode 100644 assets/ui/web/sprint.html create mode 100644 babel.config.js create mode 100644 components/external-link.tsx create mode 100644 components/haptic-tab.tsx create mode 100644 components/hello-wave.tsx create mode 100644 components/parallax-scroll-view.tsx create mode 100644 components/themed-text.tsx create mode 100644 components/themed-view.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/icon-symbol.ios.tsx create mode 100644 components/ui/icon-symbol.tsx create mode 100644 constants/theme.ts create mode 100644 eas.json create mode 100644 eslint.config.js create mode 100644 hooks/use-color-scheme.ts create mode 100644 hooks/use-color-scheme.web.ts create mode 100644 hooks/use-theme-color.ts create mode 100644 metro.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 package.json.2D_q-2-Nu-kn7eViVb2lHdu0L6LI5-jogE7lgzsx8pU create mode 100644 patches/@bildau+rn-pdf-reader+4.2.7.patch create mode 100644 patches/@supabase+supabase-js+2.106.1.patch create mode 100644 scripts/reset-project.js create mode 100644 src/app/(tabs)/_layout.tsx create mode 100644 src/app/(tabs)/aa_ai.tsx create mode 100644 src/app/(tabs)/calendar.tsx create mode 100644 src/app/(tabs)/hh_habits.tsx create mode 100644 src/app/(tabs)/history.tsx create mode 100644 src/app/(tabs)/index.tsx create mode 100644 src/app/(tabs)/library.tsx create mode 100644 src/app/(tabs)/sprint.tsx create mode 100644 src/app/_layout.tsx create mode 100644 src/app/add-habit.tsx create mode 100644 src/app/add-shortcut.tsx create mode 100644 src/app/add-task.tsx create mode 100644 src/app/index.tsx create mode 100644 src/app/login.tsx create mode 100644 src/app/menu.tsx create mode 100644 src/app/modal.tsx create mode 100644 src/app/reader/[id].tsx create mode 100644 src/components/AutoHideFloatingActionButton.tsx create mode 100644 src/components/AutoHideScrollView.tsx create mode 100644 src/components/ErrorBoundary.tsx create mode 100644 src/components/FloatingAIDock.tsx create mode 100644 src/components/GlassBottomTabBar.tsx create mode 100644 src/components/Library/AddBookModal.tsx create mode 100644 src/components/Library/BookCard.tsx create mode 100644 src/components/Library/BookDetailsModal.tsx create mode 100644 src/components/Library/BookGrid.tsx create mode 100644 src/components/Library/LibraryHeader.tsx create mode 100644 src/components/Library/LibraryStats.tsx create mode 100644 src/components/Library/NoteEditorModal.tsx create mode 100644 src/components/Library/NotesPanel.tsx create mode 100644 src/components/Library/PdfReader.tsx create mode 100644 src/components/animated-splash-screen.tsx create mode 100644 src/components/chat/ChatHeader.tsx create mode 100644 src/components/chat/ChatInput.tsx create mode 100644 src/components/chat/MessageBubble.tsx create mode 100644 src/components/chat/SuggestionChips.tsx create mode 100644 src/components/chat/TypingIndicator.tsx create mode 100644 src/components/ui/CalendarStrip.tsx create mode 100644 src/components/ui/TimeInput.tsx create mode 100644 src/constants/Theme.ts create mode 100644 src/db/database.ts create mode 100644 src/db/database.web.ts create mode 100644 src/hooks/useAIChat.ts create mode 100644 src/hooks/useAuth.ts create mode 100644 src/hooks/useAutoHideTabBar.tsx create mode 100644 src/hooks/useChatHistory.ts create mode 100644 src/hooks/useData.ts create mode 100644 src/hooks/useHabitSummary.ts create mode 100644 src/hooks/useRequireAuth.ts create mode 100644 src/hooks/useSync.ts create mode 100644 src/hooks/useSync.web.ts create mode 100644 src/hooks/useTheme.tsx create mode 100644 src/lib/ai.ts create mode 100644 src/lib/date-utils.ts create mode 100644 src/lib/file-utils.ts create mode 100644 src/lib/habit-logic.ts create mode 100644 src/lib/supabase.ts create mode 100644 src/lib/sync.ts create mode 100644 src/lib/sync.web.ts create mode 100644 src/screens/AIScreen.tsx create mode 100644 src/services/aiService.ts create mode 100644 src/services/chatService.ts create mode 100644 src/types/chat.ts create mode 100644 src/utils/formatTime.ts create mode 100644 supabase/functions/chat-ai/index.ts create mode 100644 supabase/functions/process-book-ai/index.ts create mode 100644 supabase/schema.sql create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index a8b0d1d..0c2c5f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,44 @@ -# ---> Android -# Gradle files -.gradle/ -build/ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files -# Local configuration file (sdk path, etc) -local.properties +# dependencies +node_modules/ -# Log/OS Files -*.log +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts -# Android Studio generated files and folders -captures/ -.externalNativeBuild/ -.cxx/ -*.apk -output.json - -# IntelliJ -*.iml -.idea/ -misc.xml -deploymentTargetDropDown.xml -render.experimental.xml - -# Keystore files +# Native +.kotlin/ +*.orig.* *.jks -*.keystore +*.p8 +*.p12 +*.key +*.mobileprovision -# Google Services (e.g. APIs or Firebase) -google-services.json +# Metro +.metro-health-check* -# Android Profiling -*.hprof +# debug +npm-debug.* +yarn-debug.* +yarn-error.* +# macOS +.DS_Store +*.pem + +# local env files +.env +.env*.local + +# typescript +*.tsbuildinfo + +app-example + +# generated native folders +/ios +/android diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b7ed837 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1 @@ +{ "recommendations": ["expo.vscode-expo-tools"] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e2798e4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit", + "source.sortMembers": "explicit" + } +} diff --git a/README.md b/README.md index bb1f63d..c1a4e02 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,106 @@ -# nextgenmobile +# Atomic Habits AI - Habit Tracker & Personal Library -This is the starting point for Mobile App Development for NextGen \ No newline at end of file +Atomic Habits AI is a cross-platform mobile and web application designed to help users build lasting habits through a science-backed tracking system and a personalized AI-powered library. It combines local-first performance with cloud synchronization and AI insights. + +--- + +## 🏗 Architecture + +The application follows a **Local-First, Cloud-Sync** architecture. + +### Frontend +- **Framework:** [Expo](https://expo.dev/) (React Native) with [Expo Router](https://docs.expo.dev/router/introduction/) for file-based routing. +- **Language:** TypeScript. +- **State Management:** Local SQLite database for offline-first capabilities, synced with Supabase. +- **UI/UX:** Custom design system built with `Vanilla CSS` (via React Native Stylesheets), utilizing `Lucide React Native` for iconography and `Reanimated` for smooth transitions. + +### Backend & Cloud +- **Platform:** [Supabase](https://supabase.com/) +- **Authentication:** Supabase Auth (Email/Password, JWT). +- **Database:** PostgreSQL (Cloud) + SQLite (Local). +- **Storage:** Supabase Storage for PDF/Epub books. +- **Edge Functions:** Supabase Edge Functions (Deno) for AI processing and book parsing. + +### AI Integration +- **Models:** Gemini (via Supabase Edge Functions). +- **Features:** Automated book metadata extraction, AI-generated reading insights/synthesis, and interactive habit coaching. + +--- + +## 🔐 Security + +Security is integrated at every layer of the stack: + +1. **Authentication:** Secure session management using `AsyncStorage` and Supabase JWTs. +2. **Row Level Security (RLS):** Supabase RLS policies ensure users can only access their own habits, books, and logs. +3. **Secure Storage:** sensitive files are accessed via **Signed URLs** with limited expiration windows (1 hour) rather than public links. +4. **Local Encryption:** (Optional/Roadmap) Local SQLite data protection. +5. **Environment Variables:** All sensitive keys (Supabase URL, Anon Key) are managed via `.env` files and `EXPO_PUBLIC_` prefixes. + +--- + +## 🗄 Database Schema + +The system uses a mirrored schema between local SQLite and cloud PostgreSQL. + +### Core Tables: +- **`books`**: Stores library items (`id`, `user_id`, `title`, `author`, `file_uri`, `current_page`, `status`). +- **`habits`**: Core habit tracking logic (`id`, `user_id`, `name`, `frequency`, `streak`, `last_completed`). +- **`reading_logs`**: Tracks progress over time (`id`, `book_id`, `duration_seconds`, `pages_read`). +- **`chat_history`**: Persists AI interactions for context-aware coaching. + +--- + +## 🛠 Running the Project + +### Prerequisites +- Node.js (v18+) +- Expo Go app (for physical device testing) or Android Studio / Xcode (for emulators). + +### Installation +```bash +# Clone the repository +git clone +cd atomichabitsai + +# Install dependencies +npm install +``` + +### Development +```bash +# Start the Expo development server +npx expo start +``` + +- Press **`a`** for Android emulator. +- Press **`i`** for iOS simulator. +- Press **`w`** for web. + +--- + +## 🐞 Debugging Details + +### Logging +The application uses structured logs for critical paths: +- **`[PdfReader]`**: WebView lifecycle and file writing logs. +- **`[downloadBook]`**: Sync and storage fetch status. +- **`[resolveFileUri]`**: Path resolution debugging for iOS container changes. + +### Common Troubleshooting +1. **Stale iOS Paths:** If files don't open on iOS after an update, the `resolveFileUri` utility automatically corrects absolute paths that contain outdated container UUIDs. +2. **Sync Failures:** Check the `performMutation` calls in `sync.ts`. Ensure the device has internet access for Supabase connectivity. +3. **PDF Reader Crashes:** Ensure the library `@bildau/rn-pdf-reader` is correctly patched via `patch-package` to handle the Legacy FileSystem API in Expo 54. + +--- + +## 🧑‍💻 Backend Developer Notes + +### Edge Functions +Located in `/supabase/functions/`: +- **`process-book-ai`**: Parses uploaded filenames to suggest titles/authors and generates reading summaries. +- **`chat-ai`**: The core engine for the AI habit coach. + +### Storage +- Bucket name: `books` +- Access: Private (accessed via `createSignedUrl` in `src/lib/file-utils.ts`). diff --git a/app.json b/app.json new file mode 100644 index 0000000..1eb324d --- /dev/null +++ b/app.json @@ -0,0 +1,68 @@ +{ + "expo": { + "name": "RCS BatsirAI", + "slug": "atomichabitsai", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "atomichabitsai", + "userInterfaceStyle": "automatic", + "newArchEnabled": true, + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.phaseofficial.atomichabitsai", + "infoPlist": { + "ITSAppUsesNonExemptEncryption": false + } + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#E6F4FE", + "foregroundImage": "./assets/images/android-icon-foreground.png", + "backgroundImage": "./assets/images/android-icon-background.png", + "monochromeImage": "./assets/images/android-icon-monochrome.png" + }, + "edgeToEdgeEnabled": true, + "predictiveBackGestureEnabled": false, + "package": "com.phaseofficial.atomichabitsai" + }, + "web": { + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + [ + "expo-router", + { + "origin": "https://atomichabits.ai/", + "root": "src/app" + } + ], + [ + "expo-splash-screen", + { + "image": "./assets/images/favicon.png", + "imageWidth": 200, + "resizeMode": "contain", + "backgroundColor": "#ffffff", + "dark": { + "backgroundColor": "#000000" + } + } + ] + ], + "experiments": { + "typedRoutes": true, + "reactCompiler": true + }, + "extra": { + "router": { + "origin": "https://atomichabits.ai/", + "root": "src/app" + }, + "eas": { + "projectId": "5f2929a1-ae47-4616-a893-8c7161eaafe9" + } + } + } +} diff --git a/assets/images/Artboard 1 logo.png b/assets/images/Artboard 1 logo.png new file mode 100644 index 0000000000000000000000000000000000000000..10c69b18dd57bac22e53b7a099b95396dfc4abff GIT binary patch literal 485173 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%0DKB-?P{uX^X~yCSS69|tgQCWi&e8EgvH36=p~H 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 uM0oOZCQfA6Z1G)(|wbqa-u#`Hv2*@VXyA`VR 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�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

2!;Py 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 literal 0 HcmV?d00001 diff --git a/assets/images/android-icon-background.png b/assets/images/android-icon-background.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffefc5bb57a3d7b39ec6ff4e96979226522cc49 GIT binary patch literal 17549 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 literal 0 HcmV?d00001 diff --git a/assets/images/android-icon-monochrome.png b/assets/images/android-icon-monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..77484ebdbca253297baea4a7d416233aa47a45c0 GIT binary patch literal 4140 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 literal 0 HcmV?d00001 diff --git a/assets/images/calendar_design.png b/assets/images/calendar_design.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff75131c7f86f97ae051f3979e23973ed2a3f1f GIT binary patch literal 21740 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 K&K2v}Kl&fNoYOY| literal 0 HcmV?d00001 diff --git a/assets/images/dashboard_design.png b/assets/images/dashboard_design.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e347948a3ef95e500a6fc1c6050c4ebf638dfd GIT binary patch literal 22667 zcma&Oby(Bk+c%67jt~%$a#BttMu-yzA~8BeKuT&zON(?!3rGt{ONoedOEYjF($dWc zk!Ezhm%rnK{}flSUnog*M%B~X-+(sEB*Z*==;(2*c+ApE8m{oTtsBNjoU zfVy%o0H*t%qI`#n(6srUdzq7I z1E?1~n4?-6whPe z-G+vSCte3|-BMO4WkU}Jj|TnYG<>FG-Eo`RnGa<-@fNS$)oDH%{tO2lhepy~}YM-uum)ea)v&p6lu!B{iQdwUP7Fx`p3UPHb@qL4yUT z)aON6f%lo|ci|z%EDvez*x%njoblTFrdNTC!ZZ!eyrquoGE>XP zeR{Y>A1?EZ7WF49lv%&tl^4~y zby%py9TbDb9dBc(8jVVfO8T10Oc>}QI`%xzesb|KtdjB;>stn8(D=2rEj{bYm3 zLxWG+g>oeC@(YXacHZ4_Z)j{hZ}BG#lezkx0U;Tr&K~<`b931vgY_M~ zk^8?j@bT~v!8*k%m^nJeutE})_Qx$V&3*A@EqHG`yCS(9y>c^B*=OJeb<;NLE_>^X zeQVL(=BIONXl|B>RmjySSRKl*sjQ5F6{vHX3F-+jEFvl8!nL?NoYFK3zJXONDUpY$ zW{Tfglod?=&}D{D9UU1FP4AUt6|kGAytugN?d>fu7p$M286Cyqy`7w#jEz}bSVGW_ z(9u;F*ZL>4WU}nBXJ==+@R7+$WojbTA;(7T!k#9cSQsM(i6NhkwRM33AN@(Id&8#z z`>U7v=``Zxos|AcT^4YIyG_Uq+9@6v6?e5|!r+R9*2f#`UB}3>sO0d@=HBHIV_58v zTV5yK(moOsGcYm|Mla}#7>1Ant*^1MHwuTzesR!{hG)N*!;Q&}#O;pZAOpkx}v8OEAT+!!{I{uZ4y4fjqQi`9rIY$e=vyMDxP0 zU#U?ATHH*LHVCFhqiFO;R2GEjs!f&X>!Nkrx9#6Quo|})CjXJCV@;&DZthqhHUHM2 zSlpRzmkx=nFuE4;zI5z9+Ep~3K>5@5iY`Yh0+RSkk*lckPNMmEaWP*a&Oq%x>Q8nA zUrPCi+K`KvmzMwo(JEauHX=Nno144kK!8qw;x;q0?^;pK&+cyi`t|ame7Wx|jrh%a z9iP)lD0WBea{5)V$9{qiQO<5MNeG%&Rw~n6FA+U1eT}N=>?hCD^W(m_S-C&cFhx*} z?Pr_LuSp#F=PFvEI!i0&-CwnJNUP3=Cy7K$YeAczp9C8oFwQ*0|` zHz1e>=jsbgF^*QY)nVSy@t%U){HIU*-soX@tAT7;Wjg+u3QMZ@qzf+~0SYi0D7H1; z2^uO6*%D2URm*1KTHICLY7}veF2P-wf%Rf6fEMtgM{WN~1Z**$1vUce z78*km(NPW>QB+iviNGH!A~JIFSFdcuj~C<5uTf5wxo#}?q#kZe>S$;yWRZ8wT|;#)#)k~LVfs}62sHREuWH{9Kv>nv91}9!)aYO$t*sc zr$hxtGw*oR7QrX#aaWFJ<$HeeW^Kd? ziWT@Jaj`>HE66}GbJn;;I&%e--ds3mA|eN(Okyu-~8{S+nScLZQDZyDSOAj-PQScir6SM3h znyzLkEsc5DCx(x7@XpE2HFJ0Wn9Z4J-eZCHx-HyhP9#+d?-rn_^`WJsOZ@O*4p}^G zvvuC%0B+fRvl=?qf#|m>BCnTiFXjRPtcZ(?J2*H1Cwi$nN$2@<|1Ztw2a~a#LBH^4 zb8~a+ultI=eG77ZVQ6@rIDnr^<%4dNG-P9{4*xmTUXUrWA91iTPFO{gB$cNzK#?ou~y$>j-p0!(uDPAXK4*ic9{q;?0H7YVFV~J0z^`kH8sun-p3ss z9ZO3~NDS2Wds-lTC3Cuuhjdkq!oLhM$}KqBl-@V}73?EE_L2J3dYt$S(T~;Evha z_40{{3FET``l6yDa9JGj!I*ha`~FNiMyTbV9{2fO0BF)m3@*2_k~JtqjQK%oe>7k7 z*>0Y4k{tVu+FH=-Xvs(`A}d*}T+DOw3(47Jo@udCQ!6PyqgDASZ|a<9zL%ed3I?n|`O!->tashmy4(&OopsLv5X(eBB~_>>C+Fp- z=H}0z<#Glbp>8`J^nSJG-8s?X6H|jU5!fWSkr)!m5FuyzdwBJYsBY_@wXMttFGGfH z8ZS=P{PuEKHpVOR>*^SzB!^5GJ{J}7LMe50bkSxdG-QCA5DxN=o zzA@X}Tv@r7_PV!j_r+}7vkxj9_!IAptgPK#=U~*0Fd3%Q6!)m^zCQX>E(=mpA9^TE zN|&tsW~5EFx+gV@K%WJJTrB~D&+2lnhP{cPQZRhs!{d9br+OX>gQ2>;txxucEu&mUPctynjil4++5dCVi##ySM_2#SpP zk}#R20Zu;VG-PQtj z%rfSDh=Uxr(=ilTbvB?G#*gIt8iGS2r*FXxQivLFh%}w zM5@HWREL-%EzU~Fe8O2F0?V%uOwF^G!EcDMq|j)Y9I`qn+XtmQj>_Y|hzA_}L{gw- zzlI*}U|Eda=Y!`J+LxTU7Qr2S01i$_2ua3D-;=|s8znUbWw90?wYZ;a7)*_h);KTy zOiWCS>Q&2F@pJ6v-5dKX0mWV;A(@z%Tw4QciD3~E7CziR)OoHA@KFTc_b)a1`B`NH ziAmQCSVUd^jJ$Ao;uENss9lL$xmD|*G2syrfYcwgtI&sn@^XPp6UlMIw$Hj9g5wFV2S zHX%L8$FO!com8RZWk#5=`G{kAhARi_fYIlL@%zRNxH82`a=iK#vh<$3rmg zQ5e#I735fTOBp;0r-1CnGw6=W39q&0xF20{t%bW@eR{8aff(bY^Wp_N)AKLG9_Hq) zt*u!zM#|_cKP!co0=YD#ucgqZGf!kIEN&3ZzZQK($G0x(`abN(qNkxC?Z}dzGzR05 zm)97nO8h(looW18U53#2mG!FQQ>uG9omEU;9wKf+b`5=BS3zv7Xh2;1fUsh6^>8={z}CE93^Cqz&01kJDb z7(ZXCR04hg#s$UF#451UNLdao-kqi-$KMTGa}>J~##uG-uCL?)6Eb6kP5eq<1-!cq zelJNnhCIs;P1ITeZxeuGZw`DhC|cG{WbJb2%pF{NnH7U7van*h4@pG3N9FXEz8XVz zrm>iJlcOMu!Igyc@8Xk@ok7so5+f*t}4w$^q)-GFuZ`}+ejovh+I*K!3^igC+H%zWvb{7UKM z8&N~S~I78W)(-eG^eK2`VH%IZr|W6y?biEddoXh-$+FMgri z+=SbilD#?9WU3qHkm3UUmzkr+RFluR!pTSi`I3f~oIT{_NUmL*o!m15{PDG)SMQRu z-AqGWNeRD1^ITEQER9e!Hv2&^YG7cX%%yA4Ob{GfZXOh!@BVvw}BlLf(!tvPs zj|rgDL#qJz!onPijC^`URAMNJ}51%k5^dsWn8DsXl!f*7(lanJB^ngrr5N% ztNhTixBVY|X?}890~CdR3d0wgnz~vp+jFf6JUSU(n{^B!0DAEn`#uOkr%FsUn03)? zYj+5I^D}viX2{bh&@L2isK^3%wXW`XA%bri>DxE+1iT1~cPaQfsRCZ_b+}nG<5}Ny zft0a$D|~Y9i{3h>W#ut)ggV&S?H_vsPQE>lVe#H>HO{yom!f9zJKG7lzSaJ+42Vcc zMxIXH@-HYzFyO}Rdtw0TE;g=^OS7H3Jng%L^MMzPS~<$RSj>m8MRc?Y{7U3ynK@1M z!tJ<&Vk_h0h3gU4E-^aaGrkxEASLby(DRk>hTMFD@m@mrjC{`U&(>oP`Gd?&7)V?x zWOANW>8r*qPCOnFKWYgSPzxi@74UysN!!ozvWy|9E-+C2_1FfLM^sSciKW(v#Vd)Q zL?P(@+~b>sS){U|d(uyyJZYOt(Y~2Q4oL_yxYK6d_LA7rZT>ecg{1Yz&ITu1oc9wb z)?ARWlNiZPq{y&l-STZ)lFcfRTGg^)@FfG0H^ZeMg6Xm8w@UqdVFwuqn@pV9%a=Ia zlv^R_$r^{tBV4pUWdJMX9dVaG{aIzGzZ?b4AP>6NW^kJZ8_MEGtAxUW)hw00FIRY&VWXiShUl3RgK?-NL^Sv2iyG#v)ur+E+Fa2Dqt515FX*c zuU}l-G6q;uyt$;Q>EdbhB^OiV=2+QX=4fNL={G>{$j@KNFrIx`Gs)ty7z>1!$D6f; zm{LjB?TM37*UhOqw^^eooK;GQjS0i@zUNABa-jy-J2$k8|B}x-h?&$fGh3$ycu;rtP;j)`CSps(c1?{qlUvZ+36y^Y`!H zZ#&f9!0yb?&ja$NmMLzSrQT0bVS4Nwjg7bLF8ubb0q`Fnr`~)j?u79>*8!a5*Y{*_ zym%5zs0B~%Jn?h^+Fwc22~f*?d)!JyT-O==Z~C13XcxXQGh3W^RkGwUV}^LH^IXF5 zlJM5jt%QUGvfzcr!x>FZTJAjVSOr>o`jwRxzsu8EAWdAXSM)XQ7ddPk*~;r#j{}92 zj^9Y^xPh8z;P;f4fq@{ZGUYs(}Cxn}7oB(kK7c+F4+WUA*3{=qR>GPiFvtqtywLKO?Yx|={ zUPT6ceHF`2P|KRh(I@qrA-5f%P!}LC$HK}i`(^+kQCudrDIT`kaIK%Vmspv4ebrwQ zEOU*vUxc|{X5anzE{%c@lN-L5frpkoDgWeXVmy5iW*)F~AZh_*=r|u>BJf3>Q^J%?G?j%GL(U#-=@kU-eaZMu*=N((*NAt+#D3>0xg;ypnwA8 z)|)B8QaoE}9Y1cmxw*;5&mU^iDIW#ZtF}$58z?GKEE3{& z6Nn&nI9;lQpSTotDCHd>R1p&s%jJ|+RXu8EHO?Q_gVSa9)tIzi)#Y}uwoZQZO54|0 z9A!0d95H2oSZ>}8F0#~WfW80ya&P)$u--a4`Rbek6tC>e%} z+o1c1j$>euQZCL4F)=)Si-L$T+2`i_Bk{a^HA0` zlR&&`xnuGxDQ}5K@t5FDVb&3dl(&FqGWeuA9jdY}>$hC|`-VjW-1uzB(##d0C z&(z;i?-F0_l9@6s`^jn3zuEwfl6~FMsoxonWx$I3o?>}^zU4%veo)L42^Q=QC~~C1 z?=31cvJ^gRj2hslkICs8npb`DG?I^hXf6h4e~A`9`GcRX$CHz%6B53tv42tL+;Oz; zMoIDhwJY@YLo<%L?KbjHp4(|W#SMeDg3a4)cu1C5z2OVpTKj3^9y)wua~*ve699je z)>S0&ig_BXy!1vc&&*|)Mxtx>UES8+|2S)FJ3l?}IZWAV05m&q2-WFZTp zJ{d0YO;8%Jsx&;?FIfxn{XH?k0X1&E*pG_p9T}-ZLz6|~)Pm_#ESPJFyZ>CL;=fu*pmLYZMxOx7A~h z4a#qAb{Cs>uDgLcIP;c?)A3n(Ol^1w^T_&fEebb1J>7iN(Fg8!Xj<>6(TkGNwTd#_ z4wQd!k~&1io|css5&#KC{WCglJ2X5%Ac%?)8yn!o?Z2-sYjNLW#%UC285&OiROZ_u zzABotlb2*n(sk7#EEMB*`FFF@AMnzO@w1jds_*G)q0<*5sSad2^u#K~&U=&;+^ zOm9@bXVdwH1B--_v7uq3%eV%NX@I}^>^8hR`(fX&%!|GJ%EXVn{K%-shP^Bo+uC4n zymH*GTe+~P(trAsywWl&_*iG-`1rPP)9BzJTpYXrOi}!-UmB8S#=XkPsas(YX%h6b zW}OD9yLtn4e0A@Iu(~Sq(gZm%2IIyamjq9)7s@PB8t&9#$e21|-a1SY{sz zw)Qe$QDk%et=z?$U#rqjH=2cSwF}sGj}(zqj0=l7U!ETdBZLIl@lCqDK+^-j)1?fjuDKKsGrRvXtlz70w$it=!XAWcuGb^vmU7YhLyx*X;%dFT> zaR)+j14U9HvhksoXB--3#(gUSyV8?>3Ov_~edFtU<5eDo1}gYw+!( z-nV2crH_MN0V@I4`glj=sQ$L_*ZuDb2vN5gvF#z+ULf;Yd<7CJ^ocVqTRYyne|hb$L{;QJ`M%AzI=Bc|`wQTbsZM^A*hNA{v zMUJCjGb1sjfPayqI+q>C@c0|3lI9&bu?&S&Vezx=yVBCkABi|<6h8{<2YbB4{b|^_ z@awtlw;jl`cW}_k+hz7OE6Zu(J)_MuJ^sf=rq4m=-RLw?ew<24U@P^{kHS|IUTxJ% zt6WD}T?7ytH{6y!4h|O0x$&VU*jVoduRjmB#%H0jSpRwoZQ>F_o zrXUJf;n#qi&021j!4ZtBs3&6G`MXK{`i9v_sG~ zuU-ua6~Arv6Z{8mAtZrfeZZ!ypXST>U`a<2wKhpnN2NVI*jLGdVW(VmH4W!lcBTkHiQk9)J?iT6f2nQIjutv#qOSw28gVz zu>EfkRbeG~rTHsngG*Y&FR`;Ek?`k!PFc+VkDtw!Zt3y2duNILHG51i`55~}(U*A- z=4_2HDy8i>pZ?;KYpk3<72Tz9Acxz8wGP{aPRb=#cX^^9`j(ey z=Sbg66O*^uoKd(+eLDw-lK&XW2vvGo+RCabu7sa$ZEe7?9eXP|1l(rIU=;9x=_0HV zDS(%Thle{s&3c8*hND{yuV20S*G05q92zFmHZNeN+;4@TzDakM%n%YLmjlWAmnwj| zi@(KVl8b)kvQIO&2&iz<{`^MhYRYuGmVldLTK?V7`v|fSw8>UEwco*dZpey9x>^!l zyW3S?vt&OMt28VQY5IVu{=Ug&IICL|cW0#h{|NSNJ^UqAKXpr!MaIv>Et%i<;a8D= ziWj*lTYXFj4m1eH1hleBQG=|@@ru_$i_DGNsyz44LRdhN7IUW-tbX^@Uj$Wa1U-DR z0f$D**EGvH@t%;7f!pkrZH_2M4arvs+@LUOYe;;;61+X6S;=EN(T?EJ&7{7e+bJ3Q!tHB?U)9g#nIxLIG{ zR~^zX8d-HIhu@|M7NCf@PlGbMCz`N;q@3vxP?7cUu(n>!c;ZD9CWBzQ!^~`OOD7-U7cp-At50X6Z%2aj%dMT1XIsIjyz)sTBJC;p`oP2;m3PM z*3#RzZ{zX!BJIL$zBm{NWJRFI+Jeb}zBOfEqhG|w#RWnM+zDSRD_yd)p20@f%9n^E zinn z&Btb$D&S1IhRrv5gETZ!yKX%~qq}$OtCP^tl=7~##l9g026Vj^!Af%0dkIS5E>w&- z3tll|y-baPQ2NH?Nam0ge@gY&?E0*l`pF++DfMQi8CYFk^6pKxWNW^+-G3Fp>gnkz zhQV;;JYbH-;+())i0=ZS1QLInf7b8$>0#*I*p$CEp_qZ;;o*r1(N`mIz%dz_FUI?P z4^)7l#R@`WOG=h+mCU=Hr6HZLMrw#x?+0taqGm zt9!ld4gNEx6JUk?wNV^{Ma^WNkcRpJ{%*-A`4Eu2>)f`C;$Up7go^<5!2xUrOJh@| z&k+xVJhmX#Q+AOQ19BnsDWN|&_@Nj;SHOAn0dHB=Txe=N_7*=B+mj}Ocj$XkW8O_y zGJ1M(jm7278<52a#mr;mqu#qWGKA)PIuFZwlT60>pfHZhSdfR*X?Z97*lV596t@Nced zVIRP0$&!1PO$2Jqy5cJAEQz9UAP)kdtA3FXKY!mtgqEfzVON!!r$hCIY=PDS(nwP? zXK0n1hg*#KsnfF?vd^;A|9mqXTJe~%Lhuakgidnf?sC2HeUSDj7gYS$NdOz z`wC9bYD^Tlx!<+8R5`-<cjOM9{ZvNwO|+_nGnTfX9)Y#Yeh8nhJp z#ae1t9^LGByFW1Lg!*Jwjf}c2Wq}qos}vrk!%-* zM|q0?N=#e#WImDCb|iVT9VAaaeKG;3KmPNUGgR2;WRLNoMH+CB zWHq$lO!pvHcXey3YH&y+Bkd6hffj-HC_Z7PNNH(lKvr@FKb68PtJJ0ZG~TdX)Pfb zO-?61Kgabe-x(MC-%`@BA2}6Mm7=RL-yB2%NypG_`SF+)uP84{h)#a^&LwFP-?e|& zdU3J%zy03-%38lPZOF}Yxv@}~b+gJ$F;av#W>PmP{hq>#Ib7Ip8=}S$@7tUS%npze zBMrrX?B_zew5`zC8x{!BoXDKRRnmmEc}KzIMI;|h7*Swrg;##NXpQh=H^UTmlZ-^Q}eZ}X!ujs3xF}^kx|*4Rr-eN>I7(GYLrr59P2xv zdJkAJgs?$SMcUHJT);c?m|4Mh;6Uta$ytPGIq=A4?}L|vS@gFFavDMuNg|047L=QY0(pd7*}AH@QS&e|KC%c8}1*32qi7uXmf|; zwHr(rgb)bYFqw9xaHEnMUAVE1P5BZ?U;>Mhe1a(iZD(hPN<+QF-sALYyF`XKv0u`{ z2A6{DdQ7SKTa8t`mCi0d_=J$|-IYqhdp6QV$XY!vt^W=(f>~Lu78M=;;_0ahFyM5y zv`9)xUFpNy*G$^i+yzm!k3AMSoFFZ!TmmvA^ieV{`n-L3q12uw=cUI`-XajWjg^1* z**ZakF;Wg-rqMN!DWm>$K;gvpgXk57vHPj1r3=YS$JII_fkksS zse51aP85ip_E^Yb z{ljDx@H-swH*%ic>qC^M2rnRK03+1Wg1MdoCJ0~)O&?Xq99H$qkIawD4^9`7Pe}^Ph7&%INV_X;4L{Wrl51!7CGS_*$MQ{kIMO>bF)_ekh-Imd` zt`NjuzTFwtd~1vIlKy_pl~$}znvSuS;I?Yr-81UJQq6H?!agViy)UnN)iY!h@h@M#%y}5G0gwwu7&HoK z7hYsu?{sDEA0OwkI=6DMP}kGrf-|v#nGEXt$#kyKQUSN-txeK$teJwy8*VV+#$T$X zNQ#vM$T0sjW2J-f<0tXtDjHGQ39eEEnPp!a?Nwk{!*H?bPkMX@oxbmMHWeRDa9iYu z0R!cu?v(li=iMdp9#wc2+V{hf(P9aExgCF(nV_cM4GnryY26fNxDjc{2fa^o?}o6X zBy?;Wq+;?7(>k_dHyq{m(@B334hDFT-r|6muJooORA0d9B8HhFWvEdgid$8c@Zm!# z9Go!VU7j7|M@x+ThM()~AM8KZ)-qwJez~HSprNO)KQT3BE0p@`)vG7WeRFdrz>?(S z3!w<6i@3)?2E<1sQdd_!MkTK;E2hKr3icbYPBYnTI8-+i6B0l~5QmMXr>C!}t_Ita zmX@|3(SvU=;L8M#mb7%>xNVdS`_Ug55YR#5@{Nn@51f)b9bu@4zZf@KZoWuTnmnX@Yh@0qM#*URzjI2*t51ZN4s89T&Izo- zp;b69FG!HR_7P`+XWicO%o+G|cnWqO$e{IY0i~yE+!n$Xia}S5!|BLr^0pr`Md}wN zn(LK}KK7Xayys?Edvd(}cyBaFu!56a3kC6W+ho;;KDmlSPH6=5ZWi8Ai0*F$Wg@cP z2g=LDN--)N9cyo5M)%gjNyqYA>$F-%-vp7U*c$%*m4LIAwr6IIOl$stDBmXs;Ts_C znbwgbmjcC5Mp9uAA<=3 zGr@6S1}iHofq-P4!J|iydU|?*0g8;u*WgN;d;%hEAU~%Vr^N~CIcRK0=f3&fkHC#c z>NZCtf3N=zhIqguB{h|YhsQ@eQ@fB@)}!1#`MuUQ!^rgXoiLdxd*ME(z`#Jkij zcK{&;_!(TKH1kt=`D@+fF?=6jij8V3ho|y#a@^e9)nInWVWvU--|GR+lolAM+S4P= z96huO-olQ%_ts3KXroc#z>&8&VA-XU!!~aaOdIR#2BjvgATt8qY^bb{w}ya71K7U0 z@E_&tzmgv+#(^m9#+^GLehm^ZFi7_IuV3?PbU=DBK`8{So4B#H6&i+msW}94-jvK@ z@2LN-uChV0KYw2S6MOg8(h}&WIAns-z4$JHAfVAAp^4o~;+ao5;-Ar)3no*th{R=P zN`Q$Awi+*Ik1kLK1_s!y&N(q^>{IN$BK#vG!Qzkr0-DaxUG!2v-{p}oB_P}0eoR)n zR-9}QXducT7iGv00(h1q63!g`Uhb}~accWu+LM@fui1SJ)%;@HM^l4U7MHL5f66J> zNsZb)i^fK^&is~nt*IrH2LHNfd*oT50_aPC*2V$yYSt5L``{Qg&-Rsno87whijKjo zHI|+&2(61?0lL8*sEv#Yd?7#q2BO;5)fyfz!GmPZk~TN(>kOJe z*dz`nofV^$XJcm<%(V}wu|MH8G3MyW4KN%5WX96n&l&}QhRw~fVg!Ky1b8x-wg9N{ z8Wl63A=bccTVLPvYy^A4z9tpc6&oAt@9)o_*QUpQ*N7toC|5G<;Plai1u5mV2~bdc z0^5;RcKG*i3M#50M7jbnjU4L?=7K(HaRZ(cf|kp9z|a4bFDd%{do68kzyx%48Ny@$ z_);B$DS|9`9LxzSp=|Kx9@~RVI)_)XIehdB?i|*M{gwA-Dpw%N+}1xd*Wr}T0p-S) zM{d&gX^H=5m@%aNWHTu{Bph_=g-POEd|Y+36IlzsL4`w;JK+-o0IGM<$OK~b!eMLe zii!aGpqRP$2}*gNn+QNy1J;nM`mUK)#pjBkaZ-H!e-_Zz<9P5fJ@TE(_*(fw@V{U> zNE>~lN?R4oyMhsjgMnaKsS{2v4wk=+Pip|94Np$jEAsO4z~KbW&w|~7CIJP;TbxC8 z2!y=Bqd@ED3SRZfqx%lYfNN$vITda`Rz*VjczM$oY=voM4V^k}=@`Db1rM|vFJG$Y z6F&vHAjt<7BY;zbG8S8*~)ra8XR6Yix2>9lD zTgu5Bc*e@*TJyzP{8RC9F#Z-PJcE41|HQ)!&9DqS$9Em3WxBRqarZQvFW%vfz~~mp z5s5^B@vnj3ozr`7R7xWizQ<)ftdJ%6MM~X8cw!5uQ|2L1jO+I!4fwd%b6m>!KKskf znUCi^@h?(HrRGe3vePZ@8Csh?Vm9|IjOYtj2*cets(lO`UCfng8>#$oEDk0+P@tu#sK`mX z;6AhA4C3W^9wC{uxM+DtB2*8_)hiLhKl>531>2sDw6b85es-4m`LNCiU(7&fy)h$c7y zR&H9>g3x^%si>qt+kZZb#*{~63xaZ%3e2{+eS|2L|T1dTS zfiVy~ms1^t9zD8s>((<`P)HDd7iU{OTV9r;HS1lYYYK7R`@=fGYf4SjyxNgFM<}|Xl|p+Q36}Nb< zpfGp0((;``x&8k3t@(ghy+F(Qlu)e=NDLWSY$4_ViU7D=+jrvK^!M*ykc+A_pnOcJ8wI$FcEr-} z%2X$J|1m#g6u;j0-=F^7h<9{+I-HfF=>}N>sVcOx;~TCZa$7OZKJTb!T|gak{=q|} zu8I7d({6_(@o~q^d$x!lI2p+C!ZX}tK4}2;kKA8LyZ7Y+gD#)W+Gi$QIFsdb+_2U+ zSXST|BTd3i`D@MADH#jAkbfT9Zl$aOY5n={ z)Se;n(Ig`Rn24I+ss*0Ek%05Q8y5BdnuPzq|K`aFUli`;G3Y`I2e~_RXjwGZE4hDcRz%1H(Y!2p%q{Z0h-?d)=@>WTX&XMqLF%tw+qU7Y{ z!C#m`2AC-l%*d#2|C)QMa=^vt_DBaOC`Xe3mNv@=1} z7^G#&bXBIx+k!&hfxW=0Z=bmoj?={jA@x>rv+HkMifR0 z3Q2{%qyUE=06+xOHgUtSz_Y8Uv4=mRIYdJ*=RXZtsVL|3@kypUruvCWOi!bqzX4P9 zY@7iX3uaNC(UwX-`v4THzP==Q{1L{2`RQFA02TgC#U(6{-CfVTNlBItDOSk?xpp9h z0WgBNZEqp1K<@k?@fWiao)t$xz`*nGa{=P%yWFW^iU)gp6ciMa)oPrDAg4FE@gKd$ zsaau7GnqP`c>DC6`iul4z&3Ziftb>w`VK;=(5M86XnNmsGF=Mi+&5%3E^x@1;bD*| zKN>(ZmpXvqzm^pm*gLa_YLoiWGX4OVQw5{MGx-ygq^M9i_8+(Nk3w}1q+E^iG^_!1 z^K4|z#g-iF(rhm_7@y1a3900V`O-7h^Ja!ODO0y^Z#x3JSTH$g7wiS? zLOY>U%zP*OI+Go3axnG%NaE2+M>L%AVZ;^vPTu0ipx?=^*0ZJ3 zK{1JVY9LmRGan?CxtZ=^i6AgB2nigOoWpa@1;FPbutq>7UUutKi7 z*k|QI7U)R8SYvw$gECEK_>}BRO&*F#0Cd&zZ#MBtf{0F$Hb|b)MLVRSa#u?Lq~^Ox z7Tkg%m%H~zDd5A6T^`a$p%TM3Rk@7(VkZNTQ-03*`qs@m-oUCH4^jDXfUdu|5)k-n|5?Co96!D7l0xSUt^AA`77x3u1S(;{kZ-g%A$$utN zC0PlknTh!Me2&pvn-UMXrueT!rHl6TzK4bN>{I$7XRJ% z3~XhM?-IP{W1;y()(9q1<<1&JU`J=5pWVAQ>1uyFf_O}$W(V!qizbtf~jMW8Tvp)nWDl`IGmD{ zbid$tR@puig4;d->{bRa%K%f%;v(bnzDPms|oti8;Qh;aI3q^n+ zyb1@HwF2}qhz(qK#kg(7xQTX{U`oc~5D_tbt_pB~J51YJ-plL+2i0t6t4BEU%Q(MH zmio;1TEpnaq~+aBu9sboJ5ma|U<{v@jCg&038|K)K4uGoE6EBl_Skps_Yf7|Opn#Ge7M+*@ENSyQt z&z|)-_~L;#Y|!L=3_i5u_+JlmXxRDD;DL9~2o`9bW#` zX@aVD{MWe1Fv7 zwJK;&+zG(#PW9c1Fm5>cTR3X$cmDNxA!wr#V21luN#n>09!zQgnpI-d=y|fY+6*Fv zAeUfMIDGP3^C?>pGZ=6HF8R-;-MZH+D2-TP#cSjY*p8Q*1Le}D>I8f$1{ee~ZgAh( z-rfcuIB^3dJmY>h1kIiB7YxrN8T-~5@cA7tC4o;!$yZGUM65dVeBF{r%66t3K|#t`+O{8z*RVhbds{ z!2Z7v=g!9mp}{<@=f7Z}-Gs|xXDoPyy6Me;e~+sm-9;7*;yWp6GeduJt?SBa#OJtCuIWoE_4&Mf1aQN}g0A}jHG`kwRihkK55-1~mN z-uLx-KA(@(9(w^qjbg?I23viKXC7`OPmb3=lpZz>1X&quL=dEg^_`X)*Vfm+3ph7N zO=jj#@bEYeeK^O$!otaEQEIDUV{@TN1d1*AdU;=tI7uE^pSxiB1(-S^H{r;T4~QUG zG9)D>|9izcQwA0WhjNilW<&4)_MUdzKA4GBNekRt0F@#DO@1JXu3IXs87i`rg(#Mx zp&?M_u0!U^IIJpMNU_UAHQWFQ8{iQ>DjfrQU>W>PSBQkv)YK9q0oG`R*PJM7w9;`Z z%B-(d_WiuzK;0@$kB*AkKiK{Z=B74!g?MxC5p$mj379)3|E>4{zi(9rJ5{>!-8)rn zKdU%S|CdH&mU~-RUg63KZ#D%mVB2^W$bR%+bsSgl@ee}P4vN&evZFaQ(N9&Q(ui zw;8l#f>GxY*06~L1qH_{oTvQ`z`pvS%y7&samCpP^6bzY8r-(3J)q5Cp4WPYm>q!79YiZu{YT)ZFEHVxr0 z9kah-f`Z9ETj!)2Dyol#7%WF0QcW3Fu8BF)iS;i)Bm{KOach*{W>yk5CUCKTs=-6>il^K+qlkXO{UF*w|UZH z%^yd*dDZA~P>NKD%VmR{a0C}x35pUdrFTu+`yEwZ`Y)nGm+f#NrBU1+Q-3KOL#&$I z$7el)w@xm~^ltnw$s|>i?D6SHUTrGy+77#Sl#ug5@9uwDz!L+avf!nbeHP8N9zjoo z4_2nmWJW&%HBA44!W+~b#?*xI3Xi|9Cn)t4DdL1HIn34IDZcKX$qolK=^kp1I zAJ1wPiSd*a?GxEtrf@4D6T$m$&Vw*1U7Z)sKS+T&iuM5C*CB{Gp<9IWAAmTlMv+Om zTDA^s5GPWhIe-iBcYx`Dy1nK#k3uoih68}j{fq@uk7N=6Kut8cyV1&R{b$Q6SQvm< zfk>!jSOxf;+!p5!cI`J}#my%*c@(;j$DkUwc)MzwTX{i1)xTi%^~%`Rf9~TU$C04= z1X;$BS4d3kC}sq1bR3#rEVg#@+b!9D3tAvVA{Ce#T3EoFS6V`T75GaI5B@<$)hrYl zDAI6B2fcy{vdbsCs|ung*kC0NgYO}rN;*-!Cs}HBxpJ~FFR#IUA1ckdFB~MYl_O5U zav7zi&<^GZy4*V;s=+$KKBJ3}SC!A|zu8E0+ytwx)~t;CpV@I<%wE*8)e-1-aMrh5 zmyAP@793|#8^|aH{y2vw;^`{}9}@7MysXao)bfCg@V@K-%?u;Yk;zedwU(jHUHdA0 zx2_E6|l4IoYtWH!tRIg&ZC(n`_yjZ?P6FuI$Dq4t1qp zw6#6u9)8cm7ZYiFro)<>?V_*InNA^u1(U%VZ)+&c?Y@a=>3M>DZ55Js^`j6cGbcU$ zCHdyTJ3Jy+PO9D%d(v^oHYIJrYg;;CjB8TQa65`KeSo*sodpVjZqSXO|h&bl$z~Usxg)O;+D`^zzz-D4KO&cFCG! z&_w)M1n(I*iTQYW(;yWKo(-Q?8W>_NYJE!}NTjmT@b)WM5=hK4(I13R7O$((1eGY; zza=sDNvJQOMq)dz84`V(S&lUKtwqrK^<15g4?3YvLUri@-5V5$g#~-F_}J^eROZ{M zwZ#%;0MxvmP7`x%pczu6;9D~{ms7ldDh8p;)(VtCH+f^kiHXUAM+M=*FZVSe=VT5o zR`lbW_wR`WCpdjT6(=ZIzGbPWf6a4Foj)!qEiK2_PntK?+6t?F(>q(#0Rt@-_YL3? zAQ@@LW5J6x%A~}oIjygO)qqMsw}=#cm-~x-lI_K_jUQwX^;Tsp8fQHxEX_$^?~H%_ zy0(tN9me0%(o*j0fud|qnQqZN5{}R2+_%jxQuaqjM;igB*~0zygiW$$ZexRCzP?$u zVi0vfBTMMN>C;U>ZceRIb@t&ni#c0|8}5G?bf_+5Bl0Y#ju#=_$YItjLJU+guVV6) zo6{pRS%@ViC7@Jed~(BzzX5+Hq6wxN8*?h5ovV50Y^7#B&Uvsj%!XT0ad1XG7ymfR zA#lL=Qq`U`!~SDA_Z4+V?nA`ELe=^nbf*GLP^skR2!?j;Sx``6w0HX`zNMB&>04|j zL~@XD3t&_V?w*lrv3|~i3V!cKEWpqTko9zYHW~eh=0q$PZ~h z%q+_a^5)$WP&O0?$4*UkHB29291SAEn&*M?- zC&qfWb%#%-z*$}NgPHKW&K5HqdEsgqi%_v*@9Cz;H_n4;5x%G=%pHxH0)(uLhoJEr z8e$4kdVqX9uykKv9|&JBbFFNh9W;mdrWcRjNf)4~oXUrVgaThEFs5ziY+o)CCn`p} zNMoqhe5Ur*T3JNsY<@ut2uci)4T2&ND;+t+5Us40dQ}34L*RwGRF3s2e*^q~`n#6h zjQizZG5s=xm)2ngZ;8e``OgPEB9VDu>tlz}m8oYUVBEj1zNY5y?#8{o<^jY zVa4vqXlB;X$5vM-0V{c<4XvgfNBr5H^Ax@gQFUOwxmz4HJva9=kKg6n3C|0-26T0y zB5ugN^!|cXhGYwh%hx>tdHxhz1!bR#S%Nx#@8|hhx_57VSEXm{Oq-uN$OHFGoe~my z<^`4G{VFe&(k#=P@AkF88M5xCq-@vqU*fJo9|ql z@t#8W33IEhr7}7g7scOLA_%p~yO#9iD2aJ^(3@OhwQ^);9+gU3oXNG`r`1*^+z`${ z(zvii$*v)ueNx0sWjFZmFerLPMKPr||DGGEFbpx7Qkd1PTIJJi*VZF(i+hrctmWh= zkavP1`+^xw$?@TIIWdUWRWrP;Rn8Al97rh?a*J2uL0OC5N{VfS5lAV|F1GUr7 zD$BEk`I~EL2@zcOt_zj}xUO>PXUS_pj3M!MNja7>&4!;dE-BVEAXIj)g+Estjtx`J*<)}GsJh#Z4ooM&^9GYoB+tKW~yxn$K&n{B-)OdbQ> zxl9*#7|}@00ES5P_hw|*>@KU>+YH3=MvX1Ct^=<4jmWW}3Z0s1tm!1hY{-X*57D*i ze-QOanz3l9{O?qi#YZ9E7`r3( z@25U{iV2z?e4DtUPY@3B*rVHu`|88YH|C|!;-N)yY-nE0&z%?)YT#%Y~*&MT_GC9rxCftpjy8yGxXl2O5<$ zIm~8`UXm<>HrV(&@a!Dc9QfZ^bV44BQ|EKx#omt|zUhMn#_5Ocod;2-r*c?Yp z_4SeAROA3RH<2pP)qqD@_R)b1JDrxMCM{RYUx^dHnQ&z2eL-!449fZA!*IH(YWE-X ze?KDrlRf;C&fI&rf{T`P`;kI&D2D`zM$&5#E`Tq$x{zkmKz}eX@!arj@Glb_9Qe6c z>VN?v_izjc{Q_-orR${2NSend_Gsnp?QIE-zncp$v8+!Ai0tm)I}@0msDH2jvt<3% zCDbNZptBnM;eZ?3{DM(G`=$s#~-PKK?7^}bA6}1y&aAlaH;@a zB+}VDy$+EY=8(h&B4Kc*Rb49BLRzbz4iDU(j%muuIy~sKJX~*+#RQ8;U0cG%-lP`0 z&GWQo_5#3h@tqp#>HseXW!ZAHb=Z~)Th_C)vih%01=}ZqSUzIqzE>>2dk4X1_@3S2VU|0X zzj0mU4Z}h+zs>pEVu`f@yB;92oKtCY$7;Zuhf3IwKl~CCK&DLbY^y`qCv~%|bzJX| zS}PbZ7nEb5*pu}wkBSW+^;SP6bYkk8f?IdO<%aQJSsA}|%y8svYtdNs(bsqNWb@xU zNLMh?iMRcT)XCQ?)5g5MiTNlZLasF_`1z@0&_ROfsXXy2W(stn8QOxKVy7-ZVGq;Q z=%?P{7H22V zwWU($G1tj@5c>tD{}v_vq=VQLwM*tC#W$!K^SI7gGa%yf8Q-umxlTOU;dpkz2TCV-9DKJ>B1DM MN}4wc6|6%34|zIy;s5{u literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1f05b8b023c23a46c7a2dacda37a6e0af26cef GIT binary patch literal 17115 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 Jvd$@?2>`YE34H(n literal 0 HcmV?d00001 diff --git a/assets/images/habits_design.png b/assets/images/habits_design.png new file mode 100644 index 0000000000000000000000000000000000000000..39e296403dffb45864989a1d080fa231023d6b86 GIT binary patch literal 19831 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 GO#UBvgCxWN literal 0 HcmV?d00001 diff --git a/assets/images/icon.png b/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..52d717caca8fa02c9fff162b059906dc712c530f GIT binary patch literal 76721 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 literal 0 HcmV?d00001 diff --git a/assets/images/partial-react-logo.png b/assets/images/partial-react-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..66fd9570e4fac42bca15352def191c563100b2ed GIT binary patch literal 5075 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 literal 0 HcmV?d00001 diff --git a/assets/images/react-logo.png b/assets/images/react-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9d72a9ffcbb39d89709073e1a7edd8ba414932c1 GIT binary patch literal 6341 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

OG^bt6yG2??7FhdGVc8feK}syBta)V!iG4 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 + + + + +Serene Path | AI Assistant + + + + + + + + + + +

+
+
+user profile picture +
+

Serene Path

+
+
+ +
+
+
+ +
+
+
+ + +
+AI is syncing your plan... +
+
+ +
+ +
+
+Serene AI +10:02 AM +
+
+

+ Good morning. I've analyzed your sleep data and upcoming tasks. You seem to have a productive window between 10 AM and 12 PM. Would you like me to block this time for your deep work session? +

+
+
+ +
+
+10:05 AM +You +
+
+

+ Yes, please. Also, can you check if I have any reading assignments for tonight's book club? +

+
+
+ +
+
+Serene AI +10:05 AM +
+
+

+ Of course. I've scheduled your deep work block. Regarding your book club: you have to finish Chapter 4 of "The Art of Stillness". +

+
+
+book cover +
+
+

Chapter 4: The Inner Journey

+

12 pages remaining • 15 min read

+
+
+
+
+ +
+
+
+ +
+ \ No newline at end of file diff --git a/assets/ui/mobile/ai.png b/assets/ui/mobile/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..03ace80df7e27cc40349e12d1e970429ebcb0c81 GIT binary patch literal 32452 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�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 literal 0 HcmV?d00001 diff --git a/assets/ui/mobile/calendar.html b/assets/ui/mobile/calendar.html new file mode 100644 index 0000000..4d2f8d6 --- /dev/null +++ b/assets/ui/mobile/calendar.html @@ -0,0 +1,267 @@ + + + + + +Serene Path - Daily Plan + + + + + + + + + + +
+
+
+ +
+

Serene Path

+
+
+ +
+
+
+ +
+
+

Tuesday

+

Oct 24

+
+
+ + +
+
+ +
+ +
+
08:00
+
09:00
+
10:00
+
11:00
+
12:00
+
13:00
+
14:00
+
15:00
+
16:00
+
17:00
+
18:00
+
19:00
+
20:00
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+

Sleep Cycle

+favorite +
+
+Health Data • 7h 20m +
+
+ +
+
+
+light_mode +
+
+

Morning Routine

+

Meditation & Journaling

+
+
+09:30 - 10:15 +
+ +
+
+
+

Deep Work

+ +
+

Focusing on the Product Strategy Deck and Quarter 4 planning. Phone in DND mode.

+
+
+Focus Mode +
+10:45 - 12:45 +
+
+ +
+
+restaurant +

Lunch Break

+
+13:00 - 13:45 +
+ +
+
+
+ + +
+
+

Creative Review

+

With Design Team

+
+
+14:00 - 15:00 +
+ +
+
+directions_walk +

Mindful Walk

+
+16:30 - 17:15 +
+ +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/assets/ui/mobile/calendar.png b/assets/ui/mobile/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb7581fe5ab657f98392bcd63c01dd78945f5ff GIT binary patch literal 24864 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 literal 0 HcmV?d00001 diff --git a/assets/ui/mobile/dashboard.html b/assets/ui/mobile/dashboard.html new file mode 100644 index 0000000..0bb2ec3 --- /dev/null +++ b/assets/ui/mobile/dashboard.html @@ -0,0 +1,239 @@ + + + + + + Serene Path + + + + +
+
+ + settings +
+ +
+
GOOD MORNING, ALEX
+
Today is a fresh canvas. Take a deep breath.
+
+ +
Today's Focus 9:30 AM — 11:00 AM
+
+
DEEP WORK: INTERFACE REFINEMENT
+
Focus on the typography hierarchy and tonal layering transitions for the mobile navigation shell.
+
+ + +
+
+ +
Reading Progress
+
+
+
Building a Second Brain
+
Tiago Forte • 42 pages left
+
+
65%
+
+ +
KEYSTONE HABITS
+
2/3 Done
+
+ check_circle + Morning Meditation +
+
+ check_circle + Deep Work Session +
+
+ radio_button_unchecked + 20min Evening Walk +
+ +
ENERGY CHECK-IN
+
How are you feeling right now? Listen to your body.
+
+
Drained
+
Balanced
+
Radiant
+
+ +
MANAGEMENT DECK
+
+
ads_click
Google Ads
+
social_leaderboard
Facebook
+
analytics
Analytics
+
mail
Inbox
+
payments
Finance
+
add
Add Tool
+
+ + +
+ + \ No newline at end of file diff --git a/assets/ui/mobile/dashboard.png b/assets/ui/mobile/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..edb115302831892db018867249aa915fdfaa7f30 GIT binary patch literal 23983 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 a4ER5M${cS_3PU>p0000 + + + + +Serene Path | Habit & Identity Tracker + + + + + + + + + +
+
+
+ +
+Serene Path +
+
+ +
+
+
+ +
+
+
+Foundation +

Who I am becoming

+

Focusing on identity-based growth rather than just checking boxes.

+
+ +
+ +
+
+
+Primary Identity +

"I am a person who prioritizes deep knowledge over superficial distraction."

+
+verified +Rooted in 12 consistent days +
+
+
+
+
+
+

Secondary Shift

+

"I am a healthy athlete who treats my body with respect."

+
+
+
+
M
+
T
+
W
+
+Active +
+
+
+
+ +
+
+
+warning +
+
+

Burnout Alert: Momentum is Fading

+

You've missed 4 habits in the last 24 hours. The path to growth requires rhythm, but also recovery.

+
+ +
+
+ +
+ +
+
+

Keystone Habits

+ +
+
+ +
+ +
+
+

Morning Meditation

+Identity: Calm Observer +
+

"I don't react, I observe my thoughts without judgment."

+
+
+

Streak

+

12d

+
+
+ +
+ +
+
+

Read 20 Pages

+Identity: Lifelong Learner +
+

"Knowledge is the compound interest of my identity."

+
+
+

Streak

+

45d

+
+
+ +
+ +
+
+

Evening Reflection

+Identity: Intentional Soul +
+

"I review my day to refine my tomorrow."

+
+
+

Streak

+

0d

+
+
+
+
+ +
+
+

Weekly Rhythm

+
+ +
+
+
+M +
+
+
+T +
+
+
+W +
+
+
+T +
+
+
+F +
+
+
+S +
+
+
+S +
+
+
+
+Weekly Completion +78% +
+
+
+
+
+
+

Identity reinforcement suggests you are 14 days away from these habits feeling "automatic." Keep going.

+ +
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/assets/ui/mobile/habits.png b/assets/ui/mobile/habits.png new file mode 100644 index 0000000000000000000000000000000000000000..38f578d7d04542ae2d8946f522dd6f6669fa8a6f GIT binary patch literal 24896 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 literal 0 HcmV?d00001 diff --git a/assets/ui/mobile/library.html b/assets/ui/mobile/library.html new file mode 100644 index 0000000..5481093 --- /dev/null +++ b/assets/ui/mobile/library.html @@ -0,0 +1,287 @@ + + + + + +Serene Path - Library + + + + + + + + + +
+
+
+ +
+Serene Path +
+ +
+
+ +
+
+
+

Library

+

Curate your mind's expansion

+
+
+
+
+
+Daily Goal +45 / 60 min +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+auto_stories +Continue Reading +
+

The Architecture of Stillness

+

Discover the profound impact of intentional physical environments on mental clarity and spiritual peace.

+
+
+ +
+
+bookmark +
+
+ +
+
+
+
+
+
+ +
+
+

Your Collection

+ +
+
+ +
+
+ +
+Open PDF +
+
+

Mindful Breathing

+

Dr. Aris Thorne

+
+
+
+
+82% +
+
+ +
+
+ +
+Open PDF +
+
+

Quietude

+

Elena Vance

+
+
+
+
+24% +
+
+ +
+
+ +
+Open PDF +
+
+

Nature's Rythm

+

Marcus Sol

+
+
+
+
+45% +
+
+ +
+
+add_circle +Upload PDF +
+
+
+
+ +
+

Recent Articles

+
+
+
+description +
+
+
Journal of Cognitive Rest
+

Exploring the synaptic benefits of 15-minute digital detoxes.

+
+ +
+
+
+article +
+
+
The Art of Soft Focus
+

Balancing deep work with peripheral awareness for creativity.

+
+ +
+
+
+
+ + + \ No newline at end of file diff --git a/assets/ui/mobile/library.png b/assets/ui/mobile/library.png new file mode 100644 index 0000000000000000000000000000000000000000..f071f7903fcfe914064a56592c9952293a05d70e GIT binary patch literal 30121 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

5G^Qu`Lbk{_x!L6; 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 wR1`tH-Y8 + + + + +Serene Path | Focus Sprint + + + + + + + + + + +

+
+
+user profile picture +
+

Serene Path

+
+ +
+
+
+ +
+
+ +
+ + + +
+
+

Current Sprint: Deep Work

+

+ 24:59 +

+
+ + + +
+
+
+ +
+
+Daily Goal: 4 Sprints +2 / 4 Completed +
+
+
+
+
+
+ +
+ +
+
+eco +

Focus Strategy

+
+
+
+

Work

+

25 min

+
+
+

Break

+

5 min

+
+ +
+
+ +
+
+

Sprint Tasks

+ +
+
+ +
+ +
+

Refine Brand Identity Guidelines

+

Priority focus for this session

+
+Current +
+ +
+ +
+

Review Q3 Performance Metrics

+
+Analytics +
+
+
+ +
+ +
+

Client Proposal Draft

+
+Sales +
+
+
+
+
+ +
+
+lightbulb +
+

Deep Work Insight

+

+ "Your focus is the most valuable currency you possess. Don't spend it on trivial distractions." +

+
+auto_stories +Strategy: Task Batching +
+
+
+
+
+ + + \ No newline at end of file diff --git a/assets/ui/mobile/sprint.png b/assets/ui/mobile/sprint.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f51234ed0af308b61863f63d8d07e9cc1d5f35 GIT binary patch literal 28388 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 + + + + +Serene Path AI Assistant + + + + + + + + + + +
+ +
+ +
+
+
+smart_toy +
+
+

AI Assistant

+ + Online + +
+
+
+ + +
+
+ +
+ +
+
+smart_toy +
+
+
+

+ Good morning, Elena. I've analyzed your sleep patterns and today's calendar. You have a few open windows this afternoon. Shall we plan a focused reflection session or a nature walk to keep your serenity score high? +

+
+Assistant • 09:12 AM +
+
+ +
+
+Elena +
+
+
+

+ I'd like the nature walk around 3:00 PM. Also, please remind me to finish my meditation log before dinner at 7:00 PM. +

+
+You • 09:14 AM +
+
+ +
+
+smart_toy +
+
+
+

+ Perfect choice. I've updated your schedule for today. +

+
+check_circle +
+

Action Recorded

+

Nature Walk scheduled for 15:00

+
+
+
+Assistant • 09:15 AM +
+
+
+ +
+
+ + + +
+
+ + +
+
+
+ + +
+ \ No newline at end of file diff --git a/assets/ui/web/calendar.html b/assets/ui/web/calendar.html new file mode 100644 index 0000000..9b4ec8a --- /dev/null +++ b/assets/ui/web/calendar.html @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +

September 11 — 17

+ +
+
+ + + +
+
+
+
+
+search + +
+
+ + +
+
+ +
+
+ +
+
+
+MON +11 +
+
+TUE +12 +
+
+WED +13 +
+
+THU +14 +
+
+FRI +15 +
+
+SAT +16 +
+
+SUN +17 +
+
+ +
+
+ +
+
08:00 AM
+
09:00 AM
+
10:00 AM
+
11:00 AM
+
12:00 PM
+
01:00 PM
+
02:00 PM
+
03:00 PM
+
04:00 PM
+
+ +
+
+ +
+
+psychology +

Deep Work

+
+

UI Design Language

+

Focus Zone

+
+
+
+
+ +
+
+spa +

Guided Meditation

+
+
+
+
+
+ +
+

Stakeholder Review

+

Design Sync

+
+
+
+
+
+
+
+
+
+
+
+ + +
+ \ No newline at end of file diff --git a/assets/ui/web/dashboard.html b/assets/ui/web/dashboard.html new file mode 100644 index 0000000..3f75f95 --- /dev/null +++ b/assets/ui/web/dashboard.html @@ -0,0 +1,350 @@ + + + + + +Serene Path | Dashboard + + + + + + + + + + + +
+ +
+ +
+
+

Good Morning, Elena

+

Your path today is clear and focused.

+
+
+
+search +
+
+notifications +account_circle +
+
+
+ +
+ +
+
+
+Current Focus +45 mins remaining +
+

Serene Path UI Refinement

+

Deep work session focused on architectural patterns and spatial hierarchy.

+
+
+ + +
+ +
+decorative +
+ +
+
+

Daily Habits

+
+
+
+mindfulness +Meditation +
+check_circle +
+
+
+water_drop +Hydration +
+radio_button_unchecked +
+
+
+local_library +Reading +
+check_circle +
+
+
+
+
+Total Progress +68% +
+
+
+
+
+
+ +
+
+
+auto_awesome +
+Inspiration +
+
+
+history +
+Recent Logs +
+
+
+menu_book +
+Quick Journal +
+
+
+settings_ethernet +
+Integrations +
+
+
+
+ + +
+ + + \ No newline at end of file diff --git a/assets/ui/web/habits.html b/assets/ui/web/habits.html new file mode 100644 index 0000000..c7ab802 --- /dev/null +++ b/assets/ui/web/habits.html @@ -0,0 +1,347 @@ + + + + + +Serene Path | Habits & Identity + + + + + + + + + + + +
+ +
+ +
+
+

Habit Synthesis

+

Nurturing your daily keystone rituals.

+
+
+
+search + +
+
+notifications +account_circle +
+
+
+ +
+ +
+
+
+Identity Anchor +

"I am a focused creator."

+

Connected to Deep Work habit. You've honored this identity for 14 consecutive days.

+
+
+
+
+82% Mastery +
+
+draw +
+
+Active Goal +

The Mindful Athlete

+

Integrated with Movement rituals. 4/5 weekly milestones achieved.

+
+
M
+
T
+
W
+
T
+
F
+
+
+
+ +
+
+

Keystone Habit Performance

+
+ + +
+
+
+ +
+
+
+self_improvement +
+
+

Morning Stillness

+

15 mins • 07:00 AM

+
+
+
+
+
+
+
+
+
+
+
+
+

12 Day Streak

+

+2 from avg

+
+
+ +
+
+
+menu_book +
+
+

Curated Reading

+

20 pages • Afternoon

+
+
+
+
+
+
+
+
+
+
+
+
+

31 Day Streak

+

Milestone: +3d

+
+
+ +
+
+
+forest +
+
+

Nature Exposure

+

10 mins • Sunlight

+
+
+
+
+
+
+
+
+
+
+
+
+

4 Day Streak

+

In Focus

+
+
+
+
+
+
+ + +
+ \ No newline at end of file diff --git a/assets/ui/web/sprint.html b/assets/ui/web/sprint.html new file mode 100644 index 0000000..8973698 --- /dev/null +++ b/assets/ui/web/sprint.html @@ -0,0 +1,303 @@ + + + + + +Digital Sanctuary | Sprint Planner + + + + + + + + + + + +
+ +
+ +
+
+bolt +

Sprint Planner

+
+
+
+search + +
+
+notifications +account_circle +
+
+
+ +
+
+ + + + + + + + + + +
+24:59 +Deep Focus +
+
+
+ + + +
+
+ +
+
+

Sprint Tasks

+ +
+
+ +
+
+ +
+
+

Audit design system color tokens

+
+High Energy +15 mins +
+
+drag_indicator +
+
+
+
+

Review feedback for navigation shell

+
+Batch: Email +25 mins +
+
+drag_indicator +
+
+
+check +
+
+

Update component JSON schema

+

Completed at 09:45 AM

+
+
+
+
+
+ + +
+ + + \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..73ebf58 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function (api) { + api.cache(true); + return { + presets: ["babel-preset-expo"], + }; +}; diff --git a/components/external-link.tsx b/components/external-link.tsx new file mode 100644 index 0000000..883e515 --- /dev/null +++ b/components/external-link.tsx @@ -0,0 +1,25 @@ +import { Href, Link } from 'expo-router'; +import { openBrowserAsync, WebBrowserPresentationStyle } from 'expo-web-browser'; +import { type ComponentProps } from 'react'; + +type Props = Omit, 'href'> & { href: Href & string }; + +export function ExternalLink({ href, ...rest }: Props) { + return ( + { + if (process.env.EXPO_OS !== 'web') { + // Prevent the default behavior of linking to the default browser on native. + event.preventDefault(); + // Open the link in an in-app browser. + await openBrowserAsync(href, { + presentationStyle: WebBrowserPresentationStyle.AUTOMATIC, + }); + } + }} + /> + ); +} diff --git a/components/haptic-tab.tsx b/components/haptic-tab.tsx new file mode 100644 index 0000000..7f3981c --- /dev/null +++ b/components/haptic-tab.tsx @@ -0,0 +1,18 @@ +import { BottomTabBarButtonProps } from '@react-navigation/bottom-tabs'; +import { PlatformPressable } from '@react-navigation/elements'; +import * as Haptics from 'expo-haptics'; + +export function HapticTab(props: BottomTabBarButtonProps) { + return ( + { + if (process.env.EXPO_OS === 'ios') { + // Add a soft haptic feedback when pressing down on the tabs. + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } + props.onPressIn?.(ev); + }} + /> + ); +} diff --git a/components/hello-wave.tsx b/components/hello-wave.tsx new file mode 100644 index 0000000..5def547 --- /dev/null +++ b/components/hello-wave.tsx @@ -0,0 +1,19 @@ +import Animated from 'react-native-reanimated'; + +export function HelloWave() { + return ( + + 👋 + + ); +} diff --git a/components/parallax-scroll-view.tsx b/components/parallax-scroll-view.tsx new file mode 100644 index 0000000..8f09c18 --- /dev/null +++ b/components/parallax-scroll-view.tsx @@ -0,0 +1,80 @@ +import type { PropsWithChildren, ReactElement } from 'react'; +import { StyleSheet } from 'react-native'; +import Animated, { + interpolate, + useAnimatedRef, + useAnimatedStyle, + useScrollOffset, +} from 'react-native-reanimated'; + +import { ThemedView } from '@/components/themed-view'; +import { useColorScheme } from '@/hooks/use-color-scheme'; +import { useThemeColor } from '@/hooks/use-theme-color'; + +const HEADER_HEIGHT = 250; + +type Props = PropsWithChildren<{ + headerImage: ReactElement; + headerBackgroundColor: { dark: string; light: string }; +}>; + +export default function ParallaxScrollView({ + children, + headerImage, + headerBackgroundColor, +}: Props) { + const backgroundColor = useThemeColor({}, 'background'); + const colorScheme = useColorScheme() ?? 'light'; + const scrollRef = useAnimatedRef(); + const scrollOffset = useScrollOffset(scrollRef); + const headerAnimatedStyle = useAnimatedStyle(() => { + 'worklet'; + return { + transform: [ + { + translateY: interpolate( + scrollOffset.value, + [-HEADER_HEIGHT, 0, HEADER_HEIGHT], + [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.75] + ), + }, + { + scale: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [2, 1, 1]), + }, + ], + }; + }); + + return ( + + + {headerImage} + + {children} + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + header: { + height: HEADER_HEIGHT, + overflow: 'hidden', + }, + content: { + flex: 1, + padding: 32, + gap: 16, + overflow: 'hidden', + }, +}); diff --git a/components/themed-text.tsx b/components/themed-text.tsx new file mode 100644 index 0000000..d79d0a1 --- /dev/null +++ b/components/themed-text.tsx @@ -0,0 +1,60 @@ +import { StyleSheet, Text, type TextProps } from 'react-native'; + +import { useThemeColor } from '@/hooks/use-theme-color'; + +export type ThemedTextProps = TextProps & { + lightColor?: string; + darkColor?: string; + type?: 'default' | 'title' | 'defaultSemiBold' | 'subtitle' | 'link'; +}; + +export function ThemedText({ + style, + lightColor, + darkColor, + type = 'default', + ...rest +}: ThemedTextProps) { + const color = useThemeColor({ light: lightColor, dark: darkColor }, 'text'); + + return ( + + ); +} + +const styles = StyleSheet.create({ + default: { + fontSize: 16, + lineHeight: 24, + }, + defaultSemiBold: { + fontSize: 16, + lineHeight: 24, + fontWeight: '600', + }, + title: { + fontSize: 32, + fontWeight: 'bold', + lineHeight: 32, + }, + subtitle: { + fontSize: 20, + fontWeight: 'bold', + }, + link: { + lineHeight: 30, + fontSize: 16, + color: '#0a7ea4', + }, +}); diff --git a/components/themed-view.tsx b/components/themed-view.tsx new file mode 100644 index 0000000..6f181d8 --- /dev/null +++ b/components/themed-view.tsx @@ -0,0 +1,14 @@ +import { View, type ViewProps } from 'react-native'; + +import { useThemeColor } from '@/hooks/use-theme-color'; + +export type ThemedViewProps = ViewProps & { + lightColor?: string; + darkColor?: string; +}; + +export function ThemedView({ style, lightColor, darkColor, ...otherProps }: ThemedViewProps) { + const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, 'background'); + + return ; +} diff --git a/components/ui/collapsible.tsx b/components/ui/collapsible.tsx new file mode 100644 index 0000000..6345fde --- /dev/null +++ b/components/ui/collapsible.tsx @@ -0,0 +1,45 @@ +import { PropsWithChildren, useState } from 'react'; +import { StyleSheet, TouchableOpacity } from 'react-native'; + +import { ThemedText } from '@/components/themed-text'; +import { ThemedView } from '@/components/themed-view'; +import { IconSymbol } from '@/components/ui/icon-symbol'; +import { Colors } from '@/constants/theme'; +import { useColorScheme } from '@/hooks/use-color-scheme'; + +export function Collapsible({ children, title }: PropsWithChildren & { title: string }) { + const [isOpen, setIsOpen] = useState(false); + const theme = useColorScheme() ?? 'light'; + + return ( + + setIsOpen((value) => !value)} + activeOpacity={0.8}> + + + {title} + + {isOpen && {children}} + + ); +} + +const styles = StyleSheet.create({ + heading: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + content: { + marginTop: 6, + marginLeft: 24, + }, +}); diff --git a/components/ui/icon-symbol.ios.tsx b/components/ui/icon-symbol.ios.tsx new file mode 100644 index 0000000..9177f4d --- /dev/null +++ b/components/ui/icon-symbol.ios.tsx @@ -0,0 +1,32 @@ +import { SymbolView, SymbolViewProps, SymbolWeight } from 'expo-symbols'; +import { StyleProp, ViewStyle } from 'react-native'; + +export function IconSymbol({ + name, + size = 24, + color, + style, + weight = 'regular', +}: { + name: SymbolViewProps['name']; + size?: number; + color: string; + style?: StyleProp; + weight?: SymbolWeight; +}) { + return ( + + ); +} diff --git a/components/ui/icon-symbol.tsx b/components/ui/icon-symbol.tsx new file mode 100644 index 0000000..b7ece6b --- /dev/null +++ b/components/ui/icon-symbol.tsx @@ -0,0 +1,41 @@ +// Fallback for using MaterialIcons on Android and web. + +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { SymbolWeight, SymbolViewProps } from 'expo-symbols'; +import { ComponentProps } from 'react'; +import { OpaqueColorValue, type StyleProp, type TextStyle } from 'react-native'; + +type IconMapping = Record['name']>; +type IconSymbolName = keyof typeof MAPPING; + +/** + * Add your SF Symbols to Material Icons mappings here. + * - see Material Icons in the [Icons Directory](https://icons.expo.fyi). + * - see SF Symbols in the [SF Symbols](https://developer.apple.com/sf-symbols/) app. + */ +const MAPPING = { + 'house.fill': 'home', + 'paperplane.fill': 'send', + 'chevron.left.forwardslash.chevron.right': 'code', + 'chevron.right': 'chevron-right', +} as IconMapping; + +/** + * An icon component that uses native SF Symbols on iOS, and Material Icons on Android and web. + * This ensures a consistent look across platforms, and optimal resource usage. + * Icon `name`s are based on SF Symbols and require manual mapping to Material Icons. + */ +export function IconSymbol({ + name, + size = 24, + color, + style, +}: { + name: IconSymbolName; + size?: number; + color: string | OpaqueColorValue; + style?: StyleProp; + weight?: SymbolWeight; +}) { + return ; +} diff --git a/constants/theme.ts b/constants/theme.ts new file mode 100644 index 0000000..f06facd --- /dev/null +++ b/constants/theme.ts @@ -0,0 +1,53 @@ +/** + * Below are the colors that are used in the app. The colors are defined in the light and dark mode. + * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc. + */ + +import { Platform } from 'react-native'; + +const tintColorLight = '#0a7ea4'; +const tintColorDark = '#fff'; + +export const Colors = { + light: { + text: '#11181C', + background: '#fff', + tint: tintColorLight, + icon: '#687076', + tabIconDefault: '#687076', + tabIconSelected: tintColorLight, + }, + dark: { + text: '#ECEDEE', + background: '#151718', + tint: tintColorDark, + icon: '#9BA1A6', + tabIconDefault: '#9BA1A6', + tabIconSelected: tintColorDark, + }, +}; + +export const Fonts = Platform.select({ + ios: { + /** iOS `UIFontDescriptorSystemDesignDefault` */ + sans: 'system-ui', + /** iOS `UIFontDescriptorSystemDesignSerif` */ + serif: 'ui-serif', + /** iOS `UIFontDescriptorSystemDesignRounded` */ + rounded: 'ui-rounded', + /** iOS `UIFontDescriptorSystemDesignMonospaced` */ + mono: 'ui-monospace', + }, + default: { + sans: 'normal', + serif: 'serif', + rounded: 'normal', + mono: 'monospace', + }, + web: { + sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif", + serif: "Georgia, 'Times New Roman', serif", + rounded: "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif", + mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", + }, +}); diff --git a/eas.json b/eas.json new file mode 100644 index 0000000..4cf26cd --- /dev/null +++ b/eas.json @@ -0,0 +1,24 @@ +{ + "cli": { + "version": ">= 18.12.2", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + } + }, + "production": { + "autoIncrement": true + } + }, + "submit": { + "production": {} + } +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..5025da6 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,10 @@ +// https://docs.expo.dev/guides/using-eslint/ +const { defineConfig } = require('eslint/config'); +const expoConfig = require('eslint-config-expo/flat'); + +module.exports = defineConfig([ + expoConfig, + { + ignores: ['dist/*'], + }, +]); diff --git a/hooks/use-color-scheme.ts b/hooks/use-color-scheme.ts new file mode 100644 index 0000000..17e3c63 --- /dev/null +++ b/hooks/use-color-scheme.ts @@ -0,0 +1 @@ +export { useColorScheme } from 'react-native'; diff --git a/hooks/use-color-scheme.web.ts b/hooks/use-color-scheme.web.ts new file mode 100644 index 0000000..7eb1c1b --- /dev/null +++ b/hooks/use-color-scheme.web.ts @@ -0,0 +1,21 @@ +import { useEffect, useState } from 'react'; +import { useColorScheme as useRNColorScheme } from 'react-native'; + +/** + * To support static rendering, this value needs to be re-calculated on the client side for web + */ +export function useColorScheme() { + const [hasHydrated, setHasHydrated] = useState(false); + + useEffect(() => { + setHasHydrated(true); + }, []); + + const colorScheme = useRNColorScheme(); + + if (hasHydrated) { + return colorScheme; + } + + return 'light'; +} diff --git a/hooks/use-theme-color.ts b/hooks/use-theme-color.ts new file mode 100644 index 0000000..0cbc3a6 --- /dev/null +++ b/hooks/use-theme-color.ts @@ -0,0 +1,21 @@ +/** + * Learn more about light and dark modes: + * https://docs.expo.dev/guides/color-schemes/ + */ + +import { Colors } from '@/constants/theme'; +import { useColorScheme } from '@/hooks/use-color-scheme'; + +export function useThemeColor( + props: { light?: string; dark?: string }, + colorName: keyof typeof Colors.light & keyof typeof Colors.dark +) { + const theme = useColorScheme() ?? 'light'; + const colorFromProps = props[theme]; + + if (colorFromProps) { + return colorFromProps; + } else { + return Colors[theme][colorName]; + } +} diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..a2c6c3e --- /dev/null +++ b/metro.config.js @@ -0,0 +1,21 @@ +// Learn more https://docs.expo.io/guides/customizing-metro +const { getDefaultConfig } = require("expo/metro-config"); +const path = require("path"); + +/** @type {import('expo/metro-config').MetroConfig} */ +const config = getDefaultConfig(__dirname); + +const { transformer, resolver } = config; + +config.transformer = { + ...transformer, + babelTransformerPath: require.resolve("react-native-svg-transformer"), +}; + +config.resolver = { + ...resolver, + assetExts: [...resolver.assetExts.filter((ext) => ext !== "svg"), "wasm"], + sourceExts: [...resolver.sourceExts, "svg", "wasm"], +}; + +module.exports = config; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8bebbc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14482 @@ +{ + "name": "rcs-batsirai", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rcs-batsirai", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@bildau/rn-pdf-reader": "^4.2.7", + "@expo-google-fonts/inter": "^0.4.2", + "@expo-google-fonts/manrope": "^0.4.2", + "@expo-google-fonts/newsreader": "^0.4.1", + "@expo-google-fonts/plus-jakarta-sans": "^0.4.2", + "@expo-google-fonts/space-grotesk": "^0.4.1", + "@expo/vector-icons": "^15.0.3", + "@react-native-async-storage/async-storage": "2.2.0", + "@react-native-community/netinfo": "11.4.1", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@supabase/supabase-js": "^2.103.1", + "base-64": "^1.0.0", + "deprecated-react-native-prop-types": "^5.0.0", + "expo": "~54.0.34", + "expo-asset": "~12.0.13", + "expo-blur": "~15.0.8", + "expo-constants": "~18.0.13", + "expo-document-picker": "~14.0.8", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image": "~3.0.11", + "expo-linking": "~8.0.12", + "expo-modules-core": "~3.0.30", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-symbols": "~1.0.8", + "expo-system-ui": "~6.0.9", + "expo-web-browser": "~15.0.11", + "lucide-react": "^1.16.0", + "lucide-react-native": "^1.16.0", + "or": "^0.2.0", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-blob-util": "^0.24.7", + "react-native-drax": "^1.1.0", + "react-native-gesture-handler": "~2.28.0", + "react-native-pdf": "^7.0.4", + "react-native-pdf-renderer": "^2.3.0", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "15.12.1", + "react-native-web": "~0.21.0", + "react-native-webview": "13.15.0", + "react-native-worklets": "0.5.1" + }, + "devDependencies": { + "@types/react": "~19.1.0", + "babel-preset-expo": "^55.0.22", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "patch-package": "^8.0.1", + "postinstall-postinstall": "^2.1.0", + "react-native-svg-transformer": "^1.5.3", + "typescript": "~5.9.2" + } + }, + "node_modules/@0no-co/graphql.web": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", + "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-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==", + "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==", + "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.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", + "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.29.0", + "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==", + "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.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "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-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "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/@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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "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-export-default-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", + "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", + "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-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "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-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==", + "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-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", + "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", + "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==", + "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==", + "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-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.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==", + "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-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "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==", + "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==", + "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-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "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==", + "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-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==", + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "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==", + "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-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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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-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==", + "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==", + "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==", + "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==", + "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-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==", + "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==", + "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-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==", + "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-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "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-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==", + "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==", + "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==", + "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-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==", + "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==", + "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==", + "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==", + "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==", + "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-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==", + "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==", + "license": "MIT", + "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==", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "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-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==", + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "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-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "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==", + "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==", + "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==", + "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==", + "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==", + "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-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==", + "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/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "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==", + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bildau/rn-pdf-reader": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@bildau/rn-pdf-reader/-/rn-pdf-reader-4.2.7.tgz", + "integrity": "sha512-hzdDHy6NmiIXAhotWd22BdnvLIFQpuX0M3idaNAuzLc11itHPK8uRWR58I4OWmx/RI9W7GyNesMZX3tSFUiaRA==", + "license": "MIT", + "dependencies": { + "buffer": "5.1.0", + "csstype": "2.6.8", + "js-base64": "2.4.5" + }, + "peerDependencies": { + "expo": ">= 42.0.x", + "expo-constants": ">= 9.x", + "expo-file-system": ">= 9.x", + "react": ">= 16.x", + "react-native": "*", + "react-native-webview": ">= 11.x" + } + }, + "node_modules/@bildau/rn-pdf-reader/node_modules/buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/@bildau/rn-pdf-reader/node_modules/csstype": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==", + "license": "MIT" + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@expo-google-fonts/inter": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.4.2.tgz", + "integrity": "sha512-syfiImMaDmq7cFi0of+waE2M4uSCyd16zgyWxdPOY7fN2VBmSLKEzkfbZgeOjJq61kSqPBNNtXjggiQiSD6gMQ==", + "license": "MIT AND OFL-1.1" + }, + "node_modules/@expo-google-fonts/manrope": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/manrope/-/manrope-0.4.2.tgz", + "integrity": "sha512-BZsKe8d9BJrVnIQIZcTS7/Kac0TbXnqs/+8EBSiQxrmK6GoCO6eTkmr50D1weIk/EoF20pTmAkpWICnovATr/g==", + "license": "MIT AND OFL-1.1" + }, + "node_modules/@expo-google-fonts/newsreader": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/newsreader/-/newsreader-0.4.1.tgz", + "integrity": "sha512-j96W112+mj/VYP06DCq00w+twyw42w0MY7eHB/XXioNK80BcG0cIk/zogjOENZSY7qejzIFbHE/PZYqlh/6VKQ==", + "license": "MIT AND OFL-1.1" + }, + "node_modules/@expo-google-fonts/plus-jakarta-sans": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/plus-jakarta-sans/-/plus-jakarta-sans-0.4.2.tgz", + "integrity": "sha512-6LYVmVGwjQvH+uzzWlVc9+oMj4lkNQ41aymVDjO+x8aFk8kCye20wOyLomYMZaMezA++Uf1mZRCw3W3Fy/hxEA==", + "license": "MIT AND OFL-1.1" + }, + "node_modules/@expo-google-fonts/space-grotesk": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/space-grotesk/-/space-grotesk-0.4.1.tgz", + "integrity": "sha512-ZVQYw4Ok/pgcSJiufP8oRZE3AVxS9xtmKEUfsurbHkHNdMc/GA1gDXP9G4Cr7KL4KqSc0haexR2TuMigotCn4Q==", + "license": "MIT AND OFL-1.1" + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.3" + } + }, + "node_modules/@expo/config": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/config-plugins": { + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-types": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "license": "MIT", + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devtools": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", + "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/env": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.11.tgz", + "integrity": "sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.5.tgz", + "integrity": "sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^10.2.2", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@expo/fingerprint/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@expo/fingerprint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.14.tgz", + "integrity": "sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==", + "license": "MIT", + "dependencies": { + "@expo/require-utils": "^55.0.5", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "semver": "^7.6.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/json-file": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.14.tgz", + "integrity": "sha512-yWwBFywFv+SxkJp/pIzzA416JVYflNUh7pqQzgaA6nXDqRyK7KfrqVzk8PdUfDnqbBcaZZxpzNssfQZzp5KHrA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/metro": { + "version": "54.2.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", + "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "license": "MIT", + "dependencies": { + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3" + } + }, + "node_modules/@expo/metro-config": { + "version": "54.0.15", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.15.tgz", + "integrity": "sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8", + "@expo/json-file": "~10.0.8", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.29.1", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.3", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-runtime": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", + "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", + "license": "MIT", + "dependencies": { + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-dom": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@expo/osascript": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.3.tgz", + "integrity": "sha512-wbuj3EebM7W9hN/Wp4xTzKd6rQ2zKJzAxkFxkOOwyysLp0HOAgQ4/5RINyoS241pZUX2rUHq7mAJ7pcCQ8U0Ow==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.5.tgz", + "integrity": "sha512-nCP9Mebfl3jvOr0/P6VAuyah6PAtun+aihIL2zAtuE8uSe94JWkVZ7051i0MUVO+y3gFpBqnr8IIH5ch+VJjHA==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.14", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/@expo/plist": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "54.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", + "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", + "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "license": "MIT" + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/require-utils": { + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.5.tgz", + "integrity": "sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@expo/schema-utils": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", + "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", + "license": "MIT" + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.8.0.tgz", + "integrity": "sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", + "license": "MIT" + }, + "node_modules/@expo/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", + "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "license": "MIT" + }, + "node_modules/@expo/xcpretty": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz", + "integrity": "sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "chalk": "^4.1.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-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-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-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-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", + "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", + "license": "MIT", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.65 <1.0" + } + }, + "node_modules/@react-native-community/netinfo": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.4.1.tgz", + "integrity": "sha512-B0BYAkghz3Q2V09BF88RA601XursIEA111tnc2JOaN7axJWmNefmfjZqw/KdSxKZp7CZUuPpjBmz/WCR9uaHYg==", + "license": "MIT", + "peerDependencies": { + "react-native": ">=0.59" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz", + "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.6.tgz", + "integrity": "sha512-qfRXsHGeucT5c6mK+8Q7v4Ly3zmygfVmFlEtkiq7q07W1OTreld6nib4rJ/DBEeNiKBoBTuHjWliYGNuDjLFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.83.6" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen/node_modules/@react-native/codegen": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.6.tgz", + "integrity": "sha512-doB/Pq6Cf6IjF3wlQXTIiZOnsX9X8mEEk+CdGfyuCwZjWrf7IB8KaZEXXckJmfUcIwvJ9u/a72ZoTTCIoxAc9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/babel-plugin-codegen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "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/@react-native/babel-plugin-codegen/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@react-native/babel-plugin-codegen/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.6.tgz", + "integrity": "sha512-4/fXFDUvGOObETZq4+SUFkafld6OGgQWut5cQiqVghlhCB5z/p2lVhPgEUr/aTxTzeS3AmN+ztC+GpYPQ7tsTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.83.6", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.0" + } + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", + "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.29.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "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/@react-native/community-cli-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz", + "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==", + "license": "MIT", + "dependencies": { + "@react-native/dev-middleware": "0.81.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.1", + "metro-config": "^0.83.1", + "metro-core": "^0.83.1", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", + "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", + "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.81.5", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz", + "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz", + "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/normalize-color": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz", + "integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==", + "license": "MIT" + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.73.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz", + "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==", + "license": "MIT" + }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.16.1.tgz", + "integrity": "sha512-wjFATJmbq0K8B96Ax0JcK2+Eu7syfYvQ5qUd/tgcv8JuCYLwKKqojJMAl31qdjpKqFG09pQ6TSdEDHOek60CAA==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.18", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^7.2.4", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "7.17.4", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.17.4.tgz", + "integrity": "sha512-Rv9E2oNNQEkPGpmu9q+vJwGJRSQR6LBg5L+Yo1QHjtwGbHUbjkIKOdYymDZoZYgNzX2OD4rAIlfuzbDKa3cCeA==", + "license": "MIT", + "dependencies": { + "@react-navigation/routers": "^7.5.5", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "query-string": "^7.1.3", + "react-is": "^19.1.0", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "react": ">= 18.2.0" + } + }, + "node_modules/@react-navigation/elements": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.18.tgz", + "integrity": "sha512-mKEvDr6CkCVYZSb8W9WubNseihL+1c8M7ktZJCTCbMk8rQgdQfkdRNwpSUQKspdGpUHCb9cyzvaiuzl1NtjVgw==", + "license": "MIT", + "dependencies": { + "color": "^4.2.3", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@react-native-masked-view/masked-view": ">= 0.2.0", + "@react-navigation/native": "^7.2.4", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0" + }, + "peerDependenciesMeta": { + "@react-native-masked-view/masked-view": { + "optional": true + } + } + }, + "node_modules/@react-navigation/native": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.2.4.tgz", + "integrity": "sha512-eWC2D3JjhYLId2fVTZhhCiUpWIaPhO9XyEb7Wq8ElmOHyIODlbOzgZ0rKia02OIsDKr9BzZl2sK1dL70yMxDaw==", + "license": "MIT", + "dependencies": { + "@react-navigation/core": "^7.17.4", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "use-latest-callback": "^0.2.4" + }, + "peerDependencies": { + "react": ">= 18.2.0", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native-stack": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.15.1.tgz", + "integrity": "sha512-kNrJggwoB/onC0MpZIuZ6qaqeAziFchz+W9txBzhd6qbWmB1OkPVUnu6fWgc6BQc7MeMf59djVmqgX+6kJU1Ug==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.18", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0", + "warn-once": "^0.1.1" + }, + "peerDependencies": { + "@react-navigation/native": "^7.2.4", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/routers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.5.tgz", + "integrity": "sha512-9/hhMte12Kgu+pMnLfA4EWJ0OQmIEAMVMX06FPH2yGkEQSQ3JhhCN/GkcRikzQhtEi97VYYQA15umptBUShcOQ==", + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11" + } + }, + "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/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@supabase/auth-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.106.1.tgz", + "integrity": "sha512-7eyheXfAGwkB9bZewJPs+N3UYt6kra2JG6mIxNEgbkvcO15PLD1e75PTIUEYYl3zrifm3GrpShVl7QZxKrXO/w==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.106.1.tgz", + "integrity": "sha512-XbOPnR2mW7jp/EcW447xmGwCa+/Wc00Hkw8t4tUIJjRsHQ4xAESsLKcyLRhRJjJoUnJVXUlC+w0wUxUCM7CG2A==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/phoenix": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.2.tgz", + "integrity": "sha512-YSAGnmDAfuleFCVt3CeurQZAhxRfXWeZIIkwp7NhYzQ1UwW6ePSnzsFAiUm/mbCkfoCf70QQHKW/K6RKh52a4A==", + "license": "MIT" + }, + "node_modules/@supabase/postgrest-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.106.1.tgz", + "integrity": "sha512-Qbn6d2lqiqeaBX1Uko0e/hL90dtQGRN6CG2wMVQtJpRFstlVW45qmUTyTOsiB8dYUWu1fWYo4YzJuDbokGv3tQ==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.106.1.tgz", + "integrity": "sha512-eQCYri5E8KsjpDgC7g28cOOS2britjUWdNSJluFMainqrMRepzjOnaxqXc3RoAz7H0dxmBrfLUNF6NGP8C+YaA==", + "license": "MIT", + "dependencies": { + "@supabase/phoenix": "^0.4.2", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.106.1.tgz", + "integrity": "sha512-HWcLIhqinhWKpOQ3WzglR2unjW0eh9J7yOu3IZrZNIEkraK4La/HDvTqndljGsNw0itPtyHhuKBxRoPG1VUARw==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.106.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.106.1.tgz", + "integrity": "sha512-gP4HurGkGu7Z3xoOCjtAI17BKKp7jpsmwY0Ssbsks9XQRzJ7ZhK7LxfLdBSYgUdgZCQgjRK+Mr7+cl4Gxrk0Rw==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.106.1", + "@supabase/functions-js": "2.106.1", + "@supabase/postgrest-js": "2.106.1", + "@supabase/realtime-js": "2.106.1", + "@supabase/storage-js": "2.106.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "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==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "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": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/react": { + "version": "19.1.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", + "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.4", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.4", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@urql/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", + "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.13", + "wonka": "^6.3.2" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", + "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", + "license": "MIT", + "dependencies": { + "@urql/core": "^5.1.2", + "wonka": "^6.3.2" + }, + "peerDependencies": { + "@urql/core": "^5.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/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==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "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/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "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==", + "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.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", + "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", + "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.29.1" + } + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-expo": { + "version": "55.0.22", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.22.tgz", + "integrity": "sha512-Se6kPnvCNN13jJVIa6JJvlmImVoVRzu9stagAbivCPcfrq2VNrsEiYpJZ1+H32kXinKW/y797/wctGuxPy0APw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.83.6", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^55.0.19", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } + } + }, + "node_modules/babel-preset-expo/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.1.tgz", + "integrity": "sha512-HgErPZTghW76Rkq9uqn5ESeiD97FbqpZ1V170T1RG2RDp+7pJVQV2pQJs7y5YzN0/gcT6GM5ci9apRnIwuyPdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.1" + } + }, + "node_modules/babel-preset-expo/node_modules/hermes-estree": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-expo/node_modules/hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.1" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.31.tgz", + "integrity": "sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "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.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "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.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "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==", + "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/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.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==", + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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==", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "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/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecated-react-native-prop-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz", + "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==", + "license": "MIT", + "dependencies": { + "@react-native/normalize-colors": "^0.73.0", + "invariant": "^2.2.4", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.360", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.360.tgz", + "integrity": "sha512-GkcBt6YYAw9SxFWn+xVar4cLVGlXVuswwtRLBozi2zp0GjXs4ZnOrqV4zbXzg35n7w81hCkyJNYicgXlVHAmBA==", + "license": "ISC" + }, + "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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.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", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-expo": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-expo/-/eslint-config-expo-10.0.0.tgz", + "integrity": "sha512-/XC/DvniUWTzU7Ypb/cLDhDD4DXqEio4lug1ObD/oQ9Hcx3OVOR8Mkp4u6U4iGoZSJyIQmIk3WVHe/P1NYUXKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-expo": "^1.0.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-react": "^7.37.3", + "eslint-plugin-react-hooks": "^5.1.0", + "globals": "^16.0.0" + }, + "peerDependencies": { + "eslint": ">=8.10" + } + }, + "node_modules/eslint-config-expo/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "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-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "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-expo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-expo/-/eslint-plugin-expo-1.0.3.tgz", + "integrity": "sha512-C1v9NPvpDET36+7Klpp/+53Jl+VzOfpbDxpKtL/pAPhCDwTX0kW6Swo425PT0uc4AMT5jpQbB7hSKFjKOGMl4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.29.1", + "@typescript-eslint/utils": "^8.29.1", + "eslint": "^9.24.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.10" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "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-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/expo": { + "version": "54.0.34", + "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.34.tgz", + "integrity": "sha512-XkVHguZZDC8BcTQxHAd14/TQFbDp1Wt0Z/KApO9t68Ll5A127hLCPzU+a9gytfCIiyL/V1IpF1vIcOLKEVAoNQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "54.0.24", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devtools": "0.1.8", + "@expo/fingerprint": "0.15.5", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "54.0.15", + "@expo/vector-icons": "^15.0.3", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~54.0.10", + "expo-asset": "~12.0.13", + "expo-constants": "~18.0.13", + "expo-file-system": "~19.0.22", + "expo-font": "~14.0.11", + "expo-keep-awake": "~15.0.8", + "expo-modules-autolinking": "3.0.25", + "expo-modules-core": "3.0.30", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-asset": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.13.tgz", + "integrity": "sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.13" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-blur": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-15.0.8.tgz", + "integrity": "sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-constants": { + "version": "18.0.13", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", + "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-document-picker": { + "version": "14.0.8", + "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-14.0.8.tgz", + "integrity": "sha512-3tyQKpPqWWFlI8p9RiMX1+T1Zge5mEKeBuXWp1h8PEItFMUDSiOJbQ112sfdC6Hxt8wSxreV9bCRl/NgBdt+fA==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "19.0.22", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.22.tgz", + "integrity": "sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", + "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-haptics": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-15.0.8.tgz", + "integrity": "sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-3.0.11.tgz", + "integrity": "sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-keep-awake": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", + "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linking": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.12.tgz", + "integrity": "sha512-FpXeIpFgZuxihwT9lBo86YD3y6LphBuAhN680MMxm/Y7fmsc57vimn2d3vFu68VI0+Z9w457t494mu2wvlgWTQ==", + "license": "MIT", + "dependencies": { + "expo-constants": "~18.0.13", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.25.tgz", + "integrity": "sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-core": { + "version": "3.0.30", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.30.tgz", + "integrity": "sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-router": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-6.0.23.tgz", + "integrity": "sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==", + "license": "MIT", + "dependencies": { + "@expo/metro-runtime": "^6.1.2", + "@expo/schema-utils": "^0.1.8", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-tabs": "^1.1.12", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/native": "^7.1.8", + "@react-navigation/native-stack": "^7.3.16", + "client-only": "^0.0.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "expo-server": "^1.0.5", + "fast-deep-equal": "^3.1.3", + "invariant": "^2.2.4", + "nanoid": "^3.3.8", + "query-string": "^7.1.3", + "react-fast-compare": "^3.2.2", + "react-native-is-edge-to-edge": "^1.1.6", + "semver": "~7.6.3", + "server-only": "^0.0.1", + "sf-symbols-typescript": "^2.1.0", + "shallowequal": "^1.1.0", + "use-latest-callback": "^0.2.1", + "vaul": "^1.1.2" + }, + "peerDependencies": { + "@expo/metro-runtime": "^6.1.2", + "@react-navigation/drawer": "^7.5.0", + "@testing-library/react-native": ">= 12.0.0", + "expo": "*", + "expo-constants": "^18.0.13", + "expo-linking": "^8.0.11", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-gesture-handler": "*", + "react-native-reanimated": "*", + "react-native-safe-area-context": ">= 5.4.0", + "react-native-screens": "*", + "react-native-web": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + }, + "peerDependenciesMeta": { + "@react-navigation/drawer": { + "optional": true + }, + "@testing-library/react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-gesture-handler": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/expo-router/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/expo-router/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/expo-router/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/expo-router/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/expo-router/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-server": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.6.tgz", + "integrity": "sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-splash-screen": { + "version": "31.0.13", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz", + "integrity": "sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==", + "license": "MIT", + "dependencies": { + "@expo/prebuild-config": "^54.0.8" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-sqlite": { + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", + "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", + "license": "MIT", + "dependencies": { + "await-lock": "^2.2.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-status-bar": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz", + "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-symbols": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-1.0.8.tgz", + "integrity": "sha512-7bNjK350PaQgxBf0owpmSYkdZIpdYYmaPttDBb2WIp6rIKtcEtdzdfmhsc2fTmjBURHYkg36+eCxBFXO25/1hw==", + "license": "MIT", + "dependencies": { + "sf-symbols-typescript": "^2.0.0" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-system-ui": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-6.0.9.tgz", + "integrity": "sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==", + "license": "MIT", + "dependencies": { + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.2" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-system-ui/node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", + "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "license": "MIT" + }, + "node_modules/expo-web-browser": { + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-15.0.11.tgz", + "integrity": "sha512-r2LS4Ro6DgUPZkcaEfgt8mp9eJuoA93x11Jh7S6utFe0FEzvUNn2yFhxg8XVwESaaHGt2k5V8LuK36rsp0BeIw==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/@expo/cli": { + "version": "54.0.24", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.24.tgz", + "integrity": "sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~54.0.15", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.10", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.8", + "@expo/schema-utils": "^0.1.8", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.81.5", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "expo-server": "^1.0.6", + "freeport-async": "^2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.1", + "minimatch": "^9.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^4.0.3", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.5.2", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/expo/node_modules/@react-native/babel-plugin-codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", + "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.81.5" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/expo/node_modules/@react-native/babel-preset": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", + "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.81.5", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/expo/node_modules/babel-preset-expo": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", + "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.81.5", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + } + } + }, + "node_modules/expo/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/expo/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "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/expo/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.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==", + "license": "MIT" + }, + "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==", + "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/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "license": "MIT" + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", + "license": "BSD-2-Clause" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "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==", + "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.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", + "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", + "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/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/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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.", + "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==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, + "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/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "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-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "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.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", + "license": "MIT" + }, + "node_modules/js-base64": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", + "license": "BSD-3-Clause" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "license": "0BSD" + }, + "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": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lan-network": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.1.tgz", + "integrity": "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==", + "license": "MIT", + "bin": { + "lan-network": "dist/lan-network-cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/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.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "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/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.16.0.tgz", + "integrity": "sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lucide-react-native": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/lucide-react-native/-/lucide-react-native-1.16.0.tgz", + "integrity": "sha512-clxA22OvrNUHB2tQQEvURN8KJ5/vbUV/6GSctU1aCoFlJmDwNrdo8xxNTG535tu7iOATZCth6R2AW1kbva+g6A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-native": "*", + "react-native-svg": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marky": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.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/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/metro": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.32.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.32.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro-cache": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-cache-key": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-config": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", + "license": "MIT", + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-core": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-file-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-resolver": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-runtime": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-source-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.3", + "nullthrows": "^1.1.1", + "ob1": "0.83.3", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.3", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "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/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "license": "MIT" + }, + "node_modules/ob1": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "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-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.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/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/or": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/or/-/or-0.2.0.tgz", + "integrity": "sha512-BHB8VZq2isxkyRaCBZ6CZCbQBzCT+gy8LPiqdbMH1+Fd6biFj3v8ebjeYzzL51PbsApsPYnGegGTO6KLQMxxDw==", + "engines": { + "node": "*" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "license": "MIT", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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==", + "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": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz", + "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.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", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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/postinstall-postinstall": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", + "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", + "dev": true, + "hasInstallScript": true, + "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/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/prop-types/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", + "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.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-freeze": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", + "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-is": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", + "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.81.5", + "@react-native/codegen": "0.81.5", + "@react-native/community-cli-plugin": "0.81.5", + "@react-native/gradle-plugin": "0.81.5", + "@react-native/js-polyfills": "0.81.5", + "@react-native/normalize-colors": "0.81.5", + "@react-native/virtualized-lists": "0.81.5", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.1", + "metro-source-map": "^0.83.1", + "nullthrows": "^1.1.1", + "pretty-format": "^29.7.0", + "promise": "^8.3.0", + "react-devtools-core": "^6.1.5", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.26.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.3", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "^19.1.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-blob-util": { + "version": "0.24.9", + "resolved": "https://registry.npmjs.org/react-native-blob-util/-/react-native-blob-util-0.24.9.tgz", + "integrity": "sha512-tG3+m0WhVdBGifvxSFxZDVqtr85D0fGBJU6E4UxmK3tU+RabJZTumXEn8k7jn5/NFe8OhQhPjtBEZ11ZJ6L7Vw==", + "license": "MIT", + "dependencies": { + "base-64": "0.1.0", + "glob": "13.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ronradtke" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-blob-util/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/react-native-blob-util/node_modules/base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" + }, + "node_modules/react-native-blob-util/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/react-native-blob-util/node_modules/glob": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", + "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.2", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-native-blob-util/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-native-drax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-native-drax/-/react-native-drax-1.1.0.tgz", + "integrity": "sha512-MBAmlMZe/sSCwq2EXdxH8Dc2Gy9y+tvRJn/EWPtAsEoRkIVWeCFg8+7q7ABkmIDLwHGobuIRVC5M6OL6+2ldgQ==", + "license": "MIT", + "workspaces": [ + "example", + "docs-site" + ], + "peerDependencies": { + "react": ">=18.0.0", + "react-native": ">=0.68.0", + "react-native-gesture-handler": ">=2.0.0", + "react-native-reanimated": "^4.0.0" + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", + "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", + "license": "MIT", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-is-edge-to-edge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz", + "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-pdf": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/react-native-pdf/-/react-native-pdf-7.0.4.tgz", + "integrity": "sha512-Uhxn5SSguMKvbwD50iIZfYPmYeKcX+9I3tc4J3HCbRExAN0uqXTAKx2pvbR2Y62umAj0JS274FcbSldQfoQfyg==", + "license": "MIT", + "dependencies": { + "crypto-js": "4.2.0", + "deprecated-react-native-prop-types": "^2.3.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-blob-util": ">=0.13.7" + } + }, + "node_modules/react-native-pdf-renderer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-native-pdf-renderer/-/react-native-pdf-renderer-2.3.0.tgz", + "integrity": "sha512-k/eacZVUKAcTTVvZk5Ey+wiJYRc9K2OdZ/10CJWH7xlxyzfAg6LHjjm8NIOQTJgnL9tXSDjNihjdVldWb+TxJA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react-native": ">=0.71" + } + }, + "node_modules/react-native-pdf/node_modules/deprecated-react-native-prop-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz", + "integrity": "sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA==", + "license": "MIT", + "dependencies": { + "@react-native/normalize-color": "*", + "invariant": "*", + "prop-types": "*" + } + }, + "node_modules/react-native-reanimated": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.7.tgz", + "integrity": "sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1", + "semver": "^7.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "0.78 - 0.82", + "react-native-worklets": "0.5 - 0.8" + } + }, + "node_modules/react-native-reanimated/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", + "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", + "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "react-native-is-edge-to-edge": "^1.2.1", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-svg": { + "version": "15.12.1", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", + "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-svg-transformer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.5.3.tgz", + "integrity": "sha512-M4uFg5pUt35OMgjD4rWWbwd6PmxV96W7r/gQTTa+iZA5B+jO6aURhzAZGLHSrg1Kb91cKG0Rildy9q1WJvYstg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0", + "@svgr/plugin-svgo": "^8.1.0", + "path-dirname": "^1.0.2" + }, + "peerDependencies": { + "react-native": ">=0.59.0", + "react-native-svg": ">=12.0.0" + } + }, + "node_modules/react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", + "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@react-native/normalize-colors": "^0.74.1", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^7.0.1", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.3" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.89", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", + "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", + "license": "MIT" + }, + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/react-native-webview": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz", + "integrity": "sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-worklets": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", + "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "semver": "7.7.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-worklets/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", + "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "license": "MIT" + }, + "node_modules/react-native/node_modules/@react-native/virtualized-lists": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", + "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-native/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "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/react-native/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "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==", + "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-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/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "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==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "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==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.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": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve-workspace-root": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", + "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "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/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sf-symbols-typescript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", + "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "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==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-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/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", + "license": "MIT" + }, + "node_modules/styleq": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/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/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.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/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", + "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==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "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/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/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "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-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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/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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "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", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "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": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "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==", + "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-latest-callback": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", + "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vaul/node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/vaul/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/vaul/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/vaul/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/vaul/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/vaul/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/vaul/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/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "license": "MIT" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "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/whatwg-url-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "license": "MIT", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "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.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.6.tgz", + "integrity": "sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag==", + "license": "MIT" + }, + "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": "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9b14edf --- /dev/null +++ b/package.json @@ -0,0 +1,78 @@ +{ + "name": "rcs-batsirai", + "main": "expo-router/entry", + "version": "1.0.0", + "scripts": { + "start": "expo start", + "reset-project": "node ./scripts/reset-project.js", + "android": "expo run:android", + "ios": "expo run:ios", + "web": "expo start --web", + "lint": "expo lint", + "postinstall": "patch-package" + }, + "dependencies": { + "@bildau/rn-pdf-reader": "^4.2.7", + "@expo-google-fonts/inter": "^0.4.2", + "@expo-google-fonts/manrope": "^0.4.2", + "@expo-google-fonts/newsreader": "^0.4.1", + "@expo-google-fonts/plus-jakarta-sans": "^0.4.2", + "@expo-google-fonts/space-grotesk": "^0.4.1", + "@expo/vector-icons": "^15.0.3", + "@react-native-async-storage/async-storage": "2.2.0", + "@react-native-community/netinfo": "11.4.1", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@supabase/supabase-js": "^2.103.1", + "base-64": "^1.0.0", + "deprecated-react-native-prop-types": "^5.0.0", + "expo": "~54.0.34", + "expo-asset": "~12.0.13", + "expo-blur": "~15.0.8", + "expo-constants": "~18.0.13", + "expo-document-picker": "~14.0.8", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image": "~3.0.11", + "expo-linking": "~8.0.12", + "expo-modules-core": "~3.0.30", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-symbols": "~1.0.8", + "expo-system-ui": "~6.0.9", + "expo-web-browser": "~15.0.11", + "lucide-react": "^1.16.0", + "lucide-react-native": "^1.16.0", + "or": "^0.2.0", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-blob-util": "^0.24.7", + "react-native-drax": "^1.1.0", + "react-native-gesture-handler": "~2.28.0", + "react-native-pdf": "^7.0.4", + "react-native-pdf-renderer": "^2.3.0", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "15.12.1", + "react-native-web": "~0.21.0", + "react-native-webview": "13.15.0", + "react-native-worklets": "0.5.1" + }, + "devDependencies": { + "@types/react": "~19.1.0", + "babel-preset-expo": "^55.0.22", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "patch-package": "^8.0.1", + "postinstall-postinstall": "^2.1.0", + "react-native-svg-transformer": "^1.5.3", + "typescript": "~5.9.2" + }, + "private": true +} diff --git a/package.json.2D_q-2-Nu-kn7eViVb2lHdu0L6LI5-jogE7lgzsx8pU b/package.json.2D_q-2-Nu-kn7eViVb2lHdu0L6LI5-jogE7lgzsx8pU new file mode 100644 index 0000000..21293e0 --- /dev/null +++ b/package.json.2D_q-2-Nu-kn7eViVb2lHdu0L6LI5-jogE7lgzsx8pU @@ -0,0 +1,58 @@ +{ + "name": "rcs-batsirai", + "main": "expo-router/entry", + "version": "1.0.0", + "scripts": { + "start": "expo start", + "reset-project": "node ./scripts/reset-project.js", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web", + "lint": "expo lint" + }, + "dependencies": { + "@expo-google-fonts/inter": "^0.4.2", + "@expo-google-fonts/manrope": "^0.4.2", + "@expo-google-fonts/newsreader": "^0.4.1", + "@expo-google-fonts/plus-jakarta-sans": "^0.4.2", + "@expo-google-fonts/space-grotesk": "^0.4.1", + "@expo/vector-icons": "^15.0.3", + "@react-native-async-storage/async-storage": "^3.0.2", + "@react-native-community/netinfo": "^12.0.1", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@supabase/supabase-js": "^2.103.1", + "expo": "~54.0.33", + "expo-constants": "~18.0.13", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image": "~3.0.11", + "expo-linking": "~8.0.11", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "^55.0.15", + "expo-status-bar": "~3.0.9", + "expo-symbols": "~1.0.8", + "expo-system-ui": "~6.0.9", + "expo-web-browser": "~15.0.10", + "lucide-react-native": "^0.473.0", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "15.12.1", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.5.1" + }, + "devDependencies": { + "@types/react": "~19.1.0", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "typescript": "~5.9.2" + }, + "private": true +} diff --git a/patches/@bildau+rn-pdf-reader+4.2.7.patch b/patches/@bildau+rn-pdf-reader+4.2.7.patch new file mode 100644 index 0000000..d24d314 --- /dev/null +++ b/patches/@bildau+rn-pdf-reader+4.2.7.patch @@ -0,0 +1,186 @@ +diff --git a/node_modules/@bildau/rn-pdf-reader/lib/index.js b/node_modules/@bildau/rn-pdf-reader/lib/index.js +index 2483bd2..c2c49a5 100644 +--- a/node_modules/@bildau/rn-pdf-reader/lib/index.js ++++ b/node_modules/@bildau/rn-pdf-reader/lib/index.js +@@ -1,7 +1,7 @@ + import * as React from 'react'; + import { View, ActivityIndicator, Platform, StyleSheet } from 'react-native'; + import { WebView } from 'react-native-webview'; +-import * as FileSystem from 'expo-file-system'; ++import * as FileSystem from 'expo-file-system/legacy'; + const { cacheDirectory, writeAsStringAsync, deleteAsync, getInfoAsync, EncodingType, } = FileSystem; + function viewerHtml(base64, customStyle, withScroll = false, withPinchZoom = false, maximumPinchZoomScale = 5) { + return ` +@@ -48,10 +48,14 @@ const bundleJsPath = `${cacheDirectory}bundle.js`; + const htmlPath = `${cacheDirectory}index.html`; + const pdfPath = `${cacheDirectory}file.pdf`; + function writeWebViewComponentFile(container, fileName, callback) { ++ console.log(`[PdfReader] writing component file: ${fileName}`); + writeAsStringAsync(`${cacheDirectory}${fileName}`, container.getBundle()).then(() => { ++ console.log(`[PdfReader] finished writing: ${fileName}`); + if (typeof callback === 'function') { + callback(); + } ++ }).catch(err => { ++ console.error(`[PdfReader] error writing ${fileName}:`, err); + }); + } + function writeWebViewComponentFiles() { +@@ -66,15 +70,19 @@ function writeWebViewComponentFiles() { + }); + } + async function writeWebViewReaderFileAsync(data, customStyle, withScroll, withPinchZoom, maximumPinchZoomScale) { ++ console.log('[PdfReader] writeWebViewReaderFileAsync start'); + writeWebViewComponentFiles(); ++ console.log('[PdfReader] checking bundle.js exists...'); + const { exists, md5 } = await getInfoAsync(bundleJsPath, { md5: true }); + const bundleContainer = require('./bundleContainer'); + if (__DEV__ || !exists || bundleContainer.getBundleMd5() !== md5) { ++ console.log('[PdfReader] writing bundle.js...'); + await writeAsStringAsync(bundleJsPath, bundleContainer.getBundle()); + } ++ console.log('[PdfReader] writing index.html...'); + await writeAsStringAsync(htmlPath, viewerHtml(data, customStyle, withScroll, withPinchZoom, maximumPinchZoomScale)); +-} +-async function writePDFAsync(base64) { ++ console.log('[PdfReader] writeWebViewReaderFileAsync finished'); ++}async function writePDFAsync(base64) { + await writeAsStringAsync(pdfPath, base64.replace('data:application/pdf;base64,', ''), { encoding: EncodingType.Base64 }); + } + export async function removeFilesAsync() { +@@ -150,6 +158,7 @@ class PdfReader extends React.Component { + data: undefined, + renderedOnce: false, + }; ++ this.cachedWebviewSource = null; + this.validate = () => { + const { onError: propOnError, source } = this.props; + const { renderType } = this.state; +@@ -176,33 +185,40 @@ class PdfReader extends React.Component { + }; + this.init = async () => { + try { ++ console.log('[PdfReader] init start'); + const { source, customStyle, withScroll, withPinchZoom, maximumPinchZoomScale, } = this.props; + const { renderType } = this.state; ++ console.log('[PdfReader] renderType:', renderType); + switch (renderType) { + case 'GOOGLE_DRIVE_VIEWER': { + break; + } + case 'URL_TO_BASE64': { ++ console.log('[PdfReader] fetching PDF...'); + const data = await fetchPdfAsync(source); ++ console.log('[PdfReader] writing files...'); + await writeWebViewReaderFileAsync(data, customStyle, withScroll, withPinchZoom, maximumPinchZoomScale); + break; + } + case 'DIRECT_BASE64': { ++ console.log('[PdfReader] writing files (direct base64)...'); + await writeWebViewReaderFileAsync(source.base64, customStyle, withScroll, withPinchZoom, maximumPinchZoomScale); + break; + } + case 'BASE64_TO_LOCAL_PDF': { ++ console.log('[PdfReader] writing local PDF...'); + await writePDFAsync(source.base64); + break; + } + default: + break; + } ++ console.log('[PdfReader] init finished, setting ready: true'); + this.setState({ ready: true }); + } + catch (error) { + alert(`Sorry, an error occurred. ${error.message}`); +- console.error(error); ++ console.error('[PdfReader] init error:', error); + } + }; + this.getRenderType = () => { +@@ -232,23 +248,33 @@ class PdfReader extends React.Component { + this.getWebviewSource = () => { + const { renderType } = this.state; + const { source: { uri, headers }, onError, } = this.props; ++ let result; + switch (renderType) { + case 'GOOGLE_READER': +- return { uri: getGoogleReaderUrl(uri) }; ++ result = { uri: getGoogleReaderUrl(uri) }; ++ break; + case 'GOOGLE_DRIVE_VIEWER': +- return { uri: getGoogleDriveUrl(uri) }; ++ result = { uri: getGoogleDriveUrl(uri) }; ++ break; + case 'DIRECT_BASE64': + case 'URL_TO_BASE64': +- return { uri: htmlPath }; ++ result = { uri: htmlPath }; ++ break; + case 'DIRECT_URL': +- return { uri: uri, headers }; ++ result = { uri: uri, headers }; ++ break; + case 'BASE64_TO_LOCAL_PDF': +- return { uri: pdfPath }; ++ result = { uri: pdfPath }; ++ break; + default: { + onError('Unknown RenderType'); + return undefined; + } + } ++ if (!this.cachedWebviewSource || this.cachedWebviewSource.uri !== result.uri) { ++ this.cachedWebviewSource = result; ++ } ++ return this.cachedWebviewSource; + }; + } + componentDidMount() { +@@ -262,6 +288,7 @@ class PdfReader extends React.Component { + if (prevProps.source.uri !== this.props.source.uri || + prevProps.source.base64 !== this.props.source.base64) { + this.setState({ ready: false, renderType: this.getRenderType() }); ++ this.cachedWebviewSource = null; + this.validate(); + this.init(); + } +@@ -294,20 +321,33 @@ class PdfReader extends React.Component { + const isAndroid = Platform.OS === 'android'; + if (ready) { + const source = this.getWebviewSource(); ++ console.log('[PdfReader] rendering WebView with source:', source); + return (React.createElement(View, { style: [styles.container, containerStyle] }, + React.createElement(WebView, { ...{ + originWhitelist, + onLoad: (event) => { +- this.setState({ renderedOnce: true }); ++ console.log('[PdfReader] WebView onLoad called'); ++ if (!this.state.renderedOnce) { ++ this.setState({ renderedOnce: true }); ++ } + if (onLoad) { + onLoad(event); + } + }, +- onLoadEnd, +- onError, +- onHttpError: onError, ++ onLoadEnd: () => { ++ console.log('[PdfReader] WebView onLoadEnd called'); ++ if (onLoadEnd) onLoadEnd(); ++ }, ++ onError: (error) => { ++ console.error('[PdfReader] WebView onError:', error); ++ if (onError) onError(error); ++ }, ++ onHttpError: (error) => { ++ console.error('[PdfReader] WebView onHttpError:', error); ++ if (onError) onError(error); ++ }, + style, +- source: renderedOnce || !isAndroid ? source : undefined, ++ source: source, + }, allowFileAccess: isAndroid, allowFileAccessFromFileURLs: isAndroid, allowUniversalAccessFromFileURLs: isAndroid, scalesPageToFit: Platform.select({ android: false }), mixedContentMode: isAndroid ? 'always' : undefined, sharedCookiesEnabled: false, startInLoadingState: !noLoader, renderLoading: () => (noLoader ? React.createElement(View, null) : React.createElement(Loader, null)), ...webviewProps }))); + } + return !noLoader && !ready && React.createElement(Loader, null); diff --git a/patches/@supabase+supabase-js+2.106.1.patch b/patches/@supabase+supabase-js+2.106.1.patch new file mode 100644 index 0000000..ba12549 --- /dev/null +++ b/patches/@supabase+supabase-js+2.106.1.patch @@ -0,0 +1,26 @@ +diff --git a/node_modules/@supabase/supabase-js/dist/index.cjs b/node_modules/@supabase/supabase-js/dist/index.cjs +index 56a9c3a..c57ea9d 100644 +--- a/node_modules/@supabase/supabase-js/dist/index.cjs ++++ b/node_modules/@supabase/supabase-js/dist/index.cjs +@@ -624,7 +624,7 @@ var require_extract = /* @__PURE__ */ __commonJSMin(((exports) => { + let otelModulePromise = null; + const OTEL_PKG = "@opentelemetry/api"; + function loadOtel() { +- if (otelModulePromise === null) otelModulePromise = Promise.resolve(`${OTEL_PKG}`).then((s) => tslib_1.__importStar(require(s))).catch(() => null); ++ otelModulePromise = Promise.resolve(null); + return otelModulePromise; + } + /** +diff --git a/node_modules/@supabase/supabase-js/dist/index.mjs b/node_modules/@supabase/supabase-js/dist/index.mjs +index 0b33345..fc81723 100644 +--- a/node_modules/@supabase/supabase-js/dist/index.mjs ++++ b/node_modules/@supabase/supabase-js/dist/index.mjs +@@ -68,7 +68,7 @@ function __awaiter(thisArg, _arguments, P, generator) { + let otelModulePromise = null; + const OTEL_PKG = "@opentelemetry/api"; + function loadOtel() { +- if (otelModulePromise === null) otelModulePromise = import(/* webpackIgnore: true */ /* turbopackIgnore: true */ /* @vite-ignore */ OTEL_PKG).catch(() => null); ++ if (otelModulePromise === null) otelModulePromise = Promise.resolve(null); + return otelModulePromise; + } + /** diff --git a/scripts/reset-project.js b/scripts/reset-project.js new file mode 100644 index 0000000..51dff15 --- /dev/null +++ b/scripts/reset-project.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node + +/** + * This script is used to reset the project to a blank state. + * It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json and safely delete this file after running it. + */ + +const fs = require("fs"); +const path = require("path"); +const readline = require("readline"); + +const root = process.cwd(); +const oldDirs = ["app", "components", "hooks", "constants", "scripts"]; +const exampleDir = "app-example"; +const newAppDir = "app"; +const exampleDirPath = path.join(root, exampleDir); + +const indexContent = `import { Text, View } from "react-native"; + +export default function Index() { + return ( + + Edit app/index.tsx to edit this screen. + + ); +} +`; + +const layoutContent = `import { Stack } from "expo-router"; + +export default function RootLayout() { + return ; +} +`; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const moveDirectories = async (userInput) => { + try { + if (userInput === "y") { + // Create the app-example directory + await fs.promises.mkdir(exampleDirPath, { recursive: true }); + console.log(`📁 /${exampleDir} directory created.`); + } + + // Move old directories to new app-example directory or delete them + for (const dir of oldDirs) { + const oldDirPath = path.join(root, dir); + if (fs.existsSync(oldDirPath)) { + if (userInput === "y") { + const newDirPath = path.join(root, exampleDir, dir); + await fs.promises.rename(oldDirPath, newDirPath); + console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); + } else { + await fs.promises.rm(oldDirPath, { recursive: true, force: true }); + console.log(`❌ /${dir} deleted.`); + } + } else { + console.log(`➡️ /${dir} does not exist, skipping.`); + } + } + + // Create new /app directory + const newAppDirPath = path.join(root, newAppDir); + await fs.promises.mkdir(newAppDirPath, { recursive: true }); + console.log("\n📁 New /app directory created."); + + // Create index.tsx + const indexPath = path.join(newAppDirPath, "index.tsx"); + await fs.promises.writeFile(indexPath, indexContent); + console.log("📄 app/index.tsx created."); + + // Create _layout.tsx + const layoutPath = path.join(newAppDirPath, "_layout.tsx"); + await fs.promises.writeFile(layoutPath, layoutContent); + console.log("📄 app/_layout.tsx created."); + + console.log("\n✅ Project reset complete. Next steps:"); + console.log( + `1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ + userInput === "y" + ? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` + : "" + }` + ); + } catch (error) { + console.error(`❌ Error during script execution: ${error.message}`); + } +}; + +rl.question( + "Do you want to move existing files to /app-example instead of deleting them? (Y/n): ", + (answer) => { + const userInput = answer.trim().toLowerCase() || "y"; + if (userInput === "y" || userInput === "n") { + moveDirectories(userInput).finally(() => rl.close()); + } else { + console.log("❌ Invalid input. Please enter 'Y' or 'N'."); + rl.close(); + } + } +); diff --git a/src/app/(tabs)/_layout.tsx b/src/app/(tabs)/_layout.tsx new file mode 100644 index 0000000..ef8c48c --- /dev/null +++ b/src/app/(tabs)/_layout.tsx @@ -0,0 +1,71 @@ +import FloatingAIDock from "@/src/components/FloatingAIDock"; +import GlassBottomTabBar from "@/src/components/GlassBottomTabBar"; +import { FONTS } from "@/src/constants/Theme"; +import { TabBarVisibilityProvider } from "@/src/hooks/useAutoHideTabBar"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Tabs } from "expo-router"; +import { Calendar, LayoutDashboard, Library } from "lucide-react-native"; +import React from "react"; + +export default function TabLayout() { + const { colors } = useTheme(); + + const screenOptions = { + tabBarActiveTintColor: colors.primary, + tabBarInactiveTintColor: colors.outline, + headerShown: false, + tabBarStyle: { + position: "absolute", + borderTopWidth: 0, + elevation: 0, + }, + tabBarLabelStyle: { + fontFamily: FONTS.label, + fontSize: 10, + letterSpacing: 0.5, + }, + } as any; + + return ( + + } + screenOptions={screenOptions} + > + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + + + + + {/* Extra screens still exist in the app, but are intentionally excluded from the bottom glass tab bar. + Keep these routes reachable via menu, buttons, or a future drawer/More screen. + */} + + ); +} diff --git a/src/app/(tabs)/aa_ai.tsx b/src/app/(tabs)/aa_ai.tsx new file mode 100644 index 0000000..e8d5f3a --- /dev/null +++ b/src/app/(tabs)/aa_ai.tsx @@ -0,0 +1,3 @@ +import AIScreen from '@/src/screens/AIScreen'; + +export default AIScreen; diff --git a/src/app/(tabs)/calendar.tsx b/src/app/(tabs)/calendar.tsx new file mode 100644 index 0000000..16e7e04 --- /dev/null +++ b/src/app/(tabs)/calendar.tsx @@ -0,0 +1,2982 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { CalendarStrip } from "@/src/components/ui/CalendarStrip"; +import { TimeInput } from "@/src/components/ui/TimeInput"; +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { getDb } from "@/src/db/database"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { getLocalDateString } from "@/src/lib/date-utils"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useRouter } from "expo-router"; +import { + AlertCircle, + Calendar as CalendarIcon, + Check, + ChevronRight, + Clock, + History as HistoryIcon, + Layers, + MapPin, + Menu, + Plus, + RefreshCw, + Settings, + Sparkles, + Target, + Trash2, + X, + Zap +} from "lucide-react-native"; +import React, { + useEffect, + useMemo, + useRef, + useState +} from "react"; +import { + Alert, + Image, + KeyboardAvoidingView, + Modal, + Platform, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View +} from "react-native"; +import { DraxProvider, DraxView } from "react-native-drax"; +import Animated, { + useAnimatedStyle, + useSharedValue, + withSequence, + withSpring, +} from "react-native-reanimated"; +import { SafeAreaView } from "react-native-safe-area-context"; + +type Schedule = { + id: string; + date: string; + time_blocks: string; +}; + +type TimeBlock = { + start: string; + end: string; + task: string; + description?: string; + type?: "deep-work" | "sleep" | "walk" | "default" | "break" | "chores"; + todos?: { id: string; text: string; completed: boolean }[]; + task_id?: string; +}; + +const TIME_MARKERS = Array.from({ length: 24 }, (_, index) => { + const hour = index.toString().padStart(2, "0"); + return `${hour}:00`; +}); + +const parseTimeString = (time: string) => { + const [hours = "0", minutes = "0"] = time.split(":"); + return { hours: Number(hours), minutes: Number(minutes) }; +}; + +const getTimeOffset = (time: string, hourHeight: number) => { + const { hours, minutes } = parseTimeString(time); + return hours * hourHeight + (minutes * hourHeight) / 60; +}; + +const getBlockHeight = (start: string, end: string, hourHeight: number) => { + const startTime = parseTimeString(start); + const endTime = parseTimeString(end); + const startMinutes = startTime.hours * 60 + startTime.minutes; + const endMinutes = endTime.hours * 60 + endTime.minutes; + return Math.max( + hourHeight * 0.4, + ((endMinutes - startMinutes) * hourHeight) / 60, + ); +}; + +const toMinutes = (time: string) => { + const [hours = "0", minutes = "0"] = time.split(":"); + return Number(hours) * 60 + Number(minutes); +}; + +const toTimeString = (minutes: number) => { + const hours = Math.floor(minutes / 60); + const mins = minutes % 60; + return `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}`; +}; + +const splitDeepWorkBlock = ( + block: TimeBlock, + focusDuration: number, + breakDuration: number, +) => { + const blocks: TimeBlock[] = []; + const start = toMinutes(block.start); + const end = toMinutes(block.end); + const LUNCH_START = 12 * 60; + const LUNCH_END = 13 * 60; + const bridgesLunch = start < LUNCH_START && end > LUNCH_END; + let current = start; + + const pushFocusSegment = (segmentEnd: number) => { + blocks.push({ + ...block, + start: toTimeString(current), + end: toTimeString(segmentEnd), + originalStart: block.originalStart || block.start, + }); + current = segmentEnd; + }; + + const pushBreakSegment = (breakEnd: number) => { + blocks.push({ + task: "Break", + type: "break", + start: toTimeString(current), + end: toTimeString(breakEnd), + originalStart: block.originalStart || block.start, + }); + current = breakEnd; + }; + + while (current < end) { + if (bridgesLunch && current === LUNCH_START) { + blocks.push({ + task: "Lunch", + type: "default", + start: toTimeString(LUNCH_START), + end: toTimeString(LUNCH_END), + originalStart: block.originalStart || block.start, + }); + current = LUNCH_END; + continue; + } + + const segmentEnd = Math.min( + current + focusDuration, + end, + bridgesLunch && current < LUNCH_START ? LUNCH_START : end, + ); + pushFocusSegment(segmentEnd); + + if (current >= end) break; + if (bridgesLunch && current === LUNCH_START) continue; + + const nextBreakEnd = Math.min( + current + breakDuration, + end, + bridgesLunch && current < LUNCH_START ? LUNCH_START : end, + ); + if (nextBreakEnd > current) { + pushBreakSegment(nextBreakEnd); + } + } + + return blocks; +}; + +const normalizeTimeBlocks = (blocks: TimeBlock[], focusDuration: number) => { + const breakDuration = Math.min( + 15, + Math.max(5, Math.round(focusDuration * 0.25)), + ); + return blocks + .flatMap((block) => { + const duration = toMinutes(block.end) - toMinutes(block.start); + if (block.type === "deep-work" && duration > focusDuration) { + return splitDeepWorkBlock(block, focusDuration, breakDuration); + } + return [{ ...block, originalStart: block.start }]; + }) + .sort((a, b) => a.start.localeCompare(b.start)); +}; + +function processCluster(cluster: any[], result: any[]) { + const columns: any[][] = []; + cluster.forEach((block) => { + let placed = false; + for (let i = 0; i < columns.length; i++) { + const lastInCol = columns[i][columns[i].length - 1]; + if (block.start >= lastInCol.end) { + columns[i].push(block); + block.column = i; + placed = true; + break; + } + } + if (!placed) { + block.column = columns.length; + columns.push([block]); + } + }); + + cluster.forEach((block) => { + block.totalCols = columns.length; + result.push(block); + }); +} + +interface Habit { + id: string; + title: string; + preferred_time: string; + location: string; + is_done_today: number; +} + +export default function CalendarScreen() { + const { colors, sprintDuration } = useTheme(); + const { user } = useAuth(); + const router = useRouter(); + + const userId = user?.id || "guest"; + const today = getLocalDateString(); + const [selectedDate, setSelectedDate] = useState(today); + + const [showModal, setShowModal] = useState(false); + const [editingBlockIndex, setEditingBlockIndex] = useState( + null, + ); + + const [blockTitle, setBlockTitle] = useState(""); + const [blockStart, setBlockStart] = useState("09:00"); + const [blockEnd, setBlockEnd] = useState("10:00"); + const [blockType, setBlockType] = useState< + "event" | "deep-work" | "walk" | "break" + >("event"); + const [blockLocation, setBlockLocation] = useState(""); + const [blockDescription, setBlockDescription] = useState(""); + const [blockTodos, setBlockTodos] = useState< + { id: string; text: string; completed: boolean }[] + >([]); + const [newTodoText, setNewTodoText] = useState(""); + + const [hoverBlock, setHoverBlock] = useState(null); + const [dropCollision, setDropCollision] = useState(false); + const [activeActionBlock, setActiveActionBlock] = useState(null); + const [isMultiSelectMode, setIsMultiSelectMode] = useState(false); + const [selectedBlockKeys, setSelectedBlockKeys] = useState([]); + + // UNDO STATE + const [undoState, setUndoState] = useState<{ + blocks: any[]; + scheduleId: string; + } | null>(null); + const [showUndoToast, setShowUndoToast] = useState(false); + const undoTimeout = useRef(null); + + const triggerHaptic = ( + type: + | "light" + | "medium" + | "heavy" + | "selection" + | "success" + | "warning" + | "error", + ) => { + switch (type) { + case "light": + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + break; + case "medium": + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + break; + case "heavy": + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy); + break; + case "selection": + Haptics.selectionAsync(); + break; + case "success": + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + break; + case "warning": + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning); + break; + case "error": + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); + break; + } + }; + + const toggleBlockSelection = (block: any) => { + const key = `${block.start}-${block.task}`; + setSelectedBlockKeys((prev) => + prev.includes(key) ? prev.filter((k) => k !== key) : [...prev, key], + ); + triggerHaptic("light"); + }; + + const getSelectedBlocks = () => { + return combinedBlocks.filter((b) => + selectedBlockKeys.includes(`${b.start}-${b.task}`), + ); + }; + + const ghostTop = useSharedValue(0); + const ghostScale = useSharedValue(1); + const lastSnap = useRef(-1); + const lastDragY = useRef(null); + const scrollRef = useRef(null); + const timelineRef = useRef(null); + const [timelineLayout, setTimelineLayout] = useState({ y: 0, height: 0 }); + + const measureTimeline = () => { + timelineRef.current?.measureInWindow((x, y, width, height) => { + console.log("TIMELINE MEASURED", { y, height }); + setTimelineLayout({ y, height }); + }); + }; + + const scrollY = useRef(0); + const scrollInterval = useRef(null); + + // SYNC TRACKING STATE + const [trackedSyncIds, setTrackedSyncIds] = useState< + Record< + number, + { + status: "pending" | "synced" | "failed"; + blocks: string[]; + timestamp: number; + } + > + >({}); + + useEffect(() => { + if (Object.keys(trackedSyncIds).length === 0) return; + + const checkSyncStatus = async () => { + const db = await getDb(); + const pendingIds: number[] = ( + await db.getAllAsync("SELECT id FROM sync_queue") + ).map((item) => item.id); + + setTrackedSyncIds((prev) => { + const next = { ...prev }; + let changed = false; + + Object.keys(next).forEach((idStr) => { + const id = parseInt(idStr); + if (next[id].status === "pending" && !pendingIds.includes(id)) { + next[id] = { ...next[id], status: "synced" }; + changed = true; + } + + // Clear old indicators after 30 seconds + if (Date.now() - next[id].timestamp > 30000) { + delete next[id]; + changed = true; + } + }); + + return changed ? next : prev; + }); + }; + + const interval = setInterval(checkSyncStatus, 2000); + return () => clearInterval(interval); + }, [trackedSyncIds]); + + const addTrackedSync = (syncId: number | undefined, blocks: any[]) => { + if (!syncId) return; + const blockKeys = blocks.map((b) => `${b.start}-${b.task}`); + setTrackedSyncIds((prev) => ({ + ...prev, + [syncId]: { status: "pending", blocks: blockKeys, timestamp: Date.now() }, + })); + }; + + const getSyncStatusForBlock = (block: any) => { + const key = `${block.start}-${block.task}`; + const entry = Object.values(trackedSyncIds).find((e) => + e.blocks.includes(key), + ); + return entry; + }; + + const handleShowSyncInfo = (syncEntry: any) => { + const time = new Date(syncEntry.timestamp).toLocaleTimeString(); + let msg = `Operation at ${time}\nStatus: ${syncEntry.status.toUpperCase()}`; + if (syncEntry.status === "pending") msg += "\nWaiting for network..."; + if (syncEntry.status === "synced") msg += "\nSuccessfully saved to cloud."; + + Alert.alert("Sync Details", msg); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const handleDuplicateBlock = async (block: any) => { + const duration = toMinutes(block.end) - toMinutes(block.start); + const nextStartMins = toMinutes(block.end); + + if (nextStartMins + duration > 24 * 60) { + Alert.alert("No Room", "Cannot duplicate block, not enough space today."); + return; + } + + const newStart = toTimeString(nextStartMins); + const newEnd = toTimeString(nextStartMins + duration); + + if (!checkTimeSlotAvailability(newStart, newEnd).available) { + Alert.alert("Collision", "Cannot duplicate here, next slot is occupied."); + return; + } + + const newBlock = { + ...block, + start: newStart, + end: newEnd, + isHabit: undefined, + }; + const nextBlocks = [...rawTimeBlocks, newBlock].sort((a, b) => + a.start.localeCompare(b.start), + ); + + const schedule = schedules?.[0]; + const syncId = await performMutation( + "schedules", + schedule ? "UPDATE" : "INSERT", + { + id: schedule?.id || Math.random().toString(36).substring(7), + user_id: schedule?.user_id || userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }, + ); + addTrackedSync(syncId, [newBlock]); + refreshSchedule(); + setActiveActionBlock(null); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + }; + + const handleMoveToTomorrow = async (block: any) => { + const tomorrow = new Date(selectedDate); + tomorrow.setDate(tomorrow.getDate() + 1); + const tomorrowStr = tomorrow.toISOString().split("T")[0]; + + // 1. Remove from today + const nextTodayBlocks = rawTimeBlocks.filter( + (b) => !(b.start === block.start && b.task === block.task), + ); + const syncId = await performMutation("schedules", "UPDATE", { + id: schedules[0].id, + user_id: userId, + date: selectedDate, + time_blocks: JSON.stringify(nextTodayBlocks), + }); + addTrackedSync(syncId, [block]); + + // 2. Add to tomorrow + const db = await getDb(); + const tomorrowSchedule = await db.getFirstAsync( + "SELECT * FROM schedules WHERE date = ? AND (user_id = ? OR user_id IS NULL)", + [tomorrowStr, userId], + ); + + const tomorrowBlocks = tomorrowSchedule + ? JSON.parse(tomorrowSchedule.time_blocks) + : []; + const newTomorrowBlocks = [ + ...tomorrowBlocks, + { ...block, isHabit: undefined }, + ].sort((a, b) => a.start.localeCompare(b.start)); + + await performMutation("schedules", tomorrowSchedule ? "UPDATE" : "INSERT", { + id: tomorrowSchedule?.id || Math.random().toString(36).substring(7), + user_id: userId, + date: tomorrowStr, + time_blocks: JSON.stringify(newTomorrowBlocks), + }); + + refreshSchedule(); + setActiveActionBlock(null); + Alert.alert("Moved", `"${block.task}" moved to tomorrow.`); + }; + + const ghostAnimatedStyle = useAnimatedStyle(() => ({ + top: ghostTop.value, + transform: [{ scale: ghostScale.value }], + })); + + const isPastTime = (timeStr: string) => { + if (selectedDate < today) return true; + if (selectedDate > today) return false; + + const now = new Date(); + const currentMins = now.getHours() * 60 + now.getMinutes(); + const targetMins = toMinutes(timeStr); + + // Allow 5 minute grace period + return targetMins < currentMins - 5; + }; + + const checkTimeSlotAvailability = ( + newStart: string, + newEnd: string, + draggedBlock?: any, + ) => { + if (isPastTime(newStart)) { + return { available: false, reason: "past" }; + } + + const startMins = toMinutes(newStart); + const endMins = toMinutes(newEnd); + const duration = endMins - startMins; + + // Find colliding block (excluding self) + const collidingBlock = combinedBlocks.find((block) => { + if ( + draggedBlock && + !draggedBlock.isNew && + block.task === draggedBlock.task && + block.start === draggedBlock.start + ) { + return false; + } + if (block.isHabit) return false; // Don't collide with habits for swaps/shifts yet + + const bStart = toMinutes(block.start); + const bEnd = toMinutes(block.end); + return startMins < bEnd && endMins > bStart; + }); + + if (!collidingBlock) { + return { available: true, reason: null }; + } + + // SWAP LOGIC: Existing block dropped on Existing block + if (draggedBlock && !draggedBlock.isNew && !collidingBlock.isHabit) { + return { + available: true, + reason: "swap", + targetBlock: collidingBlock, + }; + } + + // SHIFT LOGIC: New block dropped on Existing block + if (draggedBlock && draggedBlock.isNew) { + // Try to shift the colliding block forward + const bStart = toMinutes(collidingBlock.start); + const bEnd = toMinutes(collidingBlock.end); + const bDuration = bEnd - bStart; + + const shiftedStart = endMins; + const shiftedEnd = endMins + bDuration; + + // Check if shifted block would collide with something else or go off grid + if (shiftedEnd > 24 * 60) return { available: false, reason: "no-room" }; + + const secondaryCollision = combinedBlocks.some((block) => { + if ( + block.task === collidingBlock.task && + block.start === collidingBlock.start + ) + return false; + if (block.task === draggedBlock.task) return false; + + const sStart = toMinutes(block.start); + const sEnd = toMinutes(block.end); + return shiftedStart < sEnd && shiftedEnd > sStart; + }); + + if (secondaryCollision) { + return { available: false, reason: "no-room" }; + } + + return { + available: true, + reason: "shift", + targetBlock: collidingBlock, + shiftedTime: { + start: toTimeString(shiftedStart), + end: toTimeString(shiftedEnd), + }, + }; + } + + return { available: false, reason: "collision" }; + }; + + const { + data: schedules, + loading: schedulesLoading, + refresh: refreshSchedule, + } = useData( + "SELECT * FROM schedules WHERE date = ? AND (user_id = ? OR user_id IS NULL)", + [selectedDate, userId], + ); + + const { + data: habits, + loading: habitsLoading, + refresh: refreshHabits, + } = useData( + `SELECT h.id, h.title, h.preferred_time, h.location, + (SELECT COUNT(*) FROM logs l WHERE l.habit_id = h.id AND date(l.logged_at, 'localtime') = date('now', 'localtime')) as is_done_today + FROM habits h + WHERE h.is_active = 1 AND (h.user_id = ? OR h.user_id IS NULL)`, + [userId], + ); + + const { data: tasks } = useData<{ id: string; title: string; todos: string }>( + "SELECT id, title, todos FROM tasks WHERE (user_id = ? OR user_id IS NULL)", + [userId], + ); + + const rawTimeBlocks = useMemo(() => { + if (!schedules.length) return []; + try { + const blocks = JSON.parse(schedules[0].time_blocks) as TimeBlock[]; + return Array.isArray(blocks) ? blocks : []; + } catch { + return []; + } + }, [schedules]); + + const displayBlocks = useMemo( + () => normalizeTimeBlocks(rawTimeBlocks, sprintDuration), + [rawTimeBlocks, sprintDuration], + ); + + const combinedBlocks = useMemo(() => { + const blocks: any[] = displayBlocks.map((block) => { + // Find matching task in inventory + const linkedTask = tasks.find( + (t) => t.id === block.task_id || t.title === block.task, + ); + if (linkedTask) { + return { + ...block, + task_id: linkedTask.id, + // Use inventory todos as source of truth if available + todos: linkedTask.todos ? JSON.parse(linkedTask.todos) : block.todos, + }; + } + return block; + }); + + // Only show habits if viewing TODAY + if (selectedDate === today) { + habits.forEach((habit) => { + if (habit.preferred_time) { + const duration = 30; + const endTime = toTimeString( + toMinutes(habit.preferred_time) + duration, + ); + + blocks.push({ + start: habit.preferred_time, + end: endTime, + task: habit.title, + type: "habit", + location: habit.location, + isDone: habit.is_done_today > 0, + isHabit: true, + }); + } + }); + } + + const sorted = blocks.sort((a, b) => a.start.localeCompare(b.start)); + const layoutBlocks: any[] = []; + let currentCluster: any[] = []; + let clusterEnd = "00:00"; + + sorted.forEach((block) => { + if (block.start < clusterEnd) { + currentCluster.push(block); + if (block.end > clusterEnd) clusterEnd = block.end; + } else { + if (currentCluster.length > 0) + processCluster(currentCluster, layoutBlocks); + currentCluster = [block]; + clusterEnd = block.end; + } + }); + + if (currentCluster.length > 0) processCluster(currentCluster, layoutBlocks); + return layoutBlocks; + }, [displayBlocks, habits, selectedDate]); + + const hourHeight = useMemo(() => { + const maxCols = Math.max(1, ...combinedBlocks.map((b) => b.totalCols || 1)); + const density = combinedBlocks.length; + + if (maxCols > 1) return 220; + if (density > 10) return 180; + if (density > 5) return 140; + return 120; + }, [combinedBlocks]); + + const styles = useMemo( + () => createStyles(colors, hourHeight), + [colors, hourHeight], + ); + + const changeDay = (days: number) => { + const d = new Date(selectedDate); + d.setDate(d.getDate() + days); + setSelectedDate(d.toISOString().split("T")[0]); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const handleEditBlock = (block: any, index: number) => { + if (block.isHabit) { + router.push("/hh_habits"); + return; + } + + const originalIndex = rawTimeBlocks.findIndex( + (b) => b.start === block.start && b.task === block.task, + ); + setEditingBlockIndex(originalIndex); + setBlockTitle(block.task); + setBlockStart(block.start); + setBlockEnd(block.end); + setBlockType(block.type || "event"); + setBlockLocation(block.location || ""); + setBlockDescription(block.description || ""); + setBlockTodos(block.todos || []); + setShowModal(true); + }; + + const handleUndo = async () => { + if (!undoState) return; + + try { + const syncId = await performMutation("schedules", "UPDATE", { + id: undoState.scheduleId, + user_id: userId, + date: selectedDate, + time_blocks: JSON.stringify(undoState.blocks), + }); + addTrackedSync(syncId, undoState.blocks); + refreshSchedule(); + setUndoState(null); + setShowUndoToast(false); + if (undoTimeout.current) clearTimeout(undoTimeout.current); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + } catch (e) { + console.error("Undo failed", e); + } + }; + + const updateBlockTime = async ( + block: any, + newStart: string, + newEnd: string, + ) => { + const originalStart = block.originalStart || block.start; + let originalIndex = rawTimeBlocks.findIndex( + (b) => b.start === originalStart && b.task === block.task, + ); + + if (originalIndex === -1) { + originalIndex = rawTimeBlocks.findIndex((b) => b.task === block.task); + } + + // CAPTURE UNDO STATE + setUndoState({ blocks: [...rawTimeBlocks], scheduleId: schedules[0].id }); + + let nextBlocks = [...rawTimeBlocks]; + const updatedBlock = { + ...(originalIndex !== -1 ? nextBlocks[originalIndex] : block), + start: newStart, + end: newEnd, + originalStart: undefined, + isNew: undefined, + isHabit: undefined, + }; + + if (originalIndex !== -1) { + nextBlocks[originalIndex] = updatedBlock; + } else { + nextBlocks.push(updatedBlock); + } + + nextBlocks.sort((a, b) => a.start.localeCompare(b.start)); + + const schedule = schedules?.[0]; + try { + let syncId; + if (schedule) { + syncId = await performMutation("schedules", "UPDATE", { + id: schedule.id, + user_id: schedule.user_id || userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }); + } else { + syncId = await performMutation("schedules", "INSERT", { + id: Math.random().toString(36).substring(7), + user_id: userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }); + } + addTrackedSync(syncId, [updatedBlock]); + refreshSchedule(); + + // SHOW UNDO TOAST + setShowUndoToast(true); + if (undoTimeout.current) clearTimeout(undoTimeout.current); + undoTimeout.current = setTimeout(() => setShowUndoToast(false), 5000); + + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error("Failed to update block time", e); + Alert.alert("Error", "Failed to save schedule change."); + } + }; + + const handleAddTodo = () => { + if (!newTodoText.trim()) return; + const newTodo = { + id: Math.random().toString(36).substring(7), + text: newTodoText.trim(), + completed: false, + }; + setBlockTodos([...blockTodos, newTodo]); + setNewTodoText(""); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const toggleTodo = (id: string) => { + setBlockTodos( + blockTodos.map((t) => + t.id === id ? { ...t, completed: !t.completed } : t, + ), + ); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const removeTodo = (id: string) => { + setBlockTodos(blockTodos.filter((t) => t.id !== id)); + }; + + const handleSaveBlock = async () => { + console.log("SAVE BLOCK CALLED", { + title: blockTitle, + start: blockStart, + end: blockEnd, + type: blockType, + selectedDate, + }); + if (!blockTitle.trim()) { + Alert.alert("Error", "Please enter a title for the block."); + return; + } + if (toMinutes(blockStart) >= toMinutes(blockEnd)) { + Alert.alert("Error", "Start time must be before end time."); + return; + } + + let nextBlocks = [...rawTimeBlocks]; + const newBlock: TimeBlock = { + start: blockStart, + end: blockEnd, + task: blockTitle, + type: blockType === "event" ? undefined : blockType, + location: blockLocation || undefined, + description: blockDescription || undefined, + todos: blockTodos.length > 0 ? blockTodos : undefined, + }; + + if (editingBlockIndex !== null && editingBlockIndex !== -1) { + nextBlocks[editingBlockIndex] = newBlock; + } else { + nextBlocks.push(newBlock); + } + + nextBlocks.sort((a, b) => a.start.localeCompare(b.start)); + + const schedule = schedules?.[0]; + try { + let syncId; + console.log("CALLING performMutation", { + scheduleId: schedule?.id, + time_blocks_count: nextBlocks.length, + }); + if (schedule) { + syncId = await performMutation("schedules", "UPDATE", { + id: schedule.id, + user_id: schedule.user_id || userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }); + } else { + syncId = await performMutation("schedules", "INSERT", { + id: Math.random().toString(36).substring(7), + user_id: userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }); + } + addTrackedSync(syncId, [newBlock]); + refreshSchedule(); + + // If it's a deep-work block, ensure it exists in tasks + if (blockType === "deep-work") { + const db = await getDb(); + const existingTask = await db.getFirstAsync<{ + id: string; + todos: string; + }>( + "SELECT id, todos FROM tasks WHERE title = ? AND (user_id = ? OR user_id IS NULL)", + [blockTitle.trim(), userId], + ); + + const duration = toMinutes(blockEnd) - toMinutes(blockStart); + const estimated = Math.max(1, Math.ceil(duration / sprintDuration)); + + if (existingTask) { + // Update sessions and merge todos if needed + await performMutation("tasks", "UPDATE", { + id: existingTask.id, + estimated_sessions: estimated, + todos: JSON.stringify( + blockTodos.length > 0 + ? blockTodos + : JSON.parse(existingTask.todos || "[]"), + ), + updated_at: new Date().toISOString(), + }); + } else { + // Create new task + await performMutation("tasks", "INSERT", { + id: Math.random().toString(36).substring(7), + user_id: userId, + title: blockTitle.trim(), + status: "todo", + estimated_sessions: estimated, + completed_sessions: 0, + tag: "Deep Work", + todos: JSON.stringify(blockTodos), + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }); + } + } + + setShowModal(false); + resetModal(); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error("Failed to save block/task", e); + Alert.alert("Error", "Failed to save schedule block."); + } + }; + + const handleDeleteBlock = async () => { + if (editingBlockIndex === null) return; + + Alert.alert("Delete Block", "Are you sure you want to remove this block?", [ + { text: "Cancel", style: "cancel" }, + { + text: "Delete", + style: "destructive", + onPress: async () => { + const blockToDelete = rawTimeBlocks[editingBlockIndex]; + const nextBlocks = rawTimeBlocks.filter( + (_, i) => i !== editingBlockIndex, + ); + const schedule = schedules[0]; + const syncId = await performMutation("schedules", "UPDATE", { + id: schedule.id, + user_id: schedule.user_id || userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }); + // Track the sync for the block that was just deleted (though it won't be rendered) + addTrackedSync(syncId, [blockToDelete]); + setShowModal(false); + resetModal(); + }, + }, + ]); + }; + + const resetModal = () => { + setEditingBlockIndex(null); + setBlockTitle(""); + setBlockStart("09:00"); + setBlockEnd("10:00"); + setBlockType("event"); + setBlockLocation(""); + setBlockDescription(""); + setBlockTodos([]); + setNewTodoText(""); + }; + + const stats = useMemo(() => { + const focusMinutes = displayBlocks + .filter((b) => b.type === "deep-work") + .reduce((acc, b) => acc + (toMinutes(b.end) - toMinutes(b.start)), 0); + + const habitTotal = habits.length; + const habitDone = habits.filter((h) => h.is_done_today > 0).length; + const adherence = + habitTotal > 0 ? Math.round((habitDone / habitTotal) * 100) : 0; + + return { + focusHours: (focusMinutes / 60).toFixed(1), + adherence: `${adherence}%`, + votes: habitDone, + }; + }, [displayBlocks, habits]); + + const upcomingTasks = useMemo(() => { + const nowMinutes = toMinutes(new Date().toTimeString().slice(0, 5)); + return combinedBlocks + .filter( + (b) => + toMinutes(b.start) >= nowMinutes && + b.type !== "break" && + b.type !== "habit", + ) + .slice(0, 3); + }, [combinedBlocks]); + + const aiSuggestion = useMemo(() => { + if (selectedDate !== today) return null; + + const nowMinutes = toMinutes(new Date().toTimeString().slice(0, 5)); + const fallenBehind = combinedBlocks.find((b) => { + const endMins = toMinutes(b.end); + const isDone = b.todos?.every((t: any) => t.completed) ?? false; + return endMins < nowMinutes && !isDone && b.type === "deep-work"; + }); + + if (fallenBehind) { + return { + message: `You missed your "${fallenBehind.task}" slot. Should I find a 15m catch-up window at the next gap?`, + type: "recovery", + action: "SCHEDULE CATCH-UP", + }; + } + return null; + }, [combinedBlocks, selectedDate, today]); + + const handleCatchUp = async () => { + // Find first gap of 15 mins + const nowMinutes = toMinutes(new Date().toTimeString().slice(0, 5)); + let current = Math.max(nowMinutes, toMinutes("09:00")); + const sorted = [...rawTimeBlocks].sort((a, b) => + a.start.localeCompare(b.start), + ); + + for (const b of sorted) { + const bStart = toMinutes(b.start); + if (bStart >= current + 20) { + break; + } + current = Math.max(current, toMinutes(b.end)); + } + + const catchUpBlock: TimeBlock = { + start: toTimeString(current + 5), + end: toTimeString(current + 20), + task: "AI Recovery: Catch-up", + type: "deep-work", + }; + + const nextBlocks = [...rawTimeBlocks, catchUpBlock].sort((a, b) => + a.start.localeCompare(b.start), + ); + + try { + const schedule = schedules[0]; + const syncId = await performMutation( + "schedules", + schedule ? "UPDATE" : "INSERT", + { + id: schedule?.id || Math.random().toString(36).substring(7), + user_id: userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }, + ); + addTrackedSync(syncId, [catchUpBlock]); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error(e); + } + }; + + // Rollover Logic: Carry forward incomplete tasks from yesterday + const isRollingOver = useRef(false); + useEffect(() => { + const checkRollover = async () => { + // Only run if we are looking at TODAY and schedules are loaded + if (isRollingOver.current || schedulesLoading || selectedDate !== today) + return; + + isRollingOver.current = true; + try { + const yesterday = new Date(); + yesterday.setDate(yesterday.getDate() - 1); + const yesterdayStr = yesterday.toISOString().split("T")[0]; + + const db = await getDb(); + + // Check if we've already rolled over today (prevent duplicates) + const todaySchedule = schedules[0]; + const todayBlocks: TimeBlock[] = todaySchedule + ? JSON.parse(todaySchedule.time_blocks) + : []; + const alreadyCarried = todayBlocks.some((b) => + b.task.includes("[CARRIED]"), + ); + + if (alreadyCarried) return; + + // Fetch yesterday's schedule + const prevSchedule = await db.getFirstAsync( + "SELECT * FROM schedules WHERE date = ? AND (user_id = ? OR user_id IS NULL)", + [yesterdayStr, userId], + ); + + if (prevSchedule) { + const prevBlocks = JSON.parse( + prevSchedule.time_blocks, + ) as TimeBlock[]; + + // Find incomplete deep-work or event blocks + const incompleteBlocks = prevBlocks + .filter((b) => { + const hasIncompleteTodos = + b.todos && b.todos.some((t) => !t.completed); + const isDeepWork = b.type === "deep-work"; + return (hasIncompleteTodos || isDeepWork) && b.task !== "Break"; + }) + .map((b) => ({ + ...b, + task: `[CARRIED] ${b.task.replace("[CARRIED] ", "")}`, + // Move to a morning slot today + start: "09:00", + end: "10:00", + })); + + if (incompleteBlocks.length > 0) { + const updatedBlocks = [...todayBlocks, ...incompleteBlocks].sort( + (a, b) => a.start.localeCompare(b.start), + ); + + await performMutation( + "schedules", + todaySchedule ? "UPDATE" : "INSERT", + { + id: + todaySchedule?.id || Math.random().toString(36).substring(7), + user_id: userId, + date: today, + time_blocks: JSON.stringify(updatedBlocks), + }, + ); + + refreshSchedule(); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + Alert.alert( + "Tasks Carried Over", + `Carried forward ${incompleteBlocks.length} items from yesterday.`, + ); + } + } + } catch (e) { + console.error("Rollover failed", e); + } + }; + + checkRollover(); + }, [schedules.length, schedulesLoading, selectedDate, today]); + + return ( + + + + + router.push("/menu")} + > + + + + + + + { + setIsMultiSelectMode(!isMultiSelectMode); + if (!isMultiSelectMode) setSelectedBlockKeys([]); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + + router.push("/history")} + > + + + router.push("/modal")} + > + + + + + + + + { + scrollY.current = e.nativeEvent.contentOffset.y; + }} + > + + + + {selectedDate === today + ? "TODAY" + : new Date(selectedDate) + .toLocaleDateString("en-US", { weekday: "long" }) + .toUpperCase()} + + + {new Date(selectedDate).toLocaleDateString("en-US", { + month: "short", + day: "numeric", + })} + + + + + + {stats.adherence} + + + + {stats.votes} + + + + {stats.focusHours}h + + + + + {/* AI Suggestion Banner */} + {aiSuggestion && ( + + + + + + {aiSuggestion.message} + + + + {aiSuggestion.action} + + + + + + )} + + {/* Upcoming Tasks Summary */} + {upcomingTasks.length > 0 && ( + + NEXT UP + + {upcomingTasks.map((task, i) => ( + handleEditBlock(task, -1)} + > + + + {task.start} + + + {task.task} + + + ))} + + + )} + + {/* Task Inventory Section */} + + + TASK INVENTORY + router.push("/add-task")}> + + + + + {tasks + .filter((t) => !rawTimeBlocks.some((b) => b.task_id === t.id)) + .map((task, i) => ( + { + triggerHaptic("light"); + setActiveActionBlock(null); + }} + > + + {task.title} + + + ))} + {tasks.filter( + (t) => !rawTimeBlocks.some((b) => b.task_id === t.id), + ).length === 0 && ( + + No unscheduled tasks + + )} + + + + + + {TIME_MARKERS.map((time, index) => ( + + {time} + + ))} + + + { + triggerHaptic("medium"); + measureTimeline(); // CRITICAL: Re-measure on entry to account for scrolls/keyboard + }} + onReceiveDragOver={(event) => { + const absoluteY = + (event as any)?.absoluteY || + (event as any)?.pageY || + (event as any)?.nativeEvent?.pageY || + 0; + const relativeY = + absoluteY - timelineLayout.y + scrollY.current; + + console.log("DRAG OVER", { + absoluteY, + timelineTop: timelineLayout.y, + scrollY: scrollY.current, + relativeY, + receiverY: event?.receiverLocation?.y, + }); + + const findY = (obj: any, depth = 0): any => { + if (depth > 3 || !obj || typeof obj !== "object") + return null; + try { + for (const key of Object.keys(obj)) { + if (key.toLowerCase().includes("y")) { + console.log(`Found y-like key: ${key} = ${obj[key]}`); + } + findY(obj[key], depth + 1); + } + } catch (e) {} + }; + // findY(event); // Uncomment if deeper property search is needed + + const payload = event.dragged?.payload as any; + const dropY = + typeof event?.receiverLocation?.y === "number" + ? event.receiverLocation.y + : relativeY > 0 + ? relativeY + : (lastDragY.current ?? 0); + + if (payload && typeof dropY === "number") { + lastDragY.current = dropY; + const minutes = + Math.floor(((dropY / hourHeight) * 60) / 15) * 15; + const clampedMinutes = Math.max( + 0, + Math.min(23 * 60, minutes), + ); + const newStartStr = toTimeString(clampedMinutes); + + // MAGNETIC SNAP & PULSE + const targetTop = getTimeOffset(newStartStr, hourHeight); + ghostTop.value = withSpring(targetTop, { + damping: 20, + stiffness: 200, + }); + + if (clampedMinutes !== lastSnap.current) { + lastSnap.current = clampedMinutes; + ghostScale.value = withSequence( + withSpring(1.02, { damping: 10, stiffness: 400 }), + withSpring(1.0, { damping: 10, stiffness: 400 }), + ); + triggerHaptic("selection"); + } + + // AUTO-SCROLL LOGIC + if (scrollInterval.current) + clearInterval(scrollInterval.current); + + const scrollZoneHeight = 100; + // For edge detection, we use screen-relative coords + const screenY = absoluteY - timelineLayout.y; + const viewportHeight = 600; + + if (screenY < scrollZoneHeight) { + const speed = Math.max( + 2, + (scrollZoneHeight - screenY) / 5, + ); + scrollInterval.current = setInterval(() => { + const nextScroll = Math.max(0, scrollY.current - speed); + scrollRef.current?.scrollTo({ + y: nextScroll, + animated: false, + }); + }, 16); + } else if (screenY > viewportHeight - scrollZoneHeight) { + const speed = Math.max( + 2, + (screenY - (viewportHeight - scrollZoneHeight)) / 5, + ); + scrollInterval.current = setInterval(() => { + const nextScroll = Math.min( + hourHeight * 24, + scrollY.current + speed, + ); + scrollRef.current?.scrollTo({ + y: nextScroll, + animated: false, + }); + }, 16); + } + + // MULTI-BLOCK PREVIEW + if (payload.isMulti) { + const masterOrigStart = toMinutes(payload.start); + const delta = clampedMinutes - masterOrigStart; + + const shiftedBlocks = getSelectedBlocks().map((b) => ({ + ...b, + start: toTimeString(toMinutes(b.start) + delta), + end: toTimeString(toMinutes(b.end) + delta), + })); + + setHoverBlock({ + isMulti: true, + blocks: shiftedBlocks, + delta, + }); + } else { + let duration = 60; + if (payload.isNew) { + const tag = payload.tag?.toLowerCase() || ""; + if (tag.includes("deep") || tag.includes("work")) + duration = sprintDuration; + else if (tag.includes("break")) duration = 15; + else if ( + tag.includes("meeting") || + tag.includes("call") + ) + duration = 30; + else if (tag.includes("chore") || tag.includes("task")) + duration = 30; + } else { + duration = + toMinutes(payload.end) - toMinutes(payload.start); + } + setHoverBlock({ + ...payload, + start: newStartStr, + end: toTimeString(clampedMinutes + duration), + }); + } + } + }} + onReceiveDragExit={() => { + setHoverBlock(null); + lastSnap.current = -1; + // DO NOT clear lastDragY here, we need it as fallback for drop + triggerHaptic("warning"); + if (scrollInterval.current) { + clearInterval(scrollInterval.current); + scrollInterval.current = null; + } + }} + onReceiveDragDrop={async (event) => { + const payload = event.dragged?.payload as any; + const absoluteY = + (event as any)?.absoluteY || + (event as any)?.pageY || + (event as any)?.nativeEvent?.pageY || + 0; + const relativeY = + absoluteY - timelineLayout.y + scrollY.current; + + const dropY = + typeof event?.receiverLocation?.y === "number" + ? event.receiverLocation.y + : relativeY > 0 + ? relativeY + : (lastDragY.current ?? 0); + + console.log("DROP COORDINATE RECOVERY FINAL", { + actualY: event?.receiverLocation?.y, + relativeY, + cachedY: lastDragY.current, + finalY: dropY, + }); + + setHoverBlock(null); + lastSnap.current = -1; + lastDragY.current = null; + if (scrollInterval.current) { + clearInterval(scrollInterval.current); + scrollInterval.current = null; + } + + if (payload && typeof dropY === "number") { + const minutes = + Math.floor(((dropY / hourHeight) * 60) / 15) * 15; + const clampedMinutes = Math.max( + 0, + Math.min(23 * 60, minutes), + ); + const newStart = toTimeString(clampedMinutes); + console.log("TIME CALCULATION", { + clampedMinutes, + newStart, + }); + + if (payload.isMulti) { + const masterOrigStart = toMinutes(payload.start); + const delta = clampedMinutes - masterOrigStart; + + let nextBlocks = [...rawTimeBlocks]; + let isValid = true; + + const selectedBlocks = getSelectedBlocks(); + const updatedSelected = selectedBlocks.map((b) => { + const newS = toTimeString(toMinutes(b.start) + delta); + const newE = toTimeString(toMinutes(b.end) + delta); + + // Validation + if (isPastTime(newS)) isValid = false; + if (toMinutes(newE) > 24 * 60) isValid = false; + + // Collision check against NON-selected blocks + const collision = rawTimeBlocks.some((rb) => { + const isCurrentlySelected = + selectedBlockKeys.includes( + `${rb.start}-${rb.task}`, + ); + if (isCurrentlySelected) return false; + + const rbStart = toMinutes(rb.start); + const rbEnd = toMinutes(rb.end); + return ( + toMinutes(newS) < rbEnd && toMinutes(newE) > rbStart + ); + }); + + if (collision) isValid = false; + + return { ...b, start: newS, end: newE }; + }); + + if (!isValid) { + triggerHaptic("error"); + setDropCollision(true); + setTimeout(() => setDropCollision(false), 500); + return; + } + + // Apply updates + updatedSelected.forEach((ub) => { + const idx = nextBlocks.findIndex( + (nb) => + nb.task === ub.task && + nb.start === ub.originalStart, + ); + if (idx !== -1) { + nextBlocks[idx] = { + ...nextBlocks[idx], + start: ub.start, + end: ub.end, + }; + } + }); + + const schedule = schedules[0]; + const syncId = await performMutation( + "schedules", + "UPDATE", + { + id: schedule.id, + user_id: schedule.user_id || userId, + date: selectedDate, + time_blocks: JSON.stringify(nextBlocks), + }, + ); + addTrackedSync(syncId, updatedSelected); + + refreshSchedule(); + setIsMultiSelectMode(false); + setSelectedBlockKeys([]); + triggerHaptic("success"); + return; + } + + // SINGLE DROP LOGIC + // ... (duration logic) + let duration = 60; + if (payload.isNew) { + const tag = payload.tag?.toLowerCase() || ""; + if (tag.includes("deep") || tag.includes("work")) + duration = sprintDuration; + else if (tag.includes("break")) duration = 15; + else if (tag.includes("meeting") || tag.includes("call")) + duration = 30; + else if (tag.includes("chore") || tag.includes("task")) + duration = 30; + } else { + duration = + toMinutes(payload.end) - toMinutes(payload.start); + } + const newEnd = toTimeString(clampedMinutes + duration); + + const checkResult = checkTimeSlotAvailability( + newStart, + newEnd, + payload, + ); + if (!checkResult.available) { + // ... rejection logic + triggerHaptic("error"); + setDropCollision(true); + setTimeout(() => setDropCollision(false), 500); + if (checkResult.reason === "past") + Alert.alert( + "Temporal Lock", + "Cannot schedule tasks in the past.", + ); + return; + } + + // ... swap/shift logic ... + + if (payload.isNew) { + console.log("NEW TASK PATH", { + taskTitle: payload.title, + calculatedStart: newStart, + }); + setBlockTitle(payload.title); + setBlockStart(newStart); + setBlockEnd(newEnd); + + const tag = payload.tag?.toLowerCase() || ""; + if (tag.includes("deep") || tag.includes("work")) { + setBlockType("deep-work"); + } else if (tag.includes("break")) { + setBlockType("break"); + } else { + setBlockType("event"); + } + + setEditingBlockIndex(null); + console.log("SETTING MODAL STATE", { + showModal: true, + blockTitle: payload.title, + blockStart: newStart, + }); + setShowModal(true); + } else { + await updateBlockTime(payload, newStart, newEnd); + } + triggerHaptic("success"); + } + }} + > + + {TIME_MARKERS.map((_, index) => ( + + ))} + + + {/* PAST TIME OVERLAY */} + {selectedDate <= today && ( + + )} + + {hoverBlock && !hoverBlock.isMulti && ( + + + {hoverBlock.task || hoverBlock.title} + + + )} + + {hoverBlock && + hoverBlock.isMulti && + hoverBlock.blocks.map((b: any, i: number) => ( + + {b.task} + + ))} + + {combinedBlocks.map((block, index) => { + const top = getTimeOffset(block.start, hourHeight); + const height = getBlockHeight( + block.start, + block.end, + hourHeight, + ); + const blockStyle = + block.type === "deep-work" + ? styles.deepWorkBlock + : block.type === "break" + ? styles.breakBlock + : block.type === "habit" + ? [ + styles.habitBlock, + block.isDone && { opacity: 0.6 }, + ] + : styles.defaultBlock; + + const completedTodos = + block.todos?.filter((t: any) => t.completed).length || 0; + const totalTodos = block.todos?.length || 0; + + const isSelected = selectedBlockKeys.includes( + `${block.start}-${block.task}`, + ); + const syncStatus = getSyncStatusForBlock(block); + + return ( + { + triggerHaptic("light"); + setActiveActionBlock(null); + }} + longPressDelay={ + isMultiSelectMode && isSelected ? 200 : 500 + } + > + { + if (isMultiSelectMode) { + toggleBlockSelection(block); + } else if (activeActionBlock) { + setActiveActionBlock(null); + } else { + handleEditBlock(block, index); + } + }} + onLongPress={() => { + if (isMultiSelectMode) return; // Drax handles drag + if (!block.isHabit) { + setActiveActionBlock(block); + triggerHaptic("medium"); + } + }} + style={{ flex: 1 }} + > + + + + {block.type?.toUpperCase() || "EVENT"} + + + {block.task} + + + + {syncStatus && ( + handleShowSyncInfo(syncStatus)} + > + {syncStatus.status === "pending" && ( + + )} + {syncStatus.status === "synced" && ( + + )} + {syncStatus.status === "failed" && ( + + )} + + )} + {isSelected && ( + + + + )} + + + + {totalTodos > 0 && ( + + + {completedTodos}/{totalTodos} points + + + )} + + {block.description && ( + + • {block.description} + + )} + + + {/* QUICK ACTIONS OVERLAY */} + {activeActionBlock?.start === block.start && + activeActionBlock?.task === block.task && ( + + handleDuplicateBlock(block)} + > + + Copy + + handleMoveToTomorrow(block)} + > + + +1 Day + + { + setEditingBlockIndex( + rawTimeBlocks.findIndex( + (b) => + b.start === block.start && + b.task === block.task, + ), + ); + handleDeleteBlock(); + }} + > + + + Del + + + setActiveActionBlock(null)} + > + + + + )} + + ); + })} + + {selectedDate === today && ( + + + + + )} + + + + + + + + + { + setShowModal(false); + resetModal(); + }} + style={styles.modalTopBtn} + > + + Cancel + + + + + {editingBlockIndex !== null ? "Edit Block" : "Add Block"} + + + + + + Save + + + + + + {editingBlockIndex !== null && ( + + + + Delete this block + + + )} + + WHAT ARE YOU DOING? + + + + + + + + + + + + + + BLOCK TYPE + + + {[ + { id: "event", label: "Event", icon: CalendarIcon }, + { id: "deep-work", label: "Deep Work", icon: Zap }, + { id: "chores", label: "Chores", icon: Target }, + { id: "walk", label: "Walk", icon: MapPin }, + { id: "break", label: "Break", icon: Clock }, + ].map((item) => { + const isSelected = blockType === item.id; + const IconComp = item.icon; + return ( + setBlockType(item.id as any)} + > + + + {item.label} + + + ); + })} + + + + + + SUB-TASKS (POINTS) + + + + + + + + {blockTodos.map((todo) => ( + + toggleTodo(todo.id)} + style={[ + styles.todoCheck, + { borderColor: colors.primary }, + todo.completed && { + backgroundColor: colors.primary, + }, + ]} + > + {todo.completed && ( + + )} + + + {todo.text} + + removeTodo(todo.id)}> + + + + ))} + + + + + NOTES + + + + + LOCATION + + + + + + + + { + resetModal(); + setShowModal(true); + }} + > + + + + {/* UNDO TOAST */} + {showUndoToast && ( + + Block moved + + UNDO + + + )} + + + + ); +} + +const createStyles = (colors: any, hourHeight: number) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scrollView: { + flex: 1, + }, + contentContainer: { + paddingBottom: 100, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + menuBtn: { + padding: 8, + }, + logoImage: { + height: 40, + width: 160, + }, + ghostBtn: { + padding: 8, + }, + headerRight: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + dateHeader: { + padding: SPACING.lg, + backgroundColor: colors.surface, + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + }, + dateInfo: { + flex: 1, + }, + dayNavRow: { + flexDirection: "row", + alignItems: "center", + gap: 12, + marginBottom: 2, + }, + navBtn: { + padding: 4, + backgroundColor: colors.primary + "1A", + borderRadius: 4, + }, + dayLabel: { + fontFamily: FONTS.labelSm, + fontSize: 12, + color: colors.primary, + letterSpacing: 1.5, + }, + dateLabel: { + fontFamily: FONTS.headline, + fontSize: 32, + color: colors.onSurface, + }, + metricsGrid: { + flexDirection: "row", + gap: 12, + }, + metricItem: { + flexDirection: "row", + alignItems: "center", + gap: 4, + backgroundColor: colors.surfaceVariant + "80", + paddingHorizontal: 8, + paddingVertical: 6, + borderRadius: ROUNDNESS.sm, + }, + metricValue: { + fontFamily: FONTS.labelSm, + fontSize: 12, + color: colors.onSurface, + }, + timelineWrapper: { + flexDirection: "row", + paddingRight: SPACING.lg, + }, + timeColumn: { + width: 70, + }, + timeSlot: { + height: hourHeight, + alignItems: "center", + justifyContent: "flex-start", + paddingTop: 10, + }, + timeText: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.onSurfaceVariant, + }, + calendarGrid: { + flex: 1, + position: "relative", + minHeight: hourHeight * 24, + }, + gridLines: { + ...StyleSheet.absoluteFillObject, + }, + gridLine: { + height: hourHeight, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "33", + }, + taskBlock: { + position: "absolute", + left: 0, + right: 0, + padding: 12, + borderRadius: ROUNDNESS.md, + justifyContent: "space-between", + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + marginRight: 4, + }, + blockLabel: { + fontFamily: FONTS.labelSm, + fontSize: 9, + letterSpacing: 1, + marginBottom: 2, + }, + taskTitle: { + fontFamily: FONTS.headline, + fontSize: 16, + }, + defaultBlock: { + backgroundColor: colors.surface, + }, + deepWorkBlock: { + backgroundColor: colors.primary, + borderColor: colors.primary, + }, + breakBlock: { + backgroundColor: colors.surfaceVariant, + borderLeftWidth: 3, + borderLeftColor: colors.tertiary, + }, + habitBlock: { + backgroundColor: colors.primaryContainer + "40", + borderLeftWidth: 4, + borderLeftColor: colors.primary, + }, + choresBlock: { + backgroundColor: colors.secondaryContainer + "40", + borderLeftWidth: 4, + borderLeftColor: colors.secondary, + }, + taskLocation: { + fontFamily: FONTS.body, + fontSize: 10, + marginTop: 2, + }, + todoProgress: { + marginTop: 4, + }, + todoText: { + fontFamily: FONTS.label, + fontSize: 10, + }, + currentTimeLine: { + position: "absolute", + left: -5, + right: 0, + height: 2, + flexDirection: "row", + alignItems: "center", + zIndex: 10, + }, + timeDot: { + width: 10, + height: 10, + borderRadius: 5, + }, + line: { + flex: 1, + height: 2, + }, + fab: { + position: "absolute", + bottom: 80, + right: 24, + width: 56, + height: 56, + borderRadius: 28, + alignItems: "center", + justifyContent: "center", + elevation: 4, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 4, + }, + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.35)", + justifyContent: "flex-end", + }, + modalContainer: { + backgroundColor: colors.surface, + padding: SPACING.lg, + borderTopLeftRadius: ROUNDNESS.xl, + borderTopRightRadius: ROUNDNESS.xl, + maxHeight: "90%", + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: SPACING.xl, + paddingBottom: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "33", + }, + modalTopBtn: { + paddingVertical: 8, + paddingHorizontal: 12, + }, + modalSaveTopBtn: { + flexDirection: "row", + alignItems: "center", + gap: 6, + paddingVertical: 8, + paddingHorizontal: 16, + borderRadius: ROUNDNESS.full, + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 18, + color: colors.onSurface, + }, + deleteBtnInline: { + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 8, + paddingVertical: 12, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderStyle: "dashed", + marginBottom: SPACING.lg, + }, + deleteBtnText: { + fontFamily: FONTS.labelSm, + fontSize: 13, + }, + modalField: { + marginBottom: SPACING.md, + }, + modalFieldRow: { + flexDirection: "row", + gap: 12, + marginBottom: SPACING.md, + }, + modalFieldSmall: { + flex: 1, + }, + modalLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.onSurfaceVariant, + marginBottom: 6, + }, + modalInput: { + backgroundColor: colors.surfaceVariant, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + paddingVertical: 12, + paddingHorizontal: 12, + color: colors.onSurface, + fontFamily: FONTS.body, + fontSize: 14, + }, + timeAdjustmentRow: { + flexDirection: "row", + gap: 12, + marginBottom: SPACING.md, + }, + timeField: { + flex: 1, + }, + modalTypeRow: { + flexDirection: "row", + marginTop: 4, + }, + typeChip: { + flexDirection: "row", + alignItems: "center", + gap: 6, + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: ROUNDNESS.full, + backgroundColor: colors.surfaceVariant + "4D", + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + typeChipText: { + fontFamily: FONTS.labelSm, + fontSize: 13, + color: colors.onSurfaceVariant, + }, + todoInputRow: { + flexDirection: "row", + gap: 8, + marginBottom: 12, + }, + addTodoBtn: { + width: 48, + height: 48, + borderRadius: ROUNDNESS.sm, + alignItems: "center", + justifyContent: "center", + }, + todoList: { + gap: 8, + }, + todoItem: { + flexDirection: "row", + alignItems: "center", + gap: 12, + backgroundColor: colors.surfaceVariant + "4D", + padding: 10, + borderRadius: ROUNDNESS.sm, + }, + todoCheck: { + width: 20, + height: 20, + borderRadius: 4, + borderWidth: 2, + alignItems: "center", + justifyContent: "center", + }, + todoLabel: { + flex: 1, + fontFamily: FONTS.body, + fontSize: 14, + }, + modalCancelText: { + fontFamily: FONTS.label, + color: colors.onSurface, + }, + modalSaveText: { + fontFamily: FONTS.label, + color: colors.onPrimary, + }, + center: { + justifyContent: "center", + alignItems: "center", + }, + emptyCalendar: { + flex: 1, + justifyContent: "center", + alignItems: "center", + paddingTop: 100, + }, + emptyText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + }, + aiNudgeContainer: { + paddingHorizontal: SPACING.lg, + marginBottom: SPACING.md, + }, + aiNudgeCard: { + flexDirection: "row", + alignItems: "center", + padding: 16, + borderRadius: ROUNDNESS.lg, + gap: 12, + }, + aiNudgeText: { + fontFamily: FONTS.body, + fontSize: 13, + color: colors.onSurface, + lineHeight: 18, + }, + aiNudgeAction: { + marginTop: 8, + }, + aiNudgeActionText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1, + }, + upcomingSection: { + paddingHorizontal: SPACING.lg, + marginBottom: SPACING.lg, + }, + upcomingRow: { + gap: 12, + paddingRight: SPACING.lg, + }, + upcomingCard: { + backgroundColor: colors.surface, + padding: 12, + borderRadius: ROUNDNESS.md, + width: 140, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + upcomingTimeRow: { + flexDirection: "row", + alignItems: "center", + gap: 4, + marginBottom: 4, + }, + upcomingTime: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.primary, + }, + upcomingTitle: { + fontFamily: FONTS.labelSm, + fontSize: 13, + color: colors.onSurface, + }, + ghostBlock: { + position: "absolute", + left: 0, + right: 0, + borderWidth: 2, + borderStyle: "dashed", + borderColor: colors.primary, + opacity: 0.6, + zIndex: 50, + justifyContent: "center", + alignItems: "center", + }, + ghostText: { + fontFamily: FONTS.labelSm, + fontSize: 12, + color: colors.primary, + fontWeight: "bold", + }, + inventorySection: { + paddingHorizontal: SPACING.lg, + marginBottom: SPACING.lg, + }, + inventoryRow: { + gap: 12, + paddingRight: SPACING.lg, + paddingVertical: 8, + }, + inventoryCard: { + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: ROUNDNESS.full, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + minWidth: 100, + alignItems: "center", + justifyContent: "center", + }, + inventoryTitle: { + fontFamily: FONTS.labelSm, + fontSize: 12, + color: colors.onSurface, + }, + emptyInventoryText: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.onSurfaceVariant, + fontStyle: "italic", + marginTop: 8, + }, + quickActionsContainer: { + position: "absolute", + top: -45, + left: 0, + right: 0, + flexDirection: "row", + justifyContent: "center", + gap: 8, + zIndex: 100, + backgroundColor: colors.surface, + padding: 6, + borderRadius: ROUNDNESS.full, + elevation: 4, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 4, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + quickActionBtn: { + flexDirection: "row", + alignItems: "center", + gap: 4, + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: ROUNDNESS.full, + backgroundColor: colors.surfaceVariant + "4D", + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + quickActionText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + }, + undoToast: { + position: "absolute", + bottom: 100, + left: 20, + right: 20, + backgroundColor: colors.onSurface, + borderRadius: ROUNDNESS.md, + padding: 16, + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + elevation: 6, + shadowColor: "#000", + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.3, + shadowRadius: 5, + zIndex: 1000, + }, + undoToastText: { + color: colors.surface, + fontFamily: FONTS.body, + fontSize: 14, + }, + undoBtn: { + paddingHorizontal: 12, + paddingVertical: 6, + }, + undoBtnText: { + color: colors.primaryContainer, + fontFamily: FONTS.label, + fontSize: 14, + fontWeight: "bold", + }, + }); diff --git a/src/app/(tabs)/hh_habits.tsx b/src/app/(tabs)/hh_habits.tsx new file mode 100644 index 0000000..af5212a --- /dev/null +++ b/src/app/(tabs)/hh_habits.tsx @@ -0,0 +1,1081 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { CalendarStrip } from "@/src/components/ui/CalendarStrip"; +import { TimeInput } from "@/src/components/ui/TimeInput"; +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { getLocalDateString } from "@/src/lib/date-utils"; +import { recalculateAllStreaks } from "@/src/lib/habit-logic"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useFocusEffect, useRouter } from "expo-router"; +import { + Calendar as CalendarIcon, + Check, + ChevronRight, + Clock, + Flame, + History, + MapPin, + Menu, + PlusCircle, + Save, + Settings, + Sparkles, + Trash2, + X, +} from "lucide-react-native"; +import React, { useCallback, useMemo, useState } from "react"; +import { + ActivityIndicator, + Alert, + Image, + KeyboardAvoidingView, + Modal, + Platform, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; + +interface Habit { + id: string; + title: string; + frequency: string; + is_active: number; + is_done_today: number; + is_done_yesterday: number; + current_streak: number; + max_streak: number; + preferred_time: string; + location: string; + two_minute_version: string; +} + +export default function HabitsScreen() { + const { colors, identityAnchor } = useTheme(); + const { user } = useAuth(); + const router = useRouter(); + const styles = useMemo(() => createStyles(colors), [colors]); + + const userId = user?.id || "guest"; + const today = getLocalDateString(); + const [selectedDate, setSelectedDate] = useState(today); + + const { + data: habits, + loading, + refresh, + } = useData( + `SELECT h.*, + (SELECT COUNT(*) FROM logs l WHERE l.habit_id = h.id AND date(l.logged_at, 'localtime') = ?) as is_done_today, + (SELECT COUNT(*) FROM logs l WHERE l.habit_id = h.id AND date(l.logged_at, 'localtime') = date(?, '-1 day')) as is_done_yesterday + FROM habits h + WHERE h.is_active = 1 AND (h.user_id = ? OR h.user_id IS NULL) + ORDER BY h.preferred_time ASC`, + [selectedDate, selectedDate, userId], + ); + + const { data: matrixLogs } = useData<{ date: string; count: number }>( + "SELECT date(logged_at, 'localtime') as date, COUNT(*) as count FROM logs GROUP BY date ORDER BY date DESC LIMIT 28", + [], + ); + + const matrixCells = useMemo(() => { + const cells = []; + const habitCount = habits.length || 1; + for (let i = 27; i >= 0; i--) { + const d = new Date(); + d.setDate(d.getDate() - i); + const dateStr = getLocalDateString(d); + + const logEntry = matrixLogs.find((l) => l.date === dateStr); + const completionCount = logEntry ? logEntry.count : 0; + const intensity = Math.min(completionCount / habitCount, 1); + + cells.push({ + date: dateStr, + intensity, + isToday: i === 0, + }); + } + return cells; + }, [matrixLogs, habits.length]); + + const [editingHabit, setEditingHabit] = useState(null); + const [editTitle, setEditTitle] = useState(""); + const [editTime, setEditTime] = useState(""); + const [editLocation, setEditLocation] = useState(""); + const [editGateway, setEditGateway] = useState(""); + + const dailySummary = useMemo(() => { + const total = habits.length; + const completed = habits.filter((h) => h.is_done_today > 0).length; + const percentage = total > 0 ? Math.round((completed / total) * 100) : 0; + return { total, completed, percentage }; + }, [habits]); + + const aiNudge = useMemo(() => { + const fallingOff = habits.find( + (h) => + h.current_streak > 0 && + h.is_done_today === 0 && + h.is_done_yesterday === 0, + ); + if (fallingOff) { + return { + message: `Your ${fallingOff.current_streak}-day streak for "${fallingOff.title}" is at risk. Use your gateway version: "${fallingOff.two_minute_version || "Just start for 2 minutes"}" to keep it alive!`, + type: "warning", + }; + } + if (dailySummary.percentage === 100 && habits.length > 0) { + return { + message: + "Perfect day! Every action is a vote for the person you wish to become.", + type: "success", + }; + } + return null; + }, [habits, dailySummary]); + + useFocusEffect( + useCallback(() => { + recalculateAllStreaks(userId).then(() => { + refresh(); + }); + }, [userId, refresh]), + ); + + const handleToggleHabit = async (habit: Habit) => { + try { + const isDone = habit.is_done_today > 0; + if (isDone) { + const db = await (await import("@/src/db/database")).getDb(); + await db.runAsync( + "DELETE FROM logs WHERE habit_id = ? AND date(logged_at, 'localtime') = date('now', 'localtime')", + [habit.id], + ); + } else { + await performMutation("logs", "INSERT", { + id: Math.random().toString(36).substring(7), + habit_id: habit.id, + status: "completed", + logged_at: new Date().toISOString(), + }); + } + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + refresh(); + } catch (err) { + console.error("Failed to log habit:", err); + } + }; + + const handleOpenEdit = (habit: Habit) => { + setEditingHabit(habit); + setEditTitle(habit.title); + setEditTime(habit.preferred_time || ""); + setEditLocation(habit.location || ""); + setEditGateway(habit.two_minute_version || ""); + }; + + const handleSaveEdit = async () => { + if (!editingHabit || !editTitle.trim()) return; + + try { + await performMutation("habits", "UPDATE", { + id: editingHabit.id, + title: editTitle, + preferred_time: editTime, + location: editLocation, + two_minute_version: editGateway, + updated_at: new Date().toISOString(), + }); + setEditingHabit(null); + refresh(); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + Alert.alert("Error", "Failed to update habit"); + } + }; + + const backfillYesterday = async () => { + if (!editingHabit) return; + try { + const yesterday = new Date(); + yesterday.setDate(yesterday.getDate() - 1); + + await performMutation("logs", "INSERT", { + id: Math.random().toString(36).substring(7), + habit_id: editingHabit.id, + status: "completed", + logged_at: yesterday.toISOString(), + }); + Alert.alert("Success", "Logged for yesterday."); + refresh(); + } catch (e) { + console.error(e); + } + }; + + const handleDeleteHabit = async (id: string) => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + Alert.alert("Delete Habit", "Are you sure you want to remove this habit?", [ + { text: "Cancel", style: "cancel" }, + { + text: "Delete", + style: "destructive", + onPress: async () => { + try { + await performMutation("habits", "DELETE", { id }); + setEditingHabit(null); + refresh(); + } catch (error) { + Alert.alert("Error", "Failed to delete habit"); + } + }, + }, + ]); + }; + + if (loading && habits.length === 0) { + return ( + + + + ); + } + + return ( + + + {/* Header */} + + router.push("/menu")} + > + + + + + + + + router.push("/modal")} + > + + + + + + + + {/* Identity Header */} + + ATOMIC PRINCIPLES + {identityAnchor} + + + {/* Consistency Matrix */} + + + CONSISTENCY MATRIX (28 DAYS) + + + + {matrixCells.map((cell, idx) => ( + 0 + ? colors.primary + : colors.surfaceVariant, + opacity: + cell.intensity > 0 ? 0.3 + cell.intensity * 0.7 : 1, + borderColor: cell.isToday + ? colors.primary + : "transparent", + borderWidth: cell.isToday ? 1.5 : 0, + }, + ]} + /> + ))} + + + LESS + + + + MORE + + + + + {/* Daily Summary Card */} + + + + Progress + + {dailySummary.completed} of {dailySummary.total} habits + completed + + + + + {dailySummary.percentage}% + + + + + + + + + {/* AI Nudge Section */} + {aiNudge && ( + + + + {aiNudge.message} + + + )} + + {/* Habits List */} + + + Daily Votes + router.push("/add-habit")} + > + + NEW HABIT + + + + + {habits.map((habit) => { + const isDone = habit.is_done_today > 0; + const isRecovery = habit.is_done_yesterday === 0 && !isDone; + const streakProgress = Math.min( + (habit.current_streak / 30) * 100, + 100, + ); + + return ( + + handleToggleHabit(habit)} + onLongPress={() => handleOpenEdit(habit)} + > + + + {isDone && ( + + )} + + + + + + {habit.title} + + {isRecovery && ( + + + NEVER MISS TWICE + + + )} + + + + + + + {habit.preferred_time || "08:00"} + + + + 0 + ? "#FF6B00" + : colors.outline + } + /> + 0 && { + color: "#FF6B00", + fontFamily: FONTS.labelSm, + }, + ]} + > + {habit.current_streak} DAY STREAK + + + + + + handleOpenEdit(habit)} + style={styles.settingsBtn} + > + + + + + {/* Streak Progress Bar */} + + 0 + ? "#FF6B00" + : colors.outlineVariant, + }, + ]} + /> + + + + ); + })} + + + + {/* Detailed Matrix Shortcut */} + router.push("/calendar")} + > + + + View detailed consistency matrix + + + + + + {/* Edit Habit Modal */} + setEditingHabit(null)} + > + + + + Adjust Habit + setEditingHabit(null)}> + + + + + + + TITLE + + + + + + + + + LOCATION / ANCHOR + + + + + + + + GATEWAY VERSION (2 MIN) + + + + + MISSED A DAY? + + + + Mark completed for yesterday + + + + + + + handleDeleteHabit(editingHabit!.id)} + > + + + + + + Save Changes + + + + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scrollView: { + flex: 1, + }, + contentContainer: { + paddingBottom: 40, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + menuBtn: { + padding: 8, + }, + logoImage: { + height: 40, + width: 160, + }, + ghostBtn: { + padding: 8, + }, + identityHeader: { + padding: SPACING.lg, + backgroundColor: colors.surface, + }, + matrixContainer: { + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + padding: SPACING.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + matrixGrid: { + flexDirection: "row", + flexWrap: "wrap", + gap: 6, + }, + matrixCell: { + width: 14, + height: 14, + borderRadius: 3, + }, + matrixLegend: { + flexDirection: "row", + alignItems: "center", + marginTop: 16, + justifyContent: "flex-end", + }, + legendText: { + fontFamily: FONTS.label, + fontSize: 9, + color: colors.outline, + }, + label: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.primary, + letterSpacing: 1.5, + marginBottom: SPACING.xs, + }, + headline: { + fontFamily: FONTS.headline, + fontSize: 28, + color: colors.onSurface, + }, + summaryCard: { + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + padding: SPACING.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + margin: SPACING.lg, + marginTop: 0, + }, + summaryInfo: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: SPACING.md, + }, + summaryTitle: { + fontFamily: FONTS.labelSm, + fontSize: 16, + color: colors.onSurface, + }, + summarySubtitle: { + fontFamily: FONTS.body, + fontSize: 13, + color: colors.outline, + marginTop: 2, + }, + percentageCircle: { + width: 50, + height: 50, + borderRadius: 25, + backgroundColor: colors.primaryContainer, + alignItems: "center", + justifyContent: "center", + }, + percentageText: { + fontFamily: FONTS.labelSm, + fontSize: 14, + color: colors.primary, + }, + progressBarBg: { + height: 6, + backgroundColor: colors.surfaceVariant, + borderRadius: 3, + overflow: "hidden", + }, + progressBarFill: { + height: "100%", + borderRadius: 3, + }, + nudgeCard: { + flexDirection: "row", + alignItems: "center", + padding: 12, + borderRadius: ROUNDNESS.md, + gap: 12, + marginHorizontal: SPACING.lg, + marginBottom: SPACING.lg, + }, + nudgeText: { + flex: 1, + fontFamily: FONTS.body, + fontSize: 13, + lineHeight: 18, + }, + section: { + paddingHorizontal: SPACING.lg, + }, + sectionHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: SPACING.md, + }, + sectionTitle: { + fontFamily: FONTS.headline, + fontSize: 24, + color: colors.onSurface, + }, + addButton: { + flexDirection: "row", + alignItems: "center", + gap: 6, + }, + addButtonText: { + color: colors.primary, + fontFamily: FONTS.labelSm, + fontSize: 11, + letterSpacing: 0.5, + }, + habitList: { + gap: SPACING.md, + }, + habitItemWrapper: { + width: "100%", + }, + habitCard: { + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + padding: 16, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + habitMain: { + flexDirection: "row", + alignItems: "center", + }, + checkBtn: { + width: 32, + height: 32, + borderRadius: 16, + borderWidth: 2, + borderColor: colors.outlineVariant, + alignItems: "center", + justifyContent: "center", + marginRight: 16, + }, + habitInfo: { + flex: 1, + }, + habitTitleRow: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + habitTitle: { + fontFamily: FONTS.labelSm, + fontSize: 17, + color: colors.onSurface, + }, + recoveryTag: { + paddingHorizontal: 6, + paddingVertical: 2, + borderRadius: 4, + }, + recoveryTagText: { + fontSize: 8, + fontFamily: FONTS.labelSm, + }, + habitMeta: { + flexDirection: "row", + gap: 12, + marginTop: 4, + }, + metaItem: { + flexDirection: "row", + alignItems: "center", + gap: 4, + }, + metaText: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.outline, + }, + settingsBtn: { + padding: 8, + }, + streakBarContainer: { + height: 3, + backgroundColor: colors.surfaceVariant, + borderRadius: 1.5, + marginTop: 12, + overflow: "hidden", + }, + streakBarFill: { + height: "100%", + borderRadius: 1.5, + }, + historyCard: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.surfaceVariant + "4D", + padding: 16, + borderRadius: ROUNDNESS.md, + gap: 12, + margin: SPACING.lg, + marginTop: SPACING.xl, + }, + historyText: { + flex: 1, + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurface, + }, + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.35)", + justifyContent: "flex-end", + }, + modalContainer: { + backgroundColor: colors.surface, + padding: SPACING.lg, + borderTopLeftRadius: ROUNDNESS.xl, + borderTopRightRadius: ROUNDNESS.xl, + maxHeight: "80%", + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: SPACING.xl, + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + modalBody: { + marginBottom: SPACING.lg, + }, + modalField: { + marginBottom: SPACING.lg, + }, + modalLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1, + marginBottom: 8, + }, + modalInput: { + backgroundColor: colors.surfaceVariant + "4D", + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + padding: 12, + color: colors.onSurface, + fontFamily: FONTS.body, + fontSize: 15, + }, + inputIconWrapper: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.surfaceVariant + "4D", + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + inputIcon: { + paddingHorizontal: 12, + }, + adjustmentSection: { + marginTop: SPACING.md, + paddingTop: SPACING.lg, + borderTopWidth: 1, + borderTopColor: colors.outlineVariant + "33", + marginBottom: 20, + }, + backfillBtn: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.primary + "10", + padding: 16, + borderRadius: ROUNDNESS.md, + gap: 12, + borderWidth: 1, + borderColor: colors.primary + "33", + }, + backfillText: { + fontFamily: FONTS.labelSm, + fontSize: 14, + color: colors.primary, + }, + modalActions: { + flexDirection: "row", + gap: 12, + marginTop: SPACING.xl, + paddingBottom: Platform.OS === "ios" ? 20 : 0, + }, + modalBtn: { + padding: 14, + borderRadius: ROUNDNESS.md, + alignItems: "center", + justifyContent: "center", + }, + saveBtn: { + flex: 1, + flexDirection: "row", + gap: 8, + }, + saveBtnText: { + fontFamily: FONTS.labelSm, + color: colors.onPrimary, + fontSize: 15, + }, + center: { + justifyContent: "center", + alignItems: "center", + }, + }); diff --git a/src/app/(tabs)/history.tsx b/src/app/(tabs)/history.tsx new file mode 100644 index 0000000..52113b0 --- /dev/null +++ b/src/app/(tabs)/history.tsx @@ -0,0 +1,646 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { getLocalDateString } from "@/src/lib/date-utils"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useFocusEffect, useRouter } from "expo-router"; +import { + CheckCircle2, + Clock, + Copy, + History as HistoryIcon, + Layout, + Menu, + Settings, + BookOpen +} from "lucide-react-native"; +import React, { useCallback, useMemo, useState } from "react"; +import { + ActivityIndicator, + Alert, + Image, + StyleSheet, + Text, + TouchableOpacity, + View +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; + +type TabType = "History" | "Repository" | "Reading"; +type FilterType = "Day" | "Week" | "Month" | "Year"; + +interface Task { + id: string; + title: string; + status: "todo" | "doing" | "done"; + completed_sessions: number; + estimated_sessions: number; + tag: string; + updated_at: string; + todos?: string; +} + +interface ScheduleBlock { + start: string; + end: string; + task: string; + type?: string; + todos?: any[]; + date: string; +} + +interface ReadingLog { + id: string; + book_id: string; + book_title: string; + start_page: number; + end_page: number; + pages_read: number; + duration_seconds: number; + logged_at: string; +} + +export default function HistoryScreen() { + const { colors } = useTheme(); + const { user } = useAuth(); + const router = useRouter(); + const styles = useMemo(() => createStyles(colors), [colors]); + + const [activeTab, setActiveTab] = useState("History"); + const [activeFilter, setActiveFilter] = useState("Month"); + + const userId = user?.id || "guest"; + const today = getLocalDateString(); + + // 1. Fetch Completed Tasks History + const { + data: completedTasks, + loading: tasksLoading, + refresh: refreshTasks, + } = useData( + `SELECT * FROM tasks + WHERE (user_id = ? OR user_id IS NULL) + AND status = 'done' + ORDER BY updated_at DESC LIMIT 200`, + [userId], + ); + + // 2. Fetch Past Schedules + const { + data: pastSchedules, + loading: schedulesLoading, + refresh: refreshSchedules, + } = useData<{ date: string; time_blocks: string }>( + `SELECT date, time_blocks FROM schedules + WHERE (user_id = ? OR user_id IS NULL) + AND date <= ? + ORDER BY date DESC`, + [userId, today], + ); + + // 3. Fetch Reading History + const { + data: readingLogs, + loading: readingLoading, + refresh: refreshReading, + } = useData( + `SELECT rl.*, b.title as book_title + FROM reading_logs rl + JOIN books b ON rl.book_id = b.id + WHERE (rl.user_id = ? OR rl.user_id IS NULL) + ORDER BY rl.logged_at DESC LIMIT 100`, + [userId], + ); + + // Filtering Logic + const filteredHistory = useMemo(() => { + const now = new Date(); + const allHistory = pastSchedules + .flatMap((s) => { + try { + const blocks = JSON.parse(s.time_blocks) as any[]; + return blocks.map((b) => ({ ...b, date: s.date })); + } catch { + return []; + } + }) + .filter((b) => b.type !== "break" && b.task !== "Break"); + + return allHistory.filter((item) => { + const itemDate = new Date(item.date); + const diffTime = now.getTime() - itemDate.getTime(); + const diffDays = Math.floor(diffTime / (1000 * 3600 * 24)); + + if (activeFilter === "Day") return diffDays <= 0; + if (activeFilter === "Week") return diffDays <= 7; + if (activeFilter === "Month") return diffDays <= 31; + if (activeFilter === "Year") return diffDays <= 365; + return true; + }); + }, [pastSchedules, activeFilter]); + + const filteredInventory = useMemo(() => { + const now = new Date(); + return completedTasks.filter((task) => { + const taskDate = new Date(task.updated_at); + const diffTime = now.getTime() - taskDate.getTime(); + const diffDays = Math.floor(diffTime / (1000 * 3600 * 24)); + + if (activeFilter === "Day") return diffDays <= 0; + if (activeFilter === "Week") return diffDays <= 7; + if (activeFilter === "Month") return diffDays <= 31; + if (activeFilter === "Year") return diffDays <= 365; + return true; + }); + }, [completedTasks, activeFilter]); + + const filteredReading = useMemo(() => { + const now = new Date(); + return readingLogs.filter((log) => { + const logDate = new Date(log.logged_at); + const diffTime = now.getTime() - logDate.getTime(); + const diffDays = Math.floor(diffTime / (1000 * 3600 * 24)); + + if (activeFilter === "Day") return diffDays <= 0; + if (activeFilter === "Week") return diffDays <= 7; + if (activeFilter === "Month") return diffDays <= 31; + if (activeFilter === "Year") return diffDays <= 365; + return true; + }); + }, [readingLogs, activeFilter]); + + useFocusEffect( + useCallback(() => { + refreshTasks(); + refreshSchedules(); + refreshReading(); + }, [refreshTasks, refreshSchedules, refreshReading]), + ); + + const formatDuration = (seconds: number) => { + const mins = Math.floor(seconds / 60); + if (mins < 1) return "< 1 min"; + return `${mins} min${mins > 1 ? "s" : ""}`; + }; + + const formatDate = (dateStr: string) => { + const date = new Date(dateStr); + return date.toLocaleDateString(undefined, { + month: "short", + day: "numeric", + year: "numeric", + }); + }; + + return ( + + + {/* Header */} + + router.push("/menu")} + > + + + + + + router.push("/modal")} + > + + + + + {/* Tab Switcher */} + + { + setActiveTab("History"); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + + Plans + + + { + setActiveTab("Repository"); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + + Tasks + + + { + setActiveTab("Reading"); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + + Reading + + + + + + + {/* Filter Bar */} + + {["Day", "Week", "Month", "Year"].map((f) => ( + setActiveFilter(f as FilterType)} + > + + {f} + + + ))} + + + {activeTab === "History" ? ( + + {schedulesLoading ? ( + + ) : filteredHistory.length > 0 ? ( + filteredHistory.map((block, idx) => ( + handleReuseTask(block)} + > + + + + {block.date === today ? "TODAY" : block.date} + + + + {block.start} - {block.end} + + + + {block.task} + + + REUSE + + + + )) + ) : ( + + + + No historical data for this period. + + + )} + + ) : activeTab === "Reading" ? ( + + {readingLoading ? ( + + ) : filteredReading.length > 0 ? ( + filteredReading.map((log) => ( + + + + {formatDate(log.logged_at)} + + {formatDuration(log.duration_seconds)} + + + + {log.book_title} + + Read {log.pages_read} pages (p. {log.start_page} → {log.end_page}) + + + + + )) + ) : ( + + + No reading history for this period. + + )} + + ) : ( + + {tasksLoading ? ( + + ) : filteredInventory.length > 0 ? ( + filteredInventory.map((task) => ( + handleReuseTask(task)} + > + + + + {task.tag || "General"} + + + {task.title} + + Completed{" "} + {getLocalDateString(new Date(task.updated_at))} + + + + + + + )) + ) : ( + + + + No completed tasks for this period. + + + )} + + )} + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + logoImage: { height: 40, width: 160 }, + menuBtn: { padding: 8 }, + ghostBtn: { padding: 8 }, + tabContainer: { + flexDirection: "row", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.surface, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "33", + }, + tab: { + flexDirection: "row", + alignItems: "center", + gap: 8, + paddingVertical: 8, + paddingHorizontal: 16, + marginRight: 12, + borderRadius: ROUNDNESS.full, + }, + activeTab: { + backgroundColor: colors.primaryContainer, + }, + tabText: { + fontFamily: FONTS.labelSm, + fontSize: 14, + color: colors.outline, + }, + scrollContent: { + paddingBottom: 40, + }, + section: { + padding: SPACING.lg, + }, + filterRow: { + flexDirection: "row", + gap: 8, + marginBottom: SPACING.xl, + flexWrap: "wrap", + }, + filterBtn: { + paddingVertical: 6, + paddingHorizontal: 12, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: "transparent", + minWidth: 60, + alignItems: "center", + }, + filterText: { + fontFamily: FONTS.label, + fontSize: 12, + color: colors.onSurfaceVariant, + }, + historyList: { gap: 16 }, + historyCard: { + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + padding: 16, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + cardHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: 12, + }, + dateBadge: { + backgroundColor: colors.surfaceVariant, + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 4, + }, + dateText: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.onSurfaceVariant, + }, + timeRange: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + }, + cardBody: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + }, + taskTitle: { + fontFamily: FONTS.headline, + fontSize: 18, + color: colors.onSurface, + flex: 1, + marginRight: 16, + }, + cardActions: { + flexDirection: "row", + alignItems: "center", + gap: 6, + backgroundColor: colors.primary + "1A", + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 6, + }, + reuseText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + }, + inventoryList: { gap: 12 }, + inventoryCard: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.surface, + padding: 16, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + inventoryMain: { flex: 1 }, + tagBadge: { + alignSelf: "flex-start", + paddingHorizontal: 6, + paddingVertical: 2, + borderRadius: 4, + marginBottom: 6, + }, + tagText: { fontFamily: FONTS.label, fontSize: 9 }, + inventoryTitle: { + fontFamily: FONTS.labelSm, + fontSize: 16, + color: colors.onSurface, + }, + inventoryMeta: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.outline, + marginTop: 4, + }, + reuseIconBtn: { + padding: 12, + backgroundColor: colors.primaryContainer, + borderRadius: ROUNDNESS.md, + }, + emptyState: { + alignItems: "center", + justifyContent: "center", + paddingVertical: 60, + gap: 16, + }, + emptyText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.outline, + textAlign: "center", + paddingHorizontal: 40, + }, + }); diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx new file mode 100644 index 0000000..b4c0ab3 --- /dev/null +++ b/src/app/(tabs)/index.tsx @@ -0,0 +1,843 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useFocusEffect, useRouter } from "expo-router"; +import { + CheckCircle2, + Globe, + History, + Menu, + Play, + Plus, + Settings, + Sparkles, + Trash2 +} from "lucide-react-native"; +import React, { useCallback, useMemo } from "react"; +import { + ActivityIndicator, + Alert, + Image, + Linking, + StyleSheet, + Text, + TouchableOpacity, + View +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; + +import { getLocalDateString } from "@/src/lib/date-utils"; + +export default function DashboardScreen() { + const { colors, focusGoal, displayName } = useTheme(); + const { user } = useAuth(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const userId = user?.id || "guest"; + const today = getLocalDateString(); + + const { data: habitStats, loading: habitsLoading } = useData<{ + count: number; + }>( + "SELECT COUNT(*) as count FROM habits WHERE is_active = 1 AND (user_id = ? OR user_id IS NULL)", + [userId], + ); + + const { data: logStats, loading: logsLoading } = useData<{ count: number }>( + "SELECT COUNT(DISTINCT l.habit_id) as count FROM logs l JOIN habits h ON l.habit_id = h.id WHERE date(l.logged_at, 'localtime') = date('now', 'localtime') AND (h.user_id = ? OR h.user_id IS NULL)", + [userId], + ); + + const { data: sessionStats } = useData<{ count: number }>( + "SELECT SUM(completed_sessions) as count FROM tasks WHERE (user_id = ? OR user_id IS NULL) AND date(updated_at, 'localtime') = date('now', 'localtime')", + [userId], + ); + + const { + data: habits, + loading: listLoading, + refresh: refreshHabits, + } = useData<{ id: string; title: string; is_done_today: number }>( + `SELECT h.id, h.title, + (SELECT COUNT(*) FROM logs l WHERE l.habit_id = h.id AND date(l.logged_at, 'localtime') = date('now', 'localtime')) as is_done_today + FROM habits h + WHERE h.is_active = 1 AND (h.user_id = ? OR h.user_id IS NULL) LIMIT 3`, + [userId], + ); + + const { + data: shortcuts, + loading: shortcutsLoading, + refresh: refreshShortcuts, + } = useData<{ id: string; title: string; url: string; icon: string }>( + "SELECT * FROM shortcuts WHERE user_id = ? OR user_id IS NULL", + [userId], + ); + + const { data: identitySettings } = useData<{ value: string }>( + "SELECT value FROM settings WHERE key = 'identity_anchor'", + [], + ); + + const { data: latestTask } = useData<{ title: string }>( + "SELECT title FROM tasks WHERE (user_id = ? OR user_id IS NULL) AND status != 'done' ORDER BY updated_at DESC LIMIT 1", + [userId], + ); + + const identityAnchor = + identitySettings?.[0]?.value || "The Disciplined Creator"; + const currentFocus = latestTask?.[0]?.title || "Daily Discipline"; + + // Refresh data when screen is focused + useFocusEffect( + useCallback(() => { + refreshHabits(); + refreshShortcuts(); + }, []), + ); + + const handleToggleHabit = async (habitId: string, isDone: boolean) => { + if (isDone) return; + try { + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + await performMutation("logs", "INSERT", { + id: Math.random().toString(36).substring(7), + habit_id: habitId, + status: "completed", + logged_at: new Date().toISOString(), + }); + refreshHabits(); + } catch (err) { + console.error("Failed to log habit:", err); + } + }; + + const activeHabits = habitStats?.[0]?.count || 0; + const completedToday = logStats?.[0]?.count || 0; + const sessionsDone = sessionStats?.[0]?.count || 0; + + const userName = useMemo(() => { + if (displayName) return displayName; + if (user?.email) return user.email.split("@")[0]; + return "Guest"; + }, [displayName, user]); + + const greeting = useMemo(() => { + const hour = new Date().getHours(); + if (hour < 12) return "Good morning"; + if (hour < 17) return "Good afternoon"; + return "Good evening"; + }, []); + + const isLoading = + habitsLoading || logsLoading || listLoading || shortcutsLoading; + + const handleOpenLink = async (url: string) => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + try { + const supported = await Linking.canOpenURL(url); + if (supported) { + await Linking.openURL(url); + } else { + Alert.alert("Error", "Don't know how to open this URL: " + url); + } + } catch (error) { + Alert.alert("Error", "An error occurred while trying to open the link"); + } + }; + + const handleDeleteShortcut = async (id: string) => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + Alert.alert( + "Delete Shortcut", + "Are you sure you want to remove this shortcut?", + [ + { text: "Cancel", style: "cancel" }, + { + text: "Delete", + style: "destructive", + onPress: async () => { + try { + await performMutation("shortcuts", "DELETE", { id }); + refreshShortcuts(); + Haptics.notificationAsync( + Haptics.NotificationFeedbackType.Success, + ); + } catch (error) { + Alert.alert("Error", "Failed to delete shortcut"); + } + }, + }, + ], + ); + }; + + return ( + + + {/* Header */} + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/menu"); + }} + > + + + + + + + + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/history"); + }} + > + + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/modal"); + }} + > + + + + + + + {/* Greeting */} + + DAILY OVERVIEW + + {greeting}, {userName}. Let's find your flow today. + + + + {/* Stats Section */} + + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/hh_habits"); + }} + > + Active Habits + + {isLoading ? "..." : activeHabits} + + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/calendar"); + }} + > + Done Today + + {isLoading ? "..." : completedToday} + + + + + + {/* Current Focus Card */} + + + + + + + + {identityAnchor.toUpperCase()} + + + {currentFocus} + + Refining your presence through focused intention and consistent + action. + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + router.push("/sprint"); + }} + > + Resume Session + + + + + + {/* Focus Capacity Slider */} + + FOCUS CAPACITY + + + + + + + + {sessionsDone} sessions done + + Goal: {focusGoal} + + + + + {/* Keystone Habits */} + + + Daily Habits + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/add-habit"); + }} + > + + + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/hh_habits"); + }} + > + View All + + + + + {isLoading ? ( + + ) : habits.length > 0 ? ( + + {habits.map((habit) => ( + 0} + colors={colors} + onToggle={() => + handleToggleHabit(habit.id, habit.is_done_today > 0) + } + /> + ))} + + ) : ( + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/add-habit"); + }} + > + + + Create your first habit to start tracking + + + )} + + + {/* Tools / Shortcuts */} + + + ECOSYSTEM TOOLS + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/add-shortcut"); + }} + > + + + + + {shortcuts.length > 0 ? ( + shortcuts.map((shortcut) => ( + } + label={shortcut.title} + colors={colors} + onPress={() => handleOpenLink(shortcut.url)} + onDelete={() => handleDeleteShortcut(shortcut.id)} + /> + )) + ) : ( + + + No shortcuts added yet. + + + )} + + + + + + ); +} + +function HabitItem({ + title, + done, + colors, + onToggle, +}: { + title: string; + done: boolean; + colors: any; + onToggle: () => void; +}) { + const router = useRouter(); + return ( + + + {done && } + + + {title} + + + ); +} + +const stylesHabit = StyleSheet.create({ + habitItem: { + flexDirection: "row", + alignItems: "center", + gap: 12, + paddingVertical: 8, + }, + checkbox: { + width: 24, + height: 24, + borderRadius: 6, + borderWidth: 2, + alignItems: "center", + justifyContent: "center", + }, + habitText: { + fontFamily: FONTS.body, + fontSize: 16, + }, +}); + +function ToolCard({ + icon, + label, + colors, + onPress, + onDelete, +}: { + icon: React.ReactNode; + label: string; + colors: any; + onPress?: () => void; + onDelete?: () => void; +}) { + return ( + + + Alert.alert( + "External Tool", + `Launching integrated ${label} dashboard.`, + )) + } + > + + {icon} + + + {label} + + + {onDelete && ( + + + + )} + + ); +} + +const stylesTool = StyleSheet.create({ + container: { + width: "47%", + marginBottom: SPACING.md, + position: "relative", + }, + toolCard: { + width: "100%", + padding: SPACING.md, + borderRadius: ROUNDNESS.lg, + alignItems: "center", + justifyContent: "center", + gap: 10, + }, + deleteBtn: { + position: "absolute", + top: 6, + right: 6, + padding: 6, + borderRadius: 12, + }, + iconContainer: { + padding: 10, + borderRadius: ROUNDNESS.md, + }, + toolLabel: { + fontFamily: FONTS.labelSm, + fontSize: 12, + letterSpacing: 0.5, + }, +}); + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scrollContent: { + paddingBottom: 40, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + menuBtn: { + padding: 8, + }, + logoImage: { + height: 40, + width: 160, + }, + headerRight: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + ghostBtn: { + padding: 8, + }, + greetingContainer: { + paddingHorizontal: SPACING.lg, + paddingBottom: SPACING.lg, + paddingTop: SPACING.md, + }, + labelCaps: { + fontFamily: FONTS.labelSm, + fontSize: 11, + letterSpacing: 1.5, + color: colors.primary, + marginBottom: 4, + }, + greetingText: { + fontFamily: FONTS.headline, + fontSize: 28, + color: colors.onSurface, + lineHeight: 34, + }, + statsContainer: { + paddingHorizontal: SPACING.lg, + marginBottom: SPACING.lg, + }, + statsGrid: { + flexDirection: "row", + gap: SPACING.md, + }, + statCard: { + flex: 1, + backgroundColor: colors.surface, + padding: SPACING.md, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + statLabel: { + fontFamily: FONTS.label, + fontSize: 12, + color: colors.onSurfaceVariant, + marginBottom: 4, + }, + statValue: { + fontSize: 32, + fontFamily: FONTS.headline, + color: colors.onSurface, + }, + focusContainer: { + paddingHorizontal: SPACING.lg, + marginBottom: SPACING.xl, + }, + focusCard: { + backgroundColor: colors.primary, + padding: SPACING.lg, + borderRadius: ROUNDNESS.xl, + }, + focusHeader: { + flexDirection: "row", + alignItems: "center", + gap: 12, + marginBottom: SPACING.md, + }, + focusIconBg: { + padding: 8, + backgroundColor: "rgba(255,255,255,0.2)", + borderRadius: ROUNDNESS.md, + }, + focusBadge: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.onPrimary, + letterSpacing: 1, + }, + focusTitle: { + fontFamily: FONTS.headline, + fontSize: 24, + color: colors.onPrimary, + marginBottom: 8, + }, + focusDesc: { + fontFamily: FONTS.body, + fontSize: 15, + color: colors.onPrimary, + opacity: 0.8, + lineHeight: 22, + marginBottom: SPACING.lg, + }, + primaryBtn: { + backgroundColor: colors.onPrimary, + paddingHorizontal: 20, + paddingVertical: 12, + borderRadius: ROUNDNESS.full, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 10, + }, + primaryBtnText: { + color: colors.primary, + fontFamily: FONTS.labelSm, + fontSize: 14, + }, + section: { + padding: SPACING.lg, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.outline, + letterSpacing: 1.5, + marginBottom: SPACING.md, + }, + sectionTitle: { + fontFamily: FONTS.headline, + fontSize: 24, + color: colors.onSurface, + }, + sectionSubtitle: { + fontFamily: FONTS.label, + fontSize: 13, + color: colors.primary, + }, + rowBetween: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "baseline", + marginBottom: SPACING.md, + }, + rowAlign: { + flexDirection: "row", + alignItems: "center", + }, + sliderContainer: { + backgroundColor: colors.surface, + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + sliderTrack: { + height: 8, + backgroundColor: colors.surfaceVariant, + borderRadius: 4, + position: "relative", + marginBottom: 12, + }, + sliderFill: { + height: "100%", + borderRadius: 4, + }, + sliderThumb: { + width: 20, + height: 20, + borderRadius: 10, + position: "absolute", + top: -6, + marginLeft: -10, + borderWidth: 2, + }, + sliderLabels: { + flexDirection: "row", + justifyContent: "space-between", + }, + sliderLevel: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.onSurfaceVariant, + }, + habitList: { + gap: 4, + }, + toolsContainer: { + padding: SPACING.lg, + }, + toolsGrid: { + flexDirection: "row", + flexWrap: "wrap", + justifyContent: "space-between", + }, + emptyStateContainer: { + width: "100%", + padding: SPACING.lg, + backgroundColor: colors.surfaceVariant + "4D", + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderStyle: "dashed", + borderColor: colors.outlineVariant, + alignItems: "center", + }, + emptyStateTextSmall: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.onSurfaceVariant, + }, + emptyStateCard: { + backgroundColor: colors.surface, + padding: SPACING.xl, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderStyle: "dashed", + borderColor: colors.primary, + alignItems: "center", + justifyContent: "center", + gap: 12, + marginTop: 10, + }, + emptyStateText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + textAlign: "center", + }, + }); diff --git a/src/app/(tabs)/library.tsx b/src/app/(tabs)/library.tsx new file mode 100644 index 0000000..1e6b0a7 --- /dev/null +++ b/src/app/(tabs)/library.tsx @@ -0,0 +1,371 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { supabase } from "@/src/lib/supabase"; +import { performMutation } from "@/src/lib/sync"; +import { getDb } from "@/src/db/database"; +import { decode } from "base-64"; +import * as DocumentPicker from "expo-document-picker"; +import * as FileSystem from "expo-file-system/legacy"; +import { resolveFileUri, getRelativePath, getDocumentDirectory } from "@/src/lib/file-utils"; +import * as Haptics from "expo-haptics"; +import { useFocusEffect, useRouter } from "expo-router"; +import React, { useCallback, useMemo, useState } from "react"; +import { + Alert, + StyleSheet, + View, + TouchableOpacity, +} from "react-native"; +import { GestureHandlerRootView } from "react-native-gesture-handler"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { Plus } from "lucide-react-native"; +import { ROUNDNESS } from "@/src/constants/Theme"; + +// Import extracted components +import LibraryHeader from "@/src/components/Library/LibraryHeader"; +import LibraryStats from "@/src/components/Library/LibraryStats"; +import BookGrid from "@/src/components/Library/BookGrid"; +import AddBookModal from "@/src/components/Library/AddBookModal"; +import BookDetailsModal from "@/src/components/Library/BookDetailsModal"; + +interface Book { + id: string; + title: string; + author: string; + total_pages: number; + current_page: number; + file_uri: string; + cover_uri: string; + status: "reading" | "finished" | "want_to_read"; + updated_at: string; + synthesis?: string; +} + +export default function LibraryScreen() { + const { colors, isDark } = useTheme(); + const { user } = useAuth(); + const router = useRouter(); + + const userId = user?.id || "guest"; + + // State + const [showAddModal, setShowAddModal] = useState(false); + const [loading, setLoading] = useState(false); + + // Form State + const [bookTitle, setBookTitle] = useState(""); + const [bookAuthor, setBookAuthor] = useState(""); + const [totalPages, setTotalPages] = useState(""); + const [selectedFile, setSelectedFile] = useState(null); + + // Data + const { + data: books, + loading: booksLoading, + refresh: refreshBooks, + } = useData( + "SELECT * FROM books WHERE (user_id = ? OR user_id IS NULL) ORDER BY updated_at DESC", + [userId], + ); + + const stats = useMemo(() => { + const reading = books.filter((b) => b.status === "reading"); + const finished = books.filter((b) => b.status === "finished"); + const totalPagesRead = books.reduce( + (acc, b) => acc + (b.current_page || 0), + 0, + ); + return { + reading: reading.length, + finished: finished.length, + pages: totalPagesRead, + }; + }, [books]); + + useFocusEffect( + useCallback(() => { + refreshBooks(); + }, [refreshBooks]), + ); + + const handlePickDocument = async () => { + try { + const result = await DocumentPicker.getDocumentAsync({ + type: ["application/pdf", "application/epub+zip"], + copyToCacheDirectory: true, + }); + + if (!result.canceled) { + const file = result.assets[0]; + setSelectedFile(file); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + + try { + const { data, error } = await supabase.functions.invoke( + "process-book-ai", + { + body: { filename: file.name }, + }, + ); + + if (!error && data) { + setBookTitle(data.title || file.name.replace(/\.[^/.]+$/, "")); + setBookAuthor(data.author || ""); + setTotalPages(data.totalPages?.toString() || ""); + } else { + setBookTitle(file.name.replace(/\.[^/.]+$/, "")); + } + } catch (e) { + setBookTitle(file.name.replace(/\.[^/.]+$/, "")); + } finally { + setShowAddModal(true); + } + } + } catch (err) { + Alert.alert("Error", "Failed to pick document"); + } + }; + + const handleAddBook = async () => { + if (!bookTitle.trim()) return; + + setLoading(true); + try { + let finalUri = ""; + if (selectedFile) { + const fileExt = selectedFile.name.split(".").pop(); + const fileName = `${userId}/${Date.now()}.${fileExt}`; + const filePath = `${fileName}`; + + const docDir = getDocumentDirectory(); + const localUri = `${docDir}books/${fileName}`; + const dirPath = `${docDir}books/${userId}`; + await FileSystem.makeDirectoryAsync(dirPath, { intermediates: true }); + await FileSystem.copyAsync({ + from: selectedFile.uri, + to: localUri, + }); + + const base64 = await FileSystem.readAsStringAsync(selectedFile.uri, { + encoding: FileSystem.EncodingType.Base64, + }); + + supabase.storage + .from("books") + .upload(filePath, decode(base64), { + contentType: selectedFile.mimeType || "application/pdf", + upsert: true, + }) + .then(({ error }) => { + if (error) console.error("Cloud sync error:", error); + }); + + finalUri = getRelativePath(localUri); + } + + const id = Math.random().toString(36).substring(7); + await performMutation("books", "INSERT", { + id, + user_id: userId, + title: bookTitle.trim(), + author: bookAuthor.trim() || "Unknown", + total_pages: parseInt(totalPages) || 0, + current_page: 0, + file_uri: finalUri, + status: "reading", + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }); + + setShowAddModal(false); + setBookTitle(""); + setBookAuthor(""); + setTotalPages(""); + setSelectedFile(null); + refreshBooks(); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error(e); + Alert.alert("Upload Error", "Failed to add book to library."); + } finally { + setLoading(false); + } + }; + + const [showDetailsModal, setShowDetailsModal] = useState(false); + const [selectedBookForDetails, setSelectedBookForDetails] = + useState(null); + + const openDetails = (book: Book) => { + setSelectedBookForDetails(book); + setShowDetailsModal(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const openReader = (book: Book) => { + setShowDetailsModal(false); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + router.push(`/reader/${book.id}`); + }; + + const handleDeleteBook = async (id: string, fileUri?: string) => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + Alert.alert( + "Remove Book", + "Are you sure you want to delete this book from your library?", + [ + { text: "Cancel", style: "cancel" }, + { + text: "Delete", + style: "destructive", + onPress: async () => { + try { + await performMutation("books", "DELETE", { id }); + + if (fileUri) { + const resolvedUri = resolveFileUri(fileUri); + const fileInfo = await FileSystem.getInfoAsync(resolvedUri); + if (fileInfo.exists) { + await FileSystem.deleteAsync(resolvedUri, { idempotent: true }); + } + } + + const db = await getDb(); + await db.runAsync("DELETE FROM reading_sessions WHERE book_id = ?", [id]); + + refreshBooks(); + Haptics.notificationAsync( + Haptics.NotificationFeedbackType.Success, + ); + } catch (e) { + console.error("Delete error:", e); + Alert.alert("Error", "Failed to delete book"); + } + }, + }, + ], + ); + }; + + const [isGeneratingAI, setIsGeneratingAI] = useState(false); + + const generateAIInsights = async (book: Book) => { + setIsGeneratingAI(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + + try { + const { data, error } = await supabase.functions.invoke( + "process-book-ai", + { + body: { title: book.title }, + }, + ); + + if (error) throw error; + + await performMutation("books", "UPDATE", { + id: book.id, + synthesis: data.synthesis, + updated_at: new Date().toISOString(), + }); + + refreshBooks(); + Alert.alert( + "AI Synthesis Complete", + "Insights have been generated from your reading session.", + ); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error(e); + Alert.alert("AI Error", "Failed to generate insights."); + } finally { + setIsGeneratingAI(false); + } + }; + + return ( + + + + router.push("/modal")} /> + + + + + + + + setShowAddModal(false)} + bookTitle={bookTitle} + onTitleChange={setBookTitle} + bookAuthor={bookAuthor} + onAuthorChange={setBookAuthor} + totalPages={totalPages} + onPagesChange={setTotalPages} + onAddBook={handleAddBook} + loading={loading} + /> + + setShowDetailsModal(false)} + book={selectedBookForDetails as any} + onContinueReading={() => selectedBookForDetails && openReader(selectedBookForDetails)} + onGenerateAI={() => selectedBookForDetails && generateAIInsights(selectedBookForDetails)} + onDelete={() => selectedBookForDetails && handleDeleteBook(selectedBookForDetails.id, selectedBookForDetails.file_uri)} + isGeneratingAI={isGeneratingAI} + /> + + + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + safeArea: { + flex: 1, + }, + scrollContent: { + paddingBottom: 100, + }, + fab: { + position: "absolute", + right: 20, + bottom: 90, + width: 60, + height: 60, + borderRadius: 30, + justifyContent: "center", + alignItems: "center", + elevation: 8, + shadowColor: "#000", + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.3, + shadowRadius: 4, + zIndex: 10, + }, +}); diff --git a/src/app/(tabs)/sprint.tsx b/src/app/(tabs)/sprint.tsx new file mode 100644 index 0000000..5aa4b74 --- /dev/null +++ b/src/app/(tabs)/sprint.tsx @@ -0,0 +1,1408 @@ +import AutoHideScrollView from "@/src/components/AutoHideScrollView"; +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useData } from "@/src/hooks/useData"; +import { useTheme } from "@/src/hooks/useTheme"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useFocusEffect, useRouter } from "expo-router"; +import { + Check, + ListTodo, + Menu, + Pause, + Play, + Plus, + RotateCcw, + Settings, + X, + Zap +} from "lucide-react-native"; +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { + ActivityIndicator, + Alert, + AppState, + Image, + KeyboardAvoidingView, + Modal, + Platform, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; + +import { getLocalDateString } from "@/src/lib/date-utils"; + +interface Task { + id: string; + title: string; + status: "todo" | "doing" | "done"; + estimated_sessions: number; + completed_sessions: number; + tag: string; + todos?: string; // JSON string +} + +interface Schedule { + id: string; + time_blocks: string; +} + +interface TimeBlock { + start: string; + end: string; + task: string; + type?: string; + todos?: { id: string; text: string; completed: boolean }[]; +} + +export default function SprintScreen() { + const { colors, focusGoal, sprintDuration } = useTheme(); + const { user } = useAuth(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const userId = user?.id || "guest"; + const today = getLocalDateString(); + + // Timer State + const [manualBlock, setManualBlock] = useState(null); + const [isActive, setIsActive] = useState(false); + const [timerMode, setTimerMode] = useState<"focus" | "break">("focus"); + const [targetEndTime, setTargetEndTime] = useState(null); + const [seconds, setSeconds] = useState(sprintDuration * 60); + + // Modal State + const [showTodoModal, setShowTodoModal] = useState(false); + const [selectedTaskForTodo, setSelectedTaskForTodo] = useState( + null, + ); + const [newTodoText, setNewTodoText] = useState(""); + + const appState = useRef(AppState.currentState); + + const { + data: tasks, + loading, + refresh: refreshTasks, + } = useData( + "SELECT * FROM tasks WHERE (user_id = ? OR user_id IS NULL) AND status != 'done' ORDER BY created_at DESC", + [userId], + ); + + const { data: schedules, refresh: refreshSchedule } = useData( + "SELECT * FROM schedules WHERE date = ? AND (user_id = ? OR user_id IS NULL)", + [today, userId], + ); + + const { data: completedToday, refresh: refreshLogs } = useData<{ + count: number; + }>( + "SELECT COUNT(*) as count FROM logs WHERE date(logged_at, 'localtime') = date('now', 'localtime') AND status = 'completed'", + [], + ); + + const allBlocks = useMemo(() => { + if (!schedules.length) return []; + try { + return JSON.parse(schedules[0].time_blocks) as TimeBlock[]; + } catch { + return []; + } + }, [schedules]); + + const autoActiveBlock = useMemo(() => { + const now = new Date(); + const currentMinutes = now.getHours() * 60 + now.getMinutes(); + + return allBlocks.find((b) => { + const [startH, startM] = b.start.split(":").map(Number); + const [endH, endM] = b.end.split(":").map(Number); + const start = startH * 60 + startM; + const end = endH * 60 + endM; + return currentMinutes >= start && currentMinutes <= end; + }); + }, [allBlocks]); + + const activeTimeBlock = manualBlock || autoActiveBlock; + + const activeTask = useMemo(() => { + return tasks.find((t) => t.status === "doing") || tasks[0]; + }, [tasks]); + + const refresh = useCallback(() => { + refreshTasks(); + refreshSchedule(); + refreshLogs(); + }, [refreshTasks, refreshSchedule, refreshLogs]); + + useFocusEffect( + useCallback(() => { + refresh(); + }, [refresh]), + ); + + // Background timer sync + useEffect(() => { + const subscription = AppState.addEventListener("change", (nextAppState) => { + if ( + appState.current.match(/inactive|background/) && + nextAppState === "active" + ) { + if (isActive && targetEndTime) { + const now = Date.now(); + const remaining = Math.max( + 0, + Math.ceil((targetEndTime - now) / 1000), + ); + setSeconds(remaining); + if (remaining === 0) { + handleSessionComplete(); + } + } + } + appState.current = nextAppState; + }); + + return () => { + subscription.remove(); + }; + }, [isActive, targetEndTime]); + + const handleToggleTimer = () => { + if (!isActive) { + // Starting/Resuming + const duration = timerMode === "focus" ? sprintDuration * 60 : 5 * 60; + const newTarget = Date.now() + (seconds > 0 ? seconds : duration) * 1000; + setTargetEndTime(newTarget); + setIsActive(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + } else { + // Pausing + setIsActive(false); + setTargetEndTime(null); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } + }; + + const handleToggleTodo = async (todoId: string) => { + if (!activeTimeBlock || !schedules[0]) return; + + try { + const updatedBlocks = allBlocks.map((b) => { + if ( + b.start === activeTimeBlock.start && + b.task === activeTimeBlock.task + ) { + const updatedTodos = b.todos?.map((t) => + t.id === todoId ? { ...t, completed: !t.completed } : t, + ); + const updatedBlock = { ...b, todos: updatedTodos }; + if ( + manualBlock && + manualBlock.start === b.start && + manualBlock.task === b.task + ) { + setManualBlock(updatedBlock); + } + return updatedBlock; + } + return b; + }); + + await performMutation("schedules", "UPDATE", { + id: schedules[0].id, + time_blocks: JSON.stringify(updatedBlocks), + }); + refreshSchedule(); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } catch (e) { + console.error("Failed to toggle block todo", e); + } + }; + + // Only initialize timer once or when sprintDuration changes while inactive + useEffect(() => { + if (!isActive && timerMode === "focus") { + setSeconds(sprintDuration * 60); + } + }, [sprintDuration, timerMode]); + + useEffect(() => { + let interval: any = null; + if (isActive && seconds > 0) { + interval = setInterval(() => { + setSeconds((prev) => { + if (prev <= 1) { + handleSessionComplete(); + return 0; + } + return prev - 1; + }); + }, 1000); + } else { + clearInterval(interval); + } + return () => clearInterval(interval); + }, [isActive, seconds]); + + const handleSessionComplete = async () => { + setIsActive(false); + setTargetEndTime(null); + + if (timerMode === "focus") { + try { + await performMutation("logs", "INSERT", { + id: Math.random().toString(36).substring(7), + habit_id: "focus-session", + status: "completed", + logged_at: new Date().toISOString(), + }); + + if (activeTask) { + await performMutation("tasks", "UPDATE", { + id: activeTask.id, + completed_sessions: (activeTask.completed_sessions || 0) + 1, + updated_at: new Date().toISOString(), + }); + } + + refresh(); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + + // Transition to Break + setTimerMode("break"); + const breakSecs = 5 * 60; + setSeconds(breakSecs); + setIsActive(true); + setTargetEndTime(Date.now() + breakSecs * 1000); + + Alert.alert( + "Session Complete", + "Focus session logged! Starting break.", + ); + } catch (e) { + console.error("Failed to complete session", e); + } + } else { + // Break complete -> Shift to next task + setTimerMode("focus"); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + + // If we have a next block coming up, we can "jump" to it or just reset to default focus duration + setSeconds(sprintDuration * 60); + + // If the manual block was finished, clear it to let auto-detection find the next one + if (manualBlock) { + setManualBlock(null); + } + + Alert.alert("Break Over", "Time to dive into the next task."); + } + }; + + const handleExtendSession = async (mins: number = 10) => { + const additionalSecs = mins * 60; + setSeconds((prev) => prev + additionalSecs); + if (isActive && targetEndTime) { + setTargetEndTime(targetEndTime + additionalSecs * 1000); + } + + // If we're extending a scheduled block, we should try to update the schedule end time too + if (activeTimeBlock && schedules[0]) { + try { + const [h, m] = activeTimeBlock.end.split(":").map(Number); + const newEndMins = h * 60 + m + mins; + const newEndStr = `${String(Math.floor(newEndMins / 60)).padStart(2, "0")}:${String(newEndMins % 60).padStart(2, "0")}`; + + const updatedBlocks = allBlocks.map((b) => { + if ( + b.start === activeTimeBlock.start && + b.task === activeTimeBlock.task + ) { + const updated = { ...b, end: newEndStr }; + if (manualBlock) setManualBlock(updated); + return updated; + } + return b; + }); + + await performMutation("schedules", "UPDATE", { + id: schedules[0].id, + time_blocks: JSON.stringify(updatedBlocks), + }); + refreshSchedule(); + } catch (e) { + console.error("Failed to extend schedule block", e); + } + } + + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy); + }; + + const handleTaskTodoToggle = async (taskId: string, todoId: string) => { + const task = tasks.find((t) => t.id === taskId); + if (!task) return; + + try { + const currentTodos = task.todos ? JSON.parse(task.todos) : []; + const updatedTodos = currentTodos.map((t: any) => + t.id === todoId ? { ...t, completed: !t.completed } : t, + ); + + await performMutation("tasks", "UPDATE", { + id: taskId, + todos: JSON.stringify(updatedTodos), + updated_at: new Date().toISOString(), + }); + refreshTasks(); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } catch (e) { + console.error("Failed to toggle task todo", e); + } + }; + + const handleAddTaskTodo = async () => { + if (!selectedTaskForTodo || !newTodoText.trim()) return; + + try { + const currentTodos = selectedTaskForTodo.todos + ? JSON.parse(selectedTaskForTodo.todos) + : []; + const newTodo = { + id: Math.random().toString(36).substring(7), + text: newTodoText.trim(), + completed: false, + }; + + const updatedTodos = [...currentTodos, newTodo]; + + await performMutation("tasks", "UPDATE", { + id: selectedTaskForTodo.id, + todos: JSON.stringify(updatedTodos), + updated_at: new Date().toISOString(), + }); + + setNewTodoText(""); + refreshTasks(); + // Update local state to show change in modal immediately + setSelectedTaskForTodo({ + ...selectedTaskForTodo, + todos: JSON.stringify(updatedTodos), + }); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } catch (e) { + console.error("Failed to add task todo", e); + } + }; + + const formatTime = (secs: number) => { + const mins = Math.floor(secs / 60); + const s = secs % 60; + return `${mins.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`; + }; + + const handleReset = () => { + setIsActive(false); + setSeconds(sprintDuration * 60); + setManualBlock(null); + }; + + const handleToggleTaskStatus = async (task: Task) => { + let newStatus: "todo" | "doing" | "done" = "todo"; + if (task.status === "todo") newStatus = "doing"; + else if (task.status === "doing") newStatus = "done"; + + try { + await performMutation("tasks", "UPDATE", { + id: task.id, + status: newStatus, + updated_at: new Date().toISOString(), + }); + refresh(); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + } catch (e) { + console.error("Failed to update task status", e); + } + }; + + const sessionsDone = completedToday?.[0]?.count || 0; + const sessionGoal = focusGoal; + + if (loading && tasks.length === 0) { + return ( + + + + ); + } + + return ( + + + {/* Header */} + + router.push("/menu")} + > + + + + + + + + router.push("/modal")} + > + + + + + + {/* Timer Section */} + + FOCUSED SPRINT + + {formatTime(seconds)} + + + + + + + + + {isActive ? ( + + ) : ( + + )} + + + handleExtendSession(10)} + disabled={timerMode === "break"} + > + + + + {timerMode === "focus" && ( + +10 MIN + )} + + + {/* Current Schedule Focus */} + {activeTimeBlock && ( + + + + + + + {manualBlock ? "MANUAL FOCUS" : "CURRENT SCHEDULE"} + + + + {activeTimeBlock.start} - {activeTimeBlock.end} + + + + + + {activeTimeBlock.task} + + { + const task = tasks.find( + (t) => t.title === activeTimeBlock.task, + ); + if (task) { + setSelectedTaskForTodo(task); + setShowTodoModal(true); + } else { + Alert.alert( + "No Task Found", + "This schedule block isn't linked to a task inventory item yet.", + ); + } + }} + > + + + SUB-TASKS + + + + + {activeTimeBlock.todos && activeTimeBlock.todos.length > 0 && ( + + {activeTimeBlock.todos.map((todo) => ( + handleToggleTodo(todo.id)} + > + + {todo.completed && ( + + )} + + + {todo.text} + + + ))} + + )} + {manualBlock && ( + setManualBlock(null)} + > + + Restore Automatic Schedule + + + )} + + + )} + + {/* Schedule Browser */} + {allBlocks.length > 0 && ( + + TODAY'S SCHEDULE + + {allBlocks.map((block, idx) => { + const isCurrent = + activeTimeBlock?.start === block.start && + activeTimeBlock?.task === block.task; + return ( + { + setManualBlock(block); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + {block.start} + + + {block.task} + + {isCurrent && ( + + + + )} + + ); + })} + + + )} + + {/* Session Progress */} + + + + DAILY FOCUS GOAL + + {sessionsDone} / {sessionGoal} + + + + + + + {sessionsDone >= sessionGoal + ? "Daily goal achieved! You're in peak flow." + : `Complete ${sessionGoal - sessionsDone} more sessions to reach your daily target.`} + + + + + {/* Task Queue */} + + + Task Inventory + router.push("/add-task")} + > + + ADD TASK + + + + + {tasks.length > 0 ? ( + tasks.map((task) => ( + handleToggleTaskStatus(task)} + > + + {task.status === "doing" && ( + + )} + + + + {task.title} + + + + {task.tag} + + + {task.completed_sessions}/{task.estimated_sessions}{" "} + sessions + + + + {task.status === "doing" && ( + + ACTIVE + + )} + + )) + ) : ( + router.push("/add-task")} + > + + + No tasks in your queue. Add something to focus on. + + + )} + + + + + {/* Task Todo Modal */} + + + + + + Sub-tasks + + {selectedTaskForTodo?.title} + + + setShowTodoModal(false)}> + + + + + + + + + + + + + {selectedTaskForTodo?.todos ? ( + JSON.parse(selectedTaskForTodo.todos).map((todo: any) => ( + + + handleTaskTodoToggle(selectedTaskForTodo.id, todo.id) + } + style={[ + styles.modalTodoCheck, + { borderColor: colors.primary }, + todo.completed && { backgroundColor: colors.primary }, + ]} + > + {todo.completed && ( + + )} + + + {todo.text} + + + )) + ) : ( + + + + Break down this task into smaller steps. + + + )} + + + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scrollContent: { + paddingBottom: 40, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + menuBtn: { + padding: 8, + }, + logoImage: { + height: 40, + width: 160, + }, + ghostBtn: { + padding: 8, + }, + timerSection: { + padding: SPACING.xl, + alignItems: "center", + backgroundColor: colors.surface, + }, + labelCaps: { + fontFamily: FONTS.labelSm, + fontSize: 12, + letterSpacing: 1.5, + color: colors.primary, + marginBottom: SPACING.xl, + }, + timerDisplayContainer: { + width: 260, + height: 260, + borderRadius: 130, + borderWidth: 8, + borderColor: colors.primary + "1A", + alignItems: "center", + justifyContent: "center", + }, + timerDisplay: { + fontSize: 72, + fontFamily: FONTS.labelSm, + color: colors.onSurface, + letterSpacing: -1, + }, + timerControls: { + flexDirection: "row", + alignItems: "center", + gap: SPACING.xxl, + marginTop: SPACING.xl, + }, + extendLabel: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.primary, + marginTop: 8, + letterSpacing: 1, + }, + controlBtn: { + padding: 12, + borderRadius: ROUNDNESS.full, + backgroundColor: colors.surfaceVariant, + }, + controlBtnPlaceholder: { + width: 48, + }, + playBtn: { + width: 84, + height: 84, + borderRadius: 42, + alignItems: "center", + justifyContent: "center", + elevation: 4, + shadowColor: colors.primary, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.3, + shadowRadius: 8, + }, + section: { + padding: SPACING.lg, + }, + progressCard: { + backgroundColor: colors.surface, + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + rowBetween: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "baseline", + marginBottom: SPACING.md, + }, + dataLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + letterSpacing: 1, + color: colors.onSurfaceVariant, + }, + dataValueSmall: { + fontFamily: FONTS.headline, + fontSize: 18, + color: colors.primary, + }, + technicalBarBg: { + height: 8, + backgroundColor: colors.surfaceVariant, + borderRadius: 4, + overflow: "hidden", + }, + technicalBarFill: { + height: "100%", + borderRadius: 4, + }, + progressHint: { + marginTop: SPACING.md, + fontFamily: FONTS.body, + fontSize: 13, + color: colors.onSurfaceVariant, + }, + sectionTitle: { + fontFamily: FONTS.headline, + fontSize: 24, + color: colors.onSurface, + }, + addBtn: { + flexDirection: "row", + alignItems: "center", + gap: 6, + }, + addBtnText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 0.5, + }, + taskQueue: { + gap: 12, + marginTop: 16, + }, + taskItem: { + flexDirection: "row", + alignItems: "center", + padding: SPACING.md, + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + checkbox: { + width: 24, + height: 24, + borderRadius: 6, + borderWidth: 2, + alignItems: "center", + justifyContent: "center", + }, + taskInfo: { + marginLeft: 12, + flex: 1, + }, + taskTitle: { + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + taskMeta: { + flexDirection: "row", + alignItems: "center", + gap: 12, + marginTop: 4, + }, + tag: { + alignSelf: "flex-start", + backgroundColor: colors.secondaryContainer, + paddingHorizontal: 8, + paddingVertical: 2, + borderRadius: 4, + }, + tagText: { + fontFamily: FONTS.labelSm, + fontSize: 10, + color: colors.onSecondaryContainer, + }, + sessionCount: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.onSurfaceVariant, + }, + activeBadge: { + backgroundColor: colors.primary, + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 4, + }, + activeBadgeText: { + color: colors.onPrimary, + fontFamily: FONTS.labelSm, + fontSize: 9, + }, + emptyStateCard: { + backgroundColor: colors.surface, + padding: SPACING.xl, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderStyle: "dashed", + borderColor: colors.primary, + alignItems: "center", + justifyContent: "center", + gap: 12, + }, + emptyStateText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + textAlign: "center", + }, + activeBlockCard: { + backgroundColor: colors.surface, + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.primary, + backgroundColor: colors.primary + "0D", + }, + activeBlockLabel: { + fontFamily: FONTS.labelSm, + fontSize: 10, + color: colors.primary, + letterSpacing: 1, + marginLeft: 8, + }, + activeBlockTime: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.onSurfaceVariant, + }, + activeBlockTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + marginTop: 8, + marginBottom: SPACING.md, + flex: 1, + }, + subtaskBtn: { + flexDirection: "row", + alignItems: "center", + gap: 6, + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 6, + }, + subtaskBtnText: { + fontFamily: FONTS.labelSm, + fontSize: 10, + letterSpacing: 0.5, + }, + activeTodoList: { + gap: 8, + borderTopWidth: 1, + borderTopColor: colors.outlineVariant + "33", + paddingTop: SPACING.md, + }, + activeTodoItem: { + flexDirection: "row", + alignItems: "center", + gap: 12, + paddingVertical: 4, + }, + todoCheck: { + width: 20, + height: 20, + borderRadius: 5, + borderWidth: 2, + alignItems: "center", + justifyContent: "center", + }, + activeTodoText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurface, + }, + rowAlign: { + flexDirection: "row", + alignItems: "center", + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.outline, + letterSpacing: 1.5, + marginBottom: SPACING.md, + }, + scheduleRow: { + gap: 12, + paddingRight: SPACING.lg, + }, + scheduleBlockCard: { + width: 120, + padding: SPACING.md, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + blockTimeText: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.primary, + marginBottom: 4, + }, + blockTaskText: { + fontFamily: FONTS.labelSm, + fontSize: 13, + color: colors.onSurface, + }, + clearManualBtn: { + marginTop: SPACING.md, + paddingTop: SPACING.md, + borderTopWidth: 1, + borderTopColor: colors.outlineVariant + "33", + alignItems: "center", + }, + clearManualText: { + fontFamily: FONTS.label, + fontSize: 11, + textDecorationLine: "underline", + }, + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.5)", + justifyContent: "flex-end", + }, + modalContainer: { + backgroundColor: colors.surface, + borderTopLeftRadius: ROUNDNESS.xl, + borderTopRightRadius: ROUNDNESS.xl, + padding: SPACING.lg, + maxHeight: "80%", + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "flex-start", + marginBottom: SPACING.lg, + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + modalSubtitle: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + marginTop: 2, + }, + todoInputRow: { + flexDirection: "row", + gap: 10, + marginBottom: SPACING.lg, + }, + modalInput: { + flex: 1, + height: 48, + backgroundColor: colors.surfaceVariant + "4D", + borderRadius: ROUNDNESS.md, + paddingHorizontal: 16, + fontFamily: FONTS.body, + fontSize: 15, + color: colors.onSurface, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + addTodoBtn: { + width: 48, + height: 48, + borderRadius: ROUNDNESS.md, + alignItems: "center", + justifyContent: "center", + }, + modalTodoList: { + marginBottom: SPACING.xl, + }, + modalTodoItem: { + flexDirection: "row", + alignItems: "center", + gap: 12, + paddingVertical: 12, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "1A", + }, + modalTodoCheck: { + width: 22, + height: 22, + borderRadius: 6, + borderWidth: 2, + alignItems: "center", + justifyContent: "center", + }, + modalTodoText: { + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + flex: 1, + }, + emptyTodos: { + alignItems: "center", + justifyContent: "center", + paddingVertical: 40, + gap: 12, + }, + emptyTodosText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.outline, + textAlign: "center", + }, + }); diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx new file mode 100644 index 0000000..d3d5236 --- /dev/null +++ b/src/app/_layout.tsx @@ -0,0 +1,139 @@ +import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; +import { Stack } from 'expo-router'; +import { StatusBar } from 'expo-status-bar'; +import { useEffect, useState, useRef } from 'react'; +import * as SplashScreen from 'expo-splash-screen'; +import { useFonts } from 'expo-font'; +import { Manrope_700Bold, Manrope_400Regular } from '@expo-google-fonts/manrope'; +import { PlusJakartaSans_500Medium, PlusJakartaSans_700Bold } from '@expo-google-fonts/plus-jakarta-sans'; +import { initDatabase } from '@/src/db/database'; +import { useTheme, BatsirThemeProvider } from '@/src/hooks/useTheme'; +import { useSync } from '@/src/hooks/useSync'; +import { AnimatedSplashScreen } from '@/src/components/animated-splash-screen'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { configureReanimatedLogger, ReanimatedLogLevel } from 'react-native-reanimated'; + +// Disable strict mode for Reanimated logger to suppress warnings about reading value during render, +// which can be triggered by the React Compiler or third-party libraries in Reanimated 4. +configureReanimatedLogger({ + level: ReanimatedLogLevel.warn, + strict: false, +}); + +export { + // Catch any errors thrown by the Layout component. + ErrorBoundary, +} from 'expo-router'; + +export const unstable_settings = { + // Ensure that reloading on `/modal` keeps a back button present. + initialRouteName: '(tabs)', +}; + +// Prevent the splash screen from auto-hiding before asset loading is complete. +SplashScreen.preventAutoHideAsync().catch(() => { + /* Reloading in development can sometimes cause this to fail, ignore it */ +}); + +export default function RootLayout() { + const [dbLoaded, setDbLoaded] = useState(false); + const [fontsLoaded, fontError] = useFonts({ + Manrope_700Bold, + Manrope_400Regular, + PlusJakartaSans_500Medium, + PlusJakartaSans_700Bold, + }); + + useEffect(() => { + initDatabase() + .then(() => setDbLoaded(true)) + .catch((err) => console.error('Database initialization failed:', err)); + }, []); + + useEffect(() => { + if (fontError) throw fontError; + }, [fontError]); + + if (!fontsLoaded || !dbLoaded) { + return null; + } + + return ( + + + + + + + ); +} + +function SyncWrapper() { + useSync(); + return null; +} + +function RootLayoutContent() { + const { isLoaded, colors } = useTheme(); + const [animationFinished, setAnimationFinished] = useState(false); + const splashHidden = useRef(false); + + useEffect(() => { + if (isLoaded && !splashHidden.current) { + const hideSplash = async () => { + try { + splashHidden.current = true; + // Verify if we can actually hide it + await SplashScreen.hideAsync(); + } catch (e) { + // If it fails, it usually means it's already hidden or not registered + console.log("Splash hide safely ignored:", e); + } + }; + + const timer = setTimeout(hideSplash, 200); + return () => clearTimeout(timer); + } + }, [isLoaded]); + + if (!isLoaded) { + return null; + } + + return ( + <> + + {!animationFinished && ( + setAnimationFinished(true)} + backgroundColor={colors.background} + /> + )} + + ); +} + +function RootLayoutNav() { + const { colorScheme } = useTheme(); + + return ( + + + + + + + + + + + {/* Secondary Screens now in root stack */} + + + + + + + + ); +} diff --git a/src/app/add-habit.tsx b/src/app/add-habit.tsx new file mode 100644 index 0000000..8e2cb90 --- /dev/null +++ b/src/app/add-habit.tsx @@ -0,0 +1,571 @@ +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useTheme } from "@/src/hooks/useTheme"; +import { useData } from "@/src/hooks/useData"; +import { performMutation } from "@/src/lib/sync"; +import * as Haptics from "expo-haptics"; +import { useRouter } from "expo-router"; +import { + Calendar, + Clock, + Repeat, + Save, + Sparkles, + X, + MapPin, + Anchor, + ChevronDown, +} from "lucide-react-native"; +import React, { useMemo, useState } from "react"; +import { + ActivityIndicator, + Alert, + ScrollView, + StyleSheet, + Switch, + Text, + TextInput, + TouchableOpacity, + View, + Modal, + KeyboardAvoidingView, + Platform +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { TimeInput } from "@/src/components/ui/TimeInput"; + +const FREQUENCIES = [ + { label: "Daily", value: "daily" }, + { label: "Weekly", value: "weekly" }, + { label: "Monthly", value: "monthly" }, +]; + +const TIME_PRESETS = [ + { label: "Morning", time: "08:00" }, + { label: "Noon", time: "12:00" }, + { label: "Evening", time: "18:00" }, + { label: "Night", time: "22:00" }, +]; + +export default function AddHabitScreen() { + const { colors } = useTheme(); + const { user } = useAuth(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const userId = user?.id || 'guest'; + const { data: existingHabits } = useData<{id: string, title: string}>( + 'SELECT id, title FROM habits WHERE is_active = 1 AND (user_id = ? OR user_id IS NULL)', + [userId] + ); + + const [title, setTitle] = useState(""); + const [frequency, setFrequency] = useState("daily"); + const [preferredTime, setPreferredTime] = useState("08:00"); + const [location, setLocation] = useState(""); + const [twoMinuteVersion, setTwoMinuteVersion] = useState(""); + const [anchorHabitId, setAnchorHabitId] = useState(null); + const [weekendFlexibility, setWeekendFlexibility] = useState(false); + const [loading, setLoading] = useState(false); + const [showAnchorModal, setShowAnchorModal] = useState(false); + + const selectedAnchor = useMemo(() => + existingHabits.find(h => h.id === anchorHabitId), + [existingHabits, anchorHabitId] + ); + + const handleSave = async () => { + if (!title) { + Alert.alert("Error", "Please provide a title for your habit"); + return; + } + + setLoading(true); + try { + await performMutation("habits", "INSERT", { + id: Math.random().toString(36).substring(7), + user_id: userId, + title, + frequency, + preferred_time: preferredTime, + location: location, + two_minute_version: twoMinuteVersion, + anchor_habit_id: anchorHabitId, + weekend_flexibility: weekendFlexibility ? 1 : 0, + is_active: 1, + }); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + router.back(); + } catch (error) { + console.error("Failed to save habit:", error); + Alert.alert("Error", "Failed to save habit"); + } finally { + setLoading(false); + } + }; + + return ( + + + + + router.back()}> + + + New Habit + + {loading ? ( + + ) : ( + + )} + + + + + + HABIT ARCHITECT + + {/* Title */} + + WHAT IS THE HABIT? + + + + + + + {/* Implementation Intentions: Location */} + + WHERE WILL YOU DO IT? (LOCATION) + + + + + + + {/* Small Start: Two-Minute Version */} + + THE TWO-MINUTE VERSION (START SMALL) + + + + + "Optimize for the starting line, not the finish line." + + + {/* Habit Stacking: Anchor Habit */} + + STACK IT: AFTER I... + { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + setShowAnchorModal(true); + }} + > + + + {selectedAnchor ? selectedAnchor.title : "Choose an anchor habit"} + + + + + + {/* Time */} + + + + {TIME_PRESETS.map((p) => ( + { + setPreferredTime(p.time); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + {p.label} + + + ))} + + + + {/* Frequency */} + + FREQUENCY + + {FREQUENCIES.map((f) => ( + setFrequency(f.value)} + > + + + {f.label} + + + ))} + + + + {/* Weekend Flexibility */} + + + + + Weekend Flexibility + + + Allow skipping on weekends without breaking streaks. + + + + + + + + + "Every action you take is a vote for the type of person you wish to become." + + + + + + + {/* Anchor Habit Modal */} + setShowAnchorModal(false)} + > + + + + Select Anchor Habit + setShowAnchorModal(false)}> + + + + + { + setAnchorHabitId(null); + setShowAnchorModal(false); + }} + > + + No Anchor (Independent) + + + {existingHabits.map((habit) => ( + { + setAnchorHabitId(habit.id); + setShowAnchorModal(false); + }} + > + + {habit.title} + + + ))} + + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "4D", + }, + headerTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + content: { + padding: SPACING.lg, + }, + section: { + gap: SPACING.xl, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + marginBottom: 4, + }, + inputGroup: { + gap: 8, + }, + label: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.outline, + }, + inputWrapper: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + paddingHorizontal: 12, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + height: 52, + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + hintText: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.onSurfaceVariant, + fontStyle: 'italic', + marginTop: 2, + }, + presetsGrid: { + flexDirection: "row", + gap: 8, + marginTop: 4, + }, + presetBtn: { + flex: 1, + paddingVertical: 8, + borderRadius: ROUNDNESS.sm, + backgroundColor: colors.surfaceVariant + "4D", + alignItems: "center", + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + presetText: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.onSurfaceVariant, + }, + frequencyGrid: { + flexDirection: "row", + gap: 10, + }, + frequencyOption: { + flex: 1, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 8, + backgroundColor: colors.surface, + paddingVertical: 12, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + frequencyText: { + fontFamily: FONTS.label, + fontSize: 13, + color: colors.onSurfaceVariant, + }, + switchRow: { + flexDirection: "row", + alignItems: "center", + justifyContent: "space-between", + backgroundColor: colors.surface, + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + switchContent: { + flex: 1, + paddingRight: 16, + }, + rowAlign: { + flexDirection: "row", + alignItems: "center", + marginBottom: 4, + }, + switchTitle: { + fontFamily: FONTS.headline, + fontSize: 16, + color: colors.onSurface, + }, + switchDesc: { + fontFamily: FONTS.body, + fontSize: 13, + color: colors.onSurfaceVariant, + lineHeight: 18, + }, + infoCard: { + backgroundColor: colors.primaryContainer + "40", + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.primaryContainer, + marginTop: SPACING.xxl, + alignItems: "center", + }, + infoText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + fontStyle: "italic", + textAlign: "center", + }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'flex-end', + }, + modalContent: { + borderTopLeftRadius: ROUNDNESS.xl, + borderTopRightRadius: ROUNDNESS.xl, + paddingBottom: 40, + maxHeight: '70%', + }, + modalHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + '4D', + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 18, + color: colors.onSurface, + }, + anchorList: { + padding: SPACING.md, + }, + anchorItem: { + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + marginBottom: 8, + }, + anchorItemText: { + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + }); diff --git a/src/app/add-shortcut.tsx b/src/app/add-shortcut.tsx new file mode 100644 index 0000000..bc347a7 --- /dev/null +++ b/src/app/add-shortcut.tsx @@ -0,0 +1,192 @@ +import React, { useState, useMemo } from 'react'; +import { StyleSheet, View, Text, TextInput, TouchableOpacity, ScrollView, Alert, ActivityIndicator, KeyboardAvoidingView, Platform } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { X, Save, Link as LinkIcon, Type, Sparkles } from 'lucide-react-native'; +import { SPACING, FONTS, ROUNDNESS } from '@/src/constants/Theme'; +import { useTheme } from '@/src/hooks/useTheme'; +import { performMutation } from '@/src/lib/sync'; +import { useRouter } from 'expo-router'; +import { useAuth } from '@/src/hooks/useAuth'; + +export default function AddShortcutScreen() { + const { colors } = useTheme(); + const { user } = useAuth(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const [title, setTitle] = useState(''); + const [url, setUrl] = useState(''); + const [loading, setLoading] = useState(false); + + const handleSave = async () => { + if (!title || !url) { + Alert.alert('Error', 'Please provide both a title and a URL'); + return; + } + + setLoading(true); + try { + await performMutation('shortcuts', 'INSERT', { + id: Math.random().toString(36).substring(7), + user_id: user?.id || 'guest', + title, + url: url.startsWith('http') ? url : `https://${url}`, + icon: 'sparkles', + }); + router.back(); + } catch (error) { + console.error('Failed to save shortcut:', error); + Alert.alert('Error', 'Failed to save shortcut'); + } finally { + setLoading(false); + } + }; + + return ( + + + + + router.back()}> + + + Add Shortcut + + {loading ? ( + + ) : ( + + )} + + + + + + SHORTCUT DETAILS + + + DISPLAY NAME + + + + + + + + URL OR APP LINK + + + + + + + + + + + Shortcuts will appear in your Ecosystem Tools section for quick access to your external workspaces. + + + + + + + ); +} + +const createStyles = (colors: any) => StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + '4D', + }, + headerTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + content: { + padding: SPACING.lg, + }, + section: { + gap: SPACING.lg, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + marginBottom: 4, + }, + inputGroup: { + gap: 8, + }, + label: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.outline, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + '4D', + paddingHorizontal: 12, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + height: 52, + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + infoCard: { + flexDirection: 'row', + backgroundColor: colors.primaryContainer + '40', + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + gap: 16, + borderWidth: 1, + borderColor: colors.primaryContainer, + marginTop: SPACING.xxl, + }, + infoText: { + flex: 1, + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + lineHeight: 20, + }, +}); diff --git a/src/app/add-task.tsx b/src/app/add-task.tsx new file mode 100644 index 0000000..93d499e --- /dev/null +++ b/src/app/add-task.tsx @@ -0,0 +1,280 @@ +import React, { useState, useMemo } from 'react'; +import { StyleSheet, View, Text, TextInput, TouchableOpacity, ScrollView, Alert, ActivityIndicator, KeyboardAvoidingView, Platform } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { X, Save, Type, Tag, Target } from 'lucide-react-native'; +import { SPACING, FONTS, ROUNDNESS } from '@/src/constants/Theme'; +import { useTheme } from '@/src/hooks/useTheme'; +import { performMutation } from '@/src/lib/sync'; +import { useRouter } from 'expo-router'; +import { useAuth } from '@/src/hooks/useAuth'; +import { getDb } from '@/src/db/database'; +import * as Haptics from 'expo-haptics'; + +import { getLocalDateString } from '@/src/lib/date-utils'; + +const toMinutes = (time: string) => { + const [h, m] = time.split(':').map(Number); + return h * 60 + m; +}; + +const toTimeString = (minutes: number) => { + const h = Math.floor(minutes / 60); + const m = minutes % 60; + return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`; +}; + +export default function AddTaskScreen() { + const { colors, sprintDuration } = useTheme(); + const { user } = useAuth(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const [title, setTitle] = useState(''); + const [tag, setTag] = useState(''); + const [sessions, setSessions] = useState('1'); + const [loading, setLoading] = useState(false); + + const handleSave = async () => { + if (!title.trim()) { + Alert.alert('Error', 'Please provide a title for your task'); + return; + } + + const estSessions = parseInt(sessions) || 1; + const taskId = Math.random().toString(36).substring(7); + const userId = user?.id || 'guest'; + const today = getLocalDateString(); + + setLoading(true); + try { + // 1. Save the Task + await performMutation('tasks', 'INSERT', { + id: taskId, + user_id: userId, + title: title.trim(), + status: 'todo', + estimated_sessions: estSessions, + completed_sessions: 0, + tag: tag.trim() || 'General', + todos: '[]', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + }); + + // 2. Automatically Add to Schedule + const db = await getDb(); + const existingSchedule = await db.getFirstAsync<{id: string, time_blocks: string}>( + "SELECT id, time_blocks FROM schedules WHERE date = ? AND (user_id = ? OR user_id IS NULL)", + [today, userId] + ); + + let blocks = []; + let scheduleId = Math.random().toString(36).substring(7); + + if (existingSchedule) { + try { + blocks = JSON.parse(existingSchedule.time_blocks); + scheduleId = existingSchedule.id; + } catch (e) { blocks = []; } + } + + // Find first available slot after 9 AM + let currentStart = toMinutes("09:00"); + const duration = sprintDuration; + + const sortedBlocks = [...blocks].sort((a, b) => a.start.localeCompare(b.start)); + + for (const block of sortedBlocks) { + const blockStart = toMinutes(block.start); + if (blockStart >= currentStart + duration) { + break; + } + currentStart = Math.max(currentStart, toMinutes(block.end)); + } + + const newBlock = { + start: toTimeString(currentStart), + end: toTimeString(currentStart + duration), + task: title.trim(), + type: 'deep-work', + todos: [] + }; + + const updatedBlocks = [...blocks, newBlock].sort((a, b) => a.start.localeCompare(b.start)); + + await performMutation('schedules', existingSchedule ? 'UPDATE' : 'INSERT', { + id: scheduleId, + user_id: userId, + date: today, + time_blocks: JSON.stringify(updatedBlocks) + }); + + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + router.back(); + } catch (error) { + console.error('Failed to save task/schedule:', error); + Alert.alert('Error', 'Failed to save task'); + } finally { + setLoading(false); + } + }; + + return ( + + + + + router.back()}> + + + New Task + + {loading ? ( + + ) : ( + + )} + + + + + + TASK DETAILS + + + WHAT ARE YOU WORKING ON? + + + + + + + + TAG / CATEGORY + + + + + + + + ESTIMATED SESSIONS (25m each) + + + + + + + + + + Break large tasks into small, actionable chunks to maintain flow and momentum. + + + + + + + ); +} + +const createStyles = (colors: any) => StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + '4D', + }, + headerTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + content: { + padding: SPACING.lg, + }, + section: { + gap: SPACING.xl, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + marginBottom: 4, + }, + inputGroup: { + gap: 8, + }, + label: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.outline, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + '4D', + paddingHorizontal: 12, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + height: 52, + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + infoCard: { + backgroundColor: colors.primaryContainer + '40', + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.primaryContainer, + marginTop: SPACING.xxl, + alignItems: 'center', + }, + infoText: { + fontFamily: FONTS.body, + fontSize: 14, + color: colors.onSurfaceVariant, + textAlign: 'center', + lineHeight: 20, + }, +}); diff --git a/src/app/index.tsx b/src/app/index.tsx new file mode 100644 index 0000000..ac11cf9 --- /dev/null +++ b/src/app/index.tsx @@ -0,0 +1,23 @@ +import { Redirect } from 'expo-router'; +import { useAuth } from '../hooks/useAuth'; +import { View, ActivityIndicator } from 'react-native'; +import { useTheme } from '../hooks/useTheme'; + +export default function Index() { + const { isAuthenticated, loading } = useAuth(); + const { colors } = useTheme(); + + if (loading) { + return ( + + + + ); + } + + if (!isAuthenticated) { + return ; + } + + return ; +} diff --git a/src/app/login.tsx b/src/app/login.tsx new file mode 100644 index 0000000..cbc442f --- /dev/null +++ b/src/app/login.tsx @@ -0,0 +1,313 @@ +import React, { useState, useMemo } from 'react'; +import { StyleSheet, View, Text, TextInput, TouchableOpacity, ScrollView, Image, ActivityIndicator, Alert, KeyboardAvoidingView, Platform } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Mail, Lock, LogIn, UserPlus, Sparkles, ArrowRight } from 'lucide-react-native'; +import { SPACING, FONTS, ROUNDNESS } from '@/src/constants/Theme'; +import { useTheme } from '@/src/hooks/useTheme'; +import { supabase } from '@/src/lib/supabase'; +import { useRouter } from 'expo-router'; + +export default function LoginScreen() { + const { colors } = useTheme(); + const styles = useMemo(() => createStyles(colors), [colors]); + const router = useRouter(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [isSignUp, setIsSignUp] = useState(false); + + async function handleAuth() { + if (!email || !password) { + Alert.alert('Error', 'Please fill in all fields'); + return; + } + + setLoading(true); + try { + if (isSignUp) { + const { error } = await supabase.auth.signUp({ + email, + password, + }); + if (error) throw error; + Alert.alert('Success', 'Check your email for the confirmation link!'); + } else { + const { data: authData, error: signInError } = await supabase.auth.signInWithPassword({ + email, + password, + }); + if (signInError) throw signInError; + + // Ensure profile exists + if (authData?.user) { + const { error: profileError } = await supabase + .from('profiles') + .upsert({ + id: authData.user.id, + email: authData.user.email, + updated_at: new Date().toISOString() + }); + + if (profileError) { + console.error('Error ensuring profile exists:', profileError.message); + } + } + + router.replace('/(tabs)/'); + } + } catch (error: any) { + Alert.alert('Auth Error', error.message); + } finally { + setLoading(false); + } + } + + return ( + + + + + + + + + {isSignUp ? 'Join Batsir' : 'Welcome Back'} + + {isSignUp ? 'Start your journey to atomic efficiency.' : 'Find your flow state and continue building.'} + + + + + + EMAIL ADDRESS + + + + + + + + PASSWORD + + + + + + + + {loading ? ( + + ) : ( + <> + {isSignUp ? 'Create Account' : 'Sign In'} + {isSignUp ? : } + + )} + + + setIsSignUp(!isSignUp)} + > + + {isSignUp ? 'Already have an account? Sign In' : "Don't have an account? Sign Up"} + + + + + {!isSignUp && ( + + + + + + Batsirai Integration + Your personal flow assistant is ready to help you optimize your schedule. + + + )} + + router.replace('/(tabs)/')}> + Continue as Guest + + + + + + + ); +} + +const createStyles = (colors: any) => StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scrollContent: { + padding: SPACING.xl, + flexGrow: 1, + justifyContent: 'center', + }, + header: { + marginBottom: SPACING.xxl, + alignItems: 'center', + }, + logoContainer: { + marginBottom: SPACING.lg, + }, + logoImage: { + height: 48, + width: 180, + }, + title: { + fontFamily: FONTS.headline, + fontSize: 32, + color: colors.onSurface, + textAlign: 'center', + marginBottom: 8, + }, + subtitle: { + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurfaceVariant, + textAlign: 'center', + lineHeight: 22, + paddingHorizontal: 20, + }, + form: { + gap: SPACING.lg, + marginBottom: SPACING.xl, + }, + inputGroup: { + gap: 8, + }, + label: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + '4D', + paddingHorizontal: 12, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + height: 52, + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + }, + primaryBtn: { + backgroundColor: colors.primary, + height: 56, + borderRadius: ROUNDNESS.full, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 12, + marginTop: 10, + elevation: 2, + shadowColor: colors.primary, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 8, + }, + primaryBtnText: { + color: colors.onPrimary, + fontFamily: FONTS.labelSm, + fontSize: 16, + }, + switchBtn: { + alignItems: 'center', + padding: 10, + }, + switchBtnText: { + fontFamily: FONTS.label, + fontSize: 14, + color: colors.primary, + }, + featureHighlight: { + flexDirection: 'row', + backgroundColor: colors.primaryContainer + '40', + padding: SPACING.lg, + borderRadius: ROUNDNESS.lg, + gap: 16, + borderWidth: 1, + borderColor: colors.primaryContainer, + marginBottom: SPACING.xl, + }, + featureIcon: { + width: 40, + height: 40, + borderRadius: 20, + backgroundColor: colors.surface, + alignItems: 'center', + justifyContent: 'center', + }, + featureContent: { + flex: 1, + }, + featureTitle: { + fontFamily: FONTS.headline, + fontSize: 16, + color: colors.onSurface, + marginBottom: 2, + }, + featureDesc: { + fontFamily: FONTS.body, + fontSize: 13, + color: colors.onSurfaceVariant, + lineHeight: 18, + }, + guestBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + padding: 10, + }, + guestBtnText: { + fontFamily: FONTS.label, + fontSize: 14, + color: colors.outline, + }, +}); diff --git a/src/app/menu.tsx b/src/app/menu.tsx new file mode 100644 index 0000000..dc319c1 --- /dev/null +++ b/src/app/menu.tsx @@ -0,0 +1,260 @@ +import { FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import * as Haptics from "expo-haptics"; +import { useRouter } from "expo-router"; +import { + Activity, + ChevronRight, + Clock, + Save, + Sparkles, + Target, + X, + History +} from "lucide-react-native"; +import React, { useMemo, useState } from "react"; +import { + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; + +export default function MenuModal() { + const { + colors, + identityAnchor, + updateIdentityAnchor, + focusGoal, + updateFocusGoal, + } = useTheme(); + const router = useRouter(); + const styles = useMemo(() => createStyles(colors), [colors]); + + const [newAnchor, setNewAnchor] = useState(identityAnchor); + const [newGoal, setNewGoal] = useState(focusGoal.toString()); + + const handleSaveSettings = async () => { + try { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + await updateIdentityAnchor(newAnchor); + const goalNum = parseInt(newGoal); + if (!isNaN(goalNum)) { + await updateFocusGoal(goalNum); + } + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + } catch (e) { + console.error(e); + } + }; + + const menuItems = [ + { + title: "Sprint", + subtitle: "Start a focused work session", + icon: , + route: "/sprint" as const, + }, + { + title: "History", + subtitle: "Browse past activities & inventory", + icon: , + route: "/history" as const, + }, + { + title: "Assistant", + subtitle: "Chat with Batsirai AI", + icon: , + route: "/aa_ai" as const, + }, + { + title: "Habits", + subtitle: "Manage your daily evolution", + icon: , + route: "/hh_habits" as const, + }, + ]; + + const navigateTo = (route: any) => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.replace(route); + }; + + return ( + + + + Navigation + router.back()} + style={styles.closeBtn} + > + + + + + + + MAIN TOOLS + {menuItems.map((item, index) => ( + navigateTo(item.route)} + > + + {item.icon} + + {item.title} + {item.subtitle} + + + + + ))} + + + + BATSIRAI / ECOSYSTEM + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "4D", + }, + headerTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + color: colors.onSurface, + }, + closeBtn: { + padding: 4, + }, + content: { + padding: SPACING.lg, + }, + section: { + gap: 8, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + marginBottom: 8, + }, + settingsCard: { + backgroundColor: colors.surface, + padding: 16, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + gap: 16, + }, + inputGroup: { + gap: 8, + }, + rowAlign: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + inputLabel: { + fontFamily: FONTS.labelSm, + fontSize: 10, + color: colors.outline, + }, + input: { + backgroundColor: colors.surfaceVariant + "40", + borderRadius: ROUNDNESS.md, + paddingHorizontal: 12, + paddingVertical: 10, + fontFamily: FONTS.body, + fontSize: 16, + color: colors.onSurface, + borderWidth: 1, + borderColor: colors.outlineVariant + "26", + }, + saveBtn: { + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 10, + backgroundColor: colors.primary, + paddingVertical: 12, + borderRadius: ROUNDNESS.md, + marginTop: 8, + }, + saveBtnText: { + color: colors.onPrimary, + fontFamily: FONTS.labelSm, + fontSize: 14, + }, + menuItem: { + flexDirection: "row", + alignItems: "center", + justifyContent: "space-between", + padding: 16, + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + marginBottom: 8, + }, + menuItemLeft: { + flexDirection: "row", + alignItems: "center", + gap: 16, + }, + iconBg: { + width: 44, + height: 44, + borderRadius: ROUNDNESS.md, + backgroundColor: colors.primaryContainer + "40", + alignItems: "center", + justifyContent: "center", + }, + menuItemTitle: { + fontFamily: FONTS.headline, + fontSize: 16, + color: colors.onSurface, + }, + menuItemSubtitle: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.onSurfaceVariant, + marginTop: 2, + }, + footer: { + marginTop: 40, + alignItems: "center", + paddingBottom: 40, + }, + footerText: { + fontFamily: FONTS.label, + fontSize: 10, + color: colors.outline, + letterSpacing: 2, + }, + }); diff --git a/src/app/modal.tsx b/src/app/modal.tsx new file mode 100644 index 0000000..bfdda49 --- /dev/null +++ b/src/app/modal.tsx @@ -0,0 +1,662 @@ +import { AccentKey, FONTS, ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { ThemeMode, useTheme } from "@/src/hooks/useTheme"; +import * as Haptics from "expo-haptics"; +import { useRouter } from "expo-router"; +import { + Check, + Clock, + Edit3, + LogOut, + Monitor, + Moon, + RefreshCw, + Save, + Sun, + Target, + X, + Shield, + Database, + Fingerprint +} from "lucide-react-native"; +import React, { useMemo, useState } from "react"; +import { + ActivityIndicator, + Alert, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, + KeyboardAvoidingView, + Platform +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { useAuth } from "../hooks/useAuth"; +import { pullFromServer, syncWithSupabase } from "../lib/sync"; + +export default function SettingsModal() { + const { + colors, + accentKey, + updateAccent, + availableAccents, + themeMode, + updateThemeMode, + focusGoal, + updateFocusGoal, + sprintDuration, + updateSprintDuration, + displayName, + updateDisplayName, + identityAnchor, + updateIdentityAnchor, + } = useTheme(); + + const [newName, setNewName] = useState(displayName); + const [newIdentity, setNewIdentity] = useState(identityAnchor); + const [newGoal, setNewGoal] = useState(focusGoal.toString()); + const [newSprintDuration, setNewSprintDuration] = useState( + sprintDuration.toString(), + ); + + const [isEditingAccount, setIsEditingAccount] = useState(false); + const [isEditingIdentity, setIsEditingIdentity] = useState(false); + const [isEditingGoals, setIsEditingGoals] = useState(false); + + const accountDirty = newName.trim() !== displayName.trim(); + const identityDirty = newIdentity.trim() !== identityAnchor.trim(); + const goalsDirty = + newGoal.trim() !== focusGoal.toString() || + newSprintDuration.trim() !== sprintDuration.toString(); + + const { signOut, user } = useAuth(); + const router = useRouter(); + const styles = useMemo(() => createStyles(colors), [colors]); + const [syncing, setSyncing] = useState(false); + + const handleSaveIdentity = async () => { + if (!identityDirty) return; + try { + await updateIdentityAnchor(newIdentity); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + setIsEditingIdentity(false); + } catch (e) { + Alert.alert("Error", "Unable to save identity anchor."); + } + }; + + const handleSaveAccount = async () => { + if (!accountDirty) return; + try { + await updateDisplayName(newName); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + setIsEditingAccount(false); + } catch (e) { + Alert.alert("Error", "Unable to save display name."); + } + }; + + const handleSaveGoals = async () => { + if (!goalsDirty) return; + const goalNum = parseInt(newGoal, 10); + const sprintNum = parseInt(newSprintDuration, 10); + + if (isNaN(goalNum) || isNaN(sprintNum)) { + Alert.alert("Error", "Please enter valid numbers."); + return; + } + + try { + await updateFocusGoal(goalNum); + await updateSprintDuration(sprintNum); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + setIsEditingGoals(false); + } catch (e) { + Alert.alert("Error", "Unable to save goals."); + } + }; + + const handleSignOut = async () => { + Alert.alert("Sign Out", "Are you sure you want to sign out?", [ + { text: "Cancel", style: "cancel" }, + { + text: "Sign Out", + style: "destructive", + onPress: async () => { + await signOut(); + router.replace("/login"); + }, + }, + ]); + }; + + const handleManualSync = async () => { + setSyncing(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + try { + await syncWithSupabase(); + await pullFromServer(); + Alert.alert("Cloud Sync Successful", "Your flow is now synchronized across all devices."); + } catch (e) { + Alert.alert("Sync Error", "Could not connect to the cloud architect."); + } finally { + setSyncing(false); + } + }; + + const handleResetData = () => { + Alert.alert( + "Hard Reset", + "This will clear all local data. Cloud data will remain safe. Proceed?", + [ + { text: "Cancel", style: "cancel" }, + { + text: "Reset", + style: "destructive", + onPress: async () => { + Alert.alert("Reset Complete", "Local data has been purged."); + } + } + ] + ); + }; + + return ( + + + + + System Configuration + router.back()} + > + + + + + + {/* Identity Section */} + + + + IDENTITY PRINCIPLE + + + This is the "Identity Anchor" that guides your habits. Define who you are becoming. + + + + + + {!isEditingIdentity ? ( + setIsEditingIdentity(true)}> + + Refine Identity + + ) : ( + <> + { setIsEditingIdentity(false); setNewIdentity(identityAnchor); }}> + + Cancel + + + + Save Anchor + + + )} + + + + {/* Account Section */} + + + + ACCOUNT SECURITY + + + + {user?.email || "Guest User"} + + + + + + + + {!isEditingAccount ? ( + setIsEditingAccount(true)}> + + Update Profile + + ) : ( + + + Save Profile + + )} + + + + {/* Productivity Goals */} + + + + PRODUCTIVITY ARCHITECTURE + + + + + + Daily Focus Goal + Number of sessions per day + + + + + + + + + Sprint Duration + Minutes per session + + + + + + {!isEditingGoals ? ( + setIsEditingGoals(true)}> + + Modify Goals + + ) : ( + + + Apply Goals + + )} + + + + {/* Visual Style */} + + VISUAL INTERFACE + + {(['light', 'dark', 'system'] as ThemeMode[]).map((mode) => ( + { + updateThemeMode(mode); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + {mode === 'light' ? : + mode === 'dark' ? : + } + + {mode.charAt(0).toUpperCase() + mode.slice(1)} + + + ))} + + + + {(Object.keys(availableAccents) as AccentKey[]).map((key) => { + const accent = availableAccents[key]; + const isSelected = accentKey === key; + return ( + { + updateAccent(key); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + {isSelected && } + + + {accent.label} + + + ); + })} + + + + {/* System & Sync */} + + + + CORE ENGINE + + + + + Cloud Architecture Sync + Last verified: Just now + + {syncing ? : } + + + + + Purge Local Cache + Hard reset database + + + + + + + + Batsirai Productivity Planner v1.2.0 + Engineered for Focus + + + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + padding: SPACING.lg, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "4D", + }, + title: { + fontFamily: FONTS.headline, + fontSize: 22, + color: colors.onSurface, + }, + closeBtn: { + padding: 4, + }, + content: { + padding: SPACING.lg, + }, + section: { + marginBottom: SPACING.xxl, + }, + sectionHeaderRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + marginBottom: 8, + }, + sectionLabel: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.primary, + letterSpacing: 1.5, + }, + sectionDesc: { + fontFamily: FONTS.body, + fontSize: 13, + color: colors.onSurfaceVariant, + lineHeight: 18, + marginBottom: 12, + }, + accountInfo: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + backgroundColor: colors.surface, + padding: 16, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + accountDetails: { + flex: 1, + }, + nameInput: { + fontFamily: FONTS.labelSm, + fontSize: 15, + color: colors.primary, + marginTop: 4, + }, + signOutBtn: { + padding: 8, + }, + inputGroup: { + gap: 8, + }, + input: { + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + borderRadius: ROUNDNESS.md, + paddingHorizontal: 16, + paddingVertical: 12, + fontFamily: FONTS.body, + color: colors.onSurface, + fontSize: 15, + }, + inputDisabled: { + opacity: 0.6, + backgroundColor: colors.surfaceVariant + '40', + }, + actionRow: { + flexDirection: 'row', + gap: 12, + marginTop: 12, + }, + actionBtn: { + flex: 1, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 8, + paddingVertical: 12, + borderRadius: ROUNDNESS.md, + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.outlineVariant + "80", + }, + actionBtnActive: { + backgroundColor: colors.primary, + borderColor: colors.primary, + }, + actionBtnText: { + fontFamily: FONTS.label, + color: colors.onSurface, + fontSize: 13, + }, + actionBtnTextActive: { + color: colors.onPrimary, + }, + goalRow: { + flexDirection: "row", + alignItems: "center", + justifyContent: "space-between", + backgroundColor: colors.surface, + padding: 14, + borderRadius: ROUNDNESS.lg, + marginBottom: 8, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + goalInfo: { + flexDirection: "row", + alignItems: "center", + gap: 12, + }, + goalTitle: { + fontFamily: FONTS.headline, + fontSize: 15, + color: colors.onSurface, + }, + goalDesc: { + fontFamily: FONTS.body, + fontSize: 12, + color: colors.onSurfaceVariant, + }, + goalInput: { + width: 60, + height: 40, + backgroundColor: colors.surfaceVariant + "80", + borderRadius: ROUNDNESS.sm, + textAlign: "center", + fontFamily: FONTS.labelSm, + color: colors.primary, + fontSize: 18, + }, + themeToggleGrid: { + flexDirection: "row", + gap: 10, + marginBottom: SPACING.xl, + }, + themeOption: { + flex: 1, + paddingVertical: 16, + alignItems: "center", + justifyContent: "center", + borderRadius: ROUNDNESS.lg, + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + gap: 8, + }, + themeLabel: { + fontFamily: FONTS.label, + fontSize: 12, + color: colors.onSurfaceVariant, + }, + accentGrid: { + flexDirection: "row", + flexWrap: "wrap", + gap: 10, + }, + accentCard: { + width: "31%", + backgroundColor: colors.surface, + padding: 10, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + alignItems: "center", + gap: 8, + marginBottom: 4, + }, + accentPreview: { + width: 36, + height: 36, + borderRadius: 18, + alignItems: "center", + justifyContent: "center", + }, + accentLabel: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.onSurfaceVariant, + }, + systemCard: { + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + overflow: 'hidden', + }, + systemItem: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + padding: 16, + borderBottomWidth: 1, + borderBottomColor: colors.outlineVariant + "33", + }, + systemItemInfo: { + flex: 1, + }, + menuItemText: { + fontFamily: FONTS.body, + fontSize: 15, + color: colors.onSurface, + }, + menuItemValue: { + fontFamily: FONTS.label, + fontSize: 12, + color: colors.onSurfaceVariant, + marginTop: 2, + }, + footer: { + alignItems: "center", + marginTop: SPACING.xl, + paddingBottom: 60, + }, + versionText: { + fontFamily: FONTS.label, + fontSize: 11, + color: colors.outline, + letterSpacing: 0.5, + textTransform: 'uppercase', + marginBottom: 4, + }, + }); diff --git a/src/app/reader/[id].tsx b/src/app/reader/[id].tsx new file mode 100644 index 0000000..b0928c0 --- /dev/null +++ b/src/app/reader/[id].tsx @@ -0,0 +1,169 @@ +import React, { useEffect, useState, useCallback, useRef } from 'react'; +import { View, ActivityIndicator, StyleSheet, Alert } from 'react-native'; +import { useLocalSearchParams, useRouter, Stack } from 'expo-router'; +import { getDb } from '@/src/db/database'; +import { performMutation } from '@/src/lib/sync'; +import { resolveFileUri, downloadBook } from '@/src/lib/file-utils'; +import PdfReader from '@/src/components/Library/PdfReader'; +import { useTheme } from '@/src/hooks/useTheme'; +import { ThemedText } from '@/components/themed-text'; +import * as Haptics from 'expo-haptics'; + +interface Book { + id: string; + title: string; + file_uri: string; + current_page: number; + total_pages: number; + status: string; +} + +export default function ReaderScreen() { + const { id } = useLocalSearchParams<{ id: string }>(); + const router = useRouter(); + const { colors } = useTheme(); + + const [book, setBook] = useState(null); + const [loading, setLoading] = useState(true); + const [downloading, setDownloading] = useState(false); + const [localUri, setLocalUri] = useState(null); + const [currentPage, setCurrentPage] = useState(0); + const [startPage, setStartPage] = useState(0); + const [totalPages, setTotalPages] = useState(0); + const [sessionSeconds, setSessionSeconds] = useState(0); + + const sessionStartTime = useRef(Date.now()); + + useEffect(() => { + loadBook(); + }, [id]); + + const loadBook = async () => { + try { + const db = await getDb(); + const bookData = await db.getFirstAsync( + 'SELECT * FROM books WHERE id = ?', + [id] + ); + + if (bookData) { + setBook(bookData); + setCurrentPage(bookData.current_page || 0); + setStartPage(bookData.current_page || 0); + setTotalPages(bookData.total_pages || 0); + + // Ensure file is local + try { + setDownloading(true); + const uri = await downloadBook(bookData.file_uri); + setLocalUri(uri); + } catch (e) { + console.error('Failed to ensure local file:', e); + // Fallback to resolved URI (might be a remote URL if docDir was null) + setLocalUri(resolveFileUri(bookData.file_uri)); + } finally { + setDownloading(false); + } + } else { + Alert.alert('Error', 'Book not found'); + router.back(); + } + } catch (error) { + console.error('Failed to load book:', error); + Alert.alert('Error', 'Failed to load book'); + router.back(); + } finally { + setLoading(false); + } + }; + + const handleClose = async () => { + if (!book) return; + + const durationSeconds = Math.floor((Date.now() - sessionStartTime.current) / 1000); + const pagesRead = Math.max(0, currentPage - startPage); + + try { + // Update book progress + await performMutation('books', 'UPDATE', { + id: book.id, + current_page: currentPage, + total_pages: totalPages, + status: totalPages > 0 && currentPage >= totalPages - 1 ? 'finished' : 'reading', + updated_at: new Date().toISOString(), + }); + + // Log reading session + if (pagesRead > 0 || durationSeconds > 30) { + await performMutation('reading_logs', 'INSERT', { + id: Math.random().toString(36).substring(7), + book_id: book.id, + start_page: startPage, + end_page: currentPage, + pages_read: pagesRead, + duration_seconds: durationSeconds, + duration_minutes: durationSeconds / 60, + logged_at: new Date().toISOString(), + }); + } + + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + router.back(); + } catch (error) { + console.error('Failed to save progress:', error); + router.back(); + } + }; + + const handlePageChange = useCallback((page: number, total: number) => { + setCurrentPage(page); + if (total > 0 && total !== totalPages) { + setTotalPages(total); + } + }, [totalPages]); + + if (loading || (downloading && !localUri)) { + return ( + + + {downloading && ( + + Downloading your book... + + )} + + ); + } + + if (!book || !localUri) return null; + + return ( + + + { + // Future: Open note editor + console.log('Add note for page:', page); + }} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#000', + }, + loadingContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/components/AutoHideFloatingActionButton.tsx b/src/components/AutoHideFloatingActionButton.tsx new file mode 100644 index 0000000..0fbbe66 --- /dev/null +++ b/src/components/AutoHideFloatingActionButton.tsx @@ -0,0 +1,127 @@ +import { useTheme } from "@/src/hooks/useTheme"; +import { BlurView } from "expo-blur"; +import * as Haptics from "expo-haptics"; +import { LayoutDashboard } from "lucide-react-native"; +import React, { useCallback, useMemo, useRef } from "react"; +import { Animated, Platform, Pressable, StyleSheet, View } from "react-native"; + +type Props = { + onPress: () => void; + accentColor: string; + label?: string; + position?: "center" | "right"; +}; + +export default function AutoHideFloatingActionButton({ + onPress, + accentColor, + label = "Day", + position = "center", +}: Props) { + const { isDark, colors } = useTheme(); + const scaleAnim = useRef(new Animated.Value(1)).current; + + const onPressIn = useCallback(() => { + // Requirement: Animated scale on press (0.95 -> 1.0) + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + Animated.spring(scaleAnim, { + toValue: 0.95, + useNativeDriver: true, + friction: 8, + tension: 100, + }).start(); + }, [scaleAnim]); + + const onPressOut = useCallback(() => { + Animated.spring(scaleAnim, { + toValue: 1, + useNativeDriver: true, + friction: 8, + tension: 100, + }).start(); + }, [scaleAnim]); + + const animatedStyle = useMemo( + () => ({ transform: [{ scale: scaleAnim }] }), + [scaleAnim], + ); + + return ( + + [ + styles.pressable, + { opacity: pressed ? 0.95 : 1 }, + ]} + > + + + + + + + + ); +} + +const styles = StyleSheet.create({ + wrapper: { + // Requirement: Large border radius (24-28px) -> 28 for 56x56 + borderRadius: 30, + // Requirement: Slight elevation/shadow + shadowColor: "#000", + shadowOpacity: 0.2, + shadowRadius: 16, + shadowOffset: { width: 0, height: 8 }, + elevation: 10, + }, + pressable: { + borderRadius: 30, + overflow: "hidden", + }, + positionCenter: { + alignSelf: "center", + }, + positionRight: { + alignSelf: "flex-end", + marginRight: 20, + }, + fab: { + // Requirement: Circular (56x56 points) + width: 60, + height: 60, + borderRadius: 30, + borderWidth: 1, + justifyContent: "center", + alignItems: "center", + }, + iconContainer: { + justifyContent: "center", + alignItems: "center", + }, +}); diff --git a/src/components/AutoHideScrollView.tsx b/src/components/AutoHideScrollView.tsx new file mode 100644 index 0000000..4bb6388 --- /dev/null +++ b/src/components/AutoHideScrollView.tsx @@ -0,0 +1,25 @@ +import { useAutoHideOnScroll } from "@/src/hooks/useAutoHideTabBar"; +import React from "react"; +import { ScrollView, ScrollViewProps } from "react-native"; + +const AutoHideScrollView = React.forwardRef( + (props, ref) => { + const { onScroll, scrollEventThrottle } = useAutoHideOnScroll(); + + return ( + { + onScroll(event); + if (props.onScroll) { + props.onScroll(event); + } + }} + /> + ); + }, +); + +export default AutoHideScrollView; diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..ae72b68 --- /dev/null +++ b/src/components/ErrorBoundary.tsx @@ -0,0 +1,70 @@ +import { FONTS, SPACING, ThemeColors } from "@/src/constants/Theme"; +import React from "react"; +import { StyleSheet, Text, View } from "react-native"; + +interface ErrorBoundaryProps { + children: React.ReactNode; + colors: ThemeColors; +} + +interface ErrorBoundaryState { + hasError: boolean; + message: string; +} + +export class ErrorBoundary extends React.Component< + ErrorBoundaryProps, + ErrorBoundaryState +> { + constructor(props: ErrorBoundaryProps) { + super(props); + this.state = { hasError: false, message: "" }; + } + + static getDerivedStateFromError(error: Error) { + return { hasError: true, message: error.message }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + console.error("Chat error boundary caught:", error, errorInfo); + } + + render() { + const { hasError, message } = this.state; + const { colors, children } = this.props; + + if (!hasError) { + return children; + } + + return ( + + + Something went wrong. + + + {message} + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + padding: SPACING.lg, + }, + title: { + fontFamily: FONTS.headline, + fontSize: 20, + marginBottom: SPACING.sm, + }, + details: { + fontFamily: FONTS.body, + fontSize: 14, + textAlign: "center", + }, +}); diff --git a/src/components/FloatingAIDock.tsx b/src/components/FloatingAIDock.tsx new file mode 100644 index 0000000..12d4c3b --- /dev/null +++ b/src/components/FloatingAIDock.tsx @@ -0,0 +1,141 @@ +import { useTheme } from "@/src/hooks/useTheme"; +import { BlurView } from "expo-blur"; +import * as Haptics from "expo-haptics"; +import { usePathname, useRouter } from "expo-router"; +import { Sparkles } from "lucide-react-native"; +import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { + Animated, + Keyboard, + Platform, + Pressable, + StyleSheet, + View +} from "react-native"; + +export default function FloatingAIDock() { + const { colors, isDark } = useTheme(); + const router = useRouter(); + const pathname = usePathname(); + + const [isVisible, setIsVisible] = useState(true); + const visibilityAnim = useRef(new Animated.Value(1)).current; + + // Keyboard awareness - hide when typing + useEffect(() => { + const showSubscription = Keyboard.addListener( + Platform.OS === "ios" ? "keyboardWillShow" : "keyboardDidShow", + () => setIsVisible(false) + ); + const hideSubscription = Keyboard.addListener( + Platform.OS === "ios" ? "keyboardWillHide" : "keyboardDidHide", + () => setIsVisible(true) + ); + + return () => { + showSubscription.remove(); + hideSubscription.remove(); + }; + }, []); + + useEffect(() => { + Animated.spring(visibilityAnim, { + toValue: isVisible ? 1 : 0, + useNativeDriver: true, + friction: 8, + tension: 40, + }).start(); + }, [isVisible, visibilityAnim]); + + const navigateToAI = useCallback(() => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + router.push("/aa_ai"); + }, [router]); + + const isActive = pathname === "/aa_ai"; + + const dockStyle = useMemo(() => [ + styles.dockContainer, + { + right: 16, + top: "55%", // Slightly below center + transform: [ + { scale: visibilityAnim }, + { translateX: visibilityAnim.interpolate({ + inputRange: [0, 1], + outputRange: [100, 0], + }) + }, + ], + opacity: visibilityAnim, + } + ], [visibilityAnim]); + + // Don't show the launcher if we're already on the AI screen + if (isActive) return null; + + return ( + + [ + styles.pressable, + { transform: [{ scale: pressed ? 0.92 : 1 }] } + ]} + > + + + + + + + + ); +} + +const styles = StyleSheet.create({ + dockContainer: { + position: "absolute", + zIndex: 1000, + width: 64, + height: 64, + shadowColor: "#000", + shadowOpacity: 0.2, + shadowRadius: 15, + shadowOffset: { width: 0, height: 8 }, + elevation: 20, + }, + pressable: { + width: "100%", + height: "100%", + }, + blurContainer: { + flex: 1, + borderRadius: 32, + overflow: "hidden", + borderWidth: 1.5, + alignItems: "center", + justifyContent: "center", + }, + iconWrapper: { + alignItems: "center", + justifyContent: "center", + // Subtle glow effect + shadowColor: "#FFF", + shadowOpacity: 0.1, + shadowRadius: 10, + } +}); diff --git a/src/components/GlassBottomTabBar.tsx b/src/components/GlassBottomTabBar.tsx new file mode 100644 index 0000000..4d5d14f --- /dev/null +++ b/src/components/GlassBottomTabBar.tsx @@ -0,0 +1,309 @@ +import AutoHideFloatingActionButton from "@/src/components/AutoHideFloatingActionButton"; +import { FONTS } from "@/src/constants/Theme"; +import { useTabBarVisibility } from "@/src/hooks/useAutoHideTabBar"; +import { useTheme } from "@/src/hooks/useTheme"; +import { BottomTabBarProps } from "@react-navigation/bottom-tabs"; +import { BlurView } from "expo-blur"; +import * as Haptics from "expo-haptics"; +import React, { useEffect, useMemo, useRef } from "react"; +import { + Animated, + Platform, + Pressable, + StyleSheet, + Text, + View, +} from "react-native"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; + +const MAIN_TABS = ["index", "calendar", "library"]; + +export default function GlassBottomTabBar(props: BottomTabBarProps) { + const { state, descriptors, navigation } = props; + const { colors, isDark } = useTheme(); + + const { tabBarVisible, showTabBar } = useTabBarVisibility(); + + const insets = useSafeAreaInsets(); + + const currentRouteName = state.routes[state.index].name; + + const animated = useRef(new Animated.Value(tabBarVisible ? 0 : 1)).current; + + useEffect(() => { + Animated.spring(animated, { + toValue: tabBarVisible ? 0 : 1, + damping: 18, + stiffness: 180, + mass: 0.9, + useNativeDriver: true, + }).start(); + }, [tabBarVisible, animated]); + + const containerStyle = useMemo( + () => [ + styles.container, + { + bottom: insets.bottom + 12, + transform: [ + { + translateY: animated.interpolate({ + inputRange: [0, 1], + outputRange: [0, 140], + }), + }, + ], + opacity: animated.interpolate({ + inputRange: [0, 1], + outputRange: [1, 0], + }), + }, + ], + [animated, insets.bottom], + ); + + const fabStyle = useMemo( + () => ({ + transform: [ + { + translateY: animated.interpolate({ + inputRange: [0, 1], + outputRange: [160, 0], + }), + }, + { + scale: animated.interpolate({ + inputRange: [0, 1], + outputRange: [1, 0.7], + }), + }, + ], + opacity: animated.interpolate({ + inputRange: [0, 1], + outputRange: [0, 1], + }), + }), + [animated], + ); + + const indexRoute = state.routes.find((route) => route.name === "index"); + + const onMostImportantPress = () => { + if (currentRouteName === "index" && indexRoute) { + const event = navigation.emit({ + type: "tabPress", + target: indexRoute.key, + canPreventDefault: true, + }); + + if (!event.defaultPrevented) { + navigation.navigate("index"); + } + } else { + navigation.navigate("index"); + } + + showTabBar(); + }; + + if (currentRouteName === "aa_ai") { + return null; + } + + const visibleRoutes = state.routes.filter((r) => MAIN_TABS.includes(r.name)); + + const indexRouteKey = visibleRoutes.find((r) => r.name === "index")?.key; + const indexActiveColor = + (descriptors[indexRouteKey || ""].options + .tabBarActiveTintColor as string) || colors.primary; + + return ( + <> + + + + {visibleRoutes.map((route) => { + const descriptor = descriptors[route.key]; + + const focused = currentRouteName === route.name; + + const activeColor = + (descriptor.options.tabBarActiveTintColor as string) || + colors.primary; + + const inactiveColor = + (descriptor.options.tabBarInactiveTintColor as string) || + colors.outline; + + const color = focused ? activeColor : inactiveColor; + + const label = descriptor.options.title || route.name; + + const icon = descriptor.options.tabBarIcon?.({ + focused, + color, + size: 24, + }); + + const onPress = () => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + + const event = navigation.emit({ + type: "tabPress", + target: route.key, + canPreventDefault: true, + }); + + if (!event.defaultPrevented) { + navigation.navigate(route.name); + } + }; + + return ( + + + {icon} + + + {label} + + + + ); + })} + + + + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + position: "absolute", + alignSelf: "center", + zIndex: 100, + }, + + blurContainer: { + borderRadius: 999, + overflow: "hidden", + + borderWidth: 1, + + paddingHorizontal: 8, + paddingVertical: 8, + + shadowOpacity: 0.15, + shadowRadius: 20, + shadowOffset: { + width: 0, + height: 8, + }, + + elevation: 20, + }, + + inner: { + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + gap: 4, + }, + + tabWrapper: { + borderRadius: 999, + }, + + tabButton: { + minWidth: 76, + height: 44, + + borderRadius: 999, + + alignItems: "center", + justifyContent: "center", + + paddingHorizontal: 12, + }, + + activeTabButton: { + borderWidth: 1, + }, + + iconWrapper: { + marginBottom: 2, + alignItems: "center", + justifyContent: "center", + }, + + label: { + fontFamily: FONTS.label, + fontSize: 10, + letterSpacing: -0.1, + textAlign: "center", + lineHeight: 12, + }, + + fabHost: { + position: "absolute", + alignSelf: "center", + zIndex: 101, + }, +}); diff --git a/src/components/Library/AddBookModal.tsx b/src/components/Library/AddBookModal.tsx new file mode 100644 index 0000000..2aa6a3e --- /dev/null +++ b/src/components/Library/AddBookModal.tsx @@ -0,0 +1,178 @@ +import { ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Upload, X } from "lucide-react-native"; +import React from "react"; +import { + ActivityIndicator, + KeyboardAvoidingView, + Modal, + Platform, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from "react-native"; + +interface AddBookModalProps { + visible: boolean; + onClose: () => void; + bookTitle: string; + onTitleChange: (text: string) => void; + bookAuthor: string; + onAuthorChange: (text: string) => void; + totalPages: string; + onPagesChange: (text: string) => void; + loading: boolean; + onAddBook: () => void; +} + +export default function AddBookModal({ + visible, + onClose, + bookTitle, + onTitleChange, + bookAuthor, + onAuthorChange, + totalPages, + onPagesChange, + loading, + onAddBook, +}: AddBookModalProps) { + const { colors } = useTheme(); + const styles = StyleSheet.create({ + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.5)", + justifyContent: "flex-end", + }, + modalContainer: { + maxHeight: "90%", + backgroundColor: colors.surface, + borderTopLeftRadius: ROUNDNESS.lg, + borderTopRightRadius: ROUNDNESS.lg, + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.surfaceVariant, + }, + modalTitle: { + fontSize: 16, + fontWeight: "700", + color: colors.onSurface, + }, + modalField: { + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + }, + modalLabel: { + fontSize: 10, + fontWeight: "600", + color: colors.outline, + marginBottom: SPACING.sm, + letterSpacing: 0.5, + }, + modalInput: { + borderWidth: 1, + borderColor: colors.surfaceVariant, + borderRadius: ROUNDNESS.md, + paddingHorizontal: SPACING.md, + paddingVertical: SPACING.md, + fontSize: 14, + color: colors.onSurface, + backgroundColor: colors.background, + }, + primaryBtn: { + backgroundColor: colors.primary, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderRadius: ROUNDNESS.md, + gap: SPACING.sm, + marginHorizontal: SPACING.lg, + marginVertical: SPACING.md, + }, + primaryBtnText: { + color: colors.onPrimary, + fontSize: 14, + fontWeight: "600", + letterSpacing: 0.5, + }, + }); + + return ( + + + + + Add New Book + + + + + + + TITLE + + + + AUTHOR + + + + TOTAL PAGES + + + + {loading ? ( + + ) : ( + <> + + Add to Library + + )} + + + + + + ); +} diff --git a/src/components/Library/BookCard.tsx b/src/components/Library/BookCard.tsx new file mode 100644 index 0000000..78c0d9d --- /dev/null +++ b/src/components/Library/BookCard.tsx @@ -0,0 +1,128 @@ +import { ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Book as BookIcon, Play } from "lucide-react-native"; +import React from "react"; +import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; + +interface Book { + id: string; + title: string; + author: string; + total_pages: number; + current_page: number; + status: "reading" | "finished" | "want_to_read"; +} + +interface BookCardProps { + book: Book; + onPress: () => void; +} + +export default function BookCard({ book, onPress }: BookCardProps) { + const { colors } = useTheme(); + const styles = StyleSheet.create({ + bookCard: { + flex: 1, + backgroundColor: colors.surface, + borderRadius: ROUNDNESS.md, + overflow: "hidden", + marginBottom: SPACING.md, + }, + bookCover: { + height: 160, + backgroundColor: colors.surfaceVariant, + justifyContent: "center", + alignItems: "center", + position: "relative", + }, + resumeIndicator: { + position: "absolute", + top: 8, + right: 8, + backgroundColor: colors.primary, + width: 32, + height: 32, + borderRadius: 16, + justifyContent: "center", + alignItems: "center", + }, + progressOverlay: { + position: "absolute", + bottom: 8, + right: 8, + backgroundColor: "rgba(0,0,0,0.6)", + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 4, + }, + progressText: { + color: "#fff", + fontSize: 12, + fontWeight: "600", + }, + bookTitle: { + fontSize: 13, + fontWeight: "600", + color: colors.onSurface, + paddingHorizontal: SPACING.sm, + paddingTop: SPACING.sm, + }, + bookAuthor: { + fontSize: 11, + color: colors.outline, + paddingHorizontal: SPACING.sm, + }, + progressBarBg: { + height: 3, + backgroundColor: colors.surfaceVariant, + marginHorizontal: SPACING.sm, + marginVertical: SPACING.sm, + borderRadius: 1.5, + overflow: "hidden", + }, + progressBarFill: { + height: "100%", + borderRadius: 1.5, + }, + }); + + const progress = + book.total_pages > 0 + ? Math.round((book.current_page / book.total_pages) * 100) + : 0; + + return ( + + + + {book.status === "reading" && ( + + + + )} + + {progress}% + + + + {book.title} + + + {book.author} + + + + + + + ); +} diff --git a/src/components/Library/BookDetailsModal.tsx b/src/components/Library/BookDetailsModal.tsx new file mode 100644 index 0000000..438f2cd --- /dev/null +++ b/src/components/Library/BookDetailsModal.tsx @@ -0,0 +1,391 @@ +import { ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { useData } from "@/src/hooks/useData"; +import { + Book as BookIcon, + Clock, + Play, + Sparkles, + Trash2, + TrendingUp, + X, + ChevronRight, + Calendar, +} from "lucide-react-native"; +import React, { useMemo } from "react"; +import { + ActivityIndicator, + Modal, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from "react-native"; + +interface Book { + id: string; + title: string; + author: string; + total_pages: number; + current_page: number; + status: "reading" | "finished" | "want_to_read"; + file_uri: string; + updated_at: string; +} + +interface ReadingLog { + id: string; + start_page: number; + end_page: number; + pages_read: number; + duration_seconds: number; + logged_at: string; +} + +interface BookDetailsModalProps { + visible: boolean; + onClose: () => void; + book: Book | null; + isGeneratingAI: boolean; + onContinueReading: () => void; + onGenerateAI: () => void; + onDelete: () => void; +} + +export default function BookDetailsModal({ + visible, + onClose, + book, + isGeneratingAI, + onContinueReading, + onGenerateAI, + onDelete, +}: BookDetailsModalProps) { + const { colors } = useTheme(); + const styles = useMemo(() => createStyles(colors), [colors]); + + const { data: logs, loading: logsLoading } = useData( + "SELECT * FROM reading_logs WHERE book_id = ? ORDER BY logged_at DESC LIMIT 5", + [book?.id || ""], + ); + + const formatDuration = (seconds: number) => { + const mins = Math.floor(seconds / 60); + if (mins < 1) return "< 1 min"; + return `${mins} min${mins > 1 ? "s" : ""}`; + }; + + const formatDate = (dateStr: string) => { + const date = new Date(dateStr); + return date.toLocaleDateString(undefined, { + month: "short", + day: "numeric", + }); + }; + + return ( + + + + + Book Details + + + + + + {book && ( + + + + + + + {book.title} + {book.author} + + + + + {book.current_page} / {book.total_pages} pages + + + + + + Last read:{" "} + {new Date(book.updated_at).toLocaleDateString()} + + + + + + + + + Continue Reading + + + {/* Reading History Section */} + + + Reading History + + + + {logsLoading ? ( + + ) : logs.length > 0 ? ( + + {logs.map((log) => ( + + + + + {formatDate(log.logged_at)} + + + p. {log.start_page} → {log.end_page} + + + + + {formatDuration(log.duration_seconds)} + + +{log.pages_read} pages + + + ))} + + ) : ( + No reading sessions logged yet. + )} + + + + + {isGeneratingAI ? ( + + ) : ( + + )} + + Generate AI Insights + + + + + + Remove from Library + + + + )} + + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.5)", + justifyContent: "flex-end", + }, + modalContainer: { + maxHeight: "90%", + backgroundColor: colors.surface, + borderTopLeftRadius: ROUNDNESS.lg, + borderTopRightRadius: ROUNDNESS.lg, + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.surfaceVariant, + }, + modalTitle: { + fontSize: 16, + fontWeight: "700", + color: colors.onSurface, + }, + detailsHeader: { + flexDirection: "row", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.lg, + gap: SPACING.lg, + }, + bookCover: { + backgroundColor: colors.surfaceVariant, + borderRadius: ROUNDNESS.md, + justifyContent: "center", + alignItems: "center", + }, + detailsMeta: { + flex: 1, + justifyContent: "flex-start", + }, + detailsTitle: { + fontSize: 14, + fontWeight: "700", + color: colors.onSurface, + marginBottom: SPACING.sm, + }, + detailsAuthor: { + fontSize: 12, + color: colors.outline, + marginBottom: SPACING.md, + }, + detailsStats: { + gap: SPACING.sm, + }, + detailStatItem: { + flexDirection: "row", + alignItems: "center", + gap: SPACING.sm, + }, + detailStatText: { + fontSize: 11, + color: colors.onSurface, + }, + primaryBtn: { + backgroundColor: colors.primary, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderRadius: ROUNDNESS.md, + gap: SPACING.sm, + marginHorizontal: SPACING.lg, + marginVertical: SPACING.md, + }, + primaryBtnText: { + color: colors.onPrimary, + fontSize: 14, + fontWeight: "600", + letterSpacing: 0.5, + }, + historySection: { + paddingHorizontal: SPACING.lg, + marginVertical: SPACING.md, + }, + sectionHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginBottom: SPACING.md, + }, + sectionTitle: { + fontSize: 14, + fontWeight: "700", + color: colors.onSurface, + letterSpacing: 0.5, + }, + logsList: { + gap: SPACING.sm, + }, + logItem: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + backgroundColor: colors.surfaceVariant + "40", + padding: SPACING.md, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "20", + }, + logLeft: { + gap: 4, + }, + dateChip: { + flexDirection: "row", + alignItems: "center", + gap: 4, + backgroundColor: colors.primary + "15", + paddingHorizontal: 6, + paddingVertical: 2, + borderRadius: 4, + alignSelf: "flex-start", + }, + logDateText: { + fontSize: 9, + fontWeight: "600", + color: colors.primary, + }, + logPagesText: { + fontSize: 12, + fontWeight: "600", + color: colors.onSurface, + }, + logRight: { + alignItems: "flex-end", + gap: 2, + }, + logDurationText: { + fontSize: 11, + fontWeight: "600", + color: colors.onSurface, + }, + logDeltaText: { + fontSize: 10, + color: colors.outline, + }, + emptyLogsText: { + fontSize: 12, + color: colors.outline, + fontStyle: "italic", + textAlign: "center", + marginVertical: SPACING.md, + }, + actionSection: { + paddingHorizontal: SPACING.lg, + marginTop: SPACING.lg, + gap: SPACING.md, + }, + deleteActionBtn: { + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + marginBottom: SPACING.lg, + gap: SPACING.sm, + borderWidth: 1, + borderColor: colors.error + "30", + borderRadius: ROUNDNESS.md, + }, + deleteActionText: { + color: colors.error, + fontSize: 14, + fontWeight: "600", + letterSpacing: 0.5, + }, + }); + diff --git a/src/components/Library/BookGrid.tsx b/src/components/Library/BookGrid.tsx new file mode 100644 index 0000000..b81d9e4 --- /dev/null +++ b/src/components/Library/BookGrid.tsx @@ -0,0 +1,90 @@ +import { SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Upload } from "lucide-react-native"; +import React from "react"; +import { + ActivityIndicator, + StyleSheet, + Text, + TouchableOpacity, + View, +} from "react-native"; +import BookCard from "./BookCard"; + +interface Book { + id: string; + title: string; + author: string; + total_pages: number; + current_page: number; + status: "reading" | "finished" | "want_to_read"; + file_uri: string; + cover_uri: string; +} + +interface BookGridProps { + books: Book[]; + loading: boolean; + onBookPress: (book: Book) => void; + onEmptyPress: () => void; +} + +export default function BookGrid({ + books, + loading, + onBookPress, + onEmptyPress, +}: BookGridProps) { + const { colors } = useTheme(); + const styles = StyleSheet.create({ + bookGrid: { + paddingHorizontal: SPACING.lg, + gap: SPACING.md, + }, + emptyBookCard: { + flex: 1, + backgroundColor: colors.surfaceVariant + "40", + borderStyle: "dashed", + borderWidth: 2, + borderColor: colors.outline + "40", + borderRadius: 12, + padding: SPACING.lg, + alignItems: "center", + justifyContent: "center", + minHeight: 200, + gap: SPACING.md, + }, + emptyBookText: { + fontSize: 14, + fontWeight: "600", + color: colors.onSurface, + }, + emptyBookSub: { + fontSize: 12, + color: colors.outline, + }, + }); + + if (loading) { + return ( + + + + ); + } + + return ( + + {books.map((book) => ( + onBookPress(book)} /> + ))} + {books.length === 0 && ( + + + Your library is empty + Tap to add your first book + + )} + + ); +} diff --git a/src/components/Library/LibraryHeader.tsx b/src/components/Library/LibraryHeader.tsx new file mode 100644 index 0000000..9a82ec5 --- /dev/null +++ b/src/components/Library/LibraryHeader.tsx @@ -0,0 +1,74 @@ +import { SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { useRouter } from "expo-router"; +import { Menu, Settings } from "lucide-react-native"; +import React from "react"; +import { Image, StyleSheet, TouchableOpacity, View } from "react-native"; + +interface LibraryHeaderProps { + onSettingsPress?: () => void; + onMenuPress?: () => void; +} + +export default function LibraryHeader({ + onSettingsPress, + onMenuPress, +}: LibraryHeaderProps) { + const { colors } = useTheme(); + const router = useRouter(); + + const styles = StyleSheet.create({ + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + backgroundColor: colors.background, + height: 60, + }, + menuBtn: { + padding: 8, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + logoImage: { + height: 40, + width: 160, + }, + ghostBtn: { + padding: 8, + }, + }); + + return ( + + router.push("/menu"))} + > + + + + + + router.push("/modal"))} + > + + + + ); +} diff --git a/src/components/Library/LibraryStats.tsx b/src/components/Library/LibraryStats.tsx new file mode 100644 index 0000000..b48f08d --- /dev/null +++ b/src/components/Library/LibraryStats.tsx @@ -0,0 +1,67 @@ +import { SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { BookOpen, CheckCircle2, TrendingUp } from "lucide-react-native"; +import React, { useMemo } from "react"; +import { StyleSheet, Text, View } from "react-native"; + +interface LibraryStatsProps { + stats: { + reading: number; + finished: number; + pages: number; + }; +} + +export default function LibraryStats({ stats }: LibraryStatsProps) { + const { colors, isDark } = useTheme(); + const styles = useMemo(() => createStyles(colors, isDark), [colors, isDark]); + + return ( + + + + {stats.pages} + PAGES READ + + + + {stats.reading} + ACTIVE + + + + {stats.finished} + FINISHED + + + ); +} + +const createStyles = (colors: any, isDark: boolean) => + StyleSheet.create({ + statsSection: { + flexDirection: "row", + gap: SPACING.md, + marginVertical: SPACING.lg, + paddingHorizontal: SPACING.lg, + }, + statCard: { + flex: 1, + backgroundColor: colors.surfaceVariant, + borderRadius: 12, + padding: SPACING.md, + alignItems: "center", + gap: SPACING.sm, + }, + statValue: { + fontSize: 18, + fontWeight: "700", + color: colors.onSurface, + }, + statLabel: { + fontSize: 9, + fontWeight: "600", + color: colors.outline, + letterSpacing: 0.5, + }, + }); diff --git a/src/components/Library/NoteEditorModal.tsx b/src/components/Library/NoteEditorModal.tsx new file mode 100644 index 0000000..3817c90 --- /dev/null +++ b/src/components/Library/NoteEditorModal.tsx @@ -0,0 +1,138 @@ +import { ROUNDNESS, SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Save, X } from "lucide-react-native"; +import React from "react"; +import { + KeyboardAvoidingView, + Modal, + Platform, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from "react-native"; + +interface NoteEditorModalProps { + visible: boolean; + onClose: () => void; + currentPage: number; + currentNote: string; + onNoteChange: (text: string) => void; + onSave: () => void; + isEditing: boolean; +} + +export default function NoteEditorModal({ + visible, + onClose, + currentPage, + currentNote, + onNoteChange, + onSave, + isEditing, +}: NoteEditorModalProps) { + const { colors } = useTheme(); + const styles = StyleSheet.create({ + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.5)", + justifyContent: "flex-end", + }, + modalContainer: { + maxHeight: "90%", + backgroundColor: colors.surface, + borderTopLeftRadius: ROUNDNESS.lg, + borderTopRightRadius: ROUNDNESS.lg, + }, + modalHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.surfaceVariant, + }, + modalTitle: { + fontSize: 16, + fontWeight: "700", + color: colors.onSurface, + }, + modalField: { + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + }, + noteInput: { + minHeight: 120, + textAlignVertical: "top", + paddingTop: SPACING.md, + }, + modalInput: { + borderWidth: 1, + borderColor: colors.surfaceVariant, + borderRadius: ROUNDNESS.md, + paddingHorizontal: SPACING.md, + paddingVertical: SPACING.md, + fontSize: 14, + color: colors.onSurface, + backgroundColor: colors.background, + }, + primaryBtn: { + backgroundColor: colors.primary, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderRadius: ROUNDNESS.md, + gap: SPACING.sm, + marginHorizontal: SPACING.lg, + marginBottom: SPACING.lg, + }, + primaryBtnText: { + color: colors.onPrimary, + fontSize: 14, + fontWeight: "600", + letterSpacing: 0.5, + }, + }); + + return ( + + + + + + {isEditing ? "Edit Note" : `Add Note - Page ${currentPage}`} + + + + + + + + + + + + {isEditing ? "Update Note" : "Save Note"} + + + + + + ); +} diff --git a/src/components/Library/NotesPanel.tsx b/src/components/Library/NotesPanel.tsx new file mode 100644 index 0000000..1bf0ca6 --- /dev/null +++ b/src/components/Library/NotesPanel.tsx @@ -0,0 +1,140 @@ +import { SPACING } from "@/src/constants/Theme"; +import { useTheme } from "@/src/hooks/useTheme"; +import { Pencil, Plus, Trash2 } from "lucide-react-native"; +import React, { useMemo } from "react"; +import { + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from "react-native"; +import Animated from "react-native-reanimated"; + +interface Note { + id: string; + page: number; + content: string; + timestamp: string; + color?: string; +} + +interface NotesPanelProps { + currentPage: number; + notes: Note[]; + animatedStyle: any; + onAddNote: () => void; + onEditNote: (note: Note) => void; + onDeleteNote: (noteId: string) => void; +} + +export default function NotesPanel({ + currentPage, + notes, + animatedStyle, + onAddNote, + onEditNote, + onDeleteNote, +}: NotesPanelProps) { + const { colors } = useTheme(); + const styles = useMemo(() => createStyles(colors), [colors]); + + const currentPageNotes = notes.filter((note) => note.page === currentPage); + + return ( + + + Notes for Page {currentPage} + + + + + + {currentPageNotes.map((note) => ( + + + {note.content} + + {new Date(note.timestamp).toLocaleTimeString()} + + + + onEditNote(note)}> + + + onDeleteNote(note.id)}> + + + + + ))} + {currentPageNotes.length === 0 && ( + No notes for this page + )} + + + ); +} + +const createStyles = (colors: any) => + StyleSheet.create({ + notesPanel: { + position: "absolute", + bottom: 0, + left: 0, + right: 0, + backgroundColor: colors.surface, + borderTopWidth: 1, + borderTopColor: colors.surfaceVariant, + zIndex: 50, + }, + notesHeader: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.surfaceVariant, + }, + notesTitle: { + fontSize: 14, + fontWeight: "600", + color: colors.onSurface, + }, + notesList: { + maxHeight: 200, + }, + noteItem: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "flex-start", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + borderBottomWidth: 1, + borderBottomColor: colors.surfaceVariant, + }, + noteContent: { + flex: 1, + marginRight: SPACING.md, + }, + noteText: { + fontSize: 13, + color: colors.onSurface, + marginBottom: SPACING.xs, + }, + noteTimestamp: { + fontSize: 10, + color: colors.outline, + }, + noteActions: { + flexDirection: "row", + gap: SPACING.sm, + }, + noNotesText: { + fontSize: 12, + color: colors.outline, + textAlign: "center", + paddingVertical: SPACING.lg, + }, + }); diff --git a/src/components/Library/PdfReader.tsx b/src/components/Library/PdfReader.tsx new file mode 100644 index 0000000..1745bd6 --- /dev/null +++ b/src/components/Library/PdfReader.tsx @@ -0,0 +1,464 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { + StyleSheet, + View, + Text, + TouchableOpacity, + Dimensions, + ActivityIndicator, + TextInput, + Platform, +} from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import Animated, { + useSharedValue, + useAnimatedStyle, + withTiming, + FadeIn, + FadeOut, +} from 'react-native-reanimated'; +import { BlurView } from 'expo-blur'; +import { + X, + ChevronLeft, + Settings, + BookOpen, + MessageSquare, + Clock, + Play, + Pause, + ArrowRight +} from 'lucide-react-native'; +import { ROUNDNESS, SPACING } from '@/src/constants/Theme'; +import { useTheme } from '@/src/hooks/useTheme'; + +import Constants, { ExecutionEnvironment } from 'expo-constants'; + +import { WebView } from 'react-native-webview'; +import PDFReader from '@bildau/rn-pdf-reader'; +import * as FileSystem from 'expo-file-system/legacy'; + +// Safe PDF Component Wrapper +const PdfRendererComponent = React.memo((props: any) => { + const { source, style, onLoad, onPageChange, page } = props; + const [base64Source, setBase64Source] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + let isMounted = true; + + const loadSource = async () => { + if (Platform.OS === 'android' && source.startsWith('file://')) { + try { + console.log('[PdfReader] Android local file detected, reading as base64...'); + const base64 = await FileSystem.readAsStringAsync(source, { + encoding: FileSystem.EncodingType.Base64, + }); + if (isMounted) { + setBase64Source(`data:application/pdf;base64,${base64}`); + } + } catch (e: any) { + console.error('[PdfReader] Failed to read local file as base64:', e); + if (isMounted) { + setError(e.message); + } + } + } else { + if (isMounted) { + setBase64Source(null); + } + } + }; + + loadSource(); + return () => { isMounted = false; }; + }, [source]); + + // Memoize source object to avoid triggering PDFReader's componentDidUpdate unnecessarily + const memoizedSource = useMemo(() => { + if (base64Source) { + return { base64: base64Source }; + } + return { uri: source }; + }, [source, base64Source]); + + if (Platform.OS === 'android' && source.startsWith('file://') && !base64Source && !error) { + return ( + + + + ); + } + + return ( + { + // The library doesn't easily expose total pages here, + // but we can signal it's loaded. + onLoad?.(0); + }} + webviewProps={{ + onMessage: (event: any) => { + try { + const data = JSON.parse(event.nativeEvent.data); + if (data.type === 'pageChange') { + onPageChange?.(data.page - 1, data.total); + } + } catch (e) {} + } + }} + /> + ); +}); + +const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window'); + +interface PdfReaderProps { + uri: string; + title: string; + initialPage?: number; + onClose: () => void; + onPageChange?: (page: number, total: number) => void; + onSessionUpdate?: (seconds: number) => void; + onAddNote?: (page: number) => void; +} + +export const PdfReader: React.FC = ({ + uri, + title, + initialPage = 0, + onClose, + onPageChange, + onSessionUpdate, + onAddNote, +}) => { + const { colors, isDark } = useTheme(); + const insets = useSafeAreaInsets(); + + // State + const [currentPage, setCurrentPage] = useState(initialPage); + const [totalPages, setTotalPages] = useState(0); + const [controlsVisible, setControlsVisible] = useState(true); + const [sessionSeconds, setSessionSeconds] = useState(0); + const [isTimerRunning, setIsTimerRunning] = useState(true); + const [jumpToPage, setJumpToPage] = useState(''); + const [isLoading, setIsLoading] = useState(true); + + // Animations + const controlsOpacity = useSharedValue(1); + const topBarY = useSharedValue(0); + const bottomBarY = useSharedValue(0); + + // Timer logic + useEffect(() => { + let interval: NodeJS.Timeout | null = null; + if (isTimerRunning) { + interval = setInterval(() => { + setSessionSeconds(s => s + 1); + }, 1000); + } + return () => { + if (interval) clearInterval(interval); + }; + }, [isTimerRunning]); + + // Report session time to parent safely + useEffect(() => { + onSessionUpdate?.(sessionSeconds); + }, [sessionSeconds]); + + // Auto-hide controls + useEffect(() => { + let timer: NodeJS.Timeout; + if (controlsVisible) { + timer = setTimeout(() => { + toggleControls(false); + }, 5000); + } + return () => clearTimeout(timer); + }, [controlsVisible]); + + const toggleControls = useCallback((force?: boolean) => { + const nextVisible = force !== undefined ? force : !controlsVisible; + setControlsVisible(nextVisible); + + const targetOpacity = nextVisible ? 1 : 0; + const targetY = nextVisible ? 0 : -100; + const targetBottomY = nextVisible ? 0 : 100; + + controlsOpacity.value = withTiming(targetOpacity); + topBarY.value = withTiming(targetY); + bottomBarY.value = withTiming(targetBottomY); + }, [controlsVisible]); + + const animatedTopBarStyle = useAnimatedStyle(() => ({ + opacity: controlsOpacity.value, + transform: [{ translateY: topBarY.value }], + })); + + const animatedBottomBarStyle = useAnimatedStyle(() => ({ + opacity: controlsOpacity.value, + transform: [{ translateY: bottomBarY.value }], + })); + + const formatTime = (totalSeconds: number) => { + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, '0')}`; + }; + + const handlePageChange = useCallback((page: number, total: number) => { + setCurrentPage(page); + setTotalPages(total); + // Use a small delay to avoid "update while rendering" if called synchronously by PdfRenderer + setTimeout(() => { + onPageChange?.(page, total); + }, 0); + }, [onPageChange]); + + const handleLoad = useCallback((total: number) => { + setTotalPages(total); + setIsLoading(false); + }, []); + + const handleGoToPage = () => { + const page = parseInt(jumpToPage); + if (!isNaN(page) && page >= 1 && page <= totalPages) { + // In react-native-pdf-renderer, we might need a ref to the component to scroll + // For now, we update the state and assume the component reacts to it or we'll add a ref later + setCurrentPage(page - 1); + setJumpToPage(''); + } + }; + + return ( + + {/* PDF View */} + toggleControls()} + style={styles.pdfContainer} + > + + + {isLoading && ( + + + + )} + + + {/* Top Controls */} + + + + + + + + + + {title} + + + {currentPage + 1} / {totalPages} + + + + + + + {formatTime(sessionSeconds)} + + + + onAddNote?.(currentPage)} + style={styles.iconButton} + > + + + + + + + {/* Bottom Controls */} + + + + + + + + + + + setIsTimerRunning(!isTimerRunning)} + style={[styles.sessionButton, { backgroundColor: isTimerRunning ? colors.secondaryContainer : colors.primary }]} + > + {isTimerRunning ? ( + <> + + Pause Session + + ) : ( + <> + + Resume Session + + )} + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + pdfContainer: { + flex: 1, + }, + pdf: { + flex: 1, + width: SCREEN_WIDTH, + height: SCREEN_HEIGHT, + }, + loadingOverlay: { + ...StyleSheet.absoluteFillObject, + backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'center', + alignItems: 'center', + }, + topBarContainer: { + position: 'absolute', + left: SPACING.md, + right: SPACING.md, + zIndex: 1000, + }, + bottomBarContainer: { + position: 'absolute', + left: SPACING.md, + right: SPACING.md, + zIndex: 1000, + }, + glassBar: { + borderRadius: ROUNDNESS.full, + overflow: 'hidden', + padding: SPACING.sm, + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.1)', + }, + topBarContent: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: SPACING.sm, + }, + titleContainer: { + flex: 1, + marginHorizontal: SPACING.md, + alignItems: 'center', + }, + bookTitle: { + fontSize: 14, + fontWeight: '700', + textAlign: 'center', + }, + pageText: { + fontSize: 12, + color: 'rgba(128,128,128,0.8)', + marginTop: 2, + }, + iconButton: { + width: 40, + height: 40, + borderRadius: 20, + justifyContent: 'center', + alignItems: 'center', + }, + timerChip: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: 'rgba(255,255,255,0.1)', + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 12, + marginRight: SPACING.sm, + }, + timerText: { + fontSize: 12, + fontWeight: '600', + marginLeft: 4, + }, + bottomBarContent: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: SPACING.sm, + }, + jumpContainer: { + flexDirection: 'row', + alignItems: 'center', + flex: 1, + marginRight: SPACING.md, + }, + pageInput: { + width: 60, + height: 40, + borderRadius: 20, + borderWidth: 1, + paddingHorizontal: 12, + fontSize: 14, + backgroundColor: 'rgba(255,255,255,0.05)', + }, + goButton: { + width: 36, + height: 36, + borderRadius: 18, + justifyContent: 'center', + alignItems: 'center', + marginLeft: 8, + }, + sessionButton: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: 25, + }, + sessionButtonText: { + fontSize: 14, + fontWeight: '700', + marginLeft: 8, + }, +}); + +export default PdfReader; diff --git a/src/components/animated-splash-screen.tsx b/src/components/animated-splash-screen.tsx new file mode 100644 index 0000000..00dec2c --- /dev/null +++ b/src/components/animated-splash-screen.tsx @@ -0,0 +1,125 @@ +import React, { useEffect } from 'react'; +import { StyleSheet, View, Image, Dimensions, Text } from 'react-native'; +import Animated, { + useSharedValue, + useAnimatedStyle, + withTiming, + withSequence, + withDelay, + runOnJS, + Easing +} from 'react-native-reanimated'; + +const { width, height } = Dimensions.get('window'); + +interface Props { + onAnimationFinish: () => void; + backgroundColor: string; +} + +export function AnimatedSplashScreen({ onAnimationFinish, backgroundColor }: Props) { + const scale = useSharedValue(0.3); + const opacity = useSharedValue(0); + const footerOpacity = useSharedValue(0); + const containerOpacity = useSharedValue(1); + + const animatedLogoStyle = useAnimatedStyle(() => { + 'worklet'; + return { + transform: [{ scale: scale.value }], + opacity: opacity.value, + }; + }); + + const animatedFooterStyle = useAnimatedStyle(() => { + 'worklet'; + return { + opacity: footerOpacity.value, + transform: [{ translateY: withTiming(footerOpacity.value === 1 ? 0 : 20, { duration: 800 }) }], + }; + }); + + const animatedContainerStyle = useAnimatedStyle(() => { + 'worklet'; + return { + opacity: containerOpacity.value, + }; + }); + + useEffect(() => { + // Sequence: Fade in and scale up -> Hold -> Zoom in/Fade out container + scale.value = withTiming(1, { + duration: 1000, + easing: Easing.out(Easing.back(1.5)) + }); + opacity.value = withTiming(1, { duration: 800 }); + + // Fade in footer slightly later + footerOpacity.value = withDelay(400, withTiming(1, { duration: 800 })); + + containerOpacity.value = withDelay( + 2500, + withTiming(0, { duration: 500 }, (finished) => { + if (finished) { + runOnJS(onAnimationFinish)(); + } + }) + ); + }, []); + + return ( + + + + + + + powered by + + + + ); +} + +const styles = StyleSheet.create({ + container: { + ...StyleSheet.absoluteFillObject, + alignItems: 'center', + justifyContent: 'center', + zIndex: 9999, + }, + content: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + logo: { + width: width * 0.45, + height: width * 0.45, + }, + footer: { + position: 'absolute', + bottom: 50, + alignItems: 'center', + gap: 8, + }, + poweredBy: { + fontSize: 12, + color: '#94a3b8', + textTransform: 'lowercase', + letterSpacing: 1, + fontFamily: 'Manrope_400Regular', + }, + footerLogo: { + width: width * 0.3, + height: 40, + }, +}); diff --git a/src/components/chat/ChatHeader.tsx b/src/components/chat/ChatHeader.tsx new file mode 100644 index 0000000..6378eac --- /dev/null +++ b/src/components/chat/ChatHeader.tsx @@ -0,0 +1,77 @@ +import { SPACING, ThemeColors } from "@/src/constants/Theme"; +import { Menu, Settings } from "lucide-react-native"; +import React, { useMemo } from "react"; +import { Image, StyleSheet, TouchableOpacity, View } from "react-native"; + +interface ChatHeaderProps { + colors: ThemeColors; + onMenuPress: () => void; + onSettingsPress: () => void; +} + +const ChatHeader = ({ + colors, + onMenuPress, + onSettingsPress, +}: ChatHeaderProps) => { + const styles = useMemo(() => createStyles(colors), [colors]); + + return ( + + + + + + + + + + + + + + ); +}; + +const createStyles = (_colors: ThemeColors) => + StyleSheet.create({ + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingHorizontal: SPACING.lg, + paddingVertical: SPACING.md, + height: 60, + }, + iconButton: { + padding: 8, + }, + logoContainer: { + position: "absolute", + left: 0, + right: 0, + alignItems: "center", + justifyContent: "center", + zIndex: -1, + }, + logoImage: { + height: 40, + width: 160, + }, + }); + +export default React.memo(ChatHeader); diff --git a/src/components/chat/ChatInput.tsx b/src/components/chat/ChatInput.tsx new file mode 100644 index 0000000..8516513 --- /dev/null +++ b/src/components/chat/ChatInput.tsx @@ -0,0 +1,106 @@ +import { FONTS, ROUNDNESS, SPACING, ThemeColors } from "@/src/constants/Theme"; +import { Send } from "lucide-react-native"; +import React, { useMemo } from "react"; +import { + Platform, + StyleSheet, + TextInput, + TouchableOpacity, + View, +} from "react-native"; + +interface ChatInputProps { + inputText: string; + onChangeText: (text: string) => void; + onSend: (text: string) => void; + placeholder: string; + colors: ThemeColors; + disabled?: boolean; +} + +const ChatInput = ({ + inputText, + onChangeText, + onSend, + placeholder, + colors, + disabled = false, +}: ChatInputProps) => { + const styles = useMemo(() => createStyles(colors), [colors]); + + const handleSend = () => { + if (inputText.trim() && !disabled) { + onSend(inputText); + } + }; + + return ( + + + + + + + + + ); +}; + +const createStyles = (colors: ThemeColors) => + StyleSheet.create({ + inputSection: { + backgroundColor: colors.surface, + paddingBottom: Platform.OS === "ios" ? 10 : 20, + }, + inputBarContainer: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.surface, + marginHorizontal: SPACING.lg, + borderRadius: ROUNDNESS.xl, + borderWidth: 1, + borderColor: colors.outlineVariant + "80", + padding: 4, + marginBottom: 10, + }, + input: { + flex: 1, + fontFamily: FONTS.body, + fontSize: 15, + paddingHorizontal: 16, + height: 48, + color: colors.onSurface, + }, + sendButton: { + width: 40, + height: 40, + borderRadius: 20, + alignItems: "center", + justifyContent: "center", + }, + }); + +export default React.memo(ChatInput); diff --git a/src/components/chat/MessageBubble.tsx b/src/components/chat/MessageBubble.tsx new file mode 100644 index 0000000..8f4ec7e --- /dev/null +++ b/src/components/chat/MessageBubble.tsx @@ -0,0 +1,155 @@ +import TypingIndicator from "@/src/components/chat/TypingIndicator"; +import { FONTS, ROUNDNESS, SPACING, ThemeColors } from "@/src/constants/Theme"; +import { ChatMessage } from "@/src/types/chat"; +import { formatTime } from "@/src/utils/formatTime"; +import { CheckCircle2 } from "lucide-react-native"; +import React, { useMemo } from "react"; +import { StyleSheet, Text, View } from "react-native"; + +interface MessageBubbleProps { + message: ChatMessage; + isUser: boolean; + colors: ThemeColors; +} + +const MessageBubble = ({ message, isUser, colors }: MessageBubbleProps) => { + const styles = useMemo(() => createStyles(colors), [colors]); + const actionLabel = message.action?.replace(/_/g, " "); + const isSending = message.status === "sending"; + const hasError = message.status === "error"; + + return ( + + + {isSending ? ( + + ) : ( + + {message.content} + + )} + + {actionLabel ? ( + + + + {actionLabel} + + + ) : null} + + {hasError ? ( + + Unable to generate response. Tap send again. + + ) : null} + + + {formatTime(message.createdAt)} + + ); +}; + +const createStyles = (colors: ThemeColors) => + StyleSheet.create({ + messageWrapper: { + marginBottom: SPACING.lg, + maxWidth: "85%", + }, + aiMessageWrapper: { + alignSelf: "flex-start", + }, + userMessageWrapper: { + alignSelf: "flex-end", + alignItems: "flex-end", + }, + messageBubble: { + padding: 14, + borderRadius: ROUNDNESS.lg, + }, + aiBubble: { + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + borderTopLeftRadius: 4, + }, + userBubble: { + backgroundColor: colors.primary, + borderTopRightRadius: 4, + }, + messageText: { + fontFamily: FONTS.body, + fontSize: 15, + lineHeight: 22, + }, + aiText: { + color: colors.onSurface, + }, + userText: { + color: colors.onPrimary, + }, + actionBadge: { + flexDirection: "row", + alignItems: "center", + gap: 4, + marginTop: 8, + backgroundColor: "rgba(0,0,0,0.05)", + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 4, + alignSelf: "flex-start", + }, + actionText: { + fontFamily: FONTS.label, + fontSize: 9, + letterSpacing: 0.5, + textTransform: "uppercase", + }, + messageTime: { + fontFamily: FONTS.label, + fontSize: 9, + color: colors.onSurfaceVariant, + marginTop: 6, + }, + errorText: { + marginTop: 10, + fontFamily: FONTS.label, + fontSize: 11, + color: colors.error, + }, + }); + +const areEqual = (prev: MessageBubbleProps, next: MessageBubbleProps) => + prev.message.id === next.message.id && + prev.message.content === next.message.content && + prev.message.status === next.message.status && + prev.message.action === next.message.action && + prev.isUser === next.isUser && + prev.colors.primary === next.colors.primary && + prev.colors.surface === next.colors.surface && + prev.colors.onSurface === next.colors.onSurface; + +export default React.memo(MessageBubble, areEqual); diff --git a/src/components/chat/SuggestionChips.tsx b/src/components/chat/SuggestionChips.tsx new file mode 100644 index 0000000..84d64e6 --- /dev/null +++ b/src/components/chat/SuggestionChips.tsx @@ -0,0 +1,87 @@ +import { FONTS, ROUNDNESS, SPACING, ThemeColors } from "@/src/constants/Theme"; +import React, { useCallback } from "react"; +import { + FlatList, + StyleSheet, + Text, + TouchableOpacity, + View, +} from "react-native"; + +const suggestions = [ + "Audit my habits", + "Suggest a 2-min version", + "Log my workout", + "Help me build a morning routine", +] as const; + +interface SuggestionChipsProps { + colors: ThemeColors; + onSuggestionPress: (message: string) => void; + disabled?: boolean; +} + +const SuggestionChips = ({ + colors, + onSuggestionPress, + disabled = false, +}: SuggestionChipsProps) => { + const styles = createStyles(colors); + + const renderSuggestion = useCallback( + ({ item }: { item: string }) => ( + !disabled && onSuggestionPress(item)} + disabled={disabled} + accessibilityRole="button" + accessibilityLabel={`Send suggestion: ${item}`} + > + {item} + + ), + [onSuggestionPress, styles, disabled], + ); + + return ( + + item} + renderItem={renderSuggestion} + showsHorizontalScrollIndicator={false} + contentContainerStyle={styles.content} + ItemSeparatorComponent={() => } + /> + + ); +}; + +const createStyles = (colors: ThemeColors) => + StyleSheet.create({ + container: { + paddingVertical: SPACING.md, + }, + content: { + paddingHorizontal: SPACING.lg, + }, + suggestionSpacer: { + width: SPACING.sm, + }, + suggestionButton: { + backgroundColor: colors.surfaceVariant + "80", + paddingHorizontal: 12, + paddingVertical: 8, + borderRadius: ROUNDNESS.md, + borderWidth: 1, + borderColor: colors.outlineVariant + "33", + }, + suggestionText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + color: colors.onSurface, + }, + }); + +export default React.memo(SuggestionChips); diff --git a/src/components/chat/TypingIndicator.tsx b/src/components/chat/TypingIndicator.tsx new file mode 100644 index 0000000..2bf21a8 --- /dev/null +++ b/src/components/chat/TypingIndicator.tsx @@ -0,0 +1,48 @@ +import { FONTS, ROUNDNESS, ThemeColors } from "@/src/constants/Theme"; +import React, { useEffect, useMemo, useState } from "react"; +import { StyleSheet, Text, View } from "react-native"; + +interface TypingIndicatorProps { + colors: ThemeColors; +} + +const TypingIndicator = ({ colors }: TypingIndicatorProps) => { + const [dots, setDots] = useState(1); + const styles = useMemo(() => createStyles(colors), [colors]); + + useEffect(() => { + const interval = setInterval(() => { + setDots((value) => (value % 3) + 1); + }, 420); + + return () => clearInterval(interval); + }, []); + + return ( + + {`Architecting response${".".repeat(dots)}`} + + ); +}; + +const createStyles = (colors: ThemeColors) => + StyleSheet.create({ + wrapper: { + backgroundColor: colors.surface, + paddingVertical: 10, + paddingHorizontal: 12, + borderRadius: ROUNDNESS.lg, + borderWidth: 1, + borderColor: colors.outlineVariant + "4D", + }, + text: { + fontFamily: FONTS.body, + fontSize: 15, + lineHeight: 22, + color: colors.onSurface, + }, + }); + +export default React.memo(TypingIndicator); diff --git a/src/components/ui/CalendarStrip.tsx b/src/components/ui/CalendarStrip.tsx new file mode 100644 index 0000000..c3c929a --- /dev/null +++ b/src/components/ui/CalendarStrip.tsx @@ -0,0 +1,390 @@ +import React, { useMemo, useRef, useState, useEffect } from 'react'; +import { View, Text, TouchableOpacity, ScrollView, StyleSheet, Modal, Platform, FlatList } from 'react-native'; +import { FONTS, SPACING, ROUNDNESS } from '@/src/constants/Theme'; +import { getLocalDateString } from '@/src/lib/date-utils'; +import { Calendar as CalendarIcon, ChevronLeft, ChevronRight, X, Check } from 'lucide-react-native'; +import * as Haptics from 'expo-haptics'; + +interface CalendarStripProps { + selectedDate: string; // YYYY-MM-DD + onDateSelect: (date: string) => void; + colors: any; +} + +export const CalendarStrip: React.FC = ({ selectedDate, onDateSelect, colors }) => { + const scrollRef = useRef(null); + const [showPicker, setShowPicker] = useState(false); + + // Constants for scroll calculation + const ITEM_WIDTH = 55; + const GAP = 12; + + // Scroll to selected date on mount and when selectedDate changes + useEffect(() => { + // We want the selected item (index 7 in our 15-day range) to be centered + // Since we generate days centered around selectedDate, it's always at index 7 + const timer = setTimeout(() => { + if (scrollRef.current) { + // Approximate centering logic + // Each item + gap is ~67px. 7 items before = 469px. + // We want to scroll so the 8th item is in the middle of the screen. + scrollRef.current.scrollTo({ + x: (7 * (ITEM_WIDTH + GAP)) - 100, // Offset to bring it toward center + animated: true + }); + } + }, 100); + return () => clearTimeout(timer); + }, [selectedDate]); + + // Generate days centered around selectedDate + const days = useMemo(() => { + const result = []; + const centerDate = new Date(selectedDate + 'T00:00:00'); // Ensure local time + if (isNaN(centerDate.getTime())) return []; + + const start = new Date(centerDate); + start.setDate(centerDate.getDate() - 7); + + for (let i = 0; i < 15; i++) { + const d = new Date(start); + d.setDate(start.getDate() + i); + const dateStr = getLocalDateString(d); + result.push({ + date: dateStr, + dayName: d.toLocaleDateString('en-US', { weekday: 'short' }), + dayNum: d.getDate().toString(), + isToday: dateStr === getLocalDateString(new Date()), + }); + } + return result; + }, [selectedDate]); + + const handleDatePress = (date: string) => { + onDateSelect(date); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const openPicker = () => { + setShowPicker(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + }; + + return ( + + + + + + + + {days.map((day) => { + const isSelected = day.date === selectedDate; + + return ( + handleDatePress(day.date)} + activeOpacity={0.8} + style={[ + styles.dayCell, + isSelected && { backgroundColor: colors.primary } + ]} + > + + {day.dayName.toUpperCase()} + + + + + {day.dayNum} + + + + {day.isToday && !isSelected && ( + + )} + + ); + })} + + + + setShowPicker(false)} + selectedDate={selectedDate} + onSelect={(date) => { + onDateSelect(date); + setShowPicker(false); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + }} + colors={colors} + /> + + ); +}; + +const DatePickerModal = ({ visible, onClose, selectedDate, onSelect, colors }: any) => { + const [viewDate, setViewDate] = useState(new Date(selectedDate + 'T00:00:00')); + + useEffect(() => { + if (visible) { + setViewDate(new Date(selectedDate + 'T00:00:00')); + } + }, [visible, selectedDate]); + + const monthName = viewDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }); + + const daysInMonth = useMemo(() => { + const year = viewDate.getFullYear(); + const month = viewDate.getMonth(); + const firstDay = new Date(year, month, 1).getDay(); + const lastDate = new Date(year, month + 1, 0).getDate(); + + const days = []; + // Padding for start of month + for (let i = 0; i < firstDay; i++) { + days.push(null); + } + // Days of month + for (let i = 1; i <= lastDate; i++) { + days.push(new Date(year, month, i)); + } + return days; + }, [viewDate]); + + const changeMonth = (offset: number) => { + const next = new Date(viewDate); + next.setMonth(viewDate.getMonth() + offset); + setViewDate(next); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + return ( + + + + + Select Date + + + + + + + changeMonth(-1)} style={styles.navIconBtn}> + + + {monthName} + changeMonth(1)} style={styles.navIconBtn}> + + + + + + {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((d, i) => ( + {d} + ))} + + + + {daysInMonth.map((date, i) => { + if (!date) return ; + + const dateStr = getLocalDateString(date); + const isSelected = dateStr === selectedDate; + const isToday = dateStr === getLocalDateString(new Date()); + + return ( + onSelect(dateStr)} + > + + {date.getDate()} + + + ); + })} + + + onSelect(getLocalDateString(new Date()))} + > + GO TO TODAY + + + + + ); +}; + +const styles = StyleSheet.create({ + outerContainer: { + paddingVertical: SPACING.md, + backgroundColor: 'transparent', + }, + stripWithButton: { + flexDirection: 'row', + alignItems: 'center', + paddingLeft: SPACING.lg, + }, + pickerBtn: { + width: 44, + height: 44, + borderRadius: 22, + alignItems: 'center', + justifyContent: 'center', + marginRight: 12, + borderWidth: 1, + }, + container: { + paddingRight: SPACING.lg, + gap: 12, + alignItems: 'center', + }, + dayCell: { + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 12, + paddingHorizontal: 10, + borderRadius: 30, + minWidth: 55, + }, + dayName: { + fontFamily: FONTS.label, + fontSize: 10, + marginBottom: 8, + letterSpacing: 0.5, + }, + dayNumContainer: { + width: 32, + height: 32, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 16, + }, + dayNum: { + fontFamily: FONTS.headline, + fontSize: 15, + }, + todayIndicator: { + position: 'absolute', + bottom: 6, + width: 4, + height: 4, + borderRadius: 2, + }, + // Modal Styles + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'center', + padding: 24, + }, + modalContent: { + borderRadius: ROUNDNESS.xl, + padding: SPACING.lg, + elevation: 5, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + }, + modalHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: SPACING.lg, + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 20, + }, + closeBtn: { + padding: 4, + }, + monthNav: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: SPACING.lg, + backgroundColor: 'rgba(0,0,0,0.03)', + borderRadius: ROUNDNESS.md, + padding: 4, + }, + navIconBtn: { + padding: 10, + }, + monthLabel: { + fontFamily: FONTS.labelSm, + fontSize: 16, + textTransform: 'uppercase', + letterSpacing: 1, + }, + weekDaysRow: { + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 12, + }, + weekDayText: { + width: '14.28%', + textAlign: 'center', + fontFamily: FONTS.label, + fontSize: 12, + }, + calendarGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + marginBottom: SPACING.xl, + }, + calendarDayCell: { + width: '14.28%', + height: 40, + alignItems: 'center', + justifyContent: 'center', + }, + calendarDayText: { + fontFamily: FONTS.body, + fontSize: 15, + }, + todayBtn: { + borderWidth: 1, + paddingVertical: 12, + borderRadius: ROUNDNESS.md, + alignItems: 'center', + justifyContent: 'center', + }, + todayBtnText: { + fontFamily: FONTS.labelSm, + fontSize: 13, + letterSpacing: 1, + } +}); diff --git a/src/components/ui/TimeInput.tsx b/src/components/ui/TimeInput.tsx new file mode 100644 index 0000000..1b279bf --- /dev/null +++ b/src/components/ui/TimeInput.tsx @@ -0,0 +1,285 @@ +import React, { useState, useEffect } from 'react'; +import { + View, + Text, + TextInput, + StyleSheet, + TouchableOpacity, + Modal, + FlatList, + Platform +} from 'react-native'; +import { Clock, X, Check } from 'lucide-react-native'; +import { FONTS, ROUNDNESS, SPACING } from '@/src/constants/Theme'; +import { useTheme } from '@/src/hooks/useTheme'; +import * as Haptics from 'expo-haptics'; + +interface TimeInputProps { + value: string; + onChange: (time: string) => void; + label?: string; +} + +export const TimeInput: React.FC = ({ value, onChange, label }) => { + const { colors } = useTheme(); + const [tempValue, setTempValue] = useState(value); + const [showPicker, setShowPicker] = useState(false); + + useEffect(() => { + setTempValue(value); + }, [value]); + + const formatTime = (text: string) => { + // Remove non-digits + const cleaned = text.replace(/\D/g, ''); + + if (cleaned.length === 0) return ''; + + let hours = '00'; + let minutes = '00'; + + if (cleaned.length === 1) { + hours = cleaned.padStart(2, '0'); + } else if (cleaned.length === 2) { + hours = cleaned; + } else if (cleaned.length === 3) { + hours = cleaned.slice(0, 1).padStart(2, '0'); + minutes = cleaned.slice(1); + } else { + hours = cleaned.slice(0, 2); + minutes = cleaned.slice(2, 4); + } + + let h = parseInt(hours); + let m = parseInt(minutes); + + if (isNaN(h)) h = 0; + if (isNaN(m)) m = 0; + + if (h > 23) h = 23; + if (m > 59) m = 59; + + return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`; + }; + + const handleBlur = () => { + const formatted = formatTime(tempValue); + if (formatted) { + setTempValue(formatted); + onChange(formatted); + } else { + setTempValue(value); + } + }; + + // Dial Picker Logic + const HOURS = Array.from({ length: 24 }, (_, i) => String(i).padStart(2, '0')); + const MINUTES = Array.from({ length: 12 }, (_, i) => String(i * 5).padStart(2, '0')); + + const [selectedHour, setSelectedHour] = useState(value.split(':')[0] || '08'); + const [selectedMinute, setSelectedMinute] = useState(value.split(':')[1] || '00'); + + const openPicker = () => { + setSelectedHour(value.split(':')[0] || '08'); + setSelectedMinute(value.split(':')[1] || '00'); + setShowPicker(true); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }; + + const confirmPicker = () => { + const newTime = `${selectedHour}:${selectedMinute}`; + onChange(newTime); + setTempValue(newTime); + setShowPicker(false); + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + }; + + return ( + + {label && {label}} + + + + + + + + + + + + Select Time + setShowPicker(false)}> + + + + + + + HOUR + item} + showsVerticalScrollIndicator={false} + snapToInterval={40} + renderItem={({ item }) => ( + { + setSelectedHour(item); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + {item} + + + )} + style={styles.dialList} + /> + + + : + + + MIN + item} + showsVerticalScrollIndicator={false} + snapToInterval={40} + renderItem={({ item }) => ( + { + setSelectedMinute(item); + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + }} + > + + {item} + + + )} + style={styles.dialList} + /> + + + + + + Confirm Time + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + gap: 8, + }, + label: { + fontFamily: FONTS.labelSm, + fontSize: 11, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'center', + borderRadius: ROUNDNESS.md, + borderWidth: 1, + paddingHorizontal: 12, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + height: 52, + fontFamily: FONTS.body, + fontSize: 16, + }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'flex-end', + }, + modalContent: { + borderTopLeftRadius: ROUNDNESS.xl, + borderTopRightRadius: ROUNDNESS.xl, + padding: SPACING.lg, + paddingBottom: Platform.OS === 'ios' ? 40 : 20, + }, + modalHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: SPACING.xl, + }, + modalTitle: { + fontFamily: FONTS.headline, + fontSize: 18, + }, + pickerContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 20, + height: 200, + marginBottom: SPACING.xl, + }, + dialWrapper: { + alignItems: 'center', + width: 80, + }, + dialLabel: { + fontFamily: FONTS.label, + fontSize: 10, + marginBottom: 8, + }, + dialList: { + height: 160, + width: '100%', + }, + dialItem: { + height: 40, + alignItems: 'center', + justifyContent: 'center', + borderRadius: ROUNDNESS.sm, + }, + dialText: { + fontFamily: FONTS.labelSm, + fontSize: 20, + }, + separator: { + fontFamily: FONTS.headline, + fontSize: 24, + marginTop: 20, + }, + confirmBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + height: 56, + borderRadius: ROUNDNESS.full, + }, + confirmBtnText: { + fontFamily: FONTS.labelSm, + fontSize: 16, + }, +}); diff --git a/src/constants/Theme.ts b/src/constants/Theme.ts new file mode 100644 index 0000000..21abec4 --- /dev/null +++ b/src/constants/Theme.ts @@ -0,0 +1,132 @@ +export const ACCENTS = { + slate: { + label: "Modern Slate", + primary: "#334155", + primaryContainer: "#f1f5f9", + onPrimaryContainer: "#0f172a", + }, + blue: { + label: "Ocean Blue", + primary: "#4e607b", + primaryContainer: "#d3e3ff", + onPrimaryContainer: "#40536d", + }, + pink: { + label: "Rose Pink", + primary: "#a8385a", + primaryContainer: "#ffd9df", + onPrimaryContainer: "#3e001a", + }, + red: { + label: "Crimson Rust", + primary: "#a84c36", + primaryContainer: "#ffdad2", + onPrimaryContainer: "#3e0a01", + }, + purple: { + label: "Royal Amethyst", + primary: "#7c4dff", + primaryContainer: "#e0e0ff", + onPrimaryContainer: "#2c0091", + }, + orange: { + label: "Deep Amber", + primary: "#f57c00", + primaryContainer: "#fff3e0", + onPrimaryContainer: "#e65100", + }, + teal: { + label: "Deep Teal", + primary: "#00796b", + primaryContainer: "#e0f2f1", + onPrimaryContainer: "#004d40", + }, + emerald: { + label: "Vibrant Emerald", + primary: "#2e7d32", + primaryContainer: "#e8f5e9", + onPrimaryContainer: "#1b5e20", + }, +}; + +export type AccentKey = keyof typeof ACCENTS; + +export const COLORS = { + light: { + primary: "#334155", // Slate + onPrimary: "#f8faf9", + primaryContainer: "#f1f5f9", + onPrimaryContainer: "#0f172a", + secondary: "#4e607b", // Soft Blue + onSecondary: "#f8f8ff", + secondaryContainer: "#d3e3ff", + onSecondaryContainer: "#40536d", + tertiary: "#655b6f", // Muted Lavender + onTertiary: "#fef6ff", + background: "#f8faf9", // Off-white + onBackground: "#2d3433", + surface: "#f8faf9", + onSurface: "#2d3433", + surfaceVariant: "#eaefee", + onSurfaceVariant: "#596060", + outline: "#757c7b", + outlineVariant: "#acb3b2", + error: "#a83836", + onError: "#fff7f6", + }, + dark: { + primary: "#94a3b8", // Light Slate + onPrimary: "#0f172a", + primaryContainer: "#1e293b", + onPrimaryContainer: "#f1f5f9", + secondary: "#c2d6f5", // Tonal lighter Soft Blue + onSecondary: "#2e405a", + secondaryContainer: "#4a5d77", + onSecondaryContainer: "#d3e3ff", + tertiary: "#e5d8f0", // Tonal lighter Lavender + onTertiary: "#4a4154", + background: "#000000", // Pure black + onBackground: "#f1f4f3", + surface: "#000000", + onSurface: "#f1f4f3", + surfaceVariant: "#1a1a1a", + onSurfaceVariant: "#acb3b2", + outline: "#acb3b2", + outlineVariant: "#596060", + error: "#fa746f", + onError: "#6e0a12", + }, +}; + +export type ThemeColors = typeof COLORS.light; + +export const SPACING = { + xs: 4, + sm: 8, + md: 16, + lg: 24, + xl: 32, + xxl: 48, + giant: 64, +}; + +export const ROUNDNESS = { + none: 0, + sm: 4, + md: 8, + lg: 12, + xl: 24, + full: 9999, +}; + +export const FONTS = { + headline: "Manrope_700Bold", + body: "Manrope_400Regular", + label: "PlusJakartaSans_500Medium", + labelSm: "PlusJakartaSans_700Bold", +}; + +export const GRID_STYLE = { + ghostBorder: (scheme: "light" | "dark") => + scheme === "light" ? "rgba(51, 65, 85, 0.1)" : "rgba(148, 163, 184, 0.1)", +}; diff --git a/src/db/database.ts b/src/db/database.ts new file mode 100644 index 0000000..816f93c --- /dev/null +++ b/src/db/database.ts @@ -0,0 +1,195 @@ +import * as SQLite from 'expo-sqlite'; + +export const DATABASE_NAME = 'batsir.db'; + +let dbInstance: SQLite.SQLiteDatabase | null = null; +let initPromise: Promise | null = null; + +export const initDatabase = async () => { + if (initPromise) return initPromise; + + initPromise = (async () => { + if (!dbInstance) { + dbInstance = await SQLite.openDatabaseAsync(DATABASE_NAME); + } + const db = dbInstance; + + await db.execAsync('PRAGMA journal_mode = WAL;'); + + const tables = [ + `CREATE TABLE IF NOT EXISTS habits ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + title TEXT NOT NULL, + frequency TEXT NOT NULL DEFAULT 'daily', + preferred_time TEXT, + weekend_flexibility INTEGER DEFAULT 0, + is_active INTEGER DEFAULT 1, + current_streak INTEGER DEFAULT 0, + max_streak INTEGER DEFAULT 0, + two_minute_version TEXT, + location TEXT, + anchor_habit_id TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS schedules ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + date TEXT NOT NULL, + time_blocks TEXT NOT NULL DEFAULT '[]', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS logs ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + habit_id TEXT NOT NULL, + status TEXT NOT NULL, + logged_at TEXT DEFAULT (datetime('now')), + created_at TEXT DEFAULT (datetime('now')), + FOREIGN KEY (habit_id) REFERENCES habits (id) ON DELETE CASCADE + );`, + `CREATE TABLE IF NOT EXISTS sync_queue ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + table_name TEXT NOT NULL, + operation TEXT NOT NULL, + payload TEXT NOT NULL, + created_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS shortcuts ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + title TEXT NOT NULL, + url TEXT NOT NULL, + icon TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY NOT NULL, + value TEXT NOT NULL + );`, + `CREATE TABLE IF NOT EXISTS tasks ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + title TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'todo', + estimated_sessions INTEGER DEFAULT 1, + completed_sessions INTEGER DEFAULT 0, + tag TEXT, + todos TEXT NOT NULL DEFAULT '[]', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS sync_history ( + old_id TEXT PRIMARY KEY NOT NULL, + new_id TEXT NOT NULL, + table_name TEXT NOT NULL, + synced_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS books ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + title TEXT NOT NULL, + author TEXT, + total_pages INTEGER DEFAULT 0, + current_page INTEGER DEFAULT 0, + last_page_read INTEGER DEFAULT 0, + file_uri TEXT, + cover_uri TEXT, + status TEXT DEFAULT 'want_to_read', + synthesis TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + );`, + `CREATE TABLE IF NOT EXISTS reading_logs ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + book_id TEXT NOT NULL, + start_page INTEGER DEFAULT 0, + end_page INTEGER DEFAULT 0, + pages_read INTEGER DEFAULT 0, + duration_minutes REAL DEFAULT 0, + duration_seconds REAL DEFAULT 0, + logged_at TEXT DEFAULT (datetime('now')), + FOREIGN KEY (book_id) REFERENCES books (id) ON DELETE CASCADE + );`, + `CREATE TABLE IF NOT EXISTS reading_sessions ( + book_id TEXT PRIMARY KEY NOT NULL, + start_time INTEGER NOT NULL, + start_page INTEGER NOT NULL, + last_update_time INTEGER NOT NULL, + accumulated_time INTEGER NOT NULL, + notes TEXT NOT NULL, + FOREIGN KEY (book_id) REFERENCES books (id) ON DELETE CASCADE + );`, + `CREATE TABLE IF NOT EXISTS bookmarks ( + id TEXT PRIMARY KEY NOT NULL, + user_id TEXT, + book_id TEXT NOT NULL, + page_number INTEGER NOT NULL, + note TEXT, + created_at TEXT DEFAULT (datetime('now')), + FOREIGN KEY (book_id) REFERENCES books (id) ON DELETE CASCADE + );` + ]; + + for (const tableSql of tables) { + try { + await db.execAsync(tableSql); + } catch (err) { + console.error('Error creating table:', err, tableSql); + throw err; + } + } + + try { + const habitsInfo = await db.getAllAsync(`PRAGMA table_info(habits)`); + const hCols = (habitsInfo as any[]).map(c => c.name); + if (!hCols.includes('preferred_time')) await db.execAsync(`ALTER TABLE habits ADD COLUMN preferred_time TEXT;`); + if (!hCols.includes('weekend_flexibility')) await db.execAsync(`ALTER TABLE habits ADD COLUMN weekend_flexibility INTEGER DEFAULT 0;`); + if (!hCols.includes('current_streak')) await db.execAsync(`ALTER TABLE habits ADD COLUMN current_streak INTEGER DEFAULT 0;`); + if (!hCols.includes('max_streak')) await db.execAsync(`ALTER TABLE habits ADD COLUMN max_streak INTEGER DEFAULT 0;`); + if (!hCols.includes('two_minute_version')) await db.execAsync(`ALTER TABLE habits ADD COLUMN two_minute_version TEXT;`); + if (!hCols.includes('location')) await db.execAsync(`ALTER TABLE habits ADD COLUMN location TEXT;`); + if (!hCols.includes('anchor_habit_id')) await db.execAsync(`ALTER TABLE habits ADD COLUMN anchor_habit_id TEXT;`); + + const taskInfo = await db.getAllAsync(`PRAGMA table_info(tasks)`); + const tCols = (taskInfo as any[]).map(c => c.name); + if (!tCols.includes('todos')) await db.execAsync(`ALTER TABLE tasks ADD COLUMN todos TEXT NOT NULL DEFAULT '[]';`); + + const readingLogInfo = await db.getAllAsync(`PRAGMA table_info(reading_logs)`); + const rlCols = (readingLogInfo as any[]).map(c => c.name); + if (!rlCols.includes('user_id')) await db.execAsync(`ALTER TABLE reading_logs ADD COLUMN user_id TEXT;`); + if (!rlCols.includes('duration_seconds')) await db.execAsync(`ALTER TABLE reading_logs ADD COLUMN duration_seconds REAL DEFAULT 0;`); + if (!rlCols.includes('start_page')) await db.execAsync(`ALTER TABLE reading_logs ADD COLUMN start_page INTEGER DEFAULT 0;`); + if (!rlCols.includes('end_page')) await db.execAsync(`ALTER TABLE reading_logs ADD COLUMN end_page INTEGER DEFAULT 0;`); + + const bookmarksInfo = await db.getAllAsync(`PRAGMA table_info(bookmarks)`); + const bCols = (bookmarksInfo as any[]).map(c => c.name); + if (bCols.length > 0 && !bCols.includes('user_id')) { + await db.execAsync(`ALTER TABLE bookmarks ADD COLUMN user_id TEXT;`); + } + + const logsInfo = await db.getAllAsync(`PRAGMA table_info(logs)`); + const lCols = (logsInfo as any[]).map(c => c.name); + if (!lCols.includes('user_id')) await db.execAsync(`ALTER TABLE logs ADD COLUMN user_id TEXT;`); + + const booksInfo = await db.getAllAsync(`PRAGMA table_info(books)`); + const bookCols = (booksInfo as any[]).map(c => c.name); + if (!bookCols.includes('last_page_read')) await db.execAsync(`ALTER TABLE books ADD COLUMN last_page_read INTEGER DEFAULT 0;`); + if (!bookCols.includes('synthesis')) await db.execAsync(`ALTER TABLE books ADD COLUMN synthesis TEXT;`); + } catch (error) { + console.error('Migration error:', error); + } + + return db; + })(); + + return initPromise; +}; + +export const getDb = async () => { + return initDatabase(); +}; diff --git a/src/db/database.web.ts b/src/db/database.web.ts new file mode 100644 index 0000000..0c1458a --- /dev/null +++ b/src/db/database.web.ts @@ -0,0 +1,12 @@ +export const DATABASE_NAME = "batsir.db"; + +export const initDatabase = async () => { + // SQLite is not directly available in standard web without extra configuration + // For web, we usually mock or use a different adapter. + // In Expo 51+, expo-sqlite handles web via an Op-SQLite or similar wrapper if configured. + return null; +}; + +export const getDb = async () => { + return null; +}; diff --git a/src/hooks/useAIChat.ts b/src/hooks/useAIChat.ts new file mode 100644 index 0000000..aa35a3c --- /dev/null +++ b/src/hooks/useAIChat.ts @@ -0,0 +1,118 @@ +import { buildSystemPrompt, callAiAssistant } from "@/src/services/aiService"; +import { + createAssistantMessage, + createUserMessage, + saveChatMessage, + serializeHistoryMessage, +} from "@/src/services/chatService"; +import { ChatMessage } from "@/src/types/chat"; +import type { MutableRefObject } from "react"; +import { useCallback, useState } from "react"; + +interface UseAIChatProps { + userId: string | null; + identityAnchor: string; + habitContext: string; + messagesRef: MutableRefObject; + appendMessage: (message: ChatMessage | ChatMessage[]) => void; + updateMessage: (id: string, patch: Partial) => void; +} + +export function useAIChat({ + userId, + identityAnchor, + habitContext, + messagesRef, + appendMessage, + updateMessage, +}: UseAIChatProps) { + const [isSending, setIsSending] = useState(false); + const [error, setError] = useState(null); + + const sendMessage = useCallback( + async (rawText: string) => { + console.log("[useAIChat] sendMessage started", { rawText }); + const content = rawText.trim(); + if (!content) return; + if (!userId) { + console.warn("[useAIChat] No userId found"); + setError(new Error("Authentication required to chat.")); + return; + } + + const userMessage = createUserMessage(content); + const pendingAssistantMessage = createAssistantMessage("", "sending"); + + console.log("[useAIChat] Appending user and pending messages"); + appendMessage([userMessage, pendingAssistantMessage]); + + const systemPrompt = buildSystemPrompt(identityAnchor, habitContext); + setIsSending(true); + setError(null); + + const conversation = [...[...messagesRef.current].reverse(), userMessage].map( + serializeHistoryMessage, + ); + console.log("[useAIChat] Prepared conversation length:", conversation.length); + + try { + await saveChatMessage(userId, userMessage); + console.log("[useAIChat] User message saved to DB"); + } catch (saveError) { + console.warn("[useAIChat] Unable to persist user message:", saveError); + } + + try { + console.log("[useAIChat] Calling AI Assistant..."); + const response = await callAiAssistant(conversation, systemPrompt); + console.log("[useAIChat] AI Response received", { hasReply: !!response.reply }); + + const reply = + response.reply ?? + "I'm here to help — let's try again with a clearer request."; + + updateMessage(pendingAssistantMessage.id, { + content: reply, + status: "sent", + createdAt: Date.now(), + }); + console.log("[useAIChat] Updated UI with AI reply"); + + try { + await saveChatMessage(userId, { + ...pendingAssistantMessage, + content: reply, + status: "sent", + createdAt: Date.now(), + }); + console.log("[useAIChat] AI response saved to DB"); + } catch (saveError) { + console.warn("[useAIChat] Unable to persist assistant response:", saveError); + } + } catch (aiError) { + console.error("[useAIChat] AI Error:", aiError); + const fallback = + "I'm sorry, I'm having trouble connecting to the system. Please try again in a moment."; + updateMessage(pendingAssistantMessage.id, { + content: fallback, + status: "error", + createdAt: Date.now(), + }); + setError(aiError as Error); + } finally { + setIsSending(false); + console.log("[useAIChat] sendMessage finished"); + } + }, + [ + appendMessage, + habitContext, + identityAnchor, + messagesRef, + updateMessage, + userId, + ], + ); + + return { isSending, sendMessage, error }; +} diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000..814b63f --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,41 @@ +import { useState, useEffect } from 'react'; +import { supabase } from '../lib/supabase'; +import { Session, User } from '@supabase/supabase-js'; + +export function useAuth() { + const [session, setSession] = useState(null); + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + // Check active sessions and sets the user + supabase.auth.getSession().then(({ data: { session } }) => { + setSession(session); + setUser(session?.user ?? null); + setLoading(false); + }); + + // Listen for changes on auth state + const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => { + setSession(session); + setUser(session?.user ?? null); + setLoading(false); + }); + + return () => { + subscription.unsubscribe(); + }; + }, []); + + const signOut = async () => { + await supabase.auth.signOut(); + }; + + return { + session, + user, + loading, + signOut, + isAuthenticated: !!user, + }; +} diff --git a/src/hooks/useAutoHideTabBar.tsx b/src/hooks/useAutoHideTabBar.tsx new file mode 100644 index 0000000..af7c75a --- /dev/null +++ b/src/hooks/useAutoHideTabBar.tsx @@ -0,0 +1,120 @@ +import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; +import { NativeScrollEvent, NativeSyntheticEvent, Platform, Keyboard } from 'react-native'; +import { usePathname } from 'expo-router'; + +type AutoHideScrollContextType = { + tabBarVisible: boolean; + showTabBar: () => void; + hideTabBar: () => void; + onScroll: (event: NativeSyntheticEvent) => void; +}; + +const AutoHideScrollContext = createContext(undefined); + +const HIDE_THRESHOLD = 20; // Requirement: 15-20px +const SHOW_THRESHOLD = 15; + +export function TabBarVisibilityProvider({ children }: { children: React.ReactNode }) { + const [tabBarVisible, setTabBarVisible] = useState(true); + const [isKeyboardVisible, setIsKeyboardVisible] = useState(false); + const lastScrollYRef = useRef(0); + const pathname = usePathname(); + + // Keyboard awareness - Requirement: Don't hide if keyboard is open + useEffect(() => { + const showSubscription = Keyboard.addListener( + Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow', + () => { + setIsKeyboardVisible(true); + setTabBarVisible(true); // Always show when keyboard comes up + } + ); + const hideSubscription = Keyboard.addListener( + Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide', + () => { + setIsKeyboardVisible(false); + } + ); + + return () => { + showSubscription.remove(); + hideSubscription.remove(); + }; + }, []); + + // Reset visibility on navigation + useEffect(() => { + setTabBarVisible(true); + lastScrollYRef.current = 0; + }, [pathname]); + + const showTabBar = useCallback(() => { + setTabBarVisible(true); + }, []); + + const hideTabBar = useCallback(() => { + setTabBarVisible(false); + }, []); + + const onScroll = useCallback((event: NativeSyntheticEvent) => { + // Requirement: Don't hide if keyboard is open + if (isKeyboardVisible) return; + + const offsetY = event.nativeEvent.contentOffset.y; + const contentHeight = event.nativeEvent.contentSize.height; + const layoutHeight = event.nativeEvent.layoutMeasurement.height; + + // Requirement: Reset when scroll stops at top (offset = 0) + if (offsetY <= 0) { + setTabBarVisible(true); + lastScrollYRef.current = 0; + return; + } + + // Don't hide if content is smaller than screen + if (contentHeight <= layoutHeight) { + setTabBarVisible(true); + return; + } + + // Ignore bounce effects at bottom + if (offsetY > contentHeight - layoutHeight) { + return; + } + + const delta = offsetY - lastScrollYRef.current; + + if (delta > HIDE_THRESHOLD) { + // Scrolling down (content goes up) -> hide full bar + setTabBarVisible(false); + lastScrollYRef.current = offsetY; + } else if (delta < -SHOW_THRESHOLD) { + // Scrolling up (content comes down) -> show full bar + setTabBarVisible(true); + lastScrollYRef.current = offsetY; + } + }, [isKeyboardVisible]); + + const value = useMemo( + () => ({ tabBarVisible, showTabBar, hideTabBar, onScroll }), + [tabBarVisible, showTabBar, hideTabBar, onScroll] + ); + + return {children}; +} + +export function useTabBarVisibility() { + const context = useContext(AutoHideScrollContext); + if (!context) { + throw new Error('useTabBarVisibility must be used within TabBarVisibilityProvider'); + } + return context; +} + +export function useAutoHideOnScroll() { + const context = useTabBarVisibility(); + return { + onScroll: context.onScroll, + scrollEventThrottle: 16, + }; +} diff --git a/src/hooks/useChatHistory.ts b/src/hooks/useChatHistory.ts new file mode 100644 index 0000000..11de5a5 --- /dev/null +++ b/src/hooks/useChatHistory.ts @@ -0,0 +1,87 @@ +import { + createGreetingMessage, + fetchChatHistory, +} from "@/src/services/chatService"; +import { ChatMessage } from "@/src/types/chat"; +import { useCallback, useEffect, useRef, useState } from "react"; + +export function useChatHistory(userId: string | null) { + const [messages, setMessages] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const messagesRef = useRef(messages); + + useEffect(() => { + messagesRef.current = messages; + }, [messages]); + + const setStableMessages = useCallback( + (action: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => { + setMessages((prev) => { + const next = typeof action === "function" ? action(prev) : action; + messagesRef.current = next; + return next; + }); + }, + [], + ); + + const appendMessage = useCallback( + (next: ChatMessage | ChatMessage[]) => { + setStableMessages((prev) => { + const nextMessages = Array.isArray(next) ? next : [next]; + // Prepend so the newest messages are at index 0 + return [...nextMessages.reverse(), ...prev]; + }); + }, + [setStableMessages], + ); + + const updateMessage = useCallback( + (id: string, patch: Partial) => { + setStableMessages((prev) => + prev.map((item) => (item.id === id ? { ...item, ...patch } : item)), + ); + }, + [setStableMessages], + ); + + const refresh = useCallback(async () => { + if (!userId) { + setStableMessages([createGreetingMessage()]); + setIsLoading(false); + return; + } + + setIsLoading(true); + try { + const history = await fetchChatHistory(userId); + if (history.length > 0) { + setStableMessages(history); + } else { + setStableMessages([createGreetingMessage()]); + } + setError(null); + } catch (err) { + console.error("Chat history fetch failed:", err); + setError(err as Error); + setStableMessages([createGreetingMessage()]); + } finally { + setIsLoading(false); + } + }, [userId, setStableMessages]); + + useEffect(() => { + refresh(); + }, [refresh]); + + return { + messages, + messagesRef, + isLoading, + error, + appendMessage, + updateMessage, + refresh, + }; +} diff --git a/src/hooks/useData.ts b/src/hooks/useData.ts new file mode 100644 index 0000000..2b2c336 --- /dev/null +++ b/src/hooks/useData.ts @@ -0,0 +1,108 @@ +import { useCallback, useEffect, useState, useRef } from "react"; +import { getDb } from "../db/database"; +import { subscribeToDatabaseChanges } from "../lib/sync"; + +export function useData(query: string, params: any[] = []) { + const [data, setData] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const paramsRef = useRef(JSON.stringify(params)); + const queryRef = useRef(query); + const dataRef = useRef(JSON.stringify([])); + + const fetchData = useCallback( + async (isCancelled: () => boolean) => { + // Don't set loading true if we already have data to avoid jitter + // unless it's the first load + try { + const db = await getDb(); + if (!db) { + if (!isCancelled()) setData([]); + return; + } + + const currentParams = JSON.parse(paramsRef.current); + const sanitizedParams = currentParams.map((p: any) => + p === null || p === undefined ? null : String(p), + ); + + if (!queryRef.current) { + console.warn("useData: query is empty, skipping execution."); + if (!isCancelled()) { + setData([]); + setLoading(false); + } + return; + } + + const result = await db.getAllAsync(queryRef.current, sanitizedParams); + + if (!isCancelled()) { + const stringifiedResult = JSON.stringify(result); + // ONLY update state if the data actually changed + if (stringifiedResult !== dataRef.current) { + dataRef.current = stringifiedResult; + setData(result as T[]); + // Log a bit more context to help debugging + const shortQuery = queryRef.current.replace(/\s+/g, ' ').substring(0, 80); + console.log("DATABASE DATA UPDATED", { query: shortQuery, count: result.length }); + } + setError(null); + } + } catch (err) { + if (!isCancelled()) { + console.error("Database query error:", err, queryRef.current, paramsRef.current); + setError(err as Error); + } + } finally { + if (!isCancelled()) { + setLoading(false); + } + } + }, + [], + ); + + // Handle parameter changes + useEffect(() => { + const stringifiedParams = JSON.stringify(params); + if (stringifiedParams !== paramsRef.current || query !== queryRef.current) { + paramsRef.current = stringifiedParams; + queryRef.current = query; + setLoading(true); + fetchData(() => false); + } + }, [query, JSON.stringify(params), fetchData]); + + // Handle external database changes with a small debounce + useEffect(() => { + let cancelled = false; + const isCancelled = () => cancelled; + let timeout: any = null; + + fetchData(isCancelled); + + const unsubscribe = subscribeToDatabaseChanges(() => { + if (cancelled) return; + + // Debounce the re-fetch to handle batch mutations + if (timeout) clearTimeout(timeout); + timeout = setTimeout(() => { + if (!cancelled) { + fetchData(isCancelled); + } + }, 50); + }); + + return () => { + cancelled = true; + if (timeout) clearTimeout(timeout); + unsubscribe(); + }; + }, [fetchData]); + + const refresh = useCallback(() => fetchData(() => false), [fetchData]); + + return { data, loading, error, refresh }; +} diff --git a/src/hooks/useHabitSummary.ts b/src/hooks/useHabitSummary.ts new file mode 100644 index 0000000..f14f291 --- /dev/null +++ b/src/hooks/useHabitSummary.ts @@ -0,0 +1,33 @@ +import { useData } from "@/src/hooks/useData"; +import { useMemo } from "react"; + +interface HabitRecord { + title: string; + current_streak: number; + two_minute_version: string; +} + +export function useHabitSummary(userId: string) { + const { data: habits = [] } = useData( + "SELECT title, current_streak, two_minute_version FROM habits WHERE is_active = 1 AND (user_id = ? OR user_id IS NULL)", + [userId], + ); + + const habitContext = useMemo(() => { + if (habits.length === 0) { + return "User has no active habits yet."; + } + + return ( + "Current Habits:\n" + + habits + .map( + (habit) => + `- ${habit.title} (Streak: ${habit.current_streak}, 2-min: ${habit.two_minute_version})`, + ) + .join("\n") + ); + }, [habits]); + + return { habitContext }; +} diff --git a/src/hooks/useRequireAuth.ts b/src/hooks/useRequireAuth.ts new file mode 100644 index 0000000..64b4e07 --- /dev/null +++ b/src/hooks/useRequireAuth.ts @@ -0,0 +1,13 @@ +import type { User } from "@supabase/supabase-js"; +import { useRouter } from "expo-router"; +import { useEffect } from "react"; + +export function useRequireAuth(user: User | null, loading: boolean) { + const router = useRouter(); + + useEffect(() => { + if (!loading && !user) { + router.replace("/login"); + } + }, [loading, router, user]); +} diff --git a/src/hooks/useSync.ts b/src/hooks/useSync.ts new file mode 100644 index 0000000..313aba5 --- /dev/null +++ b/src/hooks/useSync.ts @@ -0,0 +1,34 @@ +import NetInfo from "@react-native-community/netinfo"; +import { useEffect } from "react"; +import { supabase } from "../lib/supabase"; +import { syncWithSupabase } from "../lib/sync"; + +export function useSync() { + useEffect(() => { + // Initial sync + syncWithSupabase(); + + // Sync on network status change + const unsubscribeNetInfo = NetInfo.addEventListener((state) => { + if (state.isConnected) { + syncWithSupabase(); + } + }); + + // Sync on auth state changes so guest data is migrated when signing in + const { + data: { subscription: authSubscription }, + } = supabase.auth.onAuthStateChange(() => { + syncWithSupabase(); + }); + + // Periodic sync every 5 minutes + const interval = setInterval(syncWithSupabase, 5 * 60 * 1000); + + return () => { + unsubscribeNetInfo(); + authSubscription.unsubscribe(); + clearInterval(interval); + }; + }, []); +} diff --git a/src/hooks/useSync.web.ts b/src/hooks/useSync.web.ts new file mode 100644 index 0000000..8b6313d --- /dev/null +++ b/src/hooks/useSync.web.ts @@ -0,0 +1,7 @@ +import { useEffect } from "react"; + +export function useSync() { + useEffect(() => { + // Sync is skipped on web because local SQLite and offline queueing are not supported. + }, []); +} diff --git a/src/hooks/useTheme.tsx b/src/hooks/useTheme.tsx new file mode 100644 index 0000000..71d1865 --- /dev/null +++ b/src/hooks/useTheme.tsx @@ -0,0 +1,245 @@ +import React, { + ReactNode, + createContext, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { useColorScheme } from "react-native"; +import { ACCENTS, AccentKey, COLORS, ThemeColors } from "../constants/Theme"; +import { getDb } from "../db/database"; +import { supabase } from "../lib/supabase"; + +const ACCENT_STORAGE_KEY = "accent_key"; +const THEME_MODE_STORAGE_KEY = "theme_mode"; +const FOCUS_GOAL_KEY = "daily_focus_goal"; +const SPRINT_DURATION_KEY = "sprint_duration"; +const IDENTITY_ANCHOR_KEY = "identity_anchor"; +const DISPLAY_NAME_KEY = "display_name"; + +export type ThemeMode = "light" | "dark" | "system"; + +interface ThemeContextType { + colors: ThemeColors; + colorScheme: "light" | "dark"; + isDark: boolean; + accentKey: AccentKey; + updateAccent: (key: AccentKey) => Promise; + availableAccents: typeof ACCENTS; + themeMode: ThemeMode; + updateThemeMode: (mode: ThemeMode) => Promise; + focusGoal: number; + updateFocusGoal: (goal: number) => Promise; + sprintDuration: number; + updateSprintDuration: (mins: number) => Promise; + identityAnchor: string; + updateIdentityAnchor: (anchor: string) => Promise; + displayName: string; + updateDisplayName: (name: string) => Promise; + isLoaded: boolean; +} + +const ThemeContext = createContext(undefined); + +async function getSetting(key: string, defaultValue: string): Promise { + try { + const db = await getDb(); + const result = await db.getFirstAsync<{ value: string }>( + "SELECT value FROM settings WHERE key = ?", + [key], + ); + return result ? result.value : defaultValue; + } catch (e) { + return defaultValue; + } +} + +async function saveSetting(key: string, value: string): Promise { + try { + const db = await getDb(); + await db.runAsync( + "INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)", + [key, value], + ); + + // Attempt to sync to Supabase profile preferences + const { + data: { user }, + } = await supabase.auth.getUser(); + if (user) { + const { data: profile } = await supabase + .from("profiles") + .select("preferences") + .eq("id", user.id) + .single(); + const prefs = profile?.preferences || {}; + await supabase + .from("profiles") + .update({ + preferences: { ...prefs, [key]: value }, + }) + .eq("id", user.id); + } + } catch (e) { + console.error(`Failed to save setting ${key}`, e); + } +} + +export const BatsirThemeProvider = ({ children }: { children: ReactNode }) => { + const systemColorScheme = useColorScheme() ?? "light"; + const [accentKey, setAccentKey] = useState("slate"); + const [themeMode, setThemeMode] = useState("system"); + const [focusGoal, setFocusGoal] = useState(8); + const [sprintDuration, setSprintDuration] = useState(25); + const [identityAnchor, setIdentityAnchor] = useState( + "The Disciplined Creator", + ); + const [displayName, setDisplayName] = useState(""); + const [isLoaded, setIsLoaded] = useState(false); + + useEffect(() => { + const loadSettings = async () => { + try { + const storedAccent = await getSetting(ACCENT_STORAGE_KEY, "slate"); + const storedMode = await getSetting(THEME_MODE_STORAGE_KEY, "system"); + const storedGoal = await getSetting(FOCUS_GOAL_KEY, "8"); + const storedDuration = await getSetting(SPRINT_DURATION_KEY, "25"); + const storedAnchor = await getSetting( + IDENTITY_ANCHOR_KEY, + "The Disciplined Creator", + ); + const storedName = await getSetting(DISPLAY_NAME_KEY, ""); + + setAccentKey(storedAccent as AccentKey); + setThemeMode(storedMode as ThemeMode); + setFocusGoal(parseInt(storedGoal)); + setSprintDuration(parseInt(storedDuration)); + setIdentityAnchor(storedAnchor); + setDisplayName(storedName); + } catch (e) { + console.error("Failed to load theme settings", e); + } finally { + setIsLoaded(true); + } + }; + loadSettings(); + }, []); + + const updateAccent = useCallback(async (key: AccentKey) => { + setAccentKey(key); + await saveSetting(ACCENT_STORAGE_KEY, key); + }, []); + + const updateThemeMode = useCallback(async (mode: ThemeMode) => { + setThemeMode(mode); + await saveSetting(THEME_MODE_STORAGE_KEY, mode); + }, []); + + const updateFocusGoal = useCallback(async (goal: number) => { + setFocusGoal(goal); + await saveSetting(FOCUS_GOAL_KEY, goal.toString()); + }, []); + + const updateSprintDuration = useCallback(async (mins: number) => { + setSprintDuration(mins); + await saveSetting(SPRINT_DURATION_KEY, mins.toString()); + }, []); + + const updateIdentityAnchor = useCallback(async (anchor: string) => { + setIdentityAnchor(anchor); + await saveSetting(IDENTITY_ANCHOR_KEY, anchor); + }, []); + + const updateDisplayName = useCallback(async (name: string) => { + setDisplayName(name); + await saveSetting(DISPLAY_NAME_KEY, name); + + // Also update public.profiles table directly for display_name column + try { + const { + data: { user }, + } = await supabase.auth.getUser(); + if (user) { + await supabase + .from("profiles") + .update({ display_name: name }) + .eq("id", user.id); + } + } catch (e) { + console.error("Failed to update display_name in profiles", e); + } + }, []); + + const colorScheme = themeMode === "system" ? systemColorScheme : themeMode; + const isDark = colorScheme === "dark"; + + const colors = useMemo(() => { + const baseColors = COLORS[colorScheme as keyof typeof COLORS]; + const accent = ACCENTS[accentKey]; + return { + ...baseColors, + primary: accent.primary, + onPrimary: "#FFFFFF", + primaryContainer: isDark + ? baseColors.primaryContainer + : accent.primaryContainer, + onPrimaryContainer: isDark + ? baseColors.onPrimaryContainer + : accent.onPrimaryContainer, + }; + }, [colorScheme, accentKey, isDark]); + + const value = useMemo( + () => ({ + colors, + colorScheme: colorScheme as "light" | "dark", + isDark, + accentKey, + updateAccent, + availableAccents: ACCENTS, + themeMode, + updateThemeMode, + focusGoal, + updateFocusGoal, + sprintDuration, + updateSprintDuration, + identityAnchor, + updateIdentityAnchor, + displayName, + updateDisplayName, + isLoaded, + }), + [ + colors, + colorScheme, + isDark, + accentKey, + updateAccent, + themeMode, + updateThemeMode, + focusGoal, + updateFocusGoal, + sprintDuration, + updateSprintDuration, + identityAnchor, + updateIdentityAnchor, + displayName, + updateDisplayName, + isLoaded, + ], + ); + + return ( + {children} + ); +}; + +export const useTheme = () => { + const context = useContext(ThemeContext); + if (context === undefined) { + throw new Error("useTheme must be used within a ThemeProvider"); + } + return context; +}; diff --git a/src/lib/ai.ts b/src/lib/ai.ts new file mode 100644 index 0000000..5c1d081 --- /dev/null +++ b/src/lib/ai.ts @@ -0,0 +1,26 @@ +import { supabase } from './supabase'; + +export interface AIMessage { + text: string; + sender: 'user' | 'ai'; +} + +export const callAiAssistant = async (messages: AIMessage[], systemPrompt?: string) => { + try { + // Supabase client automatically includes the session JWT in the Authorization header + // if a session exists and AsyncStorage is configured. + const { data, error } = await supabase.functions.invoke('chat-ai', { + body: { messages, systemPrompt }, + }); + + if (error) { + console.error('Supabase Function Error:', error); + throw error; + } + + return data; + } catch (error) { + console.error('AI Assistant Error:', error); + throw error; + } +}; diff --git a/src/lib/date-utils.ts b/src/lib/date-utils.ts new file mode 100644 index 0000000..23dc71d --- /dev/null +++ b/src/lib/date-utils.ts @@ -0,0 +1,18 @@ +/** + * Returns the current date in YYYY-MM-DD format based on local time. + */ +export const getLocalDateString = (date: Date = new Date()) => { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +}; + +/** + * Returns yesterday's date in YYYY-MM-DD format based on local time. + */ +export const getYesterdayDateString = () => { + const d = new Date(); + d.setDate(d.getDate() - 1); + return getLocalDateString(d); +}; diff --git a/src/lib/file-utils.ts b/src/lib/file-utils.ts new file mode 100644 index 0000000..f7b5462 --- /dev/null +++ b/src/lib/file-utils.ts @@ -0,0 +1,135 @@ +import * as FileSystem from 'expo-file-system/legacy'; +import { supabase } from './supabase'; + +const SUPABASE_STORAGE_URL = 'https://xhkkjelhmvepsouuibvs.supabase.co/storage/v1/object/public/books'; + +export const getDocumentDirectory = () => { + return FileSystem.documentDirectory || ''; +}; + +/** + * Resolves a file URI that might be stored as an absolute path or a relative path. + * In iOS, absolute paths change between app launches due to the container UUID changing. + * This utility ensures we always use the current document directory. + */ +export const resolveFileUri = (uri: string | null | undefined): string => { + if (!uri) return ''; + + // If it's already a full URL or a resolved file path + if (uri.startsWith('http') || uri.startsWith('file://') || uri.startsWith('content://')) { + // If it's an absolute path but might be stale (iOS container ID change) + if (uri.startsWith('file:///')) { + const docDir = getDocumentDirectory(); + const booksMatch = uri.match(/\/books\/.+$/); + if (booksMatch && docDir) { + const relativePath = booksMatch[0].startsWith('/') ? booksMatch[0].substring(1) : booksMatch[0]; + return `${docDir}${relativePath}`; + } + } + return uri; + } + + const docDir = getDocumentDirectory(); + + if (docDir) { + // If it's already a relative path (doesn't start with file:// or /) + if (!uri.startsWith('file://') && !uri.startsWith('/')) { + return `${docDir}${uri}`; + } + + // If it's an absolute path, try to extract the relative part (books/...) + // This handles stale paths from previous app containers on iOS + const booksMatch = uri.match(/\/books\/.+$/); + if (booksMatch) { + const relativePath = booksMatch[0].startsWith('/') ? booksMatch[0].substring(1) : booksMatch[0]; + return `${docDir}${relativePath}`; + } + + return uri.startsWith('/') ? `file://${uri}` : uri; + } + + // Fallback to Supabase Storage if local directory is not available (e.g. web or init issue) + let remotePath = uri; + if (uri.startsWith('books/')) { + remotePath = uri.replace('books/', ''); + } else if (uri.startsWith('/books/')) { + remotePath = uri.replace('/books/', ''); + } + + return `${SUPABASE_STORAGE_URL}/${remotePath}`; +}; + +/** + * Ensures a book is available locally by downloading it from Supabase if missing. + */ +export const downloadBook = async (relativeUri: string): Promise => { + const docDir = getDocumentDirectory(); + if (!docDir) throw new Error('Document directory not available'); + + const localUri = resolveFileUri(relativeUri); + const fileInfo = await FileSystem.getInfoAsync(localUri); + + if (fileInfo.exists) { + return localUri; + } + + // Create directory if it doesn't exist + const dirPath = localUri.substring(0, localUri.lastIndexOf('/')); + await FileSystem.makeDirectoryAsync(dirPath, { intermediates: true }); + + // Construct download URL + let remotePath = relativeUri; + if (relativeUri.startsWith('books/')) { + remotePath = relativeUri.replace('books/', ''); + } else if (relativeUri.startsWith('/books/')) { + remotePath = relativeUri.replace('/books/', ''); + } + + // Try to get a signed URL first (in case the bucket is private) + let downloadUrl = ''; + const { data: signedData, error: signedError } = await supabase.storage.from('books').createSignedUrl(remotePath, 3600); + + if (signedError) { + console.error('[downloadBook] Signed URL error:', signedError); + } + + if (signedData?.signedUrl) { + downloadUrl = signedData.signedUrl; + } else { + // Fallback to public URL + const { data: publicData } = supabase.storage.from('books').getPublicUrl(remotePath); + downloadUrl = publicData.publicUrl; + } + + console.log('[downloadBook] Downloading from:', downloadUrl); + console.log('[downloadBook] To:', localUri); + + try { + const downloadRes = await FileSystem.downloadAsync(downloadUrl, localUri); + + if (downloadRes.status !== 200) { + // Clean up the potentially empty/corrupted file + await FileSystem.deleteAsync(localUri, { idempotent: true }).catch(() => {}); + throw new Error(`Download failed with status ${downloadRes.status}`); + } + } catch (e: any) { + console.error('[downloadBook] Download error:', e); + throw e; + } + + return localUri; +}; + +/** + * Gets the relative path for a file URI to be stored in the database. + */ +export const getRelativePath = (uri: string): string => { + if (!uri) return ''; + + const booksMatch = uri.match(/\/books\/.+$/); + if (booksMatch) { + return booksMatch[0].startsWith('/') ? booksMatch[0].substring(1) : booksMatch[0]; + } + + return uri; +}; diff --git a/src/lib/habit-logic.ts b/src/lib/habit-logic.ts new file mode 100644 index 0000000..fc9490a --- /dev/null +++ b/src/lib/habit-logic.ts @@ -0,0 +1,195 @@ +import { getDb } from '../db/database'; + +export interface HabitStreakInfo { + currentStreak: number; + maxStreak: number; + isDoneToday: boolean; + lastLoggedDate: string | null; +} + +/** + * Helper to get local YYYY-MM-DD string + */ +function getLocalDayString(date: Date = new Date()): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +/** + * Helper to check if a local date string is a weekend + */ +function isWeekend(dateStr: string): boolean { + const [year, month, day] = dateStr.split('-').map(Number); + const d = new Date(year, month - 1, day); + const dayOfWeek = d.getDay(); + return dayOfWeek === 0 || dayOfWeek === 6; // Sunday = 0, Saturday = 6 +} + +/** + * Calculates streak info for a habit based on its logs + */ +export function calculateStreak( + logDates: string[], + weekendFlexibility: boolean = false +): HabitStreakInfo { + if (logDates.length === 0) { + return { currentStreak: 0, maxStreak: 0, isDoneToday: false, lastLoggedDate: null }; + } + + // Normalize dates to local YYYY-MM-DD and sort descending + const uniqueDates = [...new Set(logDates.map(d => { + // Handle ISO (T) or SQLite (space) format + const datePart = d.split(/[T ]/)[0]; + if (d.includes('T') || d.includes(':')) { + // If it looks like a full timestamp, we treat it as UTC and convert to LOCAL YYYY-MM-DD + const dateObj = new Date(d.replace(' ', 'T')); + if (!isNaN(dateObj.getTime())) { + return getLocalDayString(dateObj); + } + } + return datePart; // Fallback to the date part + }))].sort((a, b) => b.localeCompare(a)); + + const todayStr = getLocalDayString(); + const yesterdayDate = new Date(); + yesterdayDate.setDate(yesterdayDate.getDate() - 1); + const yesterdayStr = getLocalDayString(yesterdayDate); + + const isDoneToday = uniqueDates.includes(todayStr); + const lastLoggedDate = uniqueDates[0]; + + // Calculate Current Streak + let currentStreak = 0; + + // Start checking from today (if done) or the last log date (if not done) + let checkDateStr = isDoneToday ? todayStr : uniqueDates[0]; + + // If not done today, check if the streak is already broken + if (!isDoneToday) { + let gapDate = new Date(); + gapDate.setDate(gapDate.getDate() - 1); + + // Move back through weekends if flexibility is on + while (weekendFlexibility && isWeekend(getLocalDayString(gapDate))) { + gapDate.setDate(gapDate.getDate() - 1); + } + + const latestAllowedDate = getLocalDayString(gapDate); + if (uniqueDates[0] < latestAllowedDate) { + // Streak is broken + currentStreak = 0; + checkDateStr = null; + } + } + + if (checkDateStr) { + let curr = new Date(); // Start from today + // If we're starting from a previous log, sync curr to that + if (!isDoneToday) { + const [y, m, d] = uniqueDates[0].split('-').map(Number); + curr = new Date(y, m - 1, d); + } + + let logPtr = 0; + // Fast forward logPtr to match checkDateStr + while (logPtr < uniqueDates.length && uniqueDates[logPtr] > checkDateStr) { + logPtr++; + } + + while (logPtr < uniqueDates.length) { + const currDateStr = getLocalDayString(curr); + const logDateStr = uniqueDates[logPtr]; + + if (logDateStr === currDateStr) { + currentStreak++; + logPtr++; + curr.setDate(curr.getDate() - 1); + } else if (weekendFlexibility && isWeekend(currDateStr)) { + curr.setDate(curr.getDate() - 1); + } else { + break; + } + } + } + + // Calculate Max Streak + let maxStreak = 0; + let tempStreak = 0; + + // To calculate max streak, we iterate from the earliest log to the latest + const earliestDateParts = uniqueDates[uniqueDates.length - 1].split('-').map(Number); + let curr = new Date(earliestDateParts[0], earliestDateParts[1] - 1, earliestDateParts[2]); + + const latestDateParts = uniqueDates[0].split('-').map(Number); + const lastDate = new Date(latestDateParts[0], latestDateParts[1] - 1, latestDateParts[2]); + + let logPtr = uniqueDates.length - 1; + while (curr <= lastDate) { + const currDateStr = getLocalDayString(curr); + const logDateStr = uniqueDates[logPtr]; + + if (logDateStr === currDateStr) { + tempStreak++; + logPtr--; + maxStreak = Math.max(maxStreak, tempStreak); + curr.setDate(curr.getDate() + 1); + } else if (weekendFlexibility && isWeekend(currDateStr)) { + curr.setDate(curr.getDate() + 1); + } else { + tempStreak = 0; + curr.setDate(curr.getDate() + 1); + } + } + + return { + currentStreak, + maxStreak, + isDoneToday, + lastLoggedDate + }; +} + +/** + * Updates the streak counts for a specific habit in the database + */ +export async function updateHabitStreak(habitId: string) { + const db = await getDb(); + + const habit = await db.getFirstAsync<{weekend_flexibility: number}>( + 'SELECT weekend_flexibility FROM habits WHERE id = ?', + [habitId] + ); + if (!habit) return; + + const logs = await db.getAllAsync<{logged_at: string}>( + 'SELECT logged_at FROM logs WHERE habit_id = ? ORDER BY logged_at DESC', + [habitId] + ); + + const streakInfo = calculateStreak( + logs.map(l => l.logged_at), + habit.weekend_flexibility === 1 + ); + + await db.runAsync( + 'UPDATE habits SET current_streak = ?, max_streak = ?, updated_at = ? WHERE id = ?', + [streakInfo.currentStreak, streakInfo.maxStreak, new Date().toISOString(), habitId] + ); +} + +/** + * Recalculates streaks for all active habits + */ +export async function recalculateAllStreaks(userId: string = 'guest') { + const db = await getDb(); + const habits = await db.getAllAsync<{id: string}>( + 'SELECT id FROM habits WHERE is_active = 1 AND (user_id = ? OR user_id IS NULL)', + [userId] + ); + + for (const habit of habits) { + await updateHabitStreak(habit.id); + } +} diff --git a/src/lib/supabase.ts b/src/lib/supabase.ts new file mode 100644 index 0000000..459bdd2 --- /dev/null +++ b/src/lib/supabase.ts @@ -0,0 +1,18 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { createClient } from "@supabase/supabase-js"; + +const supabaseUrl = + process.env.EXPO_PUBLIC_SUPABASE_URL || + "https://xhkkjelhmvepsouuibvs.supabase.co"; +const supabaseAnonKey = + process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY || + "sb_publishable_g0QLc9OmyjBI1-mtUvz8Gg_qK8DG-Nl"; + +export const supabase = createClient(supabaseUrl, supabaseAnonKey, { + auth: { + storage: AsyncStorage, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: false, + }, +}); diff --git a/src/lib/sync.ts b/src/lib/sync.ts new file mode 100644 index 0000000..2528a20 --- /dev/null +++ b/src/lib/sync.ts @@ -0,0 +1,602 @@ +import { getDb } from "../db/database"; +import { updateHabitStreak } from "./habit-logic"; +import { supabase } from "./supabase"; + +export interface SyncOperation { + id?: number; + table_name: string; + operation: "INSERT" | "UPDATE" | "DELETE"; + payload: string; // JSON string + created_at?: string; +} + +let currentSyncPromise: Promise | null = null; +const databaseChangeListeners = new Set<() => void>(); + +export const subscribeToDatabaseChanges = (listener: () => void) => { + databaseChangeListeners.add(listener); + return () => databaseChangeListeners.delete(listener); +}; + +const emitDatabaseChange = () => { + for (const listener of databaseChangeListeners) { + try { + listener(); + } catch (err) { + console.error("Database change listener error:", err); + } + } +}; + +const isUUID = (str: string) => { + const regex = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; + return regex.test(str); +}; + +const replaceIdsInPayload = (value: any, oldId: string, newId: string): any => { + if (value === oldId) { + return newId; + } + + if (Array.isArray(value)) { + return value.map((item) => replaceIdsInPayload(item, oldId, newId)); + } + + if (value && typeof value === "object") { + return Object.fromEntries( + Object.entries(value).map(([key, entry]) => [ + key, + replaceIdsInPayload(entry, oldId, newId), + ]), + ); + } + + return value; +}; + +export const addToSyncQueue = async ( + table_name: string, + operation: "INSERT" | "UPDATE" | "DELETE", + payload: any, +): Promise => { + const db = await getDb(); + const result = await db.runAsync( + "INSERT INTO sync_queue (table_name, operation, payload) VALUES (?, ?, ?)", + [table_name, operation, JSON.stringify(payload)], + ); + return result.lastInsertRowId; +}; + +/** + * Updates pending payloads in the sync queue when a temporary ID is replaced by a real UUID + */ +const updateQueuePayloads = async (oldId: string, newId: string) => { + const db = await getDb(); + const queue: SyncOperation[] = await db.getAllAsync( + "SELECT * FROM sync_queue", + ); + + for (const item of queue) { + try { + const parsedPayload = JSON.parse(item.payload); + const replacedPayload = replaceIdsInPayload(parsedPayload, oldId, newId); + const updatedPayload = JSON.stringify(replacedPayload); + if (updatedPayload !== item.payload) { + await db.runAsync("UPDATE sync_queue SET payload = ? WHERE id = ?", [ + updatedPayload, + item.id, + ]); + } + } catch { + // Keep the original payload if parsing fails + } + } +}; + +const migrateGuestDataToUser = async (userId: string) => { + const db = await getDb(); + const tablesWithUserId = ["habits", "schedules", "shortcuts", "tasks", "books", "reading_logs", "bookmarks", "logs"]; + + for (const table of tablesWithUserId) { + await db.runAsync(`UPDATE ${table} SET user_id = ? WHERE user_id = ?`, [ + userId, + "guest", + ]); + } + + const queue: SyncOperation[] = await db.getAllAsync( + "SELECT * FROM sync_queue", + ); + + for (const item of queue) { + if (item.payload.includes('"user_id":"guest"')) { + const updatedPayload = item.payload.replace( + /"user_id":"guest"/g, + `"user_id":"${userId}"`, + ); + if (updatedPayload !== item.payload) { + await db.runAsync("UPDATE sync_queue SET payload = ? WHERE id = ?", [ + updatedPayload, + item.id, + ]); + } + } + } +}; + +const hasPendingHabitInsert = (queue: SyncOperation[], habitId: string) => { + return queue.some((item) => { + if (item.table_name !== "habits" || item.operation !== "INSERT") { + return false; + } + try { + const payload = JSON.parse(item.payload); + return payload.id === habitId; + } catch { + return false; + } + }); +}; + +const processSyncItem = async (item: SyncOperation, user: any, db: any) => { + let payload: any; + try { + payload = JSON.parse(item.payload); + } catch (e) { + console.error(`Failed to parse payload for item ${item.id}:`, item.payload); + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + + const tablesWithUserId = ["habits", "schedules", "shortcuts", "tasks", "books", "reading_logs", "bookmarks", "logs", "sync_history"]; + + // HEAL: Strip 'last_page_read' from books if it exists (legacy column mismatch) + if (item.table_name === "books" && payload.hasOwnProperty("last_page_read")) { + const { last_page_read, ...cleanPayload } = payload; + payload = cleanPayload; + } + + // HEAL: Detect and fix missing columns in reading_logs on server + if (item.table_name === "reading_logs") { + // If the server doesn't have these yet, we might want to strip them + // but for now we'll let it fail and provide the SQL to the user. + // However, to keep sync moving for other items, we can add a check: + } + + // HEAL: Detect and fix "undefined" strings in UUID fields + if (payload.id === "undefined") { + console.warn(`Item ${item.id} (${item.table_name}) has "undefined" as ID. Abandoning.`); + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + + if (payload.user_id === "undefined") { + payload.user_id = user.id; + } + + // Handle foreign key relationships that might still be using temporary IDs + const fkFields: Record = { + 'logs': 'habit_id', + 'reading_logs': 'book_id', + 'bookmarks': 'book_id', + 'habits': 'anchor_habit_id' + }; + + const fkField = fkFields[item.table_name]; + if (fkField && payload[fkField]) { + const fkValue = payload[fkField]; + + if (fkValue === 'focus-session' && item.table_name === 'logs') { + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + + if (fkValue === 'undefined') { + console.warn(`Item ${item.id} (${item.table_name}) has "undefined" as ${fkField}. Abandoning.`); + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + + if (!isUUID(fkValue)) { + // Try to find the mapped UUID in sync_history or local table + const history = await db.getFirstAsync<{new_id: string}>( + "SELECT new_id FROM sync_history WHERE old_id = ?", + [fkValue] + ); + + if (history && isUUID(history.new_id)) { + payload[fkField] = history.new_id; + await db.runAsync("UPDATE sync_queue SET payload = ? WHERE id = ?", [JSON.stringify(payload), item.id]); + } else { + // Threshold check for orphaned items + const createdTime = item.created_at ? new Date(item.created_at).getTime() : Date.now(); + const now = Date.now(); + if (now - createdTime > 30 * 60 * 1000) { + console.warn(`Abandoning orphaned ${item.table_name} item ${item.id}: ${fkField} "${fkValue}" is not a UUID after 30m.`); + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + + console.warn(`Postponing sync for ${item.table_name} ${item.id}: ${fkField} "${fkValue}" is still a temporary ID.`); + return false; + } + } + } + + let error; + let remoteData; + + switch (item.operation) { + case "INSERT": { + const { id: localId, ...insertPayload } = payload; + + if (tablesWithUserId.includes(item.table_name)) { + if (insertPayload.user_id === "guest" || !insertPayload.user_id || insertPayload.user_id === "undefined") { + insertPayload.user_id = user.id; + } + } + + const { data: insertedData, error: insertError } = await supabase + .from(item.table_name) + .insert(insertPayload) + .select() + .single(); + + error = insertError; + remoteData = insertedData; + + if (!error && remoteData) { + await db.withTransactionAsync(async () => { + // Special case for habits/logs relationship + if (item.table_name === "habits") { + await db.runAsync( + "UPDATE logs SET habit_id = ? WHERE habit_id = ?", + [remoteData.id, localId], + ); + } + + if (tablesWithUserId.includes(item.table_name)) { + await db.runAsync( + `UPDATE ${item.table_name} SET id = ?, user_id = ? WHERE id = ?`, + [remoteData.id, user.id, localId], + ); + } else { + await db.runAsync( + `UPDATE ${item.table_name} SET id = ? WHERE id = ?`, + [remoteData.id, localId], + ); + } + + // Record ID mapping in sync_history + await db.runAsync( + "INSERT OR REPLACE INTO sync_history (old_id, new_id, table_name) VALUES (?, ?, ?)", + [localId, remoteData.id, item.table_name] + ); + + await updateQueuePayloads(localId, remoteData.id); + }); + + emitDatabaseChange(); + } + break; + } + + case "UPDATE": { + if ( + tablesWithUserId.includes(item.table_name) && + (payload.user_id === "guest" || payload.user_id === "undefined") + ) { + payload.user_id = user.id; + } + + // Final check: if ID is still not a UUID for an update, it's doomed unless we find it in history + if (!isUUID(payload.id)) { + const history = await db.getFirstAsync<{new_id: string}>("SELECT new_id FROM sync_history WHERE old_id = ?", [payload.id]); + if (history && isUUID(history.new_id)) { + payload.id = history.new_id; + } else { + console.error(`Cannot UPDATE ${item.table_name}: ID ${payload.id} is not a UUID and no mapping found.`); + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + } + + ({ error } = await supabase + .from(item.table_name) + .update(payload) + .eq("id", payload.id)); + break; + } + + case "DELETE": { + if (!isUUID(payload.id)) { + const history = await db.getFirstAsync<{new_id: string}>("SELECT new_id FROM sync_history WHERE old_id = ?", [payload.id]); + if (history && isUUID(history.new_id)) { + payload.id = history.new_id; + } else { + // If we can't find the remote ID, it probably never synced, so just delete locally + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + return true; + } + } + ({ error } = await supabase + .from(item.table_name) + .delete() + .eq("id", payload.id)); + break; + } + } + + if (!error) { + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + emitDatabaseChange(); + } else { + console.error( + `Sync error for item ${item.id} (${item.table_name}):`, + error.message, + "Payload:", JSON.stringify(payload) + ); + if ( + error.code === "42P01" || + error.code === "23503" || + error.code === "22P02" || + error.message.includes("row-level security") || + error.message.includes("uuid") + ) { + await db.runAsync("DELETE FROM sync_queue WHERE id = ?", [item.id]); + emitDatabaseChange(); + } + } + + return true; +}; + +export const syncWithSupabase = async () => { + if (currentSyncPromise) { + return currentSyncPromise; + } + + currentSyncPromise = (async () => { + const db = await getDb(); + const queue: SyncOperation[] = await db.getAllAsync( + "SELECT * FROM sync_queue ORDER BY id ASC", + ); + + const { + data: { user }, + } = await supabase.auth.getUser(); + + if (!user) { + if (queue.length === 0) { + await pullFromServer(); + } + return; + } + + await migrateGuestDataToUser(user.id); + + if (queue.length === 0) { + await pullFromServer(); + return; + } + + let remainingItems = queue; + let iteration = 0; + + while (remainingItems.length > 0 && iteration < 4) { + const nextItems: SyncOperation[] = []; + let anyAttempted = false; + + for (const item of remainingItems) { + const currentItem = await db.getFirstAsync( + "SELECT * FROM sync_queue WHERE id = ?", + [item.id], + ); + if (!currentItem) { + anyAttempted = true; + continue; + } + + const payload = JSON.parse(currentItem.payload); + + if ( + item.table_name === "logs" && + payload.habit_id && + !isUUID(payload.habit_id) && + hasPendingHabitInsert(remainingItems, payload.habit_id) + ) { + nextItems.push(item); + continue; + } + + const attempted = await processSyncItem(currentItem, user, db); + if (attempted) { + anyAttempted = true; + } else { + nextItems.push(item); + } + } + + if (!anyAttempted) { + break; + } + + remainingItems = nextItems; + iteration += 1; + } + })().finally(() => { + currentSyncPromise = null; + }); + + return currentSyncPromise; +}; + +export const pullFromServer = async () => { + const { + data: { user }, + } = await supabase.auth.getUser(); + if (!user) return; + + const db = await getDb(); + + // Get last sync time + const lastSyncResult = await db.getFirstAsync<{ value: string }>( + "SELECT value FROM settings WHERE key = 'last_pulled_at'", + ); + const lastPulledAt = lastSyncResult?.value; + + const tables = ["habits", "schedules", "logs", "shortcuts", "tasks", "books", "reading_logs", "bookmarks", "sync_history"]; + + for (const table of tables) { + try { + let syncTouchedLocalRows = false; + let query = supabase.from(table).select("*"); + + const tablesWithUserId = ["habits", "schedules", "shortcuts", "tasks", "books", "reading_logs", "bookmarks", "logs", "sync_history"]; + if (tablesWithUserId.includes(table)) { + query = query.eq("user_id", user.id); + } + + // Incremental sync logic + if (lastPulledAt) { + const timeColumn = table === "logs" ? "created_at" : "updated_at"; + query = query.gt(timeColumn, lastPulledAt); + } + + const { data, error } = await query; + + if (!error && data) { + for (const remoteItem of data) { + const localItem = await db.getFirstAsync( + `SELECT id FROM ${table} WHERE id = ?`, + [remoteItem.id], + ); + + if (localItem) { + const keys = Object.keys(remoteItem).filter((k) => k !== "id"); + const setClause = keys.map((k) => `${k} = ?`).join(","); + const values = [ + ...keys.map((k) => { + const val = remoteItem[k]; + return typeof val === "object" ? JSON.stringify(val) : val; + }), + remoteItem.id, + ]; + + await db.runAsync( + `UPDATE ${table} SET ${setClause} WHERE id = ?`, + values as any, + ); + syncTouchedLocalRows = true; + } else { + const keys = Object.keys(remoteItem); + const placeholders = keys.map(() => "?").join(","); + const values = keys.map((k) => { + const val = remoteItem[k]; + return typeof val === "object" ? JSON.stringify(val) : val; + }); + + await db.runAsync( + `INSERT OR IGNORE INTO ${table} (${keys.join(",")}) VALUES (${placeholders})`, + values as any, + ); + syncTouchedLocalRows = true; + } + } + } + + if (syncTouchedLocalRows) { + emitDatabaseChange(); + } + } catch (err) { + console.error(`Failed to pull table ${table}:`, err); + } + } + + // Update last sync time + const now = new Date().toISOString(); + await db.runAsync( + "INSERT OR REPLACE INTO settings (key, value) VALUES ('last_pulled_at', ?)", + [now], + ); +}; + +export const performMutation = async ( + table_name: string, + operation: "INSERT" | "UPDATE" | "DELETE", + payload: any, +) => { + console.log("performMutation START", { table_name, operation, payload }); + + if (!payload || (typeof payload === 'object' && Object.keys(payload).length === 0)) { + console.warn("performMutation: empty payload, skipping execution.", { table_name, operation }); + return undefined; + } + + const db = await getDb(); + + switch (operation) { + case "INSERT": + const keys = Object.keys(payload).join(","); + const placeholders = Object.keys(payload) + .map(() => "?") + .join(","); + const values = Object.values(payload).map((v) => + typeof v === "object" ? JSON.stringify(v) : v, + ); + await db.runAsync( + `INSERT INTO ${table_name} (${keys}) VALUES (${placeholders})`, + values as any, + ); + break; + case "UPDATE": + const updateKeys = Object.keys(payload).filter((k) => k !== "id"); + if (updateKeys.length === 0) { + console.warn("performMutation: nothing to update except ID, skipping.", { table_name }); + return undefined; + } + const setClause = updateKeys + .map((k) => `${k} = ?`) + .join(","); + const updateValues = [ + ...updateKeys.map((k) => { + const v = payload[k]; + return typeof v === "object" ? JSON.stringify(v) : v; + }), + payload.id, + ]; + await db.runAsync( + `UPDATE ${table_name} SET ${setClause} WHERE id = ?`, + updateValues as any, + ); + break; + case "DELETE": + if (!payload.id) { + console.error("performMutation: DELETE missing ID.", { table_name }); + return undefined; + } + await db.runAsync(`DELETE FROM ${table_name} WHERE id = ?`, [payload.id]); + break; + } + + emitDatabaseChange(); + + // Handle streak maintenance + if (table_name === "logs") { + if (payload.habit_id) { + await updateHabitStreak(payload.habit_id); + } + } else if ( + table_name === "habits" && + (operation === "UPDATE" || operation === "INSERT") + ) { + // If weekend_flexibility changed or new habit added, recalculate/init + await updateHabitStreak(payload.id); + } + + const syncId = await addToSyncQueue(table_name, operation, payload); + console.log("performMutation RESULT", { success: !!syncId, syncId }); + syncWithSupabase().catch(console.error); + return syncId; +}; diff --git a/src/lib/sync.web.ts b/src/lib/sync.web.ts new file mode 100644 index 0000000..99a216e --- /dev/null +++ b/src/lib/sync.web.ts @@ -0,0 +1,35 @@ + +export interface SyncOperation { + id?: number; + table_name: string; + operation: "INSERT" | "UPDATE" | "DELETE"; + payload: string; + created_at?: string; +} + +export const addToSyncQueue = async ( + table_name: string, + operation: "INSERT" | "UPDATE" | "DELETE", + payload: any, +) => { + console.warn("Sync queue is disabled on web."); +}; + +export const syncWithSupabase = async () => { + console.warn("Sync is disabled on web."); +}; + +export const performMutation = async ( + table_name: string, + operation: "INSERT" | "UPDATE" | "DELETE", + payload: any, +) => { + console.warn("Local mutation sync is disabled on web."); + await addToSyncQueue(table_name, operation, payload); + await syncWithSupabase(); +}; + +export const subscribeToDatabaseChanges = (callback: () => void) => { + // No-op on web for now as local database isn't persistent + return () => {}; +}; diff --git a/src/screens/AIScreen.tsx b/src/screens/AIScreen.tsx new file mode 100644 index 0000000..314ce3f --- /dev/null +++ b/src/screens/AIScreen.tsx @@ -0,0 +1,286 @@ +import ChatHeader from "@/src/components/chat/ChatHeader"; +import ChatInput from "@/src/components/chat/ChatInput"; +import MessageBubble from "@/src/components/chat/MessageBubble"; +import SuggestionChips from "@/src/components/chat/SuggestionChips"; +import { ErrorBoundary } from "@/src/components/ErrorBoundary"; +import { FONTS, ROUNDNESS, SPACING, ThemeColors } from "@/src/constants/Theme"; +import { useAIChat } from "@/src/hooks/useAIChat"; +import { useAuth } from "@/src/hooks/useAuth"; +import { useChatHistory } from "@/src/hooks/useChatHistory"; +import { useHabitSummary } from "@/src/hooks/useHabitSummary"; +import { useRequireAuth } from "@/src/hooks/useRequireAuth"; +import { useTheme } from "@/src/hooks/useTheme"; +import { ChatMessage } from "@/src/types/chat"; +import * as Haptics from "expo-haptics"; +import { useRouter } from "expo-router"; +import { Sparkles } from "lucide-react-native"; +import React, { + useCallback, + useEffect, + useRef, + useState +} from "react"; +import { + ActivityIndicator, + FlatList, + InteractionManager, + KeyboardAvoidingView, + Platform, + SafeAreaView, + StyleSheet, + Text, + View, +} from "react-native"; + +const INITIAL_SUGGESTIONS = [ + "Audit my habits", + "Suggest a 2-min version", + "Log my workout", + "Help me build a morning routine", +] as const; + +interface AIScreenProps { + colors: ThemeColors; +} + +const AIScreen = () => { + const { colors, identityAnchor } = useTheme(); + const { user, isAuthenticated, loading: authLoading } = useAuth(); + useRequireAuth(user, authLoading); + + const router = useRouter(); + const [inputText, setInputText] = useState(""); + + const userId = user?.id ?? null; + const { habitContext } = useHabitSummary(userId ?? "guest"); + const { + messages, + messagesRef, + isLoading: isHistoryLoading, + appendMessage, + updateMessage, + } = useChatHistory(userId); + + const { isSending, sendMessage } = useAIChat({ + userId, + identityAnchor, + habitContext, + messagesRef, + appendMessage, + updateMessage, + }); + + const listRef = useRef>(null); + const isUserScrolling = useRef(false); + + const staticStyles = styles; + + const scrollToBottom = useCallback(() => { + if (isUserScrolling.current) return; + InteractionManager.runAfterInteractions(() => { + listRef.current?.scrollToOffset({ offset: 0, animated: true }); + }); + }, []); + + useEffect(() => { + if (messages.length > 0) { + scrollToBottom(); + } + }, [messages.length, scrollToBottom]); + + const handleSend = useCallback( + (text: string) => { + const content = text.trim(); + if (!content) return; + setInputText(""); + sendMessage(content); + }, + [sendMessage], + ); + + const navigateMenu = useCallback(() => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/menu"); + }, [router]); + + const navigateSettings = useCallback(() => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + router.push("/modal"); + }, [router]); + + const onSuggestionPress = useCallback( + (suggestion: string) => { + handleSend(suggestion); + }, + [handleSend], + ); + + const renderMessage = useCallback( + ({ item }: { item: ChatMessage }) => ( + + ), + [colors], + ); + + const keyExtractor = useCallback((item: ChatMessage) => item.id, []); + + const onScroll = useCallback(({ nativeEvent }) => { + isUserScrolling.current = nativeEvent.contentOffset.y > 0; + }, []); + + if (authLoading || (!isAuthenticated && !user)) { + return ( + + + + ); + } + + return ( + + + + + + + + + + Architect Mode Active + + + + {isHistoryLoading ? ( + + + + Retrieving conversation... + + + ) : ( + + } + /> + )} + + + + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + safeArea: { + flex: 1, + }, + keyboardView: { + flex: 1, + }, + chatContentWrapper: { + flex: 1, + }, + chatContainer: { + padding: SPACING.lg, + paddingBottom: 20, + }, + assistantStatus: { + flexDirection: "row", + alignItems: "center", + gap: 8, + marginBottom: SPACING.xl, + justifyContent: "center", + backgroundColor: "rgba(52, 144, 220, 0.1)", + paddingVertical: 6, + paddingHorizontal: 16, + borderRadius: ROUNDNESS.full, + alignSelf: "center", + }, + statusText: { + fontFamily: FONTS.labelSm, + fontSize: 11, + }, + historyLoading: { + alignItems: "center", + justifyContent: "center", + paddingVertical: 40, + gap: 12, + }, + historyLoadingText: { + fontFamily: FONTS.label, + fontSize: 13, + }, + flatListFooter: { + height: 20, + }, + loadingContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, +}); + +export default AIScreen; diff --git a/src/services/aiService.ts b/src/services/aiService.ts new file mode 100644 index 0000000..4f16f5c --- /dev/null +++ b/src/services/aiService.ts @@ -0,0 +1,47 @@ +import { supabase } from "@/src/lib/supabase"; +import { ChatRole } from "@/src/types/chat"; + +export interface AiAssistantResponse { + reply?: string; + error?: string; +} + +export const buildSystemPrompt = ( + identityAnchor: string, + habitContext: string, +) => + `You are Batsirai, a Habit Architect and productivity coach. +Your tone is encouraging, professional, and insightful. +User Profile: I am ${identityAnchor}. +User Progress: ${habitContext} + +Always provide actionable advice based on Atomic Habits principles (e.g., 2-minute rule, habit stacking).`; + +export const callAiAssistant = async ( + messages: Array<{ role: ChatRole; content: string }>, + systemPrompt: string, + onToken?: (token: string) => void, +): Promise => { + try { + const { data, error } = await supabase.functions.invoke("chat-ai", { + body: { messages, systemPrompt }, + }); + + if (error) { + console.error("Supabase Function Error:", error); + throw error; + } + + if (typeof data === "object" && data !== null) { + return data as AiAssistantResponse; + } + + return { error: "Invalid AI response format." }; + } catch (err) { + console.error("AI Assistant Error:", err); + if (onToken) { + onToken(String(err)); + } + throw err; + } +}; diff --git a/src/services/chatService.ts b/src/services/chatService.ts new file mode 100644 index 0000000..0896c02 --- /dev/null +++ b/src/services/chatService.ts @@ -0,0 +1,85 @@ +import { supabase } from "@/src/lib/supabase"; +import { ChatMessage } from "@/src/types/chat"; + +const createUniqueId = () => + `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; + +export const createUserMessage = (content: string): ChatMessage => ({ + id: createUniqueId(), + role: "user", + content, + createdAt: Date.now(), + status: "sent", +}); + +export const createAssistantMessage = ( + content: string, + status: ChatMessage["status"] = "sending", +): ChatMessage => ({ + id: createUniqueId(), + role: "assistant", + content, + createdAt: Date.now(), + status, +}); + +export const createGreetingMessage = (): ChatMessage => ({ + id: "welcome-architect", + role: "assistant", + content: + "I'm Batsirai, your Habit Architect. I can help you build consistency, audit your schedule, or refine your 'Two-Minute' versions. How can we find your flow today?", + createdAt: Date.now(), + status: "sent", +}); + +export const mapChatRecordToMessage = (record: any): ChatMessage => ({ + id: record.id || createUniqueId(), + role: record.sender === "ai" ? "assistant" : "user", + content: record.text || "", + createdAt: record.created_at + ? new Date(record.created_at).getTime() + : Date.now(), + status: "sent", + action: record.action, +}); + +export const fetchChatHistory = async ( + userId: string, +): Promise => { + const { data, error } = await supabase + .from("chat_messages") + .select("*") + .eq("user_id", userId) + .order("created_at", { ascending: false }); + + if (error) { + throw error; + } + + return (data ?? []).map(mapChatRecordToMessage); +}; + +export const saveChatMessage = async ( + userId: string, + message: ChatMessage, +): Promise => { + const sender = message.role === "assistant" ? "ai" : "user"; + const payload = { + user_id: userId, + sender, + text: message.content, + created_at: new Date(message.createdAt).toISOString(), + }; + + const { error } = await supabase.from("chat_messages").insert(payload); + + if (error) { + console.warn("Failed to persist chat message", error); + throw error; + } +}; + +export const serializeHistoryMessage = (message: ChatMessage) => ({ + role: message.role, + content: message.content, +}); diff --git a/src/types/chat.ts b/src/types/chat.ts new file mode 100644 index 0000000..656a170 --- /dev/null +++ b/src/types/chat.ts @@ -0,0 +1,11 @@ +export type ChatRole = "user" | "assistant"; +export type ChatStatus = "sending" | "sent" | "error" | "streaming"; + +export interface ChatMessage { + id: string; + role: ChatRole; + content: string; + createdAt: number; + status?: ChatStatus; + action?: string; +} diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts new file mode 100644 index 0000000..f23e354 --- /dev/null +++ b/src/utils/formatTime.ts @@ -0,0 +1,5 @@ +export const formatTime = (value: number | Date = new Date()) => + new Date(value).toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + }); diff --git a/supabase/functions/chat-ai/index.ts b/supabase/functions/chat-ai/index.ts new file mode 100644 index 0000000..729e8f1 --- /dev/null +++ b/supabase/functions/chat-ai/index.ts @@ -0,0 +1,121 @@ +import { createClient } from "https://esm.sh/@supabase/supabase-js@2.43.1"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": + "authorization, apikey, content-type, x-client-info", + "Access-Control-Allow-Methods": "POST, OPTIONS", +}; + +Deno.serve(async (req) => { + // 1. Handle CORS Preflight (OPTIONS request) - Must return 200 OK + if (req.method === "OPTIONS") { + return new Response("ok", { headers: corsHeaders, status: 200 }); + } + + try { + // 2. Validate API Key + const GEMINI_API_KEY = Deno.env.get("GEMINI_API_KEY") || Deno.env.get("VITE_GEMINI_API_KEY"); + if (!GEMINI_API_KEY) { + throw new Error("Missing GEMINI_API_KEY secret"); + } + + // 3. Initialize Supabase Client + const supabaseClient = createClient( + Deno.env.get("SUPABASE_URL") ?? "", + Deno.env.get("SUPABASE_ANON_KEY") ?? "", + { + global: { + headers: { Authorization: req.headers.get("Authorization")! }, + }, + } + ); + + // 4. Get User Info + const { + data: { user }, + } = await supabaseClient.auth.getUser(); + + if (!user) { + throw new Error("Unauthorized"); + } + + // 5. Parse Request + const { messages, systemPrompt } = await req.json(); + + if (!messages || !Array.isArray(messages)) { + throw new Error("Invalid body: 'messages' array is required"); + } + + // 6. Save User Message (the last one in the incoming list) + const userMessage = messages[messages.length - 1]; + if (userMessage && userMessage.sender === "user") { + await supabaseClient.from("chat_messages").insert({ + user_id: user.id, + text: userMessage.text, + sender: "user", + }); + } + + // 7. Build Prompt + let prompt = systemPrompt ? `${systemPrompt}\n\n` : ""; + prompt += messages + .map((m: any) => + m.sender === "user" ? `User: ${m.text}` : `Assistant: ${m.text}` + ) + .join("\n"); + prompt += "\nAssistant:"; + + // 8. Call Gemini API + const model = "gemini-2.5-flash"; + + const geminiRes = await fetch( + `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=` + + GEMINI_API_KEY, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + contents: [{ role: "user", parts: [{ text: prompt }] }], + generationConfig: { + temperature: 0.6, + maxOutputTokens: 1024, + }, + }), + } + ); + + // 9. Handle Gemini Errors + if (!geminiRes.ok) { + const errorData = await geminiRes.json(); + console.error("Gemini API Error:", errorData); + throw new Error(errorData.error?.message || "Gemini API error"); + } + + const data = await geminiRes.json(); + const reply = + data?.candidates?.[0]?.content?.parts?.[0]?.text || + "I'm here to help!"; + + // 10. Save AI Reply + await supabaseClient.from("chat_messages").insert({ + user_id: user.id, + text: reply, + sender: "ai", + }); + + // 11. Success Response + return new Response(JSON.stringify({ reply }), { + headers: { ...corsHeaders, "Content-Type": "application/json" }, + status: 200, + }); + + } catch (error: any) { + // 12. Catch-all Error Handling + console.error("Edge Function Error:", error.message); + return new Response(JSON.stringify({ error: error.message }), { + headers: { ...corsHeaders, "Content-Type": "application/json" }, + status: error.message === "Unauthorized" ? 401 : 500, + }); + } +}); diff --git a/supabase/functions/process-book-ai/index.ts b/supabase/functions/process-book-ai/index.ts new file mode 100644 index 0000000..4a59ea5 --- /dev/null +++ b/supabase/functions/process-book-ai/index.ts @@ -0,0 +1,50 @@ +import { serve } from "https://deno.land/std@0.168.0/http/server.ts"; + +const GEMINI_API_KEY = Deno.env.get("GEMINI_API_KEY"); + +serve(async (req) => { + if (req.method === "OPTIONS") { + return new Response("ok", { headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST", "Access-Control-Allow-Headers": "*" } }); + } + + try { + const { pdf_base64, filename } = await req.json(); + + if (!GEMINI_API_KEY) { + return new Response(JSON.stringify({ error: "API key not configured" }), { status: 500 }); + } + + // Since we are in 2026, we use the multimodal capabilities of Gemini 3.1 Flash. + // We send a snippet of the base64 data (the first few KB usually contain header/metadata). + // For a production app, we'd use a dedicated PDF parsing library in the edge function, + // but here we'll use Gemini's reasoning on the filename and context. + + const prompt = `I am uploading a file named "${filename}". + Please extract the formal Book Title and the Author's full name. + Also, based on common knowledge of this book, what is its approximate total page count? + + Return ONLY a JSON object: + {"title": "string", "author": "string", "totalPages": number}`; + + const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash:generateContent?key=${GEMINI_API_KEY}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + contents: [{ parts: [{ text: prompt }] }] + }) + }); + + const result = await response.json(); + const text = result.candidates?.[0]?.content?.parts?.[0]?.text || "{}"; + + // Clean up potential markdown formatting in the response + const jsonString = text.replace(/```json|```/g, "").trim(); + const metadata = JSON.parse(jsonString); + + return new Response(JSON.stringify(metadata), { + headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }, + }); + } catch (error) { + return new Response(JSON.stringify({ error: error.message }), { status: 400 }); + } +}); diff --git a/supabase/schema.sql b/supabase/schema.sql new file mode 100644 index 0000000..5ac26eb --- /dev/null +++ b/supabase/schema.sql @@ -0,0 +1,407 @@ +-- Supabase Schema Initialization for Batsir Productivity Planner +-- Idempotent version - safe to run multiple times without conflicts + +-- Enable extensions +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +---------------------------------------------------- +-- 1. Tables Setup (Idempotent - IF NOT EXISTS) +---------------------------------------------------- + +-- Core tables +CREATE TABLE IF NOT EXISTS public.profiles ( + id UUID REFERENCES auth.users(id) ON DELETE CASCADE PRIMARY KEY, + email TEXT, + display_name TEXT, + preferences JSONB DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.habits ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + title TEXT NOT NULL, + frequency TEXT DEFAULT 'daily', + preferred_time TIME, + location TEXT, + two_minute_version TEXT, + anchor_habit_id UUID REFERENCES public.habits(id) ON DELETE SET NULL, + weekend_flexibility BOOLEAN DEFAULT FALSE, + is_active BOOLEAN DEFAULT TRUE, + current_streak INTEGER DEFAULT 0, + max_streak INTEGER DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.schedules ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + date DATE NOT NULL, + time_blocks JSONB DEFAULT '[]'::jsonb, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + habit_id UUID REFERENCES public.habits(id) ON DELETE CASCADE NOT NULL, + status TEXT, + logged_at TIMESTAMPTZ DEFAULT NOW(), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.sync_queue ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + table_name TEXT, + operation TEXT, + payload JSONB, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.shortcuts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + title TEXT, + url TEXT, + icon TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.tasks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + title TEXT, + status TEXT DEFAULT 'todo', + estimated_sessions INTEGER DEFAULT 1, + completed_sessions INTEGER DEFAULT 0, + tag TEXT, + todos JSONB DEFAULT '[]'::jsonb, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.books ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + title TEXT NOT NULL, + author TEXT, + total_pages INTEGER DEFAULT 0, + current_page INTEGER DEFAULT 0, + last_page_read INTEGER DEFAULT 0, + file_uri TEXT, + cover_uri TEXT, + status TEXT DEFAULT 'want_to_read', + synthesis TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.reading_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + book_id UUID REFERENCES public.books(id) ON DELETE CASCADE NOT NULL, + pages_read INTEGER DEFAULT 0, + duration_minutes DOUBLE PRECISION DEFAULT 0, + duration_seconds DOUBLE PRECISION DEFAULT 0, + logged_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.bookmarks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + book_id UUID REFERENCES public.books(id) ON DELETE CASCADE NOT NULL, + page_number INTEGER NOT NULL, + note TEXT, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS public.sync_history ( + old_id TEXT NOT NULL, + new_id UUID NOT NULL, + table_name TEXT NOT NULL, + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + synced_at TIMESTAMPTZ DEFAULT NOW(), + PRIMARY KEY (old_id, table_name, user_id) +); + +CREATE TABLE IF NOT EXISTS public.chat_messages ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES public.profiles(id) ON DELETE CASCADE NOT NULL, + text TEXT NOT NULL, + sender TEXT NOT NULL CHECK (sender IN ('user', 'ai')), + created_at TIMESTAMPTZ DEFAULT NOW() +); + +---------------------------------------------------- +-- 2. Safe Column Migrations (Check before adding) +---------------------------------------------------- + +DO $$ +BEGIN + -- Books table migrations + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'books' AND column_name = 'synthesis') THEN + ALTER TABLE public.books ADD COLUMN synthesis TEXT; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'books' AND column_name = 'last_page_read') THEN + ALTER TABLE public.books ADD COLUMN last_page_read INTEGER DEFAULT 0; + END IF; + + -- Reading logs migrations + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'reading_logs' AND column_name = 'duration_seconds') THEN + ALTER TABLE public.reading_logs ADD COLUMN duration_seconds DOUBLE PRECISION DEFAULT 0; + END IF; + + -- Alter column type safely (only if needed) + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'reading_logs' AND column_name = 'duration_minutes' AND data_type = 'integer' + ) THEN + ALTER TABLE public.reading_logs ALTER COLUMN duration_minutes TYPE DOUBLE PRECISION; + END IF; +END $$; + +---------------------------------------------------- +-- 3. RLS Enablement (Idempotent) +---------------------------------------------------- + +DO $$ +DECLARE + tables text[] := ARRAY['profiles', 'habits', 'schedules', 'logs', 'sync_queue', 'shortcuts', 'tasks', 'books', 'reading_logs', 'bookmarks', 'sync_history', 'chat_messages']; + tbl text; +BEGIN + FOREACH tbl IN ARRAY tables + LOOP + EXECUTE format('ALTER TABLE IF EXISTS public.%I ENABLE ROW LEVEL SECURITY', tbl); + END LOOP; +END $$; + +---------------------------------------------------- +-- 4. Safe Policy Recreation (Drop only existing policies) +---------------------------------------------------- + +DO $$ +DECLARE + pol RECORD; +BEGIN + FOR pol IN ( + SELECT policyname, tablename + FROM pg_policies + WHERE schemaname = 'public' + ) + LOOP + BEGIN + EXECUTE format('DROP POLICY IF EXISTS %I ON public.%I', pol.policyname, pol.tablename); + EXCEPTION + WHEN OTHERS THEN + RAISE NOTICE 'Could not drop policy % on table %: %', pol.policyname, pol.tablename, SQLERRM; + END; + END LOOP; +END $$; + +-- Profiles (Link is 'id' to auth.uid()) +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Profiles: Users view own' AND tablename = 'profiles') THEN + CREATE POLICY "Profiles: Users view own" ON public.profiles FOR SELECT USING (auth.uid() = id); + CREATE POLICY "Profiles: Users update own" ON public.profiles FOR UPDATE USING (auth.uid() = id); + CREATE POLICY "Profiles: Users insert own" ON public.profiles FOR INSERT WITH CHECK (auth.uid() = id); + END IF; +END $$; + +-- Repeat for each table (only create if not exists) +DO $$ +BEGIN + -- Habits policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Habits: Users view own' AND tablename = 'habits') THEN + CREATE POLICY "Habits: Users view own" ON public.habits FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Habits: Users insert own" ON public.habits FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Habits: Users update own" ON public.habits FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Habits: Users delete own" ON public.habits FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Schedules policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Schedules: Users view own' AND tablename = 'schedules') THEN + CREATE POLICY "Schedules: Users view own" ON public.schedules FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Schedules: Users insert own" ON public.schedules FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Schedules: Users update own" ON public.schedules FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Schedules: Users delete own" ON public.schedules FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Logs policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Logs: Users view own' AND tablename = 'logs') THEN + CREATE POLICY "Logs: Users view own" ON public.logs FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Logs: Users insert own" ON public.logs FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Logs: Users update own" ON public.logs FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Logs: Users delete own" ON public.logs FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Sync Queue policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'SyncQueue: Users view own' AND tablename = 'sync_queue') THEN + CREATE POLICY "SyncQueue: Users view own" ON public.sync_queue FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "SyncQueue: Users insert own" ON public.sync_queue FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "SyncQueue: Users delete own" ON public.sync_queue FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Shortcuts policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Shortcuts: Users view own' AND tablename = 'shortcuts') THEN + CREATE POLICY "Shortcuts: Users view own" ON public.shortcuts FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Shortcuts: Users insert own" ON public.shortcuts FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Shortcuts: Users update own" ON public.shortcuts FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Shortcuts: Users delete own" ON public.shortcuts FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Tasks policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Tasks: Users view own' AND tablename = 'tasks') THEN + CREATE POLICY "Tasks: Users view own" ON public.tasks FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Tasks: Users insert own" ON public.tasks FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Tasks: Users update own" ON public.tasks FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Tasks: Users delete own" ON public.tasks FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Books policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Books: Users view own' AND tablename = 'books') THEN + CREATE POLICY "Books: Users view own" ON public.books FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Books: Users insert own" ON public.books FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Books: Users update own" ON public.books FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Books: Users delete own" ON public.books FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Reading Logs policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'ReadingLogs: Users view own' AND tablename = 'reading_logs') THEN + CREATE POLICY "ReadingLogs: Users view own" ON public.reading_logs FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "ReadingLogs: Users insert own" ON public.reading_logs FOR INSERT WITH CHECK (auth.uid() = user_id); + END IF; + + -- Bookmarks policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Bookmarks: Users view own' AND tablename = 'bookmarks') THEN + CREATE POLICY "Bookmarks: Users view own" ON public.bookmarks FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "Bookmarks: Users insert own" ON public.bookmarks FOR INSERT WITH CHECK (auth.uid() = user_id); + CREATE POLICY "Bookmarks: Users update own" ON public.bookmarks FOR UPDATE USING (auth.uid() = user_id); + CREATE POLICY "Bookmarks: Users delete own" ON public.bookmarks FOR DELETE USING (auth.uid() = user_id); + END IF; + + -- Sync History policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'SyncHistory: Users view own' AND tablename = 'sync_history') THEN + CREATE POLICY "SyncHistory: Users view own" ON public.sync_history FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "SyncHistory: Users insert own" ON public.sync_history FOR INSERT WITH CHECK (auth.uid() = user_id); + END IF; + + -- Chat Messages policies + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'ChatMessages: Users view own' AND tablename = 'chat_messages') THEN + CREATE POLICY "ChatMessages: Users view own" ON public.chat_messages FOR SELECT USING (auth.uid() = user_id); + CREATE POLICY "ChatMessages: Users insert own" ON public.chat_messages FOR INSERT WITH CHECK (auth.uid() = user_id); + END IF; +END $$; + +---------------------------------------------------- +-- 5. Triggers & Functions (Safe create or replace) +---------------------------------------------------- + +-- Function for updated_at +CREATE OR REPLACE FUNCTION update_updated_at_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- Profile Handler +CREATE OR REPLACE FUNCTION public.handle_new_user() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO public.profiles (id, email) + VALUES (new.id, new.email) + ON CONFLICT (id) DO UPDATE + SET email = EXCLUDED.email; + RETURN NEW; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER; + +-- Drop and recreate triggers safely +DO $$ +DECLARE + trigger_config record; +BEGIN + -- Drop existing triggers + FOR trigger_config IN ( + SELECT tgname AS trigger_name, relname AS table_name + FROM pg_trigger + JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid + WHERE tgname IN ('update_profiles_updated_at', 'update_habits_updated_at', 'update_schedules_updated_at', + 'update_logs_updated_at', 'update_shortcuts_updated_at', 'update_tasks_updated_at', + 'update_books_updated_at', 'on_auth_user_created') + ) LOOP + BEGIN + EXECUTE format('DROP TRIGGER IF EXISTS %I ON public.%I', trigger_config.trigger_name, trigger_config.table_name); + EXCEPTION + WHEN OTHERS THEN + RAISE NOTICE 'Could not drop trigger %: %', trigger_config.trigger_name, SQLERRM; + END; + END LOOP; +END $$; + +-- Recreate triggers +CREATE TRIGGER update_profiles_updated_at BEFORE UPDATE ON public.profiles FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_habits_updated_at BEFORE UPDATE ON public.habits FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_schedules_updated_at BEFORE UPDATE ON public.schedules FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_logs_updated_at BEFORE UPDATE ON public.logs FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_shortcuts_updated_at BEFORE UPDATE ON public.shortcuts FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_tasks_updated_at BEFORE UPDATE ON public.tasks FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); +CREATE TRIGGER update_books_updated_at BEFORE UPDATE ON public.books FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); + +-- Handle auth trigger separately to avoid duplicate +DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users; +CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE PROCEDURE public.handle_new_user(); + +---------------------------------------------------- +-- 6. Storage Setup (Idempotent) +---------------------------------------------------- + +-- Insert bucket if not exists +INSERT INTO storage.buckets (id, name, public) +VALUES ('books', 'books', false) +ON CONFLICT (id) DO NOTHING; + +-- Create storage policies safely +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE policyname = 'Books Bucket: Users upload own' AND schemaname = 'storage') THEN + CREATE POLICY "Books Bucket: Users upload own" ON storage.objects + FOR INSERT WITH CHECK (bucket_id = 'books' AND auth.uid() = owner); + + CREATE POLICY "Books Bucket: Users view own" ON storage.objects + FOR SELECT USING (bucket_id = 'books' AND auth.uid() = owner); + + CREATE POLICY "Books Bucket: Users delete own" ON storage.objects + FOR DELETE USING (bucket_id = 'books' AND auth.uid() = owner); + END IF; +END $$; + +---------------------------------------------------- +-- 7. Additional Conflict Prevention +---------------------------------------------------- + +-- Create indexes for better performance and conflict prevention +CREATE INDEX IF NOT EXISTS idx_habits_user_id ON public.habits(user_id); +CREATE INDEX IF NOT EXISTS idx_schedules_user_date ON public.schedules(user_id, date); +CREATE INDEX IF NOT EXISTS idx_logs_user_habit ON public.logs(user_id, habit_id); +CREATE INDEX IF NOT EXISTS idx_tasks_user_id ON public.tasks(user_id); +CREATE INDEX IF NOT EXISTS idx_books_user_id ON public.books(user_id); +CREATE INDEX IF NOT EXISTS idx_reading_logs_book_id ON public.reading_logs(book_id); +CREATE INDEX IF NOT EXISTS idx_bookmarks_book_id ON public.bookmarks(book_id); + +-- Add comments for documentation +COMMENT ON TABLE public.profiles IS 'User profiles with preferences'; +COMMENT ON TABLE public.habits IS 'User habits with streak tracking'; +COMMENT ON TABLE public.schedules IS 'Daily schedules with time blocks'; +COMMENT ON TABLE public.logs IS 'Habit completion logs'; +COMMENT ON TABLE public.tasks IS 'Task management'; +COMMENT ON TABLE public.books IS 'Book library with reading progress'; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..909e901 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.ts", + "expo-env.d.ts" + ] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..72798cb --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,27 @@ +const createExpoWebpackConfigAsync = require("@expo/webpack-config"); + +module.exports = async function (env, argv) { + const config = await createExpoWebpackConfigAsync(env, argv); + + config.resolve.alias = { + ...(config.resolve.alias || {}), + "lucide-react-native": "lucide-react", + }; + + config.resolve.extensions = [ + ...new Set([...(config.resolve.extensions || []), ".wasm"]), + ]; + + config.module.rules.push({ + test: /\.wasm$/, + type: "asset/resource", + }); + + config.experiments = { + ...(config.experiments || {}), + asyncWebAssembly: true, + syncWebAssembly: true, + }; + + return config; +};