From 280bc87a202b366e5576d73421650dd33087b951 Mon Sep 17 00:00:00 2001 From: sipra Date: Fri, 13 Mar 2026 23:24:00 +0500 Subject: [PATCH 1/3] Save work on KAN-99 before starting KAN-106 --- __tests__/App.test - Copy.tsx | 402 ---------------------------------- test/TestScreen.tsx | 285 ++++++++++++++++-------- 2 files changed, 189 insertions(+), 498 deletions(-) delete mode 100644 __tests__/App.test - Copy.tsx diff --git a/__tests__/App.test - Copy.tsx b/__tests__/App.test - Copy.tsx deleted file mode 100644 index 213abce..0000000 --- a/__tests__/App.test - Copy.tsx +++ /dev/null @@ -1,402 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { - View, Text, TextInput, TouchableOpacity, StyleSheet, - FlatList, Alert, NativeModules, NativeEventEmitter, - ScrollView, StatusBar, Animated, ActivityIndicator, - DeviceEventEmitter, -} from 'react-native'; - -const { LimitterModule } = NativeModules; - -interface AppInfo { name: string; package: string; } -type Step = 'timer' | 'apps' | 'running' | 'blocked'; - -const POPULAR_APPS = [ - { name: 'Instagram', package: 'com.instagram.android', icon: '📸', color: '#E1306C' }, - { name: 'WhatsApp', package: 'com.whatsapp', icon: '💬', color: '#25D366' }, - { name: 'YouTube', package: 'com.google.android.youtube', icon: '▶️', color: '#FF0000' }, - { name: 'Snapchat', package: 'com.snapchat.android', icon: '👻', color: '#FFFC00' }, - { name: 'Messenger', package: 'com.facebook.orca', icon: '🔵', color: '#006AFF' }, - { name: 'TikTok', package: 'com.zhiliaoapp.musically', icon: '🎵', color: '#ee1d52' }, - { name: 'Spotify', package: 'com.spotify.music', icon: '🎧', color: '#1DB954' }, - { name: 'Facebook', package: 'com.facebook.katana', icon: '👍', color: '#1877F2' }, - { name: 'Telegram', package: 'org.telegram.messenger', icon: '✈️', color: '#0088cc' }, - { name: 'Twitter/X', package: 'com.twitter.android', icon: '🐦', color: '#1DA1F2' }, - { name: 'Netflix', package: 'com.netflix.mediaclient', icon: '🎬', color: '#E50914' }, - { name: 'Reddit', package: 'com.reddit.frontpage', icon: '🤖', color: '#FF4500' }, -]; - -const C = { - bg: '#0f0c29', surface: 'rgba(255,255,255,0.07)', border: 'rgba(255,255,255,0.12)', - primary: '#7c3aed', primaryLight: '#a78bfa', - danger: '#ef4444', text: '#ffffff', muted: '#6b7280', secondary: '#c4b5fd', -}; - -export default function App() { - const [step, setStep] = useState('timer'); - const [timeUnit, setTimeUnit] = useState<'seconds' | 'hours'>('seconds'); - const [timeValue, setTimeValue] = useState(''); - const [installed, setInstalled] = useState([]); - const [selectedApp, setSelected] = useState(null); - const [totalSecs, setTotal] = useState(0); - const [remaining, setRemaining] = useState(0); - const [loading, setLoading] = useState(false); - const [permOk, setPermOk] = useState(false); - const [notifMsg, setNotifMsg] = useState(''); - const notifOpacity = useRef(new Animated.Value(0)).current; - - // ── Permissions on mount ───────────────────────────────── - useEffect(() => { checkPerms(); }, []); - - // ── Listen to native timer broadcasts ─────────────────── - // Native service broadcasts every second with remaining time - useEffect(() => { - const sub = DeviceEventEmitter.addListener('TIMER_TICK', (data: any) => { - const r = data?.remaining ?? 0; - const blocked = data?.isBlocked ?? false; - setRemaining(r); - if (blocked && step !== 'blocked') { - setStep('blocked'); - } - }); - return () => sub.remove(); - }, [step]); - - const checkPerms = async () => { - try { - const p = await LimitterModule.checkPermissions(); - setPermOk(p.overlay && p.usage); - if (!p.overlay || !p.usage) { - await LimitterModule.checkAndRequestPermissions(); - setTimeout(checkPerms, 3000); - } - } catch { setPermOk(true); } - }; - - const showNotif = (msg: string) => { - setNotifMsg(msg); - Animated.sequence([ - Animated.timing(notifOpacity, { toValue: 1, duration: 300, useNativeDriver: true }), - Animated.delay(2500), - Animated.timing(notifOpacity, { toValue: 0, duration: 300, useNativeDriver: true }), - ]).start(); - }; - - const loadApps = async () => { - setLoading(true); - try { - const apps: AppInfo[] = await LimitterModule.getInstalledApps(); - const pkgs = new Set(apps.map(a => a.package)); - const pop = POPULAR_APPS.filter(p => pkgs.has(p.package)); - const rest = apps - .filter(a => !POPULAR_APPS.find(p => p.package === a.package)) - .map(a => ({ ...a, icon: '📱', color: C.primary })); - setInstalled([...pop, ...rest]); - } catch { setInstalled(POPULAR_APPS); } - setLoading(false); - }; - - const handleSetTimer = () => { - const val = parseInt(timeValue); - if (!val || val <= 0) { Alert.alert('Invalid', 'Enter a valid time.'); return; } - const secs = timeUnit === 'hours' ? val * 3600 : val; - setTotal(secs); - setRemaining(secs); - showNotif('✅ Timer set! Now select the app to limit.'); - loadApps(); - setTimeout(() => setStep('apps'), 500); - }; - - const handleStart = async () => { - if (!selectedApp) { Alert.alert('Select App', 'Please select an app first.'); return; } - try { - await LimitterModule.showNotification( - `⏱ Timer set for ${selectedApp.name}. You have ${fmt(totalSecs)}.` - ); - const result = await LimitterModule.sendCommand('START', { - package: selectedApp.package, - appName: selectedApp.name, - duration: totalSecs, - timeUnit: 'seconds', - }); - if (result === 'PERMISSION_OVERLAY_REQUIRED' || result === 'PERMISSION_USAGE_REQUIRED') { - Alert.alert('Permission Required', 'Grant Overlay & Usage Access then try again.', - [{ text: 'Grant', onPress: checkPerms }]); - return; - } - showNotif(`🚀 ${selectedApp.name} will be blocked in ${fmt(totalSecs)}`); - setStep('running'); - } catch (e: any) { Alert.alert('Error', e?.message || 'Failed to start'); } - }; - - const reset = async () => { - try { await LimitterModule.sendCommand('STOP', {}); } catch { } - setStep('timer'); setTimeValue(''); setSelected(null); setTotal(0); setRemaining(0); - }; - - const fmt = (s: number) => { - const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60; - return h > 0 - ? `${h}:${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}` - : `${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}`; - }; - - const progress = totalSecs > 0 ? (totalSecs - remaining) / totalSecs : 0; - - return ( - - - - - {notifMsg} - - - {!permOk && ( - - ⚠️ Permissions needed. Tap to grant. - - )} - - {/* ── STEP 1: SET TIMER ── */} - {step === 'timer' && ( - - ⏱ AppGuard - Screen Time Limiter - - Set Your Timer - - {(['seconds', 'hours'] as const).map(u => ( - { setTimeUnit(u); setTimeValue(''); }}> - - {u === 'seconds' ? '⚡ Seconds' : '🕐 Hours'} - - - ))} - - - {!!timeValue && parseInt(timeValue) > 0 && ( - - = {fmt(timeUnit === 'hours' ? parseInt(timeValue) * 3600 : parseInt(timeValue))} - - )} - Quick Presets - - {([ - { l: '10s', v: '10', u: 'seconds' }, { l: '30s', v: '30', u: 'seconds' }, - { l: '1 min', v: '60', u: 'seconds' }, { l: '5 min', v: '300', u: 'seconds' }, - { l: '1 hr', v: '1', u: 'hours' }, { l: '2 hr', v: '2', u: 'hours' }, - ] as any[]).map(p => ( - { setTimeUnit(p.u); setTimeValue(p.v); }}> - {p.l} - - ))} - - - Next: Select App → - - - - )} - - {/* ── STEP 2: SELECT APP ── */} - {step === 'apps' && ( - - - setStep('timer')}> - ← Back - - 📱 Select App to Block - - Timer: {fmt(totalSecs)} • Select ONE app - {loading - ? Loading apps... - : ( - i.package} - numColumns={2} - columnWrapperStyle={{ gap: 12, marginBottom: 12, paddingHorizontal: 16 }} - contentContainerStyle={{ paddingBottom: 120, paddingTop: 8 }} - showsVerticalScrollIndicator={false} - renderItem={({ item }) => { - const sel = selectedApp?.package === item.package; - const pop = POPULAR_APPS.find(p => p.package === item.package); - const icon = pop?.icon || '📱'; - const col = pop?.color || C.primary; - return ( - setSelected(item)} activeOpacity={0.8}> - {sel && ( - - - - )} - {icon} - - {item.name} - - - ); - }} - /> - ) - } - - - - {selectedApp ? `🚀 Block ${selectedApp.name} after ${fmt(totalSecs)}` : 'Select an app first'} - - - - - )} - - {/* ── STEP 3: TIMER RUNNING ── */} - {step === 'running' && selectedApp && ( - - ⏱ Timer Running - You can use your phone normally - - {/* Big countdown — synced from native */} - - - - {fmt(remaining)} - - remaining - - - - - - - - - 🔒 Will auto-block when timer ends: - - - {POPULAR_APPS.find(p => p.package === selectedApp.package)?.icon || '📱'} - - - {selectedApp.name} - {selectedApp.package} - - - - - - - ✅ Timer runs in background automatically.{'\n'} - When time ends, {selectedApp.name} will be blocked instantly — even if you're using it. - - - - - Alert.alert('Cancel Timer?', 'This will stop the timer and unblock the app.', [ - { text: 'No', style: 'cancel' }, - { text: 'Yes, Cancel', style: 'destructive', onPress: reset }, - ])}> - ✕ Cancel Timer - - - )} - - {/* ── STEP 4: BLOCKED ── */} - {step === 'blocked' && selectedApp && ( - - 🚫 - Time's Up! - - {selectedApp.name} is now blocked.{'\n'} - If you open it, a block screen will appear automatically. - - - - - - {POPULAR_APPS.find(p => p.package === selectedApp.package)?.icon || '📱'} - - - {selectedApp.name} - 🔒 BLOCKED - - - - - - 💡 Take a Break! - Drink water, stretch, or go for a walk. 🧠 - - - - 🔄 Set New Timer - - - )} - - ); -} - -const s = StyleSheet.create({ - root: { flex: 1, backgroundColor: C.bg }, - screen: { flexGrow: 1, padding: 20, paddingTop: 60, paddingBottom: 40 }, - toast: { position: 'absolute', top: 20, left: 20, right: 20, zIndex: 999, backgroundColor: 'rgba(124,58,237,0.9)', borderRadius: 14, padding: 14, alignItems: 'center' }, - toastTxt: { color: '#fff', fontWeight: '600', fontSize: 14 }, - permBanner: { backgroundColor: 'rgba(239,68,68,0.2)', padding: 12, borderBottomWidth: 1, borderBottomColor: 'rgba(239,68,68,0.3)' }, - permTxt: { color: '#fca5a5', fontSize: 13, textAlign: 'center' }, - title: { fontSize: 36, fontWeight: '800', color: C.text, textAlign: 'center', letterSpacing: -1 }, - subtitle: { color: C.primaryLight, fontSize: 15, textAlign: 'center', marginBottom: 32, marginTop: 4 }, - card: { backgroundColor: C.surface, borderRadius: 20, borderWidth: 1, borderColor: C.border, padding: 20, marginBottom: 16 }, - cardTitle: { color: C.text, fontWeight: '700', fontSize: 18, marginBottom: 20 }, - toggle: { flexDirection: 'row', backgroundColor: 'rgba(0,0,0,0.3)', borderRadius: 12, padding: 4, marginBottom: 16 }, - tBtn: { flex: 1, padding: 12, borderRadius: 10, alignItems: 'center' }, - tBtnOn: { backgroundColor: C.primary }, - tTxt: { color: C.muted, fontWeight: '600', fontSize: 14 }, - tTxtOn: { color: '#fff' }, - input: { backgroundColor: 'rgba(255,255,255,0.08)', borderRadius: 12, borderWidth: 1, borderColor: C.border, paddingHorizontal: 20, paddingVertical: 16, fontSize: 28, fontWeight: '700', color: C.text, marginBottom: 8 }, - preview: { color: C.primaryLight, fontSize: 14, marginBottom: 20, textAlign: 'center' }, - label: { color: C.secondary, fontSize: 13, fontWeight: '600', marginBottom: 10 }, - presets: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginBottom: 20 }, - presetBtn: { backgroundColor: 'rgba(255,255,255,0.08)', borderRadius: 20, paddingHorizontal: 16, paddingVertical: 8, borderWidth: 1, borderColor: C.border }, - presetTxt: { color: C.secondary, fontWeight: '600', fontSize: 13 }, - btn: { backgroundColor: C.primary, borderRadius: 14, padding: 16, alignItems: 'center', shadowColor: C.primary, shadowOpacity: 0.4, shadowRadius: 12, elevation: 8 }, - btnOff: { opacity: 0.35, shadowOpacity: 0 }, - btnTxt: { color: '#fff', fontWeight: '700', fontSize: 16 }, - stepHdr: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingHorizontal: 16, marginBottom: 4, paddingTop: 52 }, - back: { color: C.primaryLight, fontSize: 16 }, - stepTitle: { color: C.text, fontWeight: '700', fontSize: 18 }, - stepSub: { color: C.muted, fontSize: 13, paddingHorizontal: 16, marginBottom: 12 }, - loadBox: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 16, marginTop: 60 }, - loadTxt: { color: C.muted, fontSize: 15 }, - appCard: { flex: 1, backgroundColor: C.surface, borderRadius: 18, borderWidth: 2, borderColor: C.border, padding: 16, alignItems: 'center', minHeight: 110, justifyContent: 'center', position: 'relative' }, - check: { position: 'absolute', top: 8, right: 8, width: 22, height: 22, borderRadius: 11, alignItems: 'center', justifyContent: 'center' }, - appName: { color: C.secondary, fontWeight: '600', fontSize: 12, textAlign: 'center' }, - bottomBar: { position: 'absolute', bottom: 0, left: 0, right: 0, padding: 16, backgroundColor: C.bg, borderTopWidth: 1, borderTopColor: C.border }, - ring: { alignItems: 'center', marginBottom: 20, marginTop: 8 }, - ringInner: { width: 200, height: 200, borderRadius: 100, borderWidth: 8, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(124,58,237,0.1)' }, - ringTime: { fontSize: 38, fontWeight: '800', color: C.text, letterSpacing: -2 }, - ringSub: { color: C.muted, fontSize: 12, fontWeight: '600', letterSpacing: 2, marginTop: 4 }, - pBarWrap: { height: 6, backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 3, marginBottom: 24, overflow: 'hidden' }, - pBarFill: { height: '100%', borderRadius: 3 }, - appRow: { flexDirection: 'row', alignItems: 'center', gap: 16, marginTop: 8 }, - appRowName: { color: C.text, fontWeight: '700', fontSize: 16 }, - appRowPkg: { color: C.muted, fontSize: 11, marginTop: 2 }, - cancelBtn: { borderRadius: 14, padding: 14, alignItems: 'center', borderWidth: 1, borderColor: 'rgba(239,68,68,0.3)', marginTop: 8 }, - cancelTxt: { color: C.danger, fontWeight: '600', fontSize: 15 }, - blockedTitle: { fontSize: 36, fontWeight: '800', color: C.danger, textAlign: 'center', marginBottom: 12 }, - blockedSub: { color: C.muted, fontSize: 15, textAlign: 'center', lineHeight: 22, marginBottom: 24 }, - motivTitle: { color: C.primaryLight, fontWeight: '700', fontSize: 15, marginBottom: 8 }, - motivTxt: { color: C.secondary, fontSize: 14, lineHeight: 22 }, -}); \ No newline at end of file diff --git a/test/TestScreen.tsx b/test/TestScreen.tsx index 7f4f6d3..8439183 100644 --- a/test/TestScreen.tsx +++ b/test/TestScreen.tsx @@ -1,12 +1,12 @@ import React, { useState } from 'react'; -import { View, Text, StyleSheet, ScrollView, Alert as RNAlert } from 'react-native'; +import { View, Text, StyleSheet, ScrollView, Alert as RNAlert, SafeAreaView } from 'react-native'; import { BaseButton, TextInput, - PasswordInput, BaseModal, RadioGroup, - Alert + Alert, + Icon } from '../components'; const TestScreen: React.FC = () => { @@ -20,140 +20,233 @@ const TestScreen: React.FC = () => { // Radio Options const radioOptions = [ - { label: 'Option 1', value: 'option1' }, - { label: 'Option 2', value: 'option2' }, - { label: 'Option 3', value: 'option3' }, + { label: 'Visa ending in 4242', value: 'option1', description: 'Expires 12/26' }, + { label: 'Mastercard ending in 1234', value: 'option2', description: 'Expires 08/25' }, + { label: 'Add New Card', value: 'option3', disabled: true }, ]; return ( - - UI Components Test - - - - {/* TextInput Test */} + + + + Component Library + Testing UI Elements for AppGuard2 + + + {/* Buttons Section */} - TEXT INPUT - + BUTTONS + + + RNAlert.alert("Primary Action")}> + Primary + + + Secondary + + + + + Outline + + + Danger + + + + Ghost Variant (Text only) + + + Loading State + + - {/* PasswordInput Test */} + {/* Inputs Section */} - PASSWORD INPUT - + INPUTS + + + + + - {/* RadioGroup Test */} + {/* Radio Group Section */} - RADIO GROUP - setRadioValue(value)} - /> + RADIO SELECTORS + + setRadioValue(value)} + /> + - {/* Alert Test */} + {/* Alerts Section */} - ALERT - - This is a warning message. - + ALERTS & FEEDBACK + + + This is a standard informational message for the user. + + + Your device has 30 mins of homework time left. + + + Payment confirmed successfully! + + - {/* BaseButton Test */} + {/* Icons Section */} - BUTTON - RNAlert.alert("Button clicked!")} - > - Click Me - + ICONS + + 🔒 + + 🧠 + + G + - {/* BaseModal Test */} + {/* Modal Section */} - MODAL - setIsModalOpen(true)} - > - Open Modal - - - setIsModalOpen(false)} - title="Sample Modal" - > - - This is some sample text inside the BaseModal. - You can close this modal using the cross or dim backdrop. - - - setIsModalOpen(false)} - > - Close Modal - - - + MODALS + + setIsModalOpen(true)} + > + Preview Modal + + + setIsModalOpen(false)} + title="Override Configuration" + subtitle="Configure how long you want to unlock the device." + headerLabel="System Settings" + > + + + This is a preview of the BaseModal component. It supports titles, subtitles, and custom header labels. + + + + setIsModalOpen(false)}> + Cancel + + setIsModalOpen(false)}> + Save + + + + + - - + + AppGuard2 • v2.0.0 + + + ); }; const styles = StyleSheet.create({ + safeArea: { + flex: 1, + backgroundColor: '#f8fafc', + }, container: { flex: 1, - backgroundColor: '#f9fafb', }, content: { - padding: 24, + padding: 20, paddingBottom: 60, }, + header: { + marginBottom: 32, + marginTop: 10, + }, pageTitle: { - fontSize: 24, - fontWeight: 'bold', - color: '#1f2937', - marginBottom: 24, + fontSize: 28, + fontWeight: '800', + color: '#0f172a', + letterSpacing: -0.5, + }, + pageSubtitle: { + fontSize: 16, + color: '#64748b', + marginTop: 4, }, - card: { + section: { + marginBottom: 28, + }, + sectionHeader: { + fontSize: 12, + fontWeight: '700', + color: '#94a3b8', + letterSpacing: 1.5, + marginBottom: 12, + paddingLeft: 4, + }, + componentCard: { backgroundColor: '#ffffff', - padding: 24, - borderRadius: 12, + padding: 18, + borderRadius: 16, + borderWidth: 1, + borderColor: '#e2e8f0', + gap: 12, shadowColor: '#000', - shadowOpacity: 0.05, shadowOffset: { width: 0, height: 2 }, - shadowRadius: 8, + shadowOpacity: 0.05, + shadowRadius: 10, elevation: 2, }, - section: { - marginBottom: 32, + row: { + flexDirection: 'row', + gap: 12, + }, + flex1: { + flex: 1, + }, + mb12: { + marginBottom: 12, + }, + modalText: { + fontSize: 14, + color: '#475569', + lineHeight: 20, }, - sectionTitle: { + footer: { + marginTop: 20, + alignItems: 'center', + opacity: 0.5, + }, + footerText: { fontSize: 12, fontWeight: '600', - color: '#9ca3af', - marginBottom: 12, + color: '#64748b', }, }); From 63dd1714cd89144d955d4d81e5472139f39364e0 Mon Sep 17 00:00:00 2001 From: sipra Date: Sat, 14 Mar 2026 00:11:54 +0500 Subject: [PATCH 2/3] Complete KAN-83: Login, Signup, Forgot Password screens and Auth flow integration --- App.tsx | 88 ++-------- Limitter-app | 1 - src/ComponentDemoPage.tsx | 129 -------------- src/navigation/AuthNavigator.tsx | 56 ++++++ src/screens/ForgotPasswordScreen.tsx | 157 +++++++++++++++++ src/screens/LoginScreen.tsx | 172 ++++++++++++++++++ src/screens/SignupScreen.tsx | 176 +++++++++++++++++++ src/screens/index.ts | 3 + test/TestScreen.tsx | 253 --------------------------- 9 files changed, 576 insertions(+), 459 deletions(-) delete mode 160000 Limitter-app delete mode 100644 src/ComponentDemoPage.tsx create mode 100644 src/navigation/AuthNavigator.tsx create mode 100644 src/screens/ForgotPasswordScreen.tsx create mode 100644 src/screens/LoginScreen.tsx create mode 100644 src/screens/SignupScreen.tsx create mode 100644 src/screens/index.ts delete mode 100644 test/TestScreen.tsx diff --git a/App.tsx b/App.tsx index 7814bdb..00324d1 100644 --- a/App.tsx +++ b/App.tsx @@ -1,4 +1,7 @@ import React, { useEffect, useMemo, useState } from 'react'; +import { LogBox } from 'react-native'; + +LogBox.ignoreAllLogs(); // Ignore all log notifications import { SafeAreaView, @@ -20,10 +23,8 @@ import { const { LimitterModule, TimerEventModule } = NativeModules; import { startCategoryService } from './src/services/categoryService'; -import TestScreen from './test/TestScreen'; - -// Set this to true to see the test screen instead of the main app -const SHOW_TEST_SCREEN = false; +import { NavigationContainer } from '@react-navigation/native'; +import AuthNavigator from './src/navigation/AuthNavigator'; import { BaseButton, @@ -46,10 +47,6 @@ interface AppLimit extends AppInfo { } function App(): React.JSX.Element { - if (SHOW_TEST_SCREEN) { - return ; - } - // ===== ALL HOOKS MUST BE DECLARED BEFORE ANY CONDITIONAL RETURNS ===== const [showMainApp, setShowMainApp] = useState(false); const [activeLimits, setActiveLimits] = useState([]); @@ -345,80 +342,20 @@ function App(): React.JSX.Element { }, [allApps, searchQuery]); // ===== COMPONENT TEST PAGE (Figma Mockup) ===== + // Render Auth flow if not logged in if (!showMainApp) { return ( - - - - {/* ✅ ROOT STATUS HEADER */} - SHIELD ACTIVE • ROOT FILE RESOLVED ✅ - 🛡️Login / SignupWelcome back. Monitor and protect your family's digital journey. - - Forgot password? - - { }} style={{ marginBottom: 24 }}>Sign In - - - - OR CONTINUE WITH - - - - - GGoogle - Apple - - - Don't have an account? Create one - - - - - {/* COMPONENT AUDIT SECTION */} - 🎨 Component Showcase - - - Variations - - Outline Button - Danger Action - Secondary Ghost - - - - - Selection - { }} - /> - - - - Alert System - Accessibility service is used for URL detection only. - - - setShowMainApp(true)} - > - 🚀 PROCEED TO MAIN DASHBOARD - - - + + setShowMainApp(true)} /> + ); } + // ===== END COMPONENT TEST PAGE ===== if (step === 0) { return ( - !!! ROOT APP ACTIVE !!! Permissions Needed Overlay and Usage Access required. LimitterModule?.checkAndRequestPermissions()}> @@ -437,9 +374,8 @@ function App(): React.JSX.Element { - !!! ROOT FILE RUNNING !!! - NEW UIIIII - v2.0 Native Guard + AppGuard + v2.0 Native Shield { - const [textValue, setTextValue] = useState(''); - const [usernameValue, setUsernameValue] = useState(''); - const [passwordValue, setPasswordValue] = useState(''); - const [radioValue, setRadioValue] = useState('option1'); - const [isModalOpen, setIsModalOpen] = useState(false); - - const radioOptions = [ - { label: 'Visa ending in 4242', value: 'option1', description: 'Expires 12/26' }, - { label: 'Mastercard ending in 1234', value: 'option2', description: 'Expires 08/25' }, - { label: 'Add New Card', value: 'option3', disabled: true }, - ]; - - return ( - - - UI Library Test - - - Buttons - - Primary - Secondary - - Outline Full Width - Danger Button - - - - Inputs - - - - - - - - Radio Group - - - - - Alerts - This is an info alert. - This is a warning alert. - This is a success alert. - - - - Icons - - 🔒 - 🧠 - - - - - - Modal - setIsModalOpen(true)}>Open Test Modal - setIsModalOpen(false)} - title="Test Modal" - > - Modal content is working! - setIsModalOpen(false)} style={{ marginTop: 20 }}>Close - - - - - ); -}; - -const styles = StyleSheet.create({ - section: { - marginBottom: 30, - backgroundColor: '#F9FAFB', - padding: 15, - borderRadius: 12, - }, - sectionTitle: { - fontSize: 14, - fontWeight: '700', - color: '#9CA3AF', - textTransform: 'uppercase', - marginBottom: 15, - }, - row: { - flexDirection: 'row', - gap: 10, - }, - flex1: { - flex: 1, - } -}); - -export default ComponentDemoPage; diff --git a/src/navigation/AuthNavigator.tsx b/src/navigation/AuthNavigator.tsx new file mode 100644 index 0000000..3e44a76 --- /dev/null +++ b/src/navigation/AuthNavigator.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import { LoginScreen, SignupScreen, ForgotPasswordScreen } from '../screens'; + +export type AuthStackParamList = { + Login: undefined; + Signup: undefined; + ForgotPassword: undefined; +}; + +const Stack = createNativeStackNavigator(); + +const AuthNavigator = ({ onLoginSuccess }: { onLoginSuccess: () => void }) => { + return ( + + + {(props) => ( + props.navigation.navigate('Signup')} + onForgotPassword={() => props.navigation.navigate('ForgotPassword')} + onLogin={(email) => { + console.log('Login success:', email); + onLoginSuccess(); + }} + /> + )} + + + + {(props) => ( + props.navigation.navigate('Login')} + onSignup={(email) => console.log('Signup attempt:', email)} + /> + )} + + + + {(props) => ( + props.navigation.navigate('Login')} + onSendEmail={(email) => console.log('Reset attempt:', email)} + /> + )} + + + ); +}; + +export default AuthNavigator; diff --git a/src/screens/ForgotPasswordScreen.tsx b/src/screens/ForgotPasswordScreen.tsx new file mode 100644 index 0000000..aa9c70c --- /dev/null +++ b/src/screens/ForgotPasswordScreen.tsx @@ -0,0 +1,157 @@ +import React, { useState } from 'react'; +import { + View, + Text, + StyleSheet, + SafeAreaView, + TouchableOpacity, + KeyboardAvoidingView, + Platform, + ScrollView, + Alert as RNAlert, +} from 'react-native'; +import { BaseButton, TextInput, Icon } from '../../components'; + +interface ForgotPasswordScreenProps { + onSendEmail?: (email: string) => void; + onNavigateBack?: () => void; +} + +const ForgotPasswordScreen: React.FC = ({ + onSendEmail, + onNavigateBack, +}) => { + const [email, setEmail] = useState(''); + + const handleSendEmail = () => { + if (!email) { + RNAlert.alert('Error', 'Please enter your email address'); + return; + } + + // 2. Functionality: Trigger placeholder and show alert + RNAlert.alert('Success', 'Verification email sent'); + + if (onSendEmail) { + onSendEmail(email); + } + }; + + return ( + + + + {/* Header */} + + + 🛡️ + + Reset Password + + Enter your email address and we'll send you a link to reset your password. + + + + {/* Form */} + + + + + Send Verification Email + + + + {/* Navigation Back */} + + + Back to Login + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#FFFFFF', + }, + flex: { + flex: 1, + }, + scrollContent: { + flexGrow: 1, + paddingHorizontal: 24, + paddingBottom: 40, + }, + header: { + alignItems: 'center', + marginTop: 40, + marginBottom: 48, + }, + iconContainer: { + width: 80, + height: 80, + borderRadius: 40, + backgroundColor: '#F1F5F9', + alignItems: 'center', + justifyContent: 'center', + marginBottom: 24, + alignSelf: 'center', + }, + title: { + fontSize: 28, + fontWeight: '900', + color: '#0F172A', + textAlign: 'center', + marginBottom: 12, + }, + subtitle: { + fontSize: 16, + color: '#64748B', + textAlign: 'center', + lineHeight: 24, + paddingHorizontal: 20, + }, + formContainer: { + width: '100%', + }, + actionButton: { + marginTop: 16, + marginBottom: 24, + }, + footer: { + justifyContent: 'center', + alignItems: 'center', + marginTop: 'auto', + paddingTop: 24, + }, + backText: { + color: '#10B981', + fontWeight: '800', + fontSize: 15, + }, +}); + +export default ForgotPasswordScreen; diff --git a/src/screens/LoginScreen.tsx b/src/screens/LoginScreen.tsx new file mode 100644 index 0000000..329d433 --- /dev/null +++ b/src/screens/LoginScreen.tsx @@ -0,0 +1,172 @@ +import React, { useState } from 'react'; +import { + View, + Text, + StyleSheet, + SafeAreaView, + TouchableOpacity, + KeyboardAvoidingView, + Platform, + ScrollView, +} from 'react-native'; +import { BaseButton, TextInput, Icon } from '../../components'; + +interface LoginScreenProps { + onLogin?: (email: string, pass: string) => void; + onNavigateToSignUp?: () => void; + onForgotPassword?: () => void; +} + +const LoginScreen: React.FC = ({ + onLogin, + onNavigateToSignUp, + onForgotPassword, +}) => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + const handleLogin = () => { + if (onLogin) { + onLogin(email, password); + } + }; + + return ( + + + + {/* 1. Screen Layout: App Icon & Title */} + + + 🛡️ + + Login + + + {/* 2. Input Fields: Email & Password */} + + + + + {/* 3. Actions: Forgot Password & Login Button */} + + Forgot Password? + + + + Login + + + + {/* 4. Navigation: Bottom Link */} + + Don't have an account? + + Create one + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#FFFFFF', + }, + flex: { + flex: 1, + }, + scrollContent: { + flexGrow: 1, + paddingHorizontal: 24, + paddingBottom: 40, + }, + header: { + alignItems: 'center', + marginTop: 40, + marginBottom: 48, + }, + iconContainer: { + width: 80, + height: 80, + borderRadius: 40, + backgroundColor: '#F1F5F9', // Light gray background for icon + alignItems: 'center', + justifyContent: 'center', + marginBottom: 20, + alignSelf: 'center', + }, + title: { + fontSize: 28, + fontWeight: '900', + color: '#0F172A', + textAlign: 'center', + }, + formContainer: { + width: '100%', + }, + forgotPasswordContainer: { + alignSelf: 'flex-end', + marginTop: -8, + marginBottom: 32, + padding: 4, + }, + forgotPasswordText: { + color: '#10B981', // Figma Teal + fontWeight: '700', + fontSize: 14, + }, + loginButton: { + marginBottom: 24, + }, + footer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + marginTop: 'auto', + paddingTop: 24, + }, + footerText: { + color: '#64748B', + fontSize: 15, + }, + signUpText: { + color: '#10B981', // Figma Teal + fontWeight: '800', + fontSize: 15, + }, +}); + +export default LoginScreen; diff --git a/src/screens/SignupScreen.tsx b/src/screens/SignupScreen.tsx new file mode 100644 index 0000000..1aff92d --- /dev/null +++ b/src/screens/SignupScreen.tsx @@ -0,0 +1,176 @@ +import React, { useState } from 'react'; +import { + View, + Text, + StyleSheet, + SafeAreaView, + TouchableOpacity, + KeyboardAvoidingView, + Platform, + ScrollView, +} from 'react-native'; +import { BaseButton, TextInput, Icon } from '../../components'; + +interface SignupScreenProps { + onSignup?: (email: string, pass: string) => void; + onNavigateToLogin?: () => void; +} + +const SignupScreen: React.FC = ({ + onSignup, + onNavigateToLogin, +}) => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [error, setError] = useState(null); + + const handleSignup = () => { + // Reset error + setError(null); + + // 4. Validation: Check that Password and Confirm Password match + if (password !== confirmPassword) { + setError('Passwords do not match'); + return; + } + + // Prevent submission if empty (basic check) + if (!email || !password) { + return; + } + + if (onSignup) { + onSignup(email, password); + } + }; + + return ( + + + + {/* 1. Screen Layout: App Icon & Title */} + + + 🛡️ + + Create Account + + + {/* 2. Fields: Email, Password, Confirm Password */} + + + + + + {/* 3. Button: Create Account */} + + Create Account + + + + {/* 5. Navigation: Already have an account? Login */} + + Already have an account? + + Login + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#FFFFFF', + }, + flex: { + flex: 1, + }, + scrollContent: { + flexGrow: 1, + paddingHorizontal: 24, + paddingBottom: 40, + }, + header: { + alignItems: 'center', + marginTop: 40, + marginBottom: 48, + }, + iconContainer: { + width: 80, + height: 80, + borderRadius: 40, + backgroundColor: '#F1F5F9', + alignItems: 'center', + justifyContent: 'center', + marginBottom: 20, + alignSelf: 'center', + }, + title: { + fontSize: 28, + fontWeight: '900', + color: '#0F172A', + textAlign: 'center', + }, + formContainer: { + width: '100%', + }, + signupButton: { + marginTop: 16, + marginBottom: 24, + }, + footer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + marginTop: 'auto', + paddingTop: 24, + }, + footerText: { + color: '#64748B', + fontSize: 15, + }, + loginText: { + color: '#10B981', // Figma Teal + fontWeight: '800', + fontSize: 15, + }, +}); + +export default SignupScreen; diff --git a/src/screens/index.ts b/src/screens/index.ts new file mode 100644 index 0000000..7ce323b --- /dev/null +++ b/src/screens/index.ts @@ -0,0 +1,3 @@ +export { default as LoginScreen } from './LoginScreen'; +export { default as SignupScreen } from './SignupScreen'; +export { default as ForgotPasswordScreen } from './ForgotPasswordScreen'; diff --git a/test/TestScreen.tsx b/test/TestScreen.tsx deleted file mode 100644 index 8439183..0000000 --- a/test/TestScreen.tsx +++ /dev/null @@ -1,253 +0,0 @@ -import React, { useState } from 'react'; -import { View, Text, StyleSheet, ScrollView, Alert as RNAlert, SafeAreaView } from 'react-native'; -import { - BaseButton, - TextInput, - BaseModal, - RadioGroup, - Alert, - Icon -} from '../components'; - -const TestScreen: React.FC = () => { - // State for Inputs - const [textValue, setTextValue] = useState(''); - const [passwordValue, setPasswordValue] = useState(''); - const [radioValue, setRadioValue] = useState('option1'); - - // State for Modal - const [isModalOpen, setIsModalOpen] = useState(false); - - // Radio Options - const radioOptions = [ - { label: 'Visa ending in 4242', value: 'option1', description: 'Expires 12/26' }, - { label: 'Mastercard ending in 1234', value: 'option2', description: 'Expires 08/25' }, - { label: 'Add New Card', value: 'option3', disabled: true }, - ]; - - return ( - - - - Component Library - Testing UI Elements for AppGuard2 - - - {/* Buttons Section */} - - BUTTONS - - - RNAlert.alert("Primary Action")}> - Primary - - - Secondary - - - - - Outline - - - Danger - - - - Ghost Variant (Text only) - - - Loading State - - - - - {/* Inputs Section */} - - INPUTS - - - - - - - - {/* Radio Group Section */} - - RADIO SELECTORS - - setRadioValue(value)} - /> - - - - {/* Alerts Section */} - - ALERTS & FEEDBACK - - - This is a standard informational message for the user. - - - Your device has 30 mins of homework time left. - - - Payment confirmed successfully! - - - - - {/* Icons Section */} - - ICONS - - 🔒 - - 🧠 - - G - - - - {/* Modal Section */} - - MODALS - - setIsModalOpen(true)} - > - Preview Modal - - - setIsModalOpen(false)} - title="Override Configuration" - subtitle="Configure how long you want to unlock the device." - headerLabel="System Settings" - > - - - This is a preview of the BaseModal component. It supports titles, subtitles, and custom header labels. - - - - setIsModalOpen(false)}> - Cancel - - setIsModalOpen(false)}> - Save - - - - - - - - - AppGuard2 • v2.0.0 - - - - ); -}; - -const styles = StyleSheet.create({ - safeArea: { - flex: 1, - backgroundColor: '#f8fafc', - }, - container: { - flex: 1, - }, - content: { - padding: 20, - paddingBottom: 60, - }, - header: { - marginBottom: 32, - marginTop: 10, - }, - pageTitle: { - fontSize: 28, - fontWeight: '800', - color: '#0f172a', - letterSpacing: -0.5, - }, - pageSubtitle: { - fontSize: 16, - color: '#64748b', - marginTop: 4, - }, - section: { - marginBottom: 28, - }, - sectionHeader: { - fontSize: 12, - fontWeight: '700', - color: '#94a3b8', - letterSpacing: 1.5, - marginBottom: 12, - paddingLeft: 4, - }, - componentCard: { - backgroundColor: '#ffffff', - padding: 18, - borderRadius: 16, - borderWidth: 1, - borderColor: '#e2e8f0', - gap: 12, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.05, - shadowRadius: 10, - elevation: 2, - }, - row: { - flexDirection: 'row', - gap: 12, - }, - flex1: { - flex: 1, - }, - mb12: { - marginBottom: 12, - }, - modalText: { - fontSize: 14, - color: '#475569', - lineHeight: 20, - }, - footer: { - marginTop: 20, - alignItems: 'center', - opacity: 0.5, - }, - footerText: { - fontSize: 12, - fontWeight: '600', - color: '#64748b', - }, -}); - -export default TestScreen; From e802c6ce4b57d7c72ddf83d57ff14e0f4fc73cef Mon Sep 17 00:00:00 2001 From: sipra Date: Sat, 14 Mar 2026 00:31:27 +0500 Subject: [PATCH 3/3] Restore missing components and screen files --- App.tsx | 38 +- Limitter-app | 1 + __tests__/App.test - Copy.tsx | 402 ++++++++++++++ .../app/src/main/assets/index.android.bundle | 26 +- ...s_logbox_ui_logboximages_alerttriangle.png | Bin 609 -> 0 bytes ...ies_logbox_ui_logboximages_chevronleft.png | Bin 126 -> 0 bytes ...es_logbox_ui_logboximages_chevronright.png | Bin 123 -> 0 bytes ...libraries_logbox_ui_logboximages_close.png | Bin 187 -> 0 bytes ...ibraries_logbox_ui_logboximages_loader.png | Bin 282 -> 0 bytes android/app/src/main/res/raw/keep.xml | 2 +- package-lock.json | 501 ++++++++---------- package.json | 3 - test/TestScreen.tsx | 253 +++++++++ tsconfig.json | 3 +- 14 files changed, 895 insertions(+), 334 deletions(-) create mode 160000 Limitter-app create mode 100644 __tests__/App.test - Copy.tsx delete mode 100644 android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_alerttriangle.png delete mode 100644 android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_chevronleft.png delete mode 100644 android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_chevronright.png delete mode 100644 android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_close.png delete mode 100644 android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_loader.png create mode 100644 test/TestScreen.tsx diff --git a/App.tsx b/App.tsx index 00324d1..e4c0c53 100644 --- a/App.tsx +++ b/App.tsx @@ -1,8 +1,4 @@ import React, { useEffect, useMemo, useState } from 'react'; -import { LogBox } from 'react-native'; - -LogBox.ignoreAllLogs(); // Ignore all log notifications - import { SafeAreaView, StatusBar, @@ -23,17 +19,6 @@ import { const { LimitterModule, TimerEventModule } = NativeModules; import { startCategoryService } from './src/services/categoryService'; -import { NavigationContainer } from '@react-navigation/native'; -import AuthNavigator from './src/navigation/AuthNavigator'; - -import { - BaseButton, - TextInput as CustomInput, - BaseModal, - RadioGroup, - Alert as CustomAlert, - Icon as CustomIcon -} from './components'; type AppInfo = { name: string; @@ -47,8 +32,6 @@ interface AppLimit extends AppInfo { } function App(): React.JSX.Element { - // ===== ALL HOOKS MUST BE DECLARED BEFORE ANY CONDITIONAL RETURNS ===== - const [showMainApp, setShowMainApp] = useState(false); const [activeLimits, setActiveLimits] = useState([]); const [showTroubleshoot, setShowTroubleshoot] = useState(false); const [selectedApps, setSelectedApps] = useState([]); // Multi-select support @@ -79,7 +62,6 @@ function App(): React.JSX.Element { return () => sub.remove(); }, []); - const syncActiveTimers = async () => { if (LimitterModule?.getActiveTimers) { try { @@ -341,18 +323,6 @@ function App(): React.JSX.Element { return allApps.filter(a => a.name.toLowerCase().includes(searchQuery.toLowerCase())); }, [allApps, searchQuery]); - // ===== COMPONENT TEST PAGE (Figma Mockup) ===== - // Render Auth flow if not logged in - if (!showMainApp) { - return ( - - setShowMainApp(true)} /> - - ); - } - - // ===== END COMPONENT TEST PAGE ===== - if (step === 0) { return ( @@ -374,8 +344,8 @@ function App(): React.JSX.Element { - AppGuard - v2.0 Native Shield + APPGUARD + v2.0 Native Guard - {(permissions.batteryOptimized || !permissions.exactAlarm || showTroubleshoot) && ( ⚠️ Background Performance @@ -590,7 +559,6 @@ function App(): React.JSX.Element { )} )} - @@ -634,4 +602,4 @@ const styles = StyleSheet.create({ ampmText: { color: '#94A3B8', fontWeight: '900', fontSize: 16 }, }); -export default App; \ No newline at end of file +export default App; diff --git a/Limitter-app b/Limitter-app new file mode 160000 index 0000000..a7c67fa --- /dev/null +++ b/Limitter-app @@ -0,0 +1 @@ +Subproject commit a7c67fa4615e3bb76176e797714654b731c395a4 diff --git a/__tests__/App.test - Copy.tsx b/__tests__/App.test - Copy.tsx new file mode 100644 index 0000000..213abce --- /dev/null +++ b/__tests__/App.test - Copy.tsx @@ -0,0 +1,402 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { + View, Text, TextInput, TouchableOpacity, StyleSheet, + FlatList, Alert, NativeModules, NativeEventEmitter, + ScrollView, StatusBar, Animated, ActivityIndicator, + DeviceEventEmitter, +} from 'react-native'; + +const { LimitterModule } = NativeModules; + +interface AppInfo { name: string; package: string; } +type Step = 'timer' | 'apps' | 'running' | 'blocked'; + +const POPULAR_APPS = [ + { name: 'Instagram', package: 'com.instagram.android', icon: '📸', color: '#E1306C' }, + { name: 'WhatsApp', package: 'com.whatsapp', icon: '💬', color: '#25D366' }, + { name: 'YouTube', package: 'com.google.android.youtube', icon: '▶️', color: '#FF0000' }, + { name: 'Snapchat', package: 'com.snapchat.android', icon: '👻', color: '#FFFC00' }, + { name: 'Messenger', package: 'com.facebook.orca', icon: '🔵', color: '#006AFF' }, + { name: 'TikTok', package: 'com.zhiliaoapp.musically', icon: '🎵', color: '#ee1d52' }, + { name: 'Spotify', package: 'com.spotify.music', icon: '🎧', color: '#1DB954' }, + { name: 'Facebook', package: 'com.facebook.katana', icon: '👍', color: '#1877F2' }, + { name: 'Telegram', package: 'org.telegram.messenger', icon: '✈️', color: '#0088cc' }, + { name: 'Twitter/X', package: 'com.twitter.android', icon: '🐦', color: '#1DA1F2' }, + { name: 'Netflix', package: 'com.netflix.mediaclient', icon: '🎬', color: '#E50914' }, + { name: 'Reddit', package: 'com.reddit.frontpage', icon: '🤖', color: '#FF4500' }, +]; + +const C = { + bg: '#0f0c29', surface: 'rgba(255,255,255,0.07)', border: 'rgba(255,255,255,0.12)', + primary: '#7c3aed', primaryLight: '#a78bfa', + danger: '#ef4444', text: '#ffffff', muted: '#6b7280', secondary: '#c4b5fd', +}; + +export default function App() { + const [step, setStep] = useState('timer'); + const [timeUnit, setTimeUnit] = useState<'seconds' | 'hours'>('seconds'); + const [timeValue, setTimeValue] = useState(''); + const [installed, setInstalled] = useState([]); + const [selectedApp, setSelected] = useState(null); + const [totalSecs, setTotal] = useState(0); + const [remaining, setRemaining] = useState(0); + const [loading, setLoading] = useState(false); + const [permOk, setPermOk] = useState(false); + const [notifMsg, setNotifMsg] = useState(''); + const notifOpacity = useRef(new Animated.Value(0)).current; + + // ── Permissions on mount ───────────────────────────────── + useEffect(() => { checkPerms(); }, []); + + // ── Listen to native timer broadcasts ─────────────────── + // Native service broadcasts every second with remaining time + useEffect(() => { + const sub = DeviceEventEmitter.addListener('TIMER_TICK', (data: any) => { + const r = data?.remaining ?? 0; + const blocked = data?.isBlocked ?? false; + setRemaining(r); + if (blocked && step !== 'blocked') { + setStep('blocked'); + } + }); + return () => sub.remove(); + }, [step]); + + const checkPerms = async () => { + try { + const p = await LimitterModule.checkPermissions(); + setPermOk(p.overlay && p.usage); + if (!p.overlay || !p.usage) { + await LimitterModule.checkAndRequestPermissions(); + setTimeout(checkPerms, 3000); + } + } catch { setPermOk(true); } + }; + + const showNotif = (msg: string) => { + setNotifMsg(msg); + Animated.sequence([ + Animated.timing(notifOpacity, { toValue: 1, duration: 300, useNativeDriver: true }), + Animated.delay(2500), + Animated.timing(notifOpacity, { toValue: 0, duration: 300, useNativeDriver: true }), + ]).start(); + }; + + const loadApps = async () => { + setLoading(true); + try { + const apps: AppInfo[] = await LimitterModule.getInstalledApps(); + const pkgs = new Set(apps.map(a => a.package)); + const pop = POPULAR_APPS.filter(p => pkgs.has(p.package)); + const rest = apps + .filter(a => !POPULAR_APPS.find(p => p.package === a.package)) + .map(a => ({ ...a, icon: '📱', color: C.primary })); + setInstalled([...pop, ...rest]); + } catch { setInstalled(POPULAR_APPS); } + setLoading(false); + }; + + const handleSetTimer = () => { + const val = parseInt(timeValue); + if (!val || val <= 0) { Alert.alert('Invalid', 'Enter a valid time.'); return; } + const secs = timeUnit === 'hours' ? val * 3600 : val; + setTotal(secs); + setRemaining(secs); + showNotif('✅ Timer set! Now select the app to limit.'); + loadApps(); + setTimeout(() => setStep('apps'), 500); + }; + + const handleStart = async () => { + if (!selectedApp) { Alert.alert('Select App', 'Please select an app first.'); return; } + try { + await LimitterModule.showNotification( + `⏱ Timer set for ${selectedApp.name}. You have ${fmt(totalSecs)}.` + ); + const result = await LimitterModule.sendCommand('START', { + package: selectedApp.package, + appName: selectedApp.name, + duration: totalSecs, + timeUnit: 'seconds', + }); + if (result === 'PERMISSION_OVERLAY_REQUIRED' || result === 'PERMISSION_USAGE_REQUIRED') { + Alert.alert('Permission Required', 'Grant Overlay & Usage Access then try again.', + [{ text: 'Grant', onPress: checkPerms }]); + return; + } + showNotif(`🚀 ${selectedApp.name} will be blocked in ${fmt(totalSecs)}`); + setStep('running'); + } catch (e: any) { Alert.alert('Error', e?.message || 'Failed to start'); } + }; + + const reset = async () => { + try { await LimitterModule.sendCommand('STOP', {}); } catch { } + setStep('timer'); setTimeValue(''); setSelected(null); setTotal(0); setRemaining(0); + }; + + const fmt = (s: number) => { + const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60; + return h > 0 + ? `${h}:${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}` + : `${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}`; + }; + + const progress = totalSecs > 0 ? (totalSecs - remaining) / totalSecs : 0; + + return ( + + + + + {notifMsg} + + + {!permOk && ( + + ⚠️ Permissions needed. Tap to grant. + + )} + + {/* ── STEP 1: SET TIMER ── */} + {step === 'timer' && ( + + ⏱ AppGuard + Screen Time Limiter + + Set Your Timer + + {(['seconds', 'hours'] as const).map(u => ( + { setTimeUnit(u); setTimeValue(''); }}> + + {u === 'seconds' ? '⚡ Seconds' : '🕐 Hours'} + + + ))} + + + {!!timeValue && parseInt(timeValue) > 0 && ( + + = {fmt(timeUnit === 'hours' ? parseInt(timeValue) * 3600 : parseInt(timeValue))} + + )} + Quick Presets + + {([ + { l: '10s', v: '10', u: 'seconds' }, { l: '30s', v: '30', u: 'seconds' }, + { l: '1 min', v: '60', u: 'seconds' }, { l: '5 min', v: '300', u: 'seconds' }, + { l: '1 hr', v: '1', u: 'hours' }, { l: '2 hr', v: '2', u: 'hours' }, + ] as any[]).map(p => ( + { setTimeUnit(p.u); setTimeValue(p.v); }}> + {p.l} + + ))} + + + Next: Select App → + + + + )} + + {/* ── STEP 2: SELECT APP ── */} + {step === 'apps' && ( + + + setStep('timer')}> + ← Back + + 📱 Select App to Block + + Timer: {fmt(totalSecs)} • Select ONE app + {loading + ? Loading apps... + : ( + i.package} + numColumns={2} + columnWrapperStyle={{ gap: 12, marginBottom: 12, paddingHorizontal: 16 }} + contentContainerStyle={{ paddingBottom: 120, paddingTop: 8 }} + showsVerticalScrollIndicator={false} + renderItem={({ item }) => { + const sel = selectedApp?.package === item.package; + const pop = POPULAR_APPS.find(p => p.package === item.package); + const icon = pop?.icon || '📱'; + const col = pop?.color || C.primary; + return ( + setSelected(item)} activeOpacity={0.8}> + {sel && ( + + + + )} + {icon} + + {item.name} + + + ); + }} + /> + ) + } + + + + {selectedApp ? `🚀 Block ${selectedApp.name} after ${fmt(totalSecs)}` : 'Select an app first'} + + + + + )} + + {/* ── STEP 3: TIMER RUNNING ── */} + {step === 'running' && selectedApp && ( + + ⏱ Timer Running + You can use your phone normally + + {/* Big countdown — synced from native */} + + + + {fmt(remaining)} + + remaining + + + + + + + + + 🔒 Will auto-block when timer ends: + + + {POPULAR_APPS.find(p => p.package === selectedApp.package)?.icon || '📱'} + + + {selectedApp.name} + {selectedApp.package} + + + + + + + ✅ Timer runs in background automatically.{'\n'} + When time ends, {selectedApp.name} will be blocked instantly — even if you're using it. + + + + + Alert.alert('Cancel Timer?', 'This will stop the timer and unblock the app.', [ + { text: 'No', style: 'cancel' }, + { text: 'Yes, Cancel', style: 'destructive', onPress: reset }, + ])}> + ✕ Cancel Timer + + + )} + + {/* ── STEP 4: BLOCKED ── */} + {step === 'blocked' && selectedApp && ( + + 🚫 + Time's Up! + + {selectedApp.name} is now blocked.{'\n'} + If you open it, a block screen will appear automatically. + + + + + + {POPULAR_APPS.find(p => p.package === selectedApp.package)?.icon || '📱'} + + + {selectedApp.name} + 🔒 BLOCKED + + + + + + 💡 Take a Break! + Drink water, stretch, or go for a walk. 🧠 + + + + 🔄 Set New Timer + + + )} + + ); +} + +const s = StyleSheet.create({ + root: { flex: 1, backgroundColor: C.bg }, + screen: { flexGrow: 1, padding: 20, paddingTop: 60, paddingBottom: 40 }, + toast: { position: 'absolute', top: 20, left: 20, right: 20, zIndex: 999, backgroundColor: 'rgba(124,58,237,0.9)', borderRadius: 14, padding: 14, alignItems: 'center' }, + toastTxt: { color: '#fff', fontWeight: '600', fontSize: 14 }, + permBanner: { backgroundColor: 'rgba(239,68,68,0.2)', padding: 12, borderBottomWidth: 1, borderBottomColor: 'rgba(239,68,68,0.3)' }, + permTxt: { color: '#fca5a5', fontSize: 13, textAlign: 'center' }, + title: { fontSize: 36, fontWeight: '800', color: C.text, textAlign: 'center', letterSpacing: -1 }, + subtitle: { color: C.primaryLight, fontSize: 15, textAlign: 'center', marginBottom: 32, marginTop: 4 }, + card: { backgroundColor: C.surface, borderRadius: 20, borderWidth: 1, borderColor: C.border, padding: 20, marginBottom: 16 }, + cardTitle: { color: C.text, fontWeight: '700', fontSize: 18, marginBottom: 20 }, + toggle: { flexDirection: 'row', backgroundColor: 'rgba(0,0,0,0.3)', borderRadius: 12, padding: 4, marginBottom: 16 }, + tBtn: { flex: 1, padding: 12, borderRadius: 10, alignItems: 'center' }, + tBtnOn: { backgroundColor: C.primary }, + tTxt: { color: C.muted, fontWeight: '600', fontSize: 14 }, + tTxtOn: { color: '#fff' }, + input: { backgroundColor: 'rgba(255,255,255,0.08)', borderRadius: 12, borderWidth: 1, borderColor: C.border, paddingHorizontal: 20, paddingVertical: 16, fontSize: 28, fontWeight: '700', color: C.text, marginBottom: 8 }, + preview: { color: C.primaryLight, fontSize: 14, marginBottom: 20, textAlign: 'center' }, + label: { color: C.secondary, fontSize: 13, fontWeight: '600', marginBottom: 10 }, + presets: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginBottom: 20 }, + presetBtn: { backgroundColor: 'rgba(255,255,255,0.08)', borderRadius: 20, paddingHorizontal: 16, paddingVertical: 8, borderWidth: 1, borderColor: C.border }, + presetTxt: { color: C.secondary, fontWeight: '600', fontSize: 13 }, + btn: { backgroundColor: C.primary, borderRadius: 14, padding: 16, alignItems: 'center', shadowColor: C.primary, shadowOpacity: 0.4, shadowRadius: 12, elevation: 8 }, + btnOff: { opacity: 0.35, shadowOpacity: 0 }, + btnTxt: { color: '#fff', fontWeight: '700', fontSize: 16 }, + stepHdr: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingHorizontal: 16, marginBottom: 4, paddingTop: 52 }, + back: { color: C.primaryLight, fontSize: 16 }, + stepTitle: { color: C.text, fontWeight: '700', fontSize: 18 }, + stepSub: { color: C.muted, fontSize: 13, paddingHorizontal: 16, marginBottom: 12 }, + loadBox: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 16, marginTop: 60 }, + loadTxt: { color: C.muted, fontSize: 15 }, + appCard: { flex: 1, backgroundColor: C.surface, borderRadius: 18, borderWidth: 2, borderColor: C.border, padding: 16, alignItems: 'center', minHeight: 110, justifyContent: 'center', position: 'relative' }, + check: { position: 'absolute', top: 8, right: 8, width: 22, height: 22, borderRadius: 11, alignItems: 'center', justifyContent: 'center' }, + appName: { color: C.secondary, fontWeight: '600', fontSize: 12, textAlign: 'center' }, + bottomBar: { position: 'absolute', bottom: 0, left: 0, right: 0, padding: 16, backgroundColor: C.bg, borderTopWidth: 1, borderTopColor: C.border }, + ring: { alignItems: 'center', marginBottom: 20, marginTop: 8 }, + ringInner: { width: 200, height: 200, borderRadius: 100, borderWidth: 8, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(124,58,237,0.1)' }, + ringTime: { fontSize: 38, fontWeight: '800', color: C.text, letterSpacing: -2 }, + ringSub: { color: C.muted, fontSize: 12, fontWeight: '600', letterSpacing: 2, marginTop: 4 }, + pBarWrap: { height: 6, backgroundColor: 'rgba(255,255,255,0.1)', borderRadius: 3, marginBottom: 24, overflow: 'hidden' }, + pBarFill: { height: '100%', borderRadius: 3 }, + appRow: { flexDirection: 'row', alignItems: 'center', gap: 16, marginTop: 8 }, + appRowName: { color: C.text, fontWeight: '700', fontSize: 16 }, + appRowPkg: { color: C.muted, fontSize: 11, marginTop: 2 }, + cancelBtn: { borderRadius: 14, padding: 14, alignItems: 'center', borderWidth: 1, borderColor: 'rgba(239,68,68,0.3)', marginTop: 8 }, + cancelTxt: { color: C.danger, fontWeight: '600', fontSize: 15 }, + blockedTitle: { fontSize: 36, fontWeight: '800', color: C.danger, textAlign: 'center', marginBottom: 12 }, + blockedSub: { color: C.muted, fontSize: 15, textAlign: 'center', lineHeight: 22, marginBottom: 24 }, + motivTitle: { color: C.primaryLight, fontWeight: '700', fontSize: 15, marginBottom: 8 }, + motivTxt: { color: C.secondary, fontSize: 14, lineHeight: 22 }, +}); \ No newline at end of file diff --git a/android/app/src/main/assets/index.android.bundle b/android/app/src/main/assets/index.android.bundle index 3b9eb0f..cd3dc7b 100644 --- a/android/app/src/main/assets/index.android.bundle +++ b/android/app/src/main/assets/index.android.bundle @@ -2,7 +2,7 @@ var __BUNDLE_START_TIME__=globalThis.nativePerformanceNow?nativePerformanceNow() !(function(e){"use strict";e.__r=i,e[`${__METRO_GLOBAL_PREFIX__}__d`]=function(e,o,n){if(r.has(o))return;var i={dependencyMap:n,factory:e,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}};r.set(o,i)},e.__c=n,e.__registerSegment=function(e,t,o){s[e]=t,o&&o.forEach(t=>{r.has(t)||v.has(t)||v.set(t,e)})};var r=n(),t={},o={}.hasOwnProperty;function n(){return r=new Map}function i(e,t){if(null===e)throw new Error("Cannot find module");var o=e,n=r.get(o);return n&&n.isInitialized?n.publicModule.exports:d(o,n)}function a(e){var o=e,n=r.get(o);if(n&&n.importedDefault!==t)return n.importedDefault;var a=i(o),l=a&&a.__esModule?a.default:a;return r.get(o).importedDefault=l}function l(e){var n=e,a=r.get(n);if(a&&a.importedAll!==t)return a.importedAll;var l,u=i(n);if(u&&u.__esModule)l=u;else{if(l={},u)for(var d in u)o.call(u,d)&&(l[d]=u[d]);l.default=u}return r.get(n).importedAll=l}i.importDefault=a,i.importAll=l,i.context=function(){throw new Error("The experimental Metro feature `require.context` is not enabled in your project.")},i.resolveWeak=function(){throw new Error("require.resolveWeak cannot be called dynamically.")};var u=!1;function d(r,t){if(!u&&e.ErrorUtils){var o;u=!0;try{o=h(r,t)}catch(r){e.ErrorUtils.reportFatalError(r)}return u=!1,o}return h(r,t)}var f=16,c=65535;function p(e){return{segmentId:e>>>f,localId:e&c}}i.unpackModuleId=p,i.packModuleId=function(e){return(e.segmentId<0){var n=v.get(t)??0,u=s[n];null!=u&&(u(t),o=r.get(t),v.delete(t))}var d=e.nativeRequire;if(!o&&d){var f=p(t),c=f.segmentId;d(f.localId,c),o=r.get(t)}if(!o)throw Error('Requiring unknown module "'+t+'".');if(o.hasError)throw o.error;o.isInitialized=!0;var h=o,g=h.factory,m=h.dependencyMap;try{var _=o.publicModule;return _.id=t,g(e,i,a,l,_,_.exports,m),o.factory=void 0,o.dependencyMap=void 0,_.exports}catch(e){throw o.hasError=!0,o.error=e,o.isInitialized=!1,o.publicModule.exports=void 0,e}}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); !(function(e){var n=(function(){function e(e,n){return e}function n(e){var n={};return e.forEach(function(e,r){n[e]=!0}),n}function r(e,r,u){if(e.formatValueCalls++,e.formatValueCalls>200)return`[TOO BIG formatValueCalls ${e.formatValueCalls} exceeded limit of 200]`;var c=t(e,r);if(c)return c;var s=Object.keys(r),f=n(s);if(d(r)&&(s.indexOf('message')>=0||s.indexOf('description')>=0))return o(r);if(0===s.length){if(v(r)){var g=r.name?': '+r.name:'';return e.stylize('[Function'+g+']','special')}if(p(r))return e.stylize(RegExp.prototype.toString.call(r),'regexp');if(y(r))return e.stylize(Date.prototype.toString.call(r),'date');if(d(r))return o(r)}var h,m,b='',j=!1,E=['{','}'];(h=r,Array.isArray(h)&&(j=!0,E=['[',']']),v(r))&&(b=' [Function'+(r.name?': '+r.name:'')+']');return p(r)&&(b=' '+RegExp.prototype.toString.call(r)),y(r)&&(b=' '+Date.prototype.toUTCString.call(r)),d(r)&&(b=' '+o(r)),0!==s.length||j&&0!=r.length?u<0?p(r)?e.stylize(RegExp.prototype.toString.call(r),'regexp'):e.stylize('[Object]','special'):(e.seen.push(r),m=j?i(e,r,u,f,s):s.map(function(n){return a(e,r,u,f,n,j)}),e.seen.pop(),l(m,b,E)):E[0]+b+E[1]}function t(e,n){if(f(n))return e.stylize('undefined','undefined');if('string'==typeof n){var r="'"+JSON.stringify(n).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,'string')}return s(n)?e.stylize(''+n,'number'):u(n)?e.stylize(''+n,'boolean'):c(n)?e.stylize('null','null'):void 0}function o(e){return'['+Error.prototype.toString.call(e)+']'}function i(e,n,r,t,o){for(var i=[],l=0,u=n.length;l-1&&(u=a?u.split('\n').map(function(e){return' '+e}).join('\n').slice(2):'\n'+u.split('\n').map(function(e){return' '+e}).join('\n')):u=e.stylize('[Circular]','special')),f(l)){if(a&&i.match(/^\d+$/))return u;(l=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(l=l.slice(1,l.length-1),l=e.stylize(l,'name')):(l=l.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),l=e.stylize(l,'string'))}return l+': '+u}function l(e,n,r){return e.reduce(function(e,n){return n.indexOf('\n')>=0&&0,e+n.replace(/\u001b\[\d\d?m/g,'').length+1},0)>60?r[0]+(''===n?'':n+'\n ')+' '+e.join(',\n ')+' '+r[1]:r[0]+n+' '+e.join(', ')+' '+r[1]}function u(e){return'boolean'==typeof e}function c(e){return null===e}function s(e){return'number'==typeof e}function f(e){return void 0===e}function p(e){return g(e)&&'[object RegExp]'===h(e)}function g(e){return'object'==typeof e&&null!==e}function y(e){return g(e)&&'[object Date]'===h(e)}function d(e){return g(e)&&('[object Error]'===h(e)||e instanceof Error)}function v(e){return'function'==typeof e}function h(e){return Object.prototype.toString.call(e)}function m(e,n){return Object.prototype.hasOwnProperty.call(e,n)}return function(n,t){return r({seen:[],formatValueCalls:0,stylize:e},n,t.depth)}})(),r='(index)',t=0,o=1,i=2,a=3;function l(r){return function(){var t;t=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,function(e){return n(e,{depth:10})}).join(', ');var o=arguments[0],l=r;'string'==typeof o&&'Warning: '===o.slice(0,9)&&l>=a&&(l=i),s.length&&(t=f('',t)),e.nativeLoggingHook(t,l)}}function u(e,n){return Array.apply(null,Array(n)).map(function(){return e})}function c(e,n){if(n===r)return e[n];if(e.hasOwnProperty(n)){var t=e[n];switch(typeof t){case'function':return'\u0192';case'string':return"'"+t+"'";case'object':return null==t?'null':'{\u2026}'}return String(t)}return''}var s=[];function f(e,n){return s.join('')+e+' '+(n||'')}function p(){}function g(){return{run:e=>e()}}if(e.nativeLoggingHook){var y=e.console;if(e.console={time:p,timeEnd:p,timeStamp:p,count:p,countReset:p,createTask:g,...y??{},error:l(a),info:l(o),log:l(o),warn:l(i),trace:l(t),debug:l(t),table:function(n,t){var i;if(Array.isArray(n))i=n.map((e,n)=>{var t={};return t[r]=String(n),Object.assign(t,e),t});else for(var a in i=[],n)if(n.hasOwnProperty(a)){var l={};l[r]=a,Object.assign(l,n[a]),i.push(l)}if(0!==i.length){t=Array.isArray(t)?[r].concat(t):Array.from(i.reduce((e,n)=>(Object.keys(n).forEach(n=>e.add(n)),e),new Set));var s=[],f=[];t.forEach(function(e,n){f[n]=e.length;for(var r=0;r'string'==typeof e?e:d(e)).join(' ');(r=new Error(o)).name='console.error'}e.RN$handleException(r,!1,!1)}}}Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}else if(!e.console){var h=e.print||p;e.console={debug:h,error:h,info:h,log:h,trace:h,warn:h,assert(e,n){e||h('Assertion failed: '+n)},clear:p,count:p,countReset:p,dir:p,dirxml:p,group:p,groupCollapsed:p,groupEnd:p,profile:p,profileEnd:p,table:p,time:p,timeEnd:p,timeStamp:p,createTask:g},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); !(function(r){var l=0,a=!0===r.RN$useAlwaysAvailableJSErrorHandling?r.RN$handleException:(r,l)=>{throw r},n={setGlobalHandler(r){a=r},getGlobalHandler:()=>a,reportError(r){a&&a(r,!1)},reportFatalError(r){a&&a(r,!0)},applyWithGuard(r,a,e,t,o){try{return l++,r.apply(a,e)}catch(r){n.reportError(r)}finally{l--}return null},applyWithGuardIfNeeded:(r,l,a)=>n.inGuard()?r.apply(l,a):(n.applyWithGuard(r,l,a),null),inGuard:()=>!!l,guard(r,l,a){if('function'!=typeof r)return console.warn('A function must be passed to ErrorUtils.guard, got ',r),null;var e=l??r.name??'';return function(...l){return n.applyWithGuard(r,a??this,l,null,e)}}};r.ErrorUtils=n})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),o=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).name,()=>o.default)},0,[1,2,495,513]); +__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),o=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).name,()=>o.default)},0,[1,2,495,499]); __d(function(g,r,i,a,m,_e,d){m.exports=function(e){return e&&e.__esModule?e:{default:e}},m.exports.__esModule=!0,m.exports.default=m.exports},1,[]); __d(function(g,r,i,a,m,e,d){'use strict';m.exports={get ActivityIndicator(){return r(d[0]).default},get Button(){return r(d[1]).default},get DrawerLayoutAndroid(){return r(d[2]).default},get FlatList(){return r(d[3]).default},get Image(){return r(d[4]).default},get ImageBackground(){return r(d[5]).default},get InputAccessoryView(){return r(d[6]).default},get KeyboardAvoidingView(){return r(d[7]).default},get experimental_LayoutConformance(){return r(d[8]).default},get Modal(){return r(d[9]).default},get unstable_NativeText(){return r(d[10]).NativeText},get unstable_NativeView(){return r(d[11]).default},get Pressable(){return r(d[12]).default},get ProgressBarAndroid(){return r(d[13]).default('progress-bar-android-moved',"ProgressBarAndroid has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/progress-bar-android' instead of 'react-native'. See https://github.com/react-native-progress-view/progress-bar-android"),r(d[14]).default},get RefreshControl(){return r(d[15]).default},get SafeAreaView(){return r(d[13]).default('safe-area-view-deprecated',"SafeAreaView has been deprecated and will be removed in a future release. Please use 'react-native-safe-area-context' instead. See https://github.com/AppAndFlow/react-native-safe-area-context"),r(d[16]).default},get ScrollView(){return r(d[17]).default},get SectionList(){return r(d[18]).default},get StatusBar(){return r(d[19]).default},get Switch(){return r(d[20]).default},get Text(){return r(d[21]).default},get unstable_TextAncestorContext(){return r(d[22]).default},get TextInput(){return r(d[23]).default},get Touchable(){return r(d[24]).default},get TouchableHighlight(){return r(d[25]).default},get TouchableNativeFeedback(){return r(d[26]).default},get TouchableOpacity(){return r(d[27]).default},get TouchableWithoutFeedback(){return r(d[28]).default},get View(){return r(d[29]).default},get VirtualizedList(){return r(d[30]).default},get VirtualizedSectionList(){return r(d[31]).default},get unstable_VirtualView(){return r(d[32]).default},get AccessibilityInfo(){return r(d[33]).default},get ActionSheetIOS(){return r(d[34]).default},get Alert(){return r(d[35]).default},get Animated(){return r(d[36]).default},get Appearance(){return r(d[37])},get AppRegistry(){return r(d[38]).AppRegistry},get AppState(){return r(d[39]).default},get BackHandler(){return r(d[40]).default},get Clipboard(){return r(d[13]).default('clipboard-moved',"Clipboard has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-clipboard/clipboard' instead of 'react-native'. See https://github.com/react-native-clipboard/clipboard"),r(d[41]).default},get codegenNativeCommands(){return r(d[42]).default},get codegenNativeComponent(){return r(d[43]).default},get DeviceEventEmitter(){return r(d[44]).default},get DeviceInfo(){return r(d[45]).default},get DevMenu(){return r(d[46]).default},get DevSettings(){return r(d[47]).default},get Dimensions(){return r(d[48]).default},get DynamicColorIOS(){return r(d[49]).DynamicColorIOS},get Easing(){return r(d[50]).default},get findNodeHandle(){return r(d[51]).findNodeHandle},get I18nManager(){return r(d[52]).default},get InteractionManager(){return r(d[13]).default('interaction-manager-deprecated',"InteractionManager has been deprecated and will be removed in a future release. Please refactor long tasks into smaller ones, and use 'requestIdleCallback' instead."),r(d[53]).default},get Keyboard(){return r(d[54]).default},get LayoutAnimation(){return r(d[55]).default},get Linking(){return r(d[56]).default},get LogBox(){return r(d[57]).default},get NativeAppEventEmitter(){return r(d[58]).default},get NativeComponentRegistry(){return r(d[59])},get NativeDialogManagerAndroid(){return r(d[60]).default},get NativeEventEmitter(){return r(d[61]).default},get NativeModules(){return r(d[62]).default},get Networking(){return r(d[63]).default},get PanResponder(){return r(d[64]).default},get PermissionsAndroid(){return r(d[65]).default},get PixelRatio(){return r(d[66]).default},get Platform(){return r(d[67]).default},get PlatformColor(){return r(d[68]).PlatformColor},get PushNotificationIOS(){return r(d[13]).default('pushNotificationIOS-moved',"PushNotificationIOS has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/push-notification-ios' instead of 'react-native'. See https://github.com/react-native-push-notification/ios"),r(d[69]).default},get processColor(){return r(d[70]).default},get registerCallableModule(){return r(d[71]).default},get requireNativeComponent(){return r(d[72]).default},get ReactNativeVersion(){return r(d[73]).default},get RootTagContext(){return r(d[74]).RootTagContext},get Settings(){return r(d[75]).default},get Share(){return r(d[76]).default},get StyleSheet(){return r(d[77]).default},get Systrace(){return r(d[78])},get ToastAndroid(){return r(d[79]).default},get TurboModuleRegistry(){return r(d[80])},get UIManager(){return r(d[81]).default},get unstable_batchedUpdates(){return r(d[51]).unstable_batchedUpdates},get useAnimatedValue(){return r(d[82]).default},get useColorScheme(){return r(d[83]).default},get usePressability(){return r(d[84]).default},get useWindowDimensions(){return r(d[85]).default},get UTFSequence(){return r(d[86]).default},get Vibration(){return r(d[87]).default},get VirtualViewMode(){return r(d[32]).VirtualViewMode}}},2,[3,274,390,331,349,398,399,406,412,414,285,71,422,149,266,360,400,365,387,391,424,275,68,429,433,437,286,287,438,65,439,440,441,407,445,217,288,448,230,451,243,455,100,269,15,458,459,461,14,464,308,101,419,465,371,372,466,471,225,72,218,195,31,194,472,474,8,62,52,477,49,223,270,480,240,481,483,4,26,486,29,74,489,490,277,403,491,492]); __d(function(g,_r,_i,a,m,_e,d){'use strict';var e=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var t=e(_r(d[1])),r=e(_r(d[2])),i=e(_r(d[3])),n=((function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;(function(e,t){if(!t&&e&&e.__esModule)return e;var n,l,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(n=t?i:r){if(n.has(e))return n.get(e);n.set(e,o)}for(var s in e)"default"!==s&&{}.hasOwnProperty.call(e,s)&&((l=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,s))&&(l.get||l.set)?n(o,s,l):o[s]=e[s])})(e,t)})(_r(d[4])),_r(d[5]));var l='android'===r.default.OS?_r(d[6]).default:_r(d[7]).default,o=({ref:e,animating:o=!0,color:f=('ios'===r.default.OS?"#999999":null),hidesWhenStopped:u=!0,onLayout:c,size:p="small",style:h,...y})=>{var v,_;switch(p){case'small':v=s.sizeSmall,_='small';break;case'large':v=s.sizeLarge,_='large';break;default:v={height:p,width:p}}var j={animating:o,color:f,hidesWhenStopped:u,...y,ref:e,style:v,size:_};return(0,n.jsx)(i.default,{onLayout:c,style:t.default.compose(s.container,h),children:'android'===r.default.OS?(0,n.jsx)(l,{...j,styleAttr:'Normal',indeterminate:!0}):(0,n.jsx)(l,{...j})})};o.displayName='ActivityIndicator';var s=t.default.create({container:{alignItems:'center',justifyContent:'center'},sizeSmall:{width:20,height:20},sizeLarge:{width:36,height:36}});_e.default=o},3,[1,4,62,65,69,238,266,272]); @@ -533,24 +533,10 @@ __d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{v __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1]));var u={vibrate:function(t=400,u=!1){if('number'==typeof t)n.default.vibrate(t);else{if(!Array.isArray(t))throw new Error('Vibration pattern should be a number or array');n.default.vibrateByPattern(t,u?0:-1)}},cancel:function(){n.default.cancel()}};e.default=u},492,[1,493]); __d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0});var e={};_e.default=void 0;var t=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,f,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,u)}for(var i in e)"default"!==i&&{}.hasOwnProperty.call(e,i)&&((f=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,i))&&(f.get||f.set)?o(u,i,f):u[i]=e[i]);return u})(e,t)})(_r(d[0]));Object.keys(t).forEach(function(r){"default"!==r&&"__esModule"!==r&&(Object.prototype.hasOwnProperty.call(e,r)||r in _e&&_e[r]===t[r]||Object.defineProperty(_e,r,{enumerable:!0,get:function(){return t[r]}}))});_e.default=t.default},493,[494]); __d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var e=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,f,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,u)}for(var i in e)"default"!==i&&{}.hasOwnProperty.call(e,i)&&((f=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,i))&&(f.get||f.set)?o(u,i,f):u[i]=e[i]);return u})(e,t)})(_r(d[0]));_e.default=e.getEnforcing('Vibration')},494,[29]); -__d(function(g,_r,_i,_a,_m,_e,d){var e=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var t=e(_r(d[1])),r=e(_r(d[2])),o=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,o=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var n,i,a={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return a;if(n=t?o:r){if(n.has(e))return n.get(e);n.set(e,a)}for(var l in e)"default"!==l&&{}.hasOwnProperty.call(e,l)&&((i=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,l))&&(i.get||i.set)?n(a,l,i):a[l]=e[l]);return a})(e,t)})(_r(d[3])),n=_r(d[4]),i=(e(_r(d[5])),_r(d[6]));var a=n.NativeModules.LimitterModule,l=n.NativeModules.TimerEventModule;var s=n.StyleSheet.create({container:{flex:1,backgroundColor:'#0F172A'},header:{padding:30,alignItems:'center'},title:{fontSize:40,fontWeight:'900',color:'#F8FAFC'},versionTag:{color:'#6366F1',fontSize:12,fontWeight:'700'},subtitle:{color:'#94A3B8',marginBottom:20},card:{backgroundColor:'#1E293B',margin:20,padding:20,borderRadius:20},sectionTitle:{color:'#F8FAFC',fontSize:18,fontWeight:'800',marginBottom:15},timerRow:{flexDirection:'row',gap:15,marginBottom:20},inputBox:{flex:1,backgroundColor:'#0F172A',padding:10,borderRadius:10,alignItems:'center'},label:{color:'#64748B',fontSize:10,fontWeight:'800'},input:{color:'#F8FAFC',fontSize:24,fontWeight:'900'},btn:{backgroundColor:'#6366F1',padding:18,borderRadius:15,alignItems:'center'},btnText:{color:'white',fontWeight:'900'},activeCard:{marginHorizontal:20,marginBottom:10,padding:15,borderRadius:12,borderLeftWidth:5,borderLeftColor:'#6366F1',backgroundColor:'#1E293B'},activeLabel:{color:'white',fontWeight:'700'},listSection:{padding:20},search:{backgroundColor:'#1E293B',color:'white',padding:15,borderRadius:15,marginBottom:20},appRow:{flexDirection:'row',alignItems:'center',marginBottom:15,opacity:1,backgroundColor:'#1E293B',padding:12,borderRadius:12},appRowReady:{opacity:1},appRowSelected:{backgroundColor:'#3730A3',borderWidth:2,borderColor:'#6366F1'},icon:{width:50,height:50,borderRadius:15,backgroundColor:'#334155',alignItems:'center',justifyContent:'center'},iconTxt:{color:'white',fontSize:20,fontWeight:'800'},appName:{color:'#F8FAFC',fontWeight:'700'},pkgName:{color:'#64748B',fontSize:10},tick:{width:30,height:30,borderRadius:15,borderWidth:2,borderColor:'#334155',alignItems:'center',justifyContent:'center'},tickTxt:{color:'white',fontWeight:'900'},dropdownRow:{flexDirection:'row',flexWrap:'wrap',gap:8,marginTop:8},hourChip:{width:42,height:38,borderRadius:10,backgroundColor:'#1E293B',borderWidth:1,borderColor:'#334155',alignItems:'center',justifyContent:'center'},hourChipSelected:{backgroundColor:'#D97706',borderColor:'#F59E0B'},hourChipText:{color:'#94A3B8',fontWeight:'800',fontSize:14},ampmBtn:{flex:1,padding:16,borderRadius:12,backgroundColor:'#1E293B',borderWidth:1,borderColor:'#334155',alignItems:'center'},ampmBtnSelected:{backgroundColor:'#D97706',borderColor:'#F59E0B'},ampmText:{color:'#94A3B8',fontWeight:'900',fontSize:16}});_e.default=function(){var e=(0,o.useState)(!1),c=(0,r.default)(e,2),u=c[0],h=c[1],p=(0,o.useState)([]),x=(0,r.default)(p,2),m=x[0],y=x[1],f=(0,o.useState)(!1),T=(0,r.default)(f,2),b=T[0],j=T[1],S=(0,o.useState)([]),C=(0,r.default)(S,2),A=C[0],k=C[1],w=(0,o.useState)(0),B=(0,r.default)(w,2),F=B[0],v=B[1],E=(0,o.useState)([]),R=(0,r.default)(E,2),I=R[0],O=R[1],P=(0,o.useState)(!1),V=(0,r.default)(P,2),W=V[0],M=V[1],z=(0,o.useState)(''),L=(0,r.default)(z,2),N=L[0],D=L[1],H=(0,o.useState)({overlay:!1,usage:!1,batteryOptimized:!1,exactAlarm:!0}),$=(0,r.default)(H,2),_=$[0],G=$[1],U=(0,o.useState)('0'),K=(0,r.default)(U,2),q=K[0],Y=K[1],X=(0,o.useState)('30'),Z=(0,r.default)(X,2),J=Z[0],Q=Z[1],ee=(0,o.useState)(!1),te=(0,r.default)(ee,2),re=te[0],oe=te[1],ne=(0,o.useState)('12'),ie=(0,r.default)(ne,2),ae=ie[0],le=ie[1],se=(0,o.useState)('PM'),ce=(0,r.default)(se,2),de=ce[0],ue=ce[1],he=(0,o.useState)(!1),ge=(0,r.default)(he,2),pe=ge[0],xe=ge[1];(0,o.useEffect)(()=>{ye(),me(),(0,_r(d[7]).startCategoryService)();var e=n.AppState.addEventListener('change',e=>{'active'===e&&(ye(),me())});return()=>e.remove()},[]);var me=(function(){var e=(0,t.default)(function*(){if(a?.getActiveTimers)try{var e=yield a.getActiveTimers();e&&e.length>0&&(console.log("Synced active timers:",e.length),y(t=>{var r=new Map;return e.forEach(e=>r.set(e.package,{package:e.package,name:e.name,durationSeconds:e.remainingSeconds,remainingSeconds:e.remainingSeconds,status:e.status})),Array.from(r.values())}))}catch(e){console.error("Failed to sync timers:",e)}});return function(){return e.apply(this,arguments)}})();(0,o.useEffect)(()=>{if(l){var e=new n.NativeEventEmitter(l);l.startListening();var t=e.addListener('TIMER_TICK',e=>{var t=e.package,r=e.appName,o=e.remaining,n=e.isBlocked;y(e=>e.some(e=>e.package===t)?e.map(e=>e.package===t?{...e,remainingSeconds:o,status:n?'blocked':'active'}:e):[...e,{package:t,name:r||t,durationSeconds:o,remainingSeconds:o,status:n?'blocked':'active'}])});return()=>{t.remove(),l.stopListening()}}},[]);var ye=(function(){var e=(0,t.default)(function*(){if(a?.checkPermissions){var e=yield a.checkPermissions();console.log("Permission Status:",e),G(e),e.overlay&&e.usage&&v(1)}});return function(){return e.apply(this,arguments)}})(),fe=(function(){var e=(0,t.default)(function*(){M(!0),console.log("Fetching apps...");try{if(a?.getInstalledApps){var e=yield a.getInstalledApps();console.log("Apps found:",e.length),O(e.filter(e=>'com.appguard2'!==e.package).sort((e,t)=>e.name.localeCompare(t.name)))}else console.error("LimitterModule.getInstalledApps is missing")}catch(e){console.error("Failed to load apps:",e),n.Alert.alert('Error','Failed to load app list: '+(e.message||e))}finally{M(!1)}});return function(){return e.apply(this,arguments)}})();(0,o.useEffect)(()=>{1===F&&fe()},[F]);var Te=(function(){var e=(0,t.default)(function*(){3600*(parseInt(q)||0)+(parseInt(J)||0)<=0?n.Alert.alert('Invalid Time','Please enter a valid duration.'):(oe(!0),a?.showNotification&&(yield a.showNotification("Your timer is set. Now select apps to limit.")))});return function(){return e.apply(this,arguments)}})(),be=(function(){var e=(0,t.default)(function*(){if(pe)if(0!==A.length){var e=parseInt(ae)||12;'AM'===de?12===e&&(e=0):12!==e&&(e+=12);var t=A.map(t=>({package:t.package,appName:t.name,hour:e,minute:0}));try{var r=yield a.startClockTimer({apps:t});console.log('Clock timer result:',r),n.Alert.alert('Success',`\ud83d\udd50 Clock timer set to ${ae}:00 ${de} for ${A.length} app(s)`),xe(!1),k([]),D('')}catch(e){console.error('Clock timer error:',e),n.Alert.alert('Error','Failed to start clock timer: '+(e.message||e))}}else n.Alert.alert('No Apps Selected','Please select at least one app.');else n.Alert.alert('Step Required','Please set the clock timer first.')});return function(){return e.apply(this,arguments)}})(),je=(function(){var e=(0,t.default)(function*(){if(re)if(0!==A.length){var e=3600*(parseInt(q)||0)+(parseInt(J)||0),t=A.map(t=>({...t,durationSeconds:e,remainingSeconds:e,status:'active'}));if(y(e=>[...e.filter(e=>!A.some(t=>t.package===e.package)),...t]),a?.sendCommand)try{var r=A.map(t=>({package:t.package,appName:t.name,duration:e.toString()}));yield a.sendCommand('START_TIMERS',{apps:r}),console.log(`\u2705 Started timers for ${A.length} apps`),n.Alert.alert('Success',`\u23f1 Timers started for ${A.length} app(s)`),oe(!1),k([]),D('')}catch(e){console.error("Failed to start timers:",e),n.Alert.alert('Error','Failed to start timers: '+e.message)}}else n.Alert.alert('No Apps Selected','Please select at least one app to limit.');else n.Alert.alert('Step 1 Required','Please set the timer above and click SAVE TIMER first.')});return function(){return e.apply(this,arguments)}})(),Se=(0,o.useMemo)(()=>I.filter(e=>e.name.toLowerCase().includes(N.toLowerCase())),[I,N]);return u?0===F?(0,i.jsxs)(n.View,{style:[s.container,{justifyContent:'center',padding:30}],children:[(0,i.jsx)(n.Text,{style:[s.title,{color:'#EF4444'}],children:"!!! ROOT APP ACTIVE !!!"}),(0,i.jsx)(n.Text,{style:s.title,children:"Permissions Needed"}),(0,i.jsx)(n.Text,{style:s.subtitle,children:"Overlay and Usage Access required."}),(0,i.jsx)(n.TouchableOpacity,{style:s.btn,onPress:()=>a?.checkAndRequestPermissions(),children:(0,i.jsx)(n.Text,{style:s.btnText,children:"GRANT PERMISSIONS"})}),(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#334155',marginTop:10}],onPress:ye,children:(0,i.jsx)(n.Text,{style:s.btnText,children:"I'VE GRANTED THEM - REFRESH"})})]}):(0,i.jsxs)(n.SafeAreaView,{style:s.container,children:[(0,i.jsx)(n.StatusBar,{barStyle:"light-content",backgroundColor:"#0F172A"}),(0,i.jsx)(n.View,{style:s.header,children:(0,i.jsxs)(n.View,{style:{flexDirection:'row',justifyContent:'space-between',width:'100%',alignItems:'center'},children:[(0,i.jsxs)(n.View,{children:[(0,i.jsx)(n.Text,{style:{color:'#EF4444',fontWeight:'bold'},children:"!!! ROOT FILE RUNNING !!!"}),(0,i.jsx)(n.Text,{style:s.title,children:"NEW UIIIII"}),(0,i.jsx)(n.Text,{style:s.versionTag,children:"v2.0 Native Guard"})]}),(0,i.jsx)(n.TouchableOpacity,{style:{backgroundColor:'#E11D48',padding:8,borderRadius:10},onPress:()=>n.Alert.alert("Help & Settings","If your timer stops in the background:\n\n1. Disable Battery Optimization\n2. Allow Exact Alarms\n3. Ensure 'Auto-Start' is enabled (if available in phone settings).",[{text:"Open Background Settings",onPress:()=>j(!b)},{text:"OK"}]),children:(0,i.jsx)(n.Text,{style:{color:'white',fontWeight:'bold'},children:"HELP"})})]})}),(0,i.jsxs)(n.ScrollView,{contentContainerStyle:{paddingBottom:100},children:[(_.batteryOptimized||!_.exactAlarm||b)&&(0,i.jsxs)(n.View,{style:[s.card,{backgroundColor:'#7C2D12',borderColor:'#F59E0B',borderWidth:1}],children:[(0,i.jsx)(n.Text,{style:[s.sectionTitle,{color:'#FACC15'}],children:"\u26a0\ufe0f Background Performance"}),(0,i.jsx)(n.Text,{style:{color:'#FED7AA',marginBottom:15,fontSize:13},children:"Troubleshooting: If the timer stops, ensure these system permissions are granted for 100% reliability."}),(0,i.jsxs)(n.View,{children:[_.batteryOptimized&&(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#EA580C',marginBottom:10}],onPress:()=>a?.requestBatteryOptimizationExemption(),children:(0,i.jsx)(n.Text,{style:s.btnText,children:"1. DISABLE BATTERY OPTIMIZATION"})}),!_.exactAlarm&&(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#B45309',marginBottom:10}],onPress:()=>n.Linking.openSettings(),children:(0,i.jsx)(n.Text,{style:s.btnText,children:"2. ALLOW EXACT ALARMS"})}),b&&(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#475569',marginTop:5}],onPress:()=>j(!1),children:(0,i.jsx)(n.Text,{style:s.btnText,children:"CLOSE HELP PANEL"})})]})]}),(0,i.jsxs)(n.View,{style:s.card,children:[(0,i.jsx)(n.Text,{style:s.sectionTitle,children:"1. Set Timer"}),(0,i.jsxs)(n.View,{style:s.timerRow,children:[(0,i.jsxs)(n.View,{style:s.inputBox,children:[(0,i.jsx)(n.Text,{style:s.label,children:"HRS"}),(0,i.jsx)(n.TextInput,{style:s.input,value:q,onChangeText:Y,keyboardType:"numeric"})]}),(0,i.jsxs)(n.View,{style:s.inputBox,children:[(0,i.jsx)(n.Text,{style:s.label,children:"SEC"}),(0,i.jsx)(n.TextInput,{style:s.input,value:J,onChangeText:Q,keyboardType:"numeric"})]})]}),(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,re&&{backgroundColor:'#10B981'}],onPress:Te,children:(0,i.jsx)(n.Text,{style:s.btnText,children:re?"\u2713 TIMER SET":"SAVE TIMER"})})]}),(0,i.jsxs)(n.View,{style:s.card,children:[(0,i.jsx)(n.Text,{style:[s.sectionTitle,{color:'#F59E0B'}],children:"\ud83d\udd50 Clock Timer"}),(0,i.jsx)(n.Text,{style:{color:'#94A3B8',fontSize:12,marginBottom:15},children:"Block apps at a specific time of day"}),(0,i.jsxs)(n.View,{style:s.inputBox,children:[(0,i.jsx)(n.Text,{style:s.label,children:"SELECT HOUR"}),(0,i.jsx)(n.View,{style:s.dropdownRow,children:['1','2','3','4','5','6','7','8','9','10','11','12'].map(e=>(0,i.jsx)(n.TouchableOpacity,{style:[s.hourChip,ae===e&&s.hourChipSelected],onPress:()=>le(e),children:(0,i.jsx)(n.Text,{style:[s.hourChipText,ae===e&&{color:'#FFF'}],children:e})},e))})]}),(0,i.jsxs)(n.View,{style:[s.timerRow,{marginTop:15,marginBottom:20}],children:[(0,i.jsx)(n.TouchableOpacity,{style:[s.ampmBtn,'AM'===de&&s.ampmBtnSelected],onPress:()=>ue('AM'),children:(0,i.jsx)(n.Text,{style:[s.ampmText,'AM'===de&&{color:'#FFF'}],children:"AM"})}),(0,i.jsx)(n.TouchableOpacity,{style:[s.ampmBtn,'PM'===de&&s.ampmBtnSelected],onPress:()=>ue('PM'),children:(0,i.jsx)(n.Text,{style:[s.ampmText,'PM'===de&&{color:'#FFF'}],children:"PM"})})]}),(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#D97706'},pe&&{backgroundColor:'#10B981'}],onPress:()=>{var e=parseInt(ae)||0;e<1||e>12?n.Alert.alert('Invalid Hour','Please select an hour between 1 and 12.'):xe(!0)},children:(0,i.jsx)(n.Text,{style:s.btnText,children:pe?`\u2713 CLOCK SET (${ae}:00 ${de})`:'SAVE CLOCK TIMER'})})]}),m.map(e=>{var t,r,o,a;return(0,i.jsx)(n.View,{style:[s.activeCard,'blocked'===e.status&&{borderColor:'#EF4444'}],children:(0,i.jsxs)(n.Text,{style:s.activeLabel,children:[e.name," - ",'blocked'===e.status?'BLOCKED \u26d4':(t=e.remainingSeconds,r=Math.floor(t/3600),o=Math.floor(t%3600/60),a=t%60,r>0?`${r}:${o.toString().padStart(2,'0')}:${a.toString().padStart(2,'0')}`:`${o}:${a.toString().padStart(2,'0')}`)+" remaining \u23f1"]})},e.package)}),(0,i.jsxs)(n.View,{style:s.card,children:[(0,i.jsx)(n.Text,{style:s.sectionTitle,children:"2. Select Apps"}),(0,i.jsxs)(n.Text,{style:s.subtitle,children:[A.length," app(s) selected"]}),(0,i.jsx)(n.TextInput,{style:s.search,placeholder:"Search apps...",placeholderTextColor:"#94A3B8",value:N,onChangeText:D}),W?(0,i.jsx)(n.ActivityIndicator,{color:"#6366F1"}):Se.map(e=>{var t=A.some(t=>t.package===e.package);return(0,i.jsxs)(n.TouchableOpacity,{style:[s.appRow,re&&s.appRowReady,t&&s.appRowSelected],onPress:()=>{return t=e,void k(e=>e.some(e=>e.package===t.package)?e.filter(e=>e.package!==t.package):[...e,t]);var t},children:[(0,i.jsx)(n.View,{style:[s.icon,t&&{backgroundColor:'#6366F1'}],children:(0,i.jsx)(n.Text,{style:s.iconTxt,children:e.name[0]})}),(0,i.jsxs)(n.View,{style:{flex:1,marginLeft:15},children:[(0,i.jsx)(n.Text,{style:s.appName,children:e.name}),(0,i.jsx)(n.Text,{style:s.pkgName,children:e.package})]}),(0,i.jsx)(n.View,{style:[s.tick,t&&{backgroundColor:'#6366F1'}],children:(0,i.jsx)(n.Text,{style:s.tickTxt,children:t?"\u2713":"+"})})]},e.package)}),A.length>0&&(0,i.jsxs)(n.View,{children:[(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#8B5CF6',marginTop:20}],onPress:je,children:(0,i.jsxs)(n.Text,{style:s.btnText,children:["\u25b6 START DURATION TIMERS (",A.length,")"]})}),pe&&(0,i.jsx)(n.TouchableOpacity,{style:[s.btn,{backgroundColor:'#D97706',marginTop:10}],onPress:be,children:(0,i.jsxs)(n.Text,{style:s.btnText,children:["\ud83d\udd50 START CLOCK TIMERS (",A.length,")"]})})]})]})]})]}):(0,i.jsxs)(n.SafeAreaView,{style:{flex:1,backgroundColor:'#FFFFFF'},children:[(0,i.jsx)(n.StatusBar,{barStyle:"dark-content",backgroundColor:"#FFFFFF"}),(0,i.jsxs)(n.ScrollView,{contentContainerStyle:{padding:24,paddingBottom:100},children:[(0,i.jsx)(n.View,{style:{backgroundColor:'#ECFDF5',padding:12,borderRadius:12,marginBottom:40,borderWidth:1,borderColor:'#10B981'},children:(0,i.jsx)(n.Text,{style:{color:'#065F46',fontSize:13,fontWeight:'800',textAlign:'center',letterSpacing:1},children:"SHIELD ACTIVE \u2022 ROOT FILE RESOLVED \u2705"})}),(0,i.jsxs)(n.View,{style:{alignItems:'center',marginBottom:48},children:[(0,i.jsx)(n.View,{style:{width:80,height:80,borderRadius:40,backgroundColor:'#10B981',alignItems:'center',justifyContent:'center',marginBottom:24,shadowColor:'#10B981',shadowOffset:{width:0,height:8},shadowOpacity:.3,shadowRadius:12,elevation:8},children:(0,i.jsx)(n.Text,{style:{fontSize:40},children:"\ud83d\udee1\ufe0f"})}),(0,i.jsx)(n.Text,{style:{fontSize:24,fontWeight:'900',color:'#0F172A',textAlign:'center',marginBottom:12},children:"Login / Signup"}),(0,i.jsx)(n.Text,{style:{fontSize:16,color:'#64748B',textAlign:'center',lineHeight:24,paddingHorizontal:20},children:"Welcome back. Monitor and protect your family's digital journey."})]}),(0,i.jsxs)(n.View,{style:{marginBottom:32},children:[(0,i.jsx)(_r(d[8]).TextInput,{label:"Username",placeholder:"Enter your username",autoCapitalize:"none"}),(0,i.jsx)(_r(d[8]).TextInput,{label:"Password",placeholder:"Enter your password",secureTextEntry:!0}),(0,i.jsx)(n.TouchableOpacity,{style:{alignSelf:'flex-end',marginTop:-8},children:(0,i.jsx)(n.Text,{style:{color:'#10B981',fontWeight:'700',fontSize:14},children:"Forgot password?"})})]}),(0,i.jsx)(_r(d[8]).BaseButton,{variant:"primary",fullWidth:!0,onPress:()=>{},style:{marginBottom:24},children:"Sign In"}),(0,i.jsxs)(n.View,{style:{flexDirection:'row',alignItems:'center',marginBottom:24},children:[(0,i.jsx)(n.View,{style:{flex:1,height:1,backgroundColor:'#E2E8F0'}}),(0,i.jsx)(n.Text,{style:{marginHorizontal:16,color:'#94A3B8',fontSize:12,fontWeight:'700'},children:"OR CONTINUE WITH"}),(0,i.jsx)(n.View,{style:{flex:1,height:1,backgroundColor:'#E2E8F0'}})]}),(0,i.jsxs)(n.View,{style:{flexDirection:'row',gap:12,marginBottom:40},children:[(0,i.jsxs)(n.TouchableOpacity,{style:{flex:1,height:56,borderRadius:999,borderWidth:1.5,borderColor:'#E2E8F0',alignItems:'center',justifyContent:'center',flexDirection:'row',gap:8},children:[(0,i.jsx)(n.Text,{style:{fontSize:18},children:"G"}),(0,i.jsx)(n.Text,{style:{fontWeight:'700',color:'#0F172A'},children:"Google"})]}),(0,i.jsxs)(n.TouchableOpacity,{style:{flex:1,height:56,borderRadius:999,borderWidth:1.5,borderColor:'#E2E8F0',alignItems:'center',justifyContent:'center',flexDirection:'row',gap:8},children:[(0,i.jsx)(n.Text,{style:{fontSize:18},children:"\uf8ff"}),(0,i.jsx)(n.Text,{style:{fontWeight:'700',color:'#0F172A'},children:"Apple"})]})]}),(0,i.jsxs)(n.Text,{style:{textAlign:'center',color:'#64748B'},children:["Don't have an account? ",(0,i.jsx)(n.Text,{style:{color:'#10B981',fontWeight:'800'},children:"Create one"})]}),(0,i.jsx)(n.View,{style:{height:60}}),(0,i.jsx)(n.View,{style:{height:1,backgroundColor:'#F1F5F9',marginBottom:40}}),(0,i.jsx)(n.Text,{style:{fontSize:18,fontWeight:'900',color:'#0F172A',marginBottom:24},children:"\ud83c\udfa8 Component Showcase"}),(0,i.jsxs)(n.View,{style:{backgroundColor:'#F8FAFC',padding:20,borderRadius:24,marginBottom:20},children:[(0,i.jsx)(n.Text,{style:{color:'#64748B',fontSize:12,fontWeight:'800',marginBottom:16,textTransform:'uppercase'},children:"Variations"}),(0,i.jsxs)(n.View,{style:{gap:12},children:[(0,i.jsx)(_r(d[8]).BaseButton,{variant:"outline",children:"Outline Button"}),(0,i.jsx)(_r(d[8]).BaseButton,{variant:"danger",children:"Danger Action"}),(0,i.jsx)(_r(d[8]).BaseButton,{variant:"ghost",children:"Secondary Ghost"})]})]}),(0,i.jsxs)(n.View,{style:{backgroundColor:'#F8FAFC',padding:20,borderRadius:24,marginBottom:20},children:[(0,i.jsx)(n.Text,{style:{color:'#64748B',fontSize:12,fontWeight:'800',marginBottom:16,textTransform:'uppercase'},children:"Selection"}),(0,i.jsx)(_r(d[8]).RadioGroup,{options:[{label:'Standard Protection',value:'a',description:'Real-time app blocking'},{label:'Elite Guardian',value:'b',description:'Advanced category analytics'}],value:"a",onChange:()=>{}})]}),(0,i.jsxs)(n.View,{style:{backgroundColor:'#F8FAFC',padding:20,borderRadius:24,marginBottom:40},children:[(0,i.jsx)(n.Text,{style:{color:'#64748B',fontSize:12,fontWeight:'800',marginBottom:16,textTransform:'uppercase'},children:"Alert System"}),(0,i.jsx)(_r(d[8]).Alert,{variant:"warning",title:"Privacy Notice",children:"Accessibility service is used for URL detection only."})]}),(0,i.jsx)(n.TouchableOpacity,{style:{backgroundColor:'#0F172A',padding:20,borderRadius:999,alignItems:'center',marginTop:10},onPress:()=>h(!0),children:(0,i.jsx)(n.Text,{style:{color:'white',fontSize:16,fontWeight:'900'},children:"\ud83d\ude80 PROCEED TO MAIN DASHBOARD"})})]})]})}},495,[1,350,32,69,2,496,238,510,497]); -__d(function(g,_r,_i,a,m,_e,d){var e=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var t=e(_r(d[1])),n=(function(e,t){if("function"==typeof WeakMap)var n=new WeakMap,i=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var r,s,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(r=t?i:n){if(r.has(e))return r.get(e);r.set(e,o)}for(var l in e)"default"!==l&&{}.hasOwnProperty.call(e,l)&&((s=(r=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,l))&&(s.get||s.set)?r(o,l,s):o[l]=e[l]);return o})(e,t)})(_r(d[2])),i=_r(d[3]),r=_r(d[4]);var s=i.StyleSheet.create({safeArea:{flex:1,backgroundColor:'#f8fafc'},container:{flex:1},content:{padding:20,paddingBottom:60},header:{marginBottom:32,marginTop:10},pageTitle:{fontSize:28,fontWeight:'800',color:'#0f172a',letterSpacing:-.5},pageSubtitle:{fontSize:16,color:'#64748b',marginTop:4},section:{marginBottom:28},sectionHeader:{fontSize:12,fontWeight:'700',color:'#94a3b8',letterSpacing:1.5,marginBottom:12,paddingLeft:4},componentCard:{backgroundColor:'#ffffff',padding:18,borderRadius:16,borderWidth:1,borderColor:'#e2e8f0',gap:12,shadowColor:'#000',shadowOffset:{width:0,height:2},shadowOpacity:.05,shadowRadius:10,elevation:2},row:{flexDirection:'row',gap:12},flex1:{flex:1},mb12:{marginBottom:12},modalText:{fontSize:14,color:'#475569',lineHeight:20},footer:{marginTop:20,alignItems:'center',opacity:.5},footerText:{fontSize:12,fontWeight:'600',color:'#64748b'}});_e.default=()=>{var e=(0,n.useState)(''),o=(0,t.default)(e,2),l=o[0],c=o[1],h=(0,n.useState)(''),x=(0,t.default)(h,2),u=x[0],f=x[1],p=(0,n.useState)('option1'),y=(0,t.default)(p,2),j=y[0],w=y[1],v=(0,n.useState)(!1),T=(0,t.default)(v,2),S=T[0],b=T[1];return(0,r.jsx)(i.SafeAreaView,{style:s.safeArea,children:(0,r.jsxs)(i.ScrollView,{style:s.container,contentContainerStyle:s.content,children:[(0,r.jsxs)(i.View,{style:s.header,children:[(0,r.jsx)(i.Text,{style:s.pageTitle,children:"Component Library"}),(0,r.jsx)(i.Text,{style:s.pageSubtitle,children:"Testing UI Elements for AppGuard2"})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"BUTTONS"}),(0,r.jsxs)(i.View,{style:s.componentCard,children:[(0,r.jsxs)(i.View,{style:s.row,children:[(0,r.jsx)(_r(d[5]).BaseButton,{variant:"primary",style:s.flex1,onPress:()=>i.Alert.alert("Primary Action"),children:"Primary"}),(0,r.jsx)(_r(d[5]).BaseButton,{variant:"secondary",style:s.flex1,children:"Secondary"})]}),(0,r.jsxs)(i.View,{style:s.row,children:[(0,r.jsx)(_r(d[5]).BaseButton,{variant:"outline",style:s.flex1,children:"Outline"}),(0,r.jsx)(_r(d[5]).BaseButton,{variant:"danger",style:s.flex1,children:"Danger"})]}),(0,r.jsx)(_r(d[5]).BaseButton,{variant:"ghost",fullWidth:!0,children:"Ghost Variant (Text only)"}),(0,r.jsx)(_r(d[5]).BaseButton,{variant:"primary",isLoading:!0,fullWidth:!0,children:"Loading State"})]})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"INPUTS"}),(0,r.jsxs)(i.View,{style:s.componentCard,children:[(0,r.jsx)(_r(d[5]).TextInput,{label:"Standard Input",placeholder:"e.g. John Doe",value:l,onChangeText:c}),(0,r.jsx)(_r(d[5]).TextInput,{label:"Input with Error",value:"Invalid email",error:"Please enter a valid email address"}),(0,r.jsx)(_r(d[5]).TextInput,{label:"Password Field",placeholder:"Enter your password",value:u,onChangeText:f,secureTextEntry:!0})]})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"RADIO SELECTORS"}),(0,r.jsx)(i.View,{style:s.componentCard,children:(0,r.jsx)(_r(d[5]).RadioGroup,{options:[{label:'Visa ending in 4242',value:'option1',description:'Expires 12/26'},{label:'Mastercard ending in 1234',value:'option2',description:'Expires 08/25'},{label:'Add New Card',value:'option3',disabled:!0}],value:j,onChange:e=>w(e)})})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"ALERTS & FEEDBACK"}),(0,r.jsxs)(i.View,{style:s.componentCard,children:[(0,r.jsx)(_r(d[5]).Alert,{variant:"info",title:"Information",style:s.mb12,children:"This is a standard informational message for the user."}),(0,r.jsx)(_r(d[5]).Alert,{variant:"warning",title:"Security Warning",style:s.mb12,children:"Your device has 30 mins of homework time left."}),(0,r.jsx)(_r(d[5]).Alert,{variant:"success",title:"Success",children:"Payment confirmed successfully!"})]})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"ICONS"}),(0,r.jsxs)(i.View,{style:[s.componentCard,s.row,{justifyContent:'space-around'}],children:[(0,r.jsx)(_r(d[5]).Icon,{size:"sm",children:"\ud83d\udd12"}),(0,r.jsx)(_r(d[5]).Icon,{size:"md",children:"\u26a1"}),(0,r.jsx)(_r(d[5]).Icon,{size:"lg",children:"\ud83e\udde0"}),(0,r.jsx)(_r(d[5]).Icon,{size:32,style:{color:'#2563eb'},children:"\uf8ff"}),(0,r.jsx)(_r(d[5]).Icon,{size:32,style:{color:'#ea4335'},children:"G"})]})]}),(0,r.jsxs)(i.View,{style:s.section,children:[(0,r.jsx)(i.Text,{style:s.sectionHeader,children:"MODALS"}),(0,r.jsxs)(i.View,{style:s.componentCard,children:[(0,r.jsx)(_r(d[5]).BaseButton,{variant:"outline",fullWidth:!0,onPress:()=>b(!0),children:"Preview Modal"}),(0,r.jsx)(_r(d[5]).BaseModal,{isOpen:S,onClose:()=>b(!1),title:"Override Configuration",subtitle:"Configure how long you want to unlock the device.",headerLabel:"System Settings",children:(0,r.jsxs)(i.View,{style:{gap:16},children:[(0,r.jsx)(i.Text,{style:s.modalText,children:"This is a preview of the BaseModal component. It supports titles, subtitles, and custom header labels."}),(0,r.jsx)(_r(d[5]).TextInput,{label:"Quick Adjust (mins)",placeholder:"30"}),(0,r.jsxs)(i.View,{style:s.row,children:[(0,r.jsx)(_r(d[5]).BaseButton,{variant:"outline",style:s.flex1,onPress:()=>b(!1),children:"Cancel"}),(0,r.jsx)(_r(d[5]).BaseButton,{variant:"primary",style:s.flex1,onPress:()=>b(!1),children:"Save"})]})]})})]})]}),(0,r.jsx)(i.View,{style:s.footer,children:(0,r.jsx)(i.Text,{style:s.footerText,children:"AppGuard2 \u2022 v2.0.0"})})]})})}},496,[1,32,69,2,238,497]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))}),Object.keys(r(d[1])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[1])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[1])[n]}}))}),Object.keys(r(d[2])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[2])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[2])[n]}}))}),Object.keys(r(d[3])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[3])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[3])[n]}}))}),Object.keys(r(d[4])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[4])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[4])[n]}}))}),Object.keys(r(d[5])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[5])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[5])[n]}}))})},497,[498,500,502,504,506,508]); -__d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0});var e={};Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return t.default}});var t=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,u,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f)}for(var c in e)"default"!==c&&{}.hasOwnProperty.call(e,c)&&((u=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,c))&&(u.get||u.set)?o(f,c,u):f[c]=e[c]);return f})(e,t)})(_r(d[0]));Object.keys(t).forEach(function(r){"default"!==r&&"__esModule"!==r&&(Object.prototype.hasOwnProperty.call(e,r)||r in _e&&_e[r]===t[r]||Object.defineProperty(_e,r,{enumerable:!0,get:function(){return t[r]}}))})},498,[499]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseButton=void 0;t(r(d[1]));var o=r(d[2]),s=r(d[3]),n=({children:t,variant:n="primary",size:u="md",fullWidth:h=!1,isLoading:c=!1,leftIcon:p,rightIcon:y,disabled:B=!1,onPress:x,style:F})=>{var b=[l.base],f=[l.textBase];return'primary'===n?(b.push(l.primaryBg),f.push(l.primaryText)):'secondary'===n?(b.push(l.secondaryBg),f.push(l.secondaryText)):'outline'===n?(b.push(l.outlineBg),f.push(l.outlineText)):'danger'===n?(b.push(l.dangerBg),f.push(l.dangerText)):'ghost'===n&&(b.push(l.ghostBg),f.push(l.ghostText)),'sm'===u?b.push(l.sizeSm):'md'===u?b.push(l.sizeMd):'lg'===u&&b.push(l.sizeLg),h&&b.push(l.fullWidth),(B||c)&&b.push(l.disabled),(0,s.jsxs)(o.TouchableOpacity,{style:[b,F],disabled:B||c,onPress:x,activeOpacity:.7,children:[c?(0,s.jsx)(o.ActivityIndicator,{color:f[1]?.color||'#fff',style:{marginRight:8}}):null,!c&&p?p:null,'string'==typeof t||Array.isArray(t)?(0,s.jsx)(o.Text,{style:f,children:t}):t,!c&&y?y:null]})};e.BaseButton=n;var l=o.StyleSheet.create({base:{flexDirection:'row',alignItems:'center',justifyContent:'center',borderRadius:999},textBase:{fontWeight:'700',letterSpacing:-.5},primaryBg:{backgroundColor:'#10B981'},primaryText:{color:'#FFFFFF'},secondaryBg:{backgroundColor:'#F3F4F6'},secondaryText:{color:'#0F172A'},outlineBg:{backgroundColor:'transparent',borderWidth:2,borderColor:'#10B981'},outlineText:{color:'#10B981'},dangerBg:{backgroundColor:'#EF4444'},dangerText:{color:'#FFFFFF'},ghostBg:{backgroundColor:'transparent'},ghostText:{color:'#64748B'},sizeSm:{height:40,paddingHorizontal:16},sizeMd:{height:56,paddingHorizontal:24},sizeLg:{height:64,paddingHorizontal:32},fullWidth:{width:'100%'},disabled:{opacity:.5}});e.default=n},499,[1,69,2,238]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))})},500,[501]); -__d(function(g,_r,_i,a,m,_e,d){var e=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.TextInput=void 0;var t=e(_r(d[1])),r=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,i,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,l)}for(var u in e)"default"!==u&&{}.hasOwnProperty.call(e,u)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,u))&&(i.get||i.set)?o(l,u,i):l[u]=e[u]);return l})(e,t)})(_r(d[2])),n=_r(d[3]),o=_r(d[4]);(_e.TextInput=(0,r.forwardRef)(({label:e,error:l,style:u,secureTextEntry:p,...s},c)=>{var f=(0,r.useState)(!1),y=(0,t.default)(f,2),h=y[0],x=y[1],T=p&&!h;return(0,o.jsxs)(n.View,{style:i.container,children:[e&&(0,o.jsx)(n.Text,{style:i.label,children:e}),(0,o.jsxs)(n.View,{style:i.inputWrapper,children:[(0,o.jsx)(n.TextInput,{ref:c,style:[i.input,l?i.inputError:i.inputNormal,p&&{paddingRight:60},u],secureTextEntry:!!T,placeholderTextColor:"#94A3B8",...s}),p&&(0,o.jsx)(n.TouchableOpacity,{style:i.eyeButton,onPress:()=>x(!h),activeOpacity:.6,children:(0,o.jsx)(n.Text,{style:i.eyeText,children:h?'Hide':'Show'})})]}),l&&(0,o.jsx)(n.Text,{style:i.errorText,children:l})]})})).displayName='TextInput';var i=n.StyleSheet.create({container:{width:'100%',marginBottom:16},label:{fontSize:13,fontWeight:'700',color:'#64748B',marginBottom:8,marginLeft:4,textTransform:'uppercase',letterSpacing:.5},inputWrapper:{width:'100%',justifyContent:'center'},input:{height:56,width:'100%',borderWidth:1.5,borderRadius:16,paddingHorizontal:16,fontSize:15,color:'#0F172A',backgroundColor:'#F8FAFC'},inputNormal:{borderColor:'#E2E8F0'},inputError:{borderColor:'#EF4444'},eyeButton:{position:'absolute',right:16,height:'100%',justifyContent:'center',paddingHorizontal:8},eyeText:{color:'#10B981',fontSize:12,fontWeight:'800',textTransform:'uppercase'},errorText:{marginTop:6,fontSize:12,color:'#EF4444',marginLeft:4}})},501,[1,32,69,2,238]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))})},502,[503]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.BaseModal=void 0;t(r(d[1]));var o=r(d[2]),l=r(d[3]);e.BaseModal=({isOpen:t,onClose:s,title:h,subtitle:c,headerLabel:f,showCloseButton:x=!0,children:y})=>(0,l.jsx)(o.Modal,{visible:t,transparent:!0,animationType:"fade",onRequestClose:s,children:(0,l.jsx)(o.TouchableWithoutFeedback,{onPress:s,children:(0,l.jsx)(o.View,{style:n.overlay,children:(0,l.jsx)(o.TouchableWithoutFeedback,{onPress:()=>{},children:(0,l.jsxs)(o.View,{style:n.modalContainer,children:[(h||c||f||x)&&(0,l.jsxs)(o.View,{style:n.header,children:[(0,l.jsxs)(o.View,{style:n.headerTop,children:[(0,l.jsxs)(o.View,{style:n.titleContainer,children:[f&&(0,l.jsx)(o.Text,{style:n.headerLabel,children:f}),h&&('string'==typeof h||Array.isArray(h))?(0,l.jsx)(o.Text,{style:n.title,children:h}):h]}),x&&(0,l.jsx)(o.TouchableOpacity,{onPress:s,style:n.closeBtn,children:(0,l.jsx)(o.Text,{style:n.closeBtnText,children:"\u2715"})})]}),c&&(0,l.jsx)(o.Text,{style:n.subtitle,children:c})]}),(0,l.jsx)(o.View,{style:n.body,children:y})]})})})})});var n=o.StyleSheet.create({overlay:{flex:1,backgroundColor:'rgba(0, 0, 0, 0.5)',justifyContent:'center',alignItems:'center',padding:20},modalContainer:{width:'100%',maxWidth:400,backgroundColor:'#ffffff',borderRadius:16,overflow:'hidden',shadowColor:'#000',shadowOffset:{width:0,height:10},shadowOpacity:.15,shadowRadius:20,elevation:8},header:{padding:20,paddingBottom:16,borderBottomWidth:1,borderBottomColor:'#f3f4f6'},headerTop:{flexDirection:'row',justifyContent:'space-between',alignItems:'flex-start'},titleContainer:{flex:1},headerLabel:{fontSize:12,fontWeight:'700',color:'#2563eb',textTransform:'uppercase',marginBottom:4},title:{fontSize:20,fontWeight:'700',color:'#111827'},closeBtn:{padding:4,marginLeft:16},closeBtnText:{fontSize:20,color:'#9ca3af',fontWeight:'500'},subtitle:{marginTop:6,fontSize:14,color:'#6b7280'},body:{padding:20,maxHeight:500}})},503,[1,69,2,238]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))})},504,[505]); -__d(function(g,r,i,a,m,e,d){var o=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.RadioGroup=void 0;o(r(d[1]));var t=r(d[2]),l=r(d[3]);e.RadioGroup=({options:o,value:c,onChange:s,orientation:f="vertical",error:h,style:C})=>(0,l.jsxs)(t.View,{style:C,children:[(0,l.jsx)(t.View,{style:'vertical'===f?n.verticalContainer:n.horizontalContainer,children:o.map(o=>{var f=c===o.value;return(0,l.jsxs)(t.TouchableOpacity,{disabled:o.disabled,style:[n.optionContainer,o.disabled&&n.disabled],onPress:()=>s(o.value),activeOpacity:.7,children:[(0,l.jsx)(t.View,{style:[n.radioCircle,f&&n.radioChecked,h&&!f&&n.radioError],children:f&&(0,l.jsx)(t.View,{style:n.radioInnerCircle})}),(0,l.jsxs)(t.View,{style:n.textContainer,children:[(0,l.jsx)(t.Text,{style:[n.label,f&&n.labelChecked],children:o.label}),o.description&&(0,l.jsx)(t.Text,{style:n.description,children:o.description})]})]},o.value)})}),h&&(0,l.jsx)(t.Text,{style:n.errorText,children:h})]});var n=t.StyleSheet.create({verticalContainer:{flexDirection:'column',gap:16},horizontalContainer:{flexDirection:'row',gap:24,flexWrap:'wrap'},optionContainer:{flexDirection:'row',alignItems:'flex-start',marginBottom:4},disabled:{opacity:.5},radioCircle:{width:22,height:22,borderRadius:11,borderWidth:2,borderColor:'#d1d5db',alignItems:'center',justifyContent:'center',marginTop:2,backgroundColor:'#ffffff'},radioChecked:{borderColor:'#10B981',backgroundColor:'#10B981'},radioError:{borderColor:'#EF4444'},radioInnerCircle:{width:8,height:8,borderRadius:4,backgroundColor:'#ffffff'},textContainer:{marginLeft:12,flex:1},label:{fontSize:15,fontWeight:'600',color:'#0F172A'},labelChecked:{color:'#0F172A'},description:{fontSize:14,color:'#64748B',marginTop:2},errorText:{marginTop:6,fontSize:12,color:'#ef4444'}})},505,[1,69,2,238]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))})},506,[507]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.Alert=void 0;t(r(d[1]));var o=r(d[2]),n=r(d[3]),f={default:{bg:'#ffffff',border:'#e5e7eb',text:'#111827',icon:'\ud83d\udcdd'},success:{bg:'#f0fdf4',border:'#bbf7d0',text:'#14532d',icon:'\u2705'},warning:{bg:'#fffbeb',border:'#fde68a',text:'#78350f',icon:'\u26a0\ufe0f'},error:{bg:'#fef2f2',border:'#fecaca',text:'#7f1d1d',icon:'\u274c'},info:{bg:'#eff6ff',border:'#bfdbfe',text:'#1e3a8a',icon:'\u2139\ufe0f'}};e.Alert=({variant:t="default",title:c,children:b,style:s})=>{var x=f[t]||f.default;return(0,n.jsxs)(o.View,{style:[l.container,{backgroundColor:x.bg,borderColor:x.border},s],children:[(0,n.jsx)(o.Text,{style:l.icon,children:x.icon}),(0,n.jsxs)(o.View,{style:l.content,children:[c?(0,n.jsx)(o.Text,{style:[l.title,{color:x.text}],children:c}):null,'string'==typeof b||Array.isArray(b)?(0,n.jsx)(o.Text,{style:[l.message,{color:x.text}],children:b}):b]})]})};var l=o.StyleSheet.create({container:{flexDirection:'row',padding:16,borderRadius:8,borderWidth:1,width:'100%'},icon:{fontSize:18,marginRight:12,marginTop:2},content:{flex:1},title:{fontSize:16,fontWeight:'600',marginBottom:4},message:{fontSize:14,lineHeight:20,opacity:.9}})},507,[1,69,2,238]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(r(d[0])).forEach(function(n){"default"!==n&&"__esModule"!==n&&(n in e&&e[n]===r(d[0])[n]||Object.defineProperty(e,n,{enumerable:!0,get:function(){return r(d[0])[n]}}))})},508,[509]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.Icon=void 0;n(r(d[1]));var t=r(d[2]),o=r(d[3]),c={sm:16,md:20,lg:24},l=({size:n="md",style:l,children:v,...y})=>{var u='number'==typeof n?n:c[n];return(0,o.jsx)(t.Text,{style:[{fontSize:u},s.icon,l],...y,children:v})};e.Icon=l,l.displayName='Icon';var s=t.StyleSheet.create({icon:{}})},509,[1,69,2,238]); -__d(function(g,r,i,a,m,_e,d){var e=r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.startCategoryService=void 0;var o=e(r(d[1])),t=r(d[2]),l=t.NativeModules.CategoryTrackerModule,n=new t.NativeEventEmitter(l),c=null,v=null;_e.startCategoryService=()=>{l?(l.startTracking(),setInterval((0,o.default)(function*(){try{(yield l.isServiceEnabled())?l.logToNative("\u2705 Service Status: ENABLED"):l.logToNative("\u26a0\ufe0f ACCESSIBILITY SERVICE IS OFF - Please enable it in Settings!")}catch(e){}}),5e3),n.addListener('onForegroundChange',e=>{var o=e.packageName,t=e.url;l.logToNative(`[JS] Detecting: Pkg=${o}, URL=${t}`);var n=null;if(t&&('com.android.chrome'===o||'com.microsoft.emmx'===o))for(var v in r(d[3]).categoryMap)if(!v.startsWith('com.')&&t.toLowerCase().includes(v.toLowerCase())){n=v;break}!n&&r(d[3]).categoryMap[o]&&(n=o),n!==c&&(l.logToNative(`[JS] Switch: ${c} -> ${n}`),c=n,s())}),l.logToNative("[JS] Category Service Initialized")):console.error("CategoryTrackerModule not found.")};var s=()=>{v&&(clearInterval(v),v=null);var e=c?r(d[3]).categoryMap[c]:null;if(e){if(l.logToNative(`Active tracking for category: ${e}`),(0,r(d[4]).isCategoryBlocked)(e))return l.logToNative(`Category ${e} is ALREADY blocked.`),void l.triggerBlock(e);v=setInterval(()=>{var o=(0,r(d[4]).incrementCategoryTime)(e);l.logToNative(`Time for ${e}: ${o}s`),(0,r(d[4]).isCategoryBlocked)(e)&&(l.logToNative(`Limit REACHED for ${e}. Triggering block.`),l.triggerBlock(e),clearInterval(v),v=null)},1e3)}else l.logToNative("No tracked item in foreground. Timer cleared.")}},510,[1,350,2,511,512]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.categoryMap=e.CATEGORY_LIMIT=void 0;e.categoryMap={"com.facebook.katana":"Social Media","com.instagram.android":"Social Media","com.twitter.android":"Social Media","google.com":"Social Media","twitter.com":"Social Media","facebook.com":"Social Media","instagram.com":"Social Media","x.com":"Social Media"},e.CATEGORY_LIMIT=3},511,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.isCategoryBlocked=e.incrementCategoryTime=e.getCategoryTime=void 0;var o={"Social Media":0};e.incrementCategoryTime=t=>void 0!==o[t]?(o[t]+=1,o[t]):0;e.isCategoryBlocked=t=>(o[t]||0)>=r(d[0]).CATEGORY_LIMIT;e.getCategoryTime=t=>o[t]||0},512,[511]); -__d(function(p,a,d,e,n,r,u){n.exports={name:"AppGuard2",displayName:"AppGuard2"}},513,[]); +__d(function(g,_r,_i,_a,_m,_e,d){var e=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var t=e(_r(d[1])),r=e(_r(d[2])),o=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,o=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var a,n,i={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return i;if(a=t?o:r){if(a.has(e))return a.get(e);a.set(e,i)}for(var l in e)"default"!==l&&{}.hasOwnProperty.call(e,l)&&((n=(a=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,l))&&(n.get||n.set)?a(i,l,n):i[l]=e[l]);return i})(e,t)})(_r(d[3])),a=_r(d[4]),n=_r(d[5]);var i=a.NativeModules.LimitterModule,l=a.NativeModules.TimerEventModule;var s=a.StyleSheet.create({container:{flex:1,backgroundColor:'#0F172A'},header:{padding:30,alignItems:'center'},title:{fontSize:40,fontWeight:'900',color:'#F8FAFC'},versionTag:{color:'#6366F1',fontSize:12,fontWeight:'700'},subtitle:{color:'#94A3B8',marginBottom:20},card:{backgroundColor:'#1E293B',margin:20,padding:20,borderRadius:20},sectionTitle:{color:'#F8FAFC',fontSize:18,fontWeight:'800',marginBottom:15},timerRow:{flexDirection:'row',gap:15,marginBottom:20},inputBox:{flex:1,backgroundColor:'#0F172A',padding:10,borderRadius:10,alignItems:'center'},label:{color:'#64748B',fontSize:10,fontWeight:'800'},input:{color:'#F8FAFC',fontSize:24,fontWeight:'900'},btn:{backgroundColor:'#6366F1',padding:18,borderRadius:15,alignItems:'center'},btnText:{color:'white',fontWeight:'900'},activeCard:{marginHorizontal:20,marginBottom:10,padding:15,borderRadius:12,borderLeftWidth:5,borderLeftColor:'#6366F1',backgroundColor:'#1E293B'},activeLabel:{color:'white',fontWeight:'700'},listSection:{padding:20},search:{backgroundColor:'#1E293B',color:'white',padding:15,borderRadius:15,marginBottom:20},appRow:{flexDirection:'row',alignItems:'center',marginBottom:15,opacity:1,backgroundColor:'#1E293B',padding:12,borderRadius:12},appRowReady:{opacity:1},appRowSelected:{backgroundColor:'#3730A3',borderWidth:2,borderColor:'#6366F1'},icon:{width:50,height:50,borderRadius:15,backgroundColor:'#334155',alignItems:'center',justifyContent:'center'},iconTxt:{color:'white',fontSize:20,fontWeight:'800'},appName:{color:'#F8FAFC',fontWeight:'700'},pkgName:{color:'#64748B',fontSize:10},tick:{width:30,height:30,borderRadius:15,borderWidth:2,borderColor:'#334155',alignItems:'center',justifyContent:'center'},tickTxt:{color:'white',fontWeight:'900'},dropdownRow:{flexDirection:'row',flexWrap:'wrap',gap:8,marginTop:8},hourChip:{width:42,height:38,borderRadius:10,backgroundColor:'#1E293B',borderWidth:1,borderColor:'#334155',alignItems:'center',justifyContent:'center'},hourChipSelected:{backgroundColor:'#D97706',borderColor:'#F59E0B'},hourChipText:{color:'#94A3B8',fontWeight:'800',fontSize:14},ampmBtn:{flex:1,padding:16,borderRadius:12,backgroundColor:'#1E293B',borderWidth:1,borderColor:'#334155',alignItems:'center'},ampmBtnSelected:{backgroundColor:'#D97706',borderColor:'#F59E0B'},ampmText:{color:'#94A3B8',fontWeight:'900',fontSize:16}});_e.default=function(){var e=(0,o.useState)([]),c=(0,r.default)(e,2),u=c[0],p=c[1],h=(0,o.useState)(!1),m=(0,r.default)(h,2),x=m[0],f=m[1],y=(0,o.useState)([]),T=(0,r.default)(y,2),b=T[0],S=T[1],C=(0,o.useState)(0),j=(0,r.default)(C,2),k=j[0],v=j[1],A=(0,o.useState)([]),w=(0,r.default)(A,2),E=w[0],B=w[1],R=(0,o.useState)(!1),F=(0,r.default)(R,2),I=F[0],P=F[1],O=(0,o.useState)(''),M=(0,r.default)(O,2),L=M[0],V=M[1],W=(0,o.useState)({overlay:!1,usage:!1,batteryOptimized:!1,exactAlarm:!0}),N=(0,r.default)(W,2),D=N[0],z=N[1],$=(0,o.useState)('0'),_=(0,r.default)($,2),H=_[0],K=_[1],q=(0,o.useState)('30'),G=(0,r.default)(q,2),U=G[0],Y=G[1],X=(0,o.useState)(!1),Z=(0,r.default)(X,2),J=Z[0],Q=Z[1],ee=(0,o.useState)('12'),te=(0,r.default)(ee,2),re=te[0],oe=te[1],ae=(0,o.useState)('PM'),ne=(0,r.default)(ae,2),ie=ne[0],le=ne[1],se=(0,o.useState)(!1),ce=(0,r.default)(se,2),de=ce[0],ue=ce[1];(0,o.useEffect)(()=>{he(),pe(),(0,_r(d[6]).startCategoryService)();var e=a.AppState.addEventListener('change',e=>{'active'===e&&(he(),pe())});return()=>e.remove()},[]);var pe=(function(){var e=(0,t.default)(function*(){if(i?.getActiveTimers)try{var e=yield i.getActiveTimers();e&&e.length>0&&(console.log("Synced active timers:",e.length),p(t=>{var r=new Map;return e.forEach(e=>r.set(e.package,{package:e.package,name:e.name,durationSeconds:e.remainingSeconds,remainingSeconds:e.remainingSeconds,status:e.status})),Array.from(r.values())}))}catch(e){console.error("Failed to sync timers:",e)}});return function(){return e.apply(this,arguments)}})();(0,o.useEffect)(()=>{if(l){var e=new a.NativeEventEmitter(l);l.startListening();var t=e.addListener('TIMER_TICK',e=>{var t=e.package,r=e.appName,o=e.remaining,a=e.isBlocked;p(e=>e.some(e=>e.package===t)?e.map(e=>e.package===t?{...e,remainingSeconds:o,status:a?'blocked':'active'}:e):[...e,{package:t,name:r||t,durationSeconds:o,remainingSeconds:o,status:a?'blocked':'active'}])});return()=>{t.remove(),l.stopListening()}}},[]);var he=(function(){var e=(0,t.default)(function*(){if(i?.checkPermissions){var e=yield i.checkPermissions();console.log("Permission Status:",e),z(e),e.overlay&&e.usage&&v(1)}});return function(){return e.apply(this,arguments)}})(),ge=(function(){var e=(0,t.default)(function*(){P(!0),console.log("Fetching apps...");try{if(i?.getInstalledApps){var e=yield i.getInstalledApps();console.log("Apps found:",e.length),B(e.filter(e=>'com.appguard2'!==e.package).sort((e,t)=>e.name.localeCompare(t.name)))}else console.error("LimitterModule.getInstalledApps is missing")}catch(e){console.error("Failed to load apps:",e),a.Alert.alert('Error','Failed to load app list: '+(e.message||e))}finally{P(!1)}});return function(){return e.apply(this,arguments)}})();(0,o.useEffect)(()=>{1===k&&ge()},[k]);var me=(function(){var e=(0,t.default)(function*(){3600*(parseInt(H)||0)+(parseInt(U)||0)<=0?a.Alert.alert('Invalid Time','Please enter a valid duration.'):(Q(!0),i?.showNotification&&(yield i.showNotification("Your timer is set. Now select apps to limit.")))});return function(){return e.apply(this,arguments)}})(),xe=(function(){var e=(0,t.default)(function*(){if(de)if(0!==b.length){var e=parseInt(re)||12;'AM'===ie?12===e&&(e=0):12!==e&&(e+=12);var t=b.map(t=>({package:t.package,appName:t.name,hour:e,minute:0}));try{var r=yield i.startClockTimer({apps:t});console.log('Clock timer result:',r),a.Alert.alert('Success',`\ud83d\udd50 Clock timer set to ${re}:00 ${ie} for ${b.length} app(s)`),ue(!1),S([]),V('')}catch(e){console.error('Clock timer error:',e),a.Alert.alert('Error','Failed to start clock timer: '+(e.message||e))}}else a.Alert.alert('No Apps Selected','Please select at least one app.');else a.Alert.alert('Step Required','Please set the clock timer first.')});return function(){return e.apply(this,arguments)}})(),fe=(function(){var e=(0,t.default)(function*(){if(J)if(0!==b.length){var e=3600*(parseInt(H)||0)+(parseInt(U)||0),t=b.map(t=>({...t,durationSeconds:e,remainingSeconds:e,status:'active'}));if(p(e=>[...e.filter(e=>!b.some(t=>t.package===e.package)),...t]),i?.sendCommand)try{var r=b.map(t=>({package:t.package,appName:t.name,duration:e.toString()}));yield i.sendCommand('START_TIMERS',{apps:r}),console.log(`\u2705 Started timers for ${b.length} apps`),a.Alert.alert('Success',`\u23f1 Timers started for ${b.length} app(s)`),Q(!1),S([]),V('')}catch(e){console.error("Failed to start timers:",e),a.Alert.alert('Error','Failed to start timers: '+e.message)}}else a.Alert.alert('No Apps Selected','Please select at least one app to limit.');else a.Alert.alert('Step 1 Required','Please set the timer above and click SAVE TIMER first.')});return function(){return e.apply(this,arguments)}})(),ye=(0,o.useMemo)(()=>E.filter(e=>e.name.toLowerCase().includes(L.toLowerCase())),[E,L]);return 0===k?(0,n.jsxs)(a.View,{style:[s.container,{justifyContent:'center',padding:30}],children:[(0,n.jsx)(a.Text,{style:s.title,children:"Permissions Needed"}),(0,n.jsx)(a.Text,{style:s.subtitle,children:"Overlay and Usage Access required."}),(0,n.jsx)(a.TouchableOpacity,{style:s.btn,onPress:()=>i?.checkAndRequestPermissions(),children:(0,n.jsx)(a.Text,{style:s.btnText,children:"GRANT PERMISSIONS"})}),(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#334155',marginTop:10}],onPress:he,children:(0,n.jsx)(a.Text,{style:s.btnText,children:"I'VE GRANTED THEM - REFRESH"})})]}):(0,n.jsxs)(a.SafeAreaView,{style:s.container,children:[(0,n.jsx)(a.StatusBar,{barStyle:"light-content",backgroundColor:"#0F172A"}),(0,n.jsx)(a.View,{style:s.header,children:(0,n.jsxs)(a.View,{style:{flexDirection:'row',justifyContent:'space-between',width:'100%',alignItems:'center'},children:[(0,n.jsxs)(a.View,{children:[(0,n.jsx)(a.Text,{style:s.title,children:"APPGUARD"}),(0,n.jsx)(a.Text,{style:s.versionTag,children:"v2.0 Native Guard"})]}),(0,n.jsx)(a.TouchableOpacity,{style:{backgroundColor:'#E11D48',padding:8,borderRadius:10},onPress:()=>a.Alert.alert("Help & Settings","If your timer stops in the background:\n\n1. Disable Battery Optimization\n2. Allow Exact Alarms\n3. Ensure 'Auto-Start' is enabled (if available in phone settings).",[{text:"Open Background Settings",onPress:()=>f(!x)},{text:"OK"}]),children:(0,n.jsx)(a.Text,{style:{color:'white',fontWeight:'bold'},children:"HELP"})})]})}),(0,n.jsxs)(a.ScrollView,{contentContainerStyle:{paddingBottom:100},children:[(D.batteryOptimized||!D.exactAlarm||x)&&(0,n.jsxs)(a.View,{style:[s.card,{backgroundColor:'#7C2D12',borderColor:'#F59E0B',borderWidth:1}],children:[(0,n.jsx)(a.Text,{style:[s.sectionTitle,{color:'#FACC15'}],children:"\u26a0\ufe0f Background Performance"}),(0,n.jsx)(a.Text,{style:{color:'#FED7AA',marginBottom:15,fontSize:13},children:"Troubleshooting: If the timer stops, ensure these system permissions are granted for 100% reliability."}),(0,n.jsxs)(a.View,{children:[D.batteryOptimized&&(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#EA580C',marginBottom:10}],onPress:()=>i?.requestBatteryOptimizationExemption(),children:(0,n.jsx)(a.Text,{style:s.btnText,children:"1. DISABLE BATTERY OPTIMIZATION"})}),!D.exactAlarm&&(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#B45309',marginBottom:10}],onPress:()=>a.Linking.openSettings(),children:(0,n.jsx)(a.Text,{style:s.btnText,children:"2. ALLOW EXACT ALARMS"})}),x&&(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#475569',marginTop:5}],onPress:()=>f(!1),children:(0,n.jsx)(a.Text,{style:s.btnText,children:"CLOSE HELP PANEL"})})]})]}),(0,n.jsxs)(a.View,{style:s.card,children:[(0,n.jsx)(a.Text,{style:s.sectionTitle,children:"1. Set Timer"}),(0,n.jsxs)(a.View,{style:s.timerRow,children:[(0,n.jsxs)(a.View,{style:s.inputBox,children:[(0,n.jsx)(a.Text,{style:s.label,children:"HRS"}),(0,n.jsx)(a.TextInput,{style:s.input,value:H,onChangeText:K,keyboardType:"numeric"})]}),(0,n.jsxs)(a.View,{style:s.inputBox,children:[(0,n.jsx)(a.Text,{style:s.label,children:"SEC"}),(0,n.jsx)(a.TextInput,{style:s.input,value:U,onChangeText:Y,keyboardType:"numeric"})]})]}),(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,J&&{backgroundColor:'#10B981'}],onPress:me,children:(0,n.jsx)(a.Text,{style:s.btnText,children:J?"\u2713 TIMER SET":"SAVE TIMER"})})]}),(0,n.jsxs)(a.View,{style:s.card,children:[(0,n.jsx)(a.Text,{style:[s.sectionTitle,{color:'#F59E0B'}],children:"\ud83d\udd50 Clock Timer"}),(0,n.jsx)(a.Text,{style:{color:'#94A3B8',fontSize:12,marginBottom:15},children:"Block apps at a specific time of day"}),(0,n.jsxs)(a.View,{style:s.inputBox,children:[(0,n.jsx)(a.Text,{style:s.label,children:"SELECT HOUR"}),(0,n.jsx)(a.View,{style:s.dropdownRow,children:['1','2','3','4','5','6','7','8','9','10','11','12'].map(e=>(0,n.jsx)(a.TouchableOpacity,{style:[s.hourChip,re===e&&s.hourChipSelected],onPress:()=>oe(e),children:(0,n.jsx)(a.Text,{style:[s.hourChipText,re===e&&{color:'#FFF'}],children:e})},e))})]}),(0,n.jsxs)(a.View,{style:[s.timerRow,{marginTop:15,marginBottom:20}],children:[(0,n.jsx)(a.TouchableOpacity,{style:[s.ampmBtn,'AM'===ie&&s.ampmBtnSelected],onPress:()=>le('AM'),children:(0,n.jsx)(a.Text,{style:[s.ampmText,'AM'===ie&&{color:'#FFF'}],children:"AM"})}),(0,n.jsx)(a.TouchableOpacity,{style:[s.ampmBtn,'PM'===ie&&s.ampmBtnSelected],onPress:()=>le('PM'),children:(0,n.jsx)(a.Text,{style:[s.ampmText,'PM'===ie&&{color:'#FFF'}],children:"PM"})})]}),(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#D97706'},de&&{backgroundColor:'#10B981'}],onPress:()=>{var e=parseInt(re)||0;e<1||e>12?a.Alert.alert('Invalid Hour','Please select an hour between 1 and 12.'):ue(!0)},children:(0,n.jsx)(a.Text,{style:s.btnText,children:de?`\u2713 CLOCK SET (${re}:00 ${ie})`:'SAVE CLOCK TIMER'})})]}),u.map(e=>{var t,r,o,i;return(0,n.jsx)(a.View,{style:[s.activeCard,'blocked'===e.status&&{borderColor:'#EF4444'}],children:(0,n.jsxs)(a.Text,{style:s.activeLabel,children:[e.name," - ",'blocked'===e.status?'BLOCKED \u26d4':(t=e.remainingSeconds,r=Math.floor(t/3600),o=Math.floor(t%3600/60),i=t%60,r>0?`${r}:${o.toString().padStart(2,'0')}:${i.toString().padStart(2,'0')}`:`${o}:${i.toString().padStart(2,'0')}`)+" remaining \u23f1"]})},e.package)}),(0,n.jsxs)(a.View,{style:s.card,children:[(0,n.jsx)(a.Text,{style:s.sectionTitle,children:"2. Select Apps"}),(0,n.jsxs)(a.Text,{style:s.subtitle,children:[b.length," app(s) selected"]}),(0,n.jsx)(a.TextInput,{style:s.search,placeholder:"Search apps...",placeholderTextColor:"#94A3B8",value:L,onChangeText:V}),I?(0,n.jsx)(a.ActivityIndicator,{color:"#6366F1"}):ye.map(e=>{var t=b.some(t=>t.package===e.package);return(0,n.jsxs)(a.TouchableOpacity,{style:[s.appRow,J&&s.appRowReady,t&&s.appRowSelected],onPress:()=>{return t=e,void S(e=>e.some(e=>e.package===t.package)?e.filter(e=>e.package!==t.package):[...e,t]);var t},children:[(0,n.jsx)(a.View,{style:[s.icon,t&&{backgroundColor:'#6366F1'}],children:(0,n.jsx)(a.Text,{style:s.iconTxt,children:e.name[0]})}),(0,n.jsxs)(a.View,{style:{flex:1,marginLeft:15},children:[(0,n.jsx)(a.Text,{style:s.appName,children:e.name}),(0,n.jsx)(a.Text,{style:s.pkgName,children:e.package})]}),(0,n.jsx)(a.View,{style:[s.tick,t&&{backgroundColor:'#6366F1'}],children:(0,n.jsx)(a.Text,{style:s.tickTxt,children:t?"\u2713":"+"})})]},e.package)}),b.length>0&&(0,n.jsxs)(a.View,{children:[(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#8B5CF6',marginTop:20}],onPress:fe,children:(0,n.jsxs)(a.Text,{style:s.btnText,children:["\u25b6 START DURATION TIMERS (",b.length,")"]})}),de&&(0,n.jsx)(a.TouchableOpacity,{style:[s.btn,{backgroundColor:'#D97706',marginTop:10}],onPress:xe,children:(0,n.jsxs)(a.Text,{style:s.btnText,children:["\ud83d\udd50 START CLOCK TIMERS (",b.length,")"]})})]})]})]})]})}},495,[1,350,32,69,2,238,496]); +__d(function(g,r,i,a,m,_e,d){var e=r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.startCategoryService=void 0;var o=e(r(d[1])),t=r(d[2]),l=t.NativeModules.CategoryTrackerModule,n=new t.NativeEventEmitter(l),c=null,v=null;_e.startCategoryService=()=>{l?(l.startTracking(),setInterval((0,o.default)(function*(){try{(yield l.isServiceEnabled())?l.logToNative("\u2705 Service Status: ENABLED"):l.logToNative("\u26a0\ufe0f ACCESSIBILITY SERVICE IS OFF - Please enable it in Settings!")}catch(e){}}),5e3),n.addListener('onForegroundChange',e=>{var o=e.packageName,t=e.url;l.logToNative(`[JS] Detecting: Pkg=${o}, URL=${t}`);var n=null;if(t&&('com.android.chrome'===o||'com.microsoft.emmx'===o))for(var v in r(d[3]).categoryMap)if(!v.startsWith('com.')&&t.toLowerCase().includes(v.toLowerCase())){n=v;break}!n&&r(d[3]).categoryMap[o]&&(n=o),n!==c&&(l.logToNative(`[JS] Switch: ${c} -> ${n}`),c=n,s())}),l.logToNative("[JS] Category Service Initialized")):console.error("CategoryTrackerModule not found.")};var s=()=>{v&&(clearInterval(v),v=null);var e=c?r(d[3]).categoryMap[c]:null;if(e){if(l.logToNative(`Active tracking for category: ${e}`),(0,r(d[4]).isCategoryBlocked)(e))return l.logToNative(`Category ${e} is ALREADY blocked.`),void l.triggerBlock(e);v=setInterval(()=>{var o=(0,r(d[4]).incrementCategoryTime)(e);l.logToNative(`Time for ${e}: ${o}s`),(0,r(d[4]).isCategoryBlocked)(e)&&(l.logToNative(`Limit REACHED for ${e}. Triggering block.`),l.triggerBlock(e),clearInterval(v),v=null)},1e3)}else l.logToNative("No tracked item in foreground. Timer cleared.")}},496,[1,350,2,497,498]); +__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.categoryMap=e.CATEGORY_LIMIT=void 0;e.categoryMap={"com.facebook.katana":"Social Media","com.instagram.android":"Social Media","com.twitter.android":"Social Media","google.com":"Social Media","twitter.com":"Social Media","facebook.com":"Social Media","instagram.com":"Social Media","x.com":"Social Media"},e.CATEGORY_LIMIT=3},497,[]); +__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.isCategoryBlocked=e.incrementCategoryTime=e.getCategoryTime=void 0;var o={"Social Media":0};e.incrementCategoryTime=t=>void 0!==o[t]?(o[t]+=1,o[t]):0;e.isCategoryBlocked=t=>(o[t]||0)>=r(d[0]).CATEGORY_LIMIT;e.getCategoryTime=t=>o[t]||0},498,[497]); +__d(function(p,a,d,e,n,r,u){n.exports={name:"AppGuard2",displayName:"AppGuard2"}},499,[]); __r(106); __r(0); \ No newline at end of file diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_alerttriangle.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_alerttriangle.png deleted file mode 100644 index 48e05d7be96a213ecabde05d139b4300fd994a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmV-n0-pVeP)>YpKI z7Aa;kixefHfs=gVD_{A<2^xr)#XRRLzVMvIL`XFcQM4})sU|W`JN5-H{QNW#v4Ss( z>>@^tF1`A~3L+rRpaRE80+3`(D}%%d&0!zOIuPr;b~wD=*NVCTU@mC&by(G>6!e~Y z08`Iz$~qv$gx2~CQGLKs z8zAcd*x=OzL`ie^O;7yGj85papSNoiDSgJ{qXk_^Tp_CO)eB zCF&noGl7&_GbnI*w`dsQ$+iegAHrG(xf)qAaJGsUvm8GHGM3hTW_7_M1$1%Giw z8y{)H1WJC$9!wV1M*y?fdOHzW-lk8Y& zY;oT1zr|c9DsKFpIIfqgiHcQ9952;?)qfAT?mtiqh=PR-{Cz~b`C5{TCCBJ4Nqjdk vL>V_DkH1M7VB$1$pO=wDzu+Ft==<~=mc%HM{zOvz00000NkvXXu0mjf|6voF diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_chevronleft.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_chevronleft.png deleted file mode 100644 index 6b07c51b4a0187d8cc4d99bce95eb3d2d121f790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!2%=?S$v-eq+C5+978H@B_H5ql8|FwsIK?2 zpv|7=f8z&3xy%lxJ(nD;81|R^;F!ecF!dNq|HY-8+6paRDH-YwMUCnVaXFiM^=`#3J*?9RP3FZ!KqTc$%yaZ8g_?f~)LATIet#w`>(o}KlJ44lo+~TYI?8TbmpK1C_dAizvTbecPG%b47y{;h znqcU#)_e9n$1A}uwvJaM7cX{8?vY|H*>jUavi(oUYxCtlEDS!g7(4v*?weU|`S`y5 m!l&~?e}0enr#O9j1M8}6ag7_*YkmM-!{F)a=d#Wzp$PzAgiBoj diff --git a/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_loader.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnative_libraries_logbox_ui_logboximages_loader.png deleted file mode 100644 index 7647edab864eb39fa180e86132d9e56d7a3fcdc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p5-k{SN<{N7;uF(Jp%v$z&pvlQE3ULBrohG7iV>OjGs)Iuz^Mj;@W(}em-EVb?35Xui% zYJ=#n4^ZnZyM%}L6u1+YD)^1l_D1TFn{hNvqU}GyeHPA{l#A zGV$d9-# + diff --git a/package-lock.json b/package-lock.json index dbfb960..854d465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,10 +13,7 @@ "@react-navigation/bottom-tabs": "^7.15.5", "@react-navigation/native": "^7.1.33", "@react-navigation/native-stack": "^7.14.4", - "@types/react-dom": "^19.2.3", - "class-variance-authority": "^0.7.1", "react": "19.2.3", - "react-dom": "^19.2.4", "react-native": "0.84.1", "react-native-background-timer": "^2.4.1", "react-native-safe-area-context": "^5.7.0", @@ -138,7 +135,7 @@ "version": "7.27.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -167,7 +164,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -189,7 +186,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -207,7 +204,7 @@ "version": "0.6.6", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -233,7 +230,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.5", @@ -277,7 +274,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -299,7 +296,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -317,7 +314,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", @@ -335,7 +332,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -376,7 +373,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -503,7 +500,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -583,7 +580,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -596,7 +593,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -612,7 +609,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -683,7 +680,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -801,7 +798,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -850,7 +847,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -868,7 +865,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -902,7 +899,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -918,7 +915,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -952,7 +949,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -990,7 +987,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1122,7 +1119,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1139,7 +1136,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1255,7 +1252,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", @@ -1308,7 +1305,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -1341,7 +1338,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -1410,7 +1407,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -1426,7 +1423,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -1459,7 +1456,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -1476,7 +1473,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -1510,7 +1507,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1526,7 +1523,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -1546,7 +1543,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1562,7 +1559,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1578,7 +1575,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -1627,7 +1624,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -1648,7 +1645,7 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", @@ -1743,7 +1740,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -1796,7 +1793,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -2108,14 +2105,14 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -2675,7 +2672,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2689,7 +2686,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 8" @@ -2699,7 +2696,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2725,7 +2722,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-20.1.0.tgz", "integrity": "sha512-441WsVtRe4nGJ9OzA+QMU1+22lA6Q2hRWqqIMKD0wjEMLqcSfOZyu2UL9a/yRpL/dRpyUsU4n7AxqKfTKO/Csg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-clean": "20.1.0", @@ -2755,7 +2752,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-20.1.0.tgz", "integrity": "sha512-77L4DifWfxAT8ByHnkypge7GBMYpbJAjBGV+toowt5FQSGaTBDcBHCX+FFqFRukD5fH6i8sZ41Gtw+nbfCTTIA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-tools": "20.1.0", @@ -2768,7 +2765,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-20.1.0.tgz", "integrity": "sha512-1x9rhLLR/dKKb92Lb5O0l0EmUG08FHf+ZVyVEf9M+tX+p5QIm52MRiy43R0UAZ2jJnFApxRk+N3sxoYK4Dtnag==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-tools": "20.1.0", @@ -2783,7 +2780,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-android/-/cli-config-android-20.1.0.tgz", "integrity": "sha512-3A01ZDyFeCALzzPcwP/fleHoP3sGNq1UX7FzxkTrOFX8RRL9ntXNXQd27E56VU4BBxGAjAJT4Utw8pcOjJceIA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-tools": "20.1.0", @@ -2796,7 +2793,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-apple/-/cli-config-apple-20.1.0.tgz", "integrity": "sha512-n6JVs8Q3yxRbtZQOy05ofeb1kGtspGN3SgwPmuaqvURF9fsuS7c4/9up2Kp9C+1D2J1remPJXiZLNGOcJvfpOA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-tools": "20.1.0", @@ -2809,7 +2806,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-20.1.0.tgz", "integrity": "sha512-QfJF1GVjA4PBrIT3SJ0vFFIu0km1vwOmLDlOYVqfojajZJ+Dnvl0f94GN1il/jT7fITAxom///XH3/URvi7YTQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-config": "20.1.0", @@ -2833,7 +2830,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2846,7 +2843,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-20.1.0.tgz", "integrity": "sha512-TeHPDThOwDppQRpndm9kCdRCBI8AMy3HSIQ+iy7VYQXL5BtZ5LfmGdusoj7nVN/ZGn0Lc6Gwts5qowyupXdeKg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-config-android": "20.1.0", @@ -2860,7 +2857,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-20.1.0.tgz", "integrity": "sha512-0ih1hrYezSM2cuOlVnwBEFtMwtd8YgpTLmZauDJCv50rIumtkI1cQoOgLoS4tbPCj9U/Vn2a9BFH0DLFOOIacg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-config-apple": "20.1.0", @@ -2874,7 +2871,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-20.1.0.tgz", "integrity": "sha512-XN7Da9z4WsJxtqVtEzY8q2bv22OsvzaFP5zy5+phMWNoJlU4lf7IvBSxqGYMpQ9XhYP7arDw5vmW4W34s06rnA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-platform-apple": "20.1.0" @@ -2884,7 +2881,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-20.1.0.tgz", "integrity": "sha512-Tb415Oh8syXNT2zOzLzFkBXznzGaqKCiaichxKzGCDKg6JGHp3jSuCmcTcaPeYC7oc32n/S3Psw7798r4Q/7lA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native-community/cli-tools": "20.1.0", @@ -2903,7 +2900,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vscode/sudo-prompt": "^9.0.0", @@ -2922,7 +2919,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2935,7 +2932,7 @@ "version": "20.1.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-20.1.0.tgz", "integrity": "sha512-D0kDspcwgbVXyNjwicT7Bb1JgXjijTw1JJd+qxyF/a9+sHv7TU4IchV+gN38QegeXqVyM4Ym7YZIvXMFBmyJqA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "joi": "^17.2.1" @@ -2945,7 +2942,7 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2967,7 +2964,7 @@ "version": "0.84.1", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.84.1.tgz", "integrity": "sha512-vorvcvptGxtK0qTDCFQb+W3CU6oIhzcX5dduetWRBoAhXdthEQM0MQnF+GTXoXL8/luffKgy7PlZRG/WeI/oRQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.3", @@ -2981,7 +2978,7 @@ "version": "0.84.1", "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.84.1.tgz", "integrity": "sha512-3GpmCKk21f4oe32bKIdmkdn+WydvhhZL+1nsoFBGi30Qrq9vL16giKu31OcnWshYz139x+mVAvCyoyzgn8RXSw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -3243,7 +3240,7 @@ "version": "0.84.1", "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.84.1.tgz", "integrity": "sha512-NswINguTz0eg1Dc0oGO/1dejXSr6iQaz8/NnCRn5HJdA3dGfqadS7zlYv0YjiWpgKgcW6uENaIEgJOQww0KSpw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -3262,7 +3259,7 @@ "version": "0.84.1", "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.84.1.tgz", "integrity": "sha512-KlRawK4aXxRLlR3HYVfZKhfQp7sejQefQ/LttUWUkErhKO0AFt+yznoSLq7xwIrH9K3A3YwImHuFVtUtuDmurA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@react-native/js-polyfills": "0.84.1", @@ -3444,7 +3441,7 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -3454,14 +3451,14 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/@sinclair/typebox": { @@ -3586,21 +3583,12 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" } }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, "node_modules/@types/react-test-renderer": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz", @@ -3889,7 +3877,7 @@ "version": "9.3.2", "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.2.tgz", "integrity": "sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/abort-controller": { @@ -3908,7 +3896,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -3922,7 +3910,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4015,7 +4003,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "colorette": "^1.0.7", @@ -4027,7 +4015,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -4037,7 +4025,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" @@ -4087,14 +4075,14 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, + "devOptional": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { @@ -4245,7 +4233,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -4265,7 +4253,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/available-typed-arrays": { @@ -4356,7 +4344,7 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -4385,7 +4373,7 @@ "version": "0.6.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.6" @@ -4407,7 +4395,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" @@ -4501,7 +4489,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -4513,7 +4501,7 @@ "version": "1.20.4", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -4538,7 +4526,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -4548,7 +4536,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/brace-expansion": { @@ -4622,7 +4610,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -4653,7 +4641,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -4682,7 +4670,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4696,7 +4684,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4713,7 +4701,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -4852,23 +4840,11 @@ "dev": true, "license": "MIT" }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -4881,7 +4857,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -4908,21 +4884,12 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4986,21 +4953,21 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -5010,7 +4977,7 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -5023,7 +4990,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -5042,7 +5009,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5052,7 +5019,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/concat-map": { @@ -5095,7 +5062,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -5111,7 +5078,7 @@ "version": "3.48.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "browserslist": "^4.28.1" @@ -5125,7 +5092,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -5188,7 +5155,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/data-view-buffer": { @@ -5249,7 +5216,7 @@ "version": "1.11.19", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/debug": { @@ -5273,7 +5240,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5314,7 +5281,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5324,7 +5291,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -5425,7 +5392,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -5480,7 +5447,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -5490,7 +5457,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "envinfo": "dist/cli.js" @@ -5503,7 +5470,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -5522,7 +5489,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.2.tgz", "integrity": "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -5609,7 +5576,7 @@ "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, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5619,7 +5586,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5657,7 +5624,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -6273,7 +6240,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -6335,7 +6302,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6352,7 +6319,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6378,7 +6345,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.4.tgz", "integrity": "sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -6397,7 +6364,7 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -6507,7 +6474,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -6577,7 +6544,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6612,7 +6579,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6681,7 +6648,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6715,7 +6682,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -6729,7 +6696,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -6855,7 +6822,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6932,7 +6899,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6961,7 +6928,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7044,7 +7011,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -7054,7 +7021,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -7067,7 +7034,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -7113,7 +7080,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -7218,7 +7185,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -7291,7 +7258,7 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -7357,7 +7324,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7383,7 +7350,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -7423,7 +7390,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7436,7 +7403,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -7565,7 +7532,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -7629,7 +7596,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -7688,7 +7655,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -8397,7 +8364,7 @@ "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", @@ -8417,7 +8384,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -8455,7 +8422,7 @@ "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, + "devOptional": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -8488,7 +8455,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "devOptional": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -8524,7 +8491,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -8534,7 +8501,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "picocolors": "^1.1.1", @@ -8593,14 +8560,14 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, + "devOptional": true, "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, + "devOptional": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -8623,7 +8590,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/lodash.merge": { @@ -8643,7 +8610,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -8660,7 +8627,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-fragments": "^0.2.1", @@ -8675,7 +8642,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -8687,7 +8654,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -8701,7 +8668,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -8714,7 +8681,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -8730,7 +8697,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -8743,7 +8710,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -8758,14 +8725,14 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/logkitty/node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "cliui": "^6.0.0", @@ -8788,7 +8755,7 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "camelcase": "^5.0.0", @@ -8867,7 +8834,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8877,7 +8844,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -8911,7 +8878,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 8" @@ -9324,7 +9291,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -9346,7 +9313,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -9359,7 +9326,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9369,7 +9336,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -9438,7 +9405,7 @@ "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9448,7 +9415,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -9489,7 +9456,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9512,7 +9479,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -9553,7 +9520,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9663,7 +9630,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -9682,7 +9649,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -9698,7 +9665,7 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-wsl": "^1.1.0" @@ -9729,7 +9696,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -9771,7 +9738,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -9787,7 +9754,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -9812,7 +9779,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -9825,7 +9792,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -9880,7 +9847,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/picocolors": { @@ -10054,7 +10021,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "kleur": "^3.0.3", @@ -10114,7 +10081,7 @@ "version": "6.14.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -10157,7 +10124,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -10187,7 +10154,7 @@ "version": "2.5.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -10239,18 +10206,6 @@ } } }, - "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.4" - } - }, "node_modules/react-freeze": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", @@ -10436,7 +10391,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -10474,14 +10429,14 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -10521,7 +10476,7 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -10539,14 +10494,14 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.1.0" @@ -10568,14 +10523,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -10619,7 +10574,7 @@ "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, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -10639,7 +10594,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -10653,7 +10608,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -10680,7 +10635,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -10724,7 +10679,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -10780,7 +10735,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/scheduler": { @@ -10904,7 +10859,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -11008,7 +10963,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11028,7 +10983,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11045,7 +11000,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11064,7 +11019,7 @@ "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, + "devOptional": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11105,7 +11060,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/slash": { @@ -11121,7 +11076,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.0", @@ -11136,7 +11091,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -11149,7 +11104,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -11159,7 +11114,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/source-map": { @@ -11281,7 +11236,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -11455,7 +11410,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -11478,7 +11433,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -11503,7 +11458,7 @@ "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==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11725,7 +11680,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -11856,7 +11811,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -11866,7 +11821,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -11880,7 +11835,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -11890,7 +11845,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -11900,7 +11855,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -11977,7 +11932,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/utils-merge": { @@ -12008,7 +11963,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -12039,7 +11994,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -12137,7 +12092,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/which-typed-array": { @@ -12212,7 +12167,7 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" @@ -12279,7 +12234,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index a9e1ed4..9c12334 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,7 @@ "@react-navigation/bottom-tabs": "^7.15.5", "@react-navigation/native": "^7.1.33", "@react-navigation/native-stack": "^7.14.4", - "@types/react-dom": "^19.2.3", - "class-variance-authority": "^0.7.1", "react": "19.2.3", - "react-dom": "^19.2.4", "react-native": "0.84.1", "react-native-background-timer": "^2.4.1", "react-native-safe-area-context": "^5.7.0", diff --git a/test/TestScreen.tsx b/test/TestScreen.tsx new file mode 100644 index 0000000..8439183 --- /dev/null +++ b/test/TestScreen.tsx @@ -0,0 +1,253 @@ +import React, { useState } from 'react'; +import { View, Text, StyleSheet, ScrollView, Alert as RNAlert, SafeAreaView } from 'react-native'; +import { + BaseButton, + TextInput, + BaseModal, + RadioGroup, + Alert, + Icon +} from '../components'; + +const TestScreen: React.FC = () => { + // State for Inputs + const [textValue, setTextValue] = useState(''); + const [passwordValue, setPasswordValue] = useState(''); + const [radioValue, setRadioValue] = useState('option1'); + + // State for Modal + const [isModalOpen, setIsModalOpen] = useState(false); + + // Radio Options + const radioOptions = [ + { label: 'Visa ending in 4242', value: 'option1', description: 'Expires 12/26' }, + { label: 'Mastercard ending in 1234', value: 'option2', description: 'Expires 08/25' }, + { label: 'Add New Card', value: 'option3', disabled: true }, + ]; + + return ( + + + + Component Library + Testing UI Elements for AppGuard2 + + + {/* Buttons Section */} + + BUTTONS + + + RNAlert.alert("Primary Action")}> + Primary + + + Secondary + + + + + Outline + + + Danger + + + + Ghost Variant (Text only) + + + Loading State + + + + + {/* Inputs Section */} + + INPUTS + + + + + + + + {/* Radio Group Section */} + + RADIO SELECTORS + + setRadioValue(value)} + /> + + + + {/* Alerts Section */} + + ALERTS & FEEDBACK + + + This is a standard informational message for the user. + + + Your device has 30 mins of homework time left. + + + Payment confirmed successfully! + + + + + {/* Icons Section */} + + ICONS + + 🔒 + + 🧠 + + G + + + + {/* Modal Section */} + + MODALS + + setIsModalOpen(true)} + > + Preview Modal + + + setIsModalOpen(false)} + title="Override Configuration" + subtitle="Configure how long you want to unlock the device." + headerLabel="System Settings" + > + + + This is a preview of the BaseModal component. It supports titles, subtitles, and custom header labels. + + + + setIsModalOpen(false)}> + Cancel + + setIsModalOpen(false)}> + Save + + + + + + + + + AppGuard2 • v2.0.0 + + + + ); +}; + +const styles = StyleSheet.create({ + safeArea: { + flex: 1, + backgroundColor: '#f8fafc', + }, + container: { + flex: 1, + }, + content: { + padding: 20, + paddingBottom: 60, + }, + header: { + marginBottom: 32, + marginTop: 10, + }, + pageTitle: { + fontSize: 28, + fontWeight: '800', + color: '#0f172a', + letterSpacing: -0.5, + }, + pageSubtitle: { + fontSize: 16, + color: '#64748b', + marginTop: 4, + }, + section: { + marginBottom: 28, + }, + sectionHeader: { + fontSize: 12, + fontWeight: '700', + color: '#94a3b8', + letterSpacing: 1.5, + marginBottom: 12, + paddingLeft: 4, + }, + componentCard: { + backgroundColor: '#ffffff', + padding: 18, + borderRadius: 16, + borderWidth: 1, + borderColor: '#e2e8f0', + gap: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.05, + shadowRadius: 10, + elevation: 2, + }, + row: { + flexDirection: 'row', + gap: 12, + }, + flex1: { + flex: 1, + }, + mb12: { + marginBottom: 12, + }, + modalText: { + fontSize: 14, + color: '#475569', + lineHeight: 20, + }, + footer: { + marginTop: 20, + alignItems: 'center', + opacity: 0.5, + }, + footerText: { + fontSize: 12, + fontWeight: '600', + color: '#64748b', + }, +}); + +export default TestScreen; diff --git a/tsconfig.json b/tsconfig.json index a7313ac..266ba9c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "@react-native/typescript-config", "compilerOptions": { - "types": ["jest"], - "lib": ["es2020", "dom", "dom.iterable"] + "types": ["jest"] }, "include": ["**/*.ts", "**/*.tsx"], "exclude": ["**/node_modules", "**/Pods"]