Update icons with pointerEvents="none" and upgrade lucide-react-native to v0.563.0

This commit is contained in:
2026-02-17 10:22:18 +01:00
parent cded5e8f00
commit 68e25fac71
27 changed files with 106 additions and 128 deletions

View File

@@ -1 +0,0 @@
{ "recommendations": ["expo.vscode-expo-tools"] }

View File

@@ -1,7 +0,0 @@
{
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
}
}

View File

@@ -1,7 +1,7 @@
{
"expo": {
"name": "Mariani",
"slug": "mariani-app",
"slug": "mariani_app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/mariani-icon.png",
@@ -25,7 +25,7 @@
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO"
],
"package": "com.pcrt.mariani-app"
"package": "com.pcrt.mariani_app"
},
"web": {
"output": "static",

View File

@@ -2,12 +2,12 @@ import { Redirect, Tabs } from 'expo-router';
import { Home, Clock, Zap, CalendarIcon, Building } from 'lucide-react-native';
import { useContext } from 'react';
import { AuthContext } from '@/utils/authContext';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import {useSafeAreaInsets} from "react-native-safe-area-context";
export default function ProtectedLayout() {
const authState = useContext(AuthContext);
const insets = useSafeAreaInsets();
if (!authState.isReady) {
return null;
}
@@ -24,7 +24,7 @@ export default function ProtectedLayout() {
backgroundColor: '#ffffff',
borderTopWidth: 1,
borderTopColor: '#f3f4f6',
height: 90,
height: 70 + insets.bottom,
paddingBottom: insets.bottom,
paddingTop: 10,
paddingHorizontal: 10,
@@ -43,28 +43,28 @@ export default function ProtectedLayout() {
name="index"
options={{
title: 'Home',
tabBarIcon: ({ color, size }) => <Home color={color} size={24} />,
tabBarIcon: ({ color, size }) => <Home pointerEvents="none" color={color} size={24} />,
}}
/>
<Tabs.Screen
name="attendance/index"
options={{
title: 'Presenze',
tabBarIcon: ({ color, size }) => <Clock color={color} size={24} />,
tabBarIcon: ({ color, size }) => <Clock pointerEvents="none" color={color} size={24} />,
}}
/>
<Tabs.Screen
name="permits/index"
options={{
title: 'Permessi',
tabBarIcon: ({ color, size }) => <CalendarIcon color={color} size={24} />,
tabBarIcon: ({ color, size }) => <CalendarIcon pointerEvents="none" color={color} size={24} />,
}}
/>
<Tabs.Screen
name="sites"
options={{
title: 'Cantieri',
tabBarIcon: ({ color, size }) => <Building color={color} size={24} />,
tabBarIcon: ({ color, size }) => <Building pointerEvents="none" color={color} size={24} />,
}}
/>
{/* // TODO: Probably needs to be restricted to admin */}
@@ -72,7 +72,7 @@ export default function ProtectedLayout() {
name="automation"
options={{
title: 'Domotica',
tabBarIcon: ({ color, size }) => <Zap color={color} size={24} />,
tabBarIcon: ({ color, size }) => <Zap pointerEvents="none" color={color} size={24} />,
}}
/>
{/* TODO: Should be removed - move tabs inside (tabs) and refactor _layout */}
@@ -85,4 +85,4 @@ export default function ProtectedLayout() {
/>
</Tabs>
);
}
}

View File

@@ -139,7 +139,7 @@ export default function AttendanceScreen() {
{lastScan ? (
<View className="w-full bg-green-50 border border-green-200 rounded-3xl p-5 mb-8 flex-row items-center gap-4 shadow-sm">
<View className="bg-green-500 rounded-full p-3 shadow-lg shadow-green-500/40 flex-shrink-0">
<CheckCircle2 size={32} color="white" />
<CheckCircle2 size={32} color="white" pointerEvents="none" />
</View>
<View className="flex-1">
<Text
@@ -171,7 +171,7 @@ export default function AttendanceScreen() {
onPress={handleStartScan}
className="bg-[#099499] rounded-2xl py-6 flex-row items-center justify-center active:bg-[#077d82] shadow-lg shadow-teal-900/20 active:scale-[0.98]"
>
{scannerType === 'qr' ? <QrCode color="white" size={32} /> : <Nfc color="white" size={32} />}
{scannerType === 'qr' ? <QrCode color="white" size={32} pointerEvents="none" /> : <Nfc color="white" size={32} pointerEvents="none" />}
<Text className="text-white text-xl font-bold ml-3">Scansiona Codice</Text>
</TouchableOpacity>

View File

@@ -84,7 +84,7 @@ export default function AutomationDetailScreen() {
if (!area) {
return (
<View className="flex-1 items-center justify-center">
<WifiOff size={48} color="#9ca3af" />
<WifiOff size={48} color="#9ca3af" pointerEvents="none" />
<Text className="text-xl text-gray-600 font-bold mt-4">Area non trovata</Text>
<Text className="text-gray-400 text-center mt-2 mb-4">L'area che stai cercando non esiste o è stata rimossa.</Text>
<TouchableOpacity onPress={() => router.back()} className="mt-4 bg-[#099499] px-6 py-3 rounded-xl active:scale-95">
@@ -101,7 +101,7 @@ export default function AutomationDetailScreen() {
<View className="flex-row justify-between items-center">
<View className='flex-row items-center gap-4'>
<TouchableOpacity onPress={() => router.back()} className='rounded-full active:bg-gray-100'>
<ChevronLeft size={28} color="#4b5563" />
<ChevronLeft size={28} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
<Text className="text-2xl font-bold text-gray-800">{area.name}</Text>
</View>
@@ -122,7 +122,7 @@ export default function AutomationDetailScreen() {
</View>
) : (
<View className="items-center">
<ServerOff size={48} color="#9ca3af" />
<ServerOff size={48} color="#9ca3af" pointerEvents="none" />
<Text className="text-lg text-gray-500 font-medium mt-4">Nessun dispositivo</Text>
<Text className="text-center text-gray-400 mt-2">
Non ci sono dispositivi in quest'area.

View File

@@ -95,7 +95,7 @@ export default function AutomationScreen() {
contentContainerClassName="flex-grow items-center justify-center pb-[100px]"
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} colors={['#099499']} tintColor={'#099499'} />}
>
<WifiOff size={48} color="#9ca3af" />
<WifiOff size={48} color="#9ca3af" pointerEvents="none" />
<Text className="text-lg text-gray-500 font-medium mt-4">Errore di connessione</Text>
<Text className="text-center text-gray-400 mt-2 px-10">
{connectionStatus.message}
@@ -162,7 +162,7 @@ export default function AutomationScreen() {
>
<View className="flex-1 justify-between">
<View className={`${bgColor} w-14 h-14 items-center justify-center rounded-2xl`}>
<IconComponent size={32} />
<IconComponent size={32} pointerEvents="none" />
</View>
<View>
<Text
@@ -182,7 +182,7 @@ export default function AutomationScreen() {
</View>
) : (
<View className="mt-20 items-center justify-center">
<WifiOff size={48} color="#9ca3af" />
<WifiOff size={48} color="#9ca3af" pointerEvents="none" />
<Text className="text-lg text-gray-500 font-medium mt-4">Nessuna area trovata</Text>
<Text className="text-center text-gray-400 mt-2">
{`Nessuna area per il piano "${selectedFloor}"`}

View File

@@ -79,7 +79,7 @@ export default function HomeScreen() {
</View>
<View className="flex-row gap-4 flex-shrink-0">
<TouchableOpacity className="p-3 bg-white/10 rounded-full active:bg-white/20" onPress={() => router.push('/profile')}>
<User size={28} color="white" />
<User size={28} color="white" pointerEvents="none"/>
</TouchableOpacity>
</View>
</View>
@@ -104,7 +104,7 @@ export default function HomeScreen() {
>
<View className="flex-row items-center gap-5">
<View className="bg-orange-100 p-4 rounded-full">
<AlertTriangle size={32} color="#f97316" />
<AlertTriangle size={32} color="#f97316" pointerEvents="none"/>
</View>
<View className="flex-1">
<Text className="font-bold text-gray-800 text-lg">Presenza incompleta</Text>
@@ -123,7 +123,7 @@ export default function HomeScreen() {
className="flex-1 bg-white p-6 rounded-3xl shadow-sm items-center justify-center gap-4 border border-gray-100 active:scale-[0.98]"
>
<View className="w-20 h-20 rounded-full bg-teal-50 items-center justify-center mb-1">
<QrCode size={40} color="#099499" />
<QrCode size={40} color="#099499" pointerEvents="none"/>
</View>
<Text className="text-lg font-bold text-gray-700 text-center">Nuova Presenza</Text>
</TouchableOpacity>
@@ -133,7 +133,7 @@ export default function HomeScreen() {
className="flex-1 bg-white p-6 rounded-3xl shadow-sm items-center justify-center gap-4 border border-gray-100 active:scale-[0.98]"
>
<View className="w-20 h-20 rounded-full bg-blue-50 items-center justify-center mb-1">
<CalendarDays size={40} color="#2563eb" />
<CalendarDays size={40} color="#2563eb" pointerEvents="none"/>
</View>
<Text className="text-lg font-bold text-gray-700 text-center">Gestisci Permessi</Text>
</TouchableOpacity>
@@ -159,7 +159,7 @@ export default function HomeScreen() {
{/* Icon */}
<View className={`${config.bg} p-4 rounded-2xl flex-shrink-0`}>
<IconComponent size={24} color={config.color} />
<IconComponent size={24} color={config.color} pointerEvents="none"/>
</View>
{/* Title and Subtitle */}
@@ -206,4 +206,4 @@ export default function HomeScreen() {
</ScrollView>
</View>
);
}
}

View File

@@ -12,10 +12,10 @@ import { SafeAreaView } from 'react-native-safe-area-context';
// Icon Mapping
const typeIcons: Record<string, (color: string) => JSX.Element> = {
Ferie: (color) => <CalendarIcon size={24} color={color} />,
Permesso: (color) => <Clock size={24} color={color} />,
Malattia: (color) => <Thermometer size={24} color={color} />,
Assenza: (color) => <CalendarX size={24} color={color} />,
Ferie: (color) => <CalendarIcon size={24} color={color} pointerEvents="none" />,
Permesso: (color) => <Clock size={24} color={color} pointerEvents="none" />,
Malattia: (color) => <Thermometer size={24} color={color} pointerEvents="none" />,
Assenza: (color) => <CalendarX size={24} color={color} pointerEvents="none" />,
};
export default function PermitsScreen() {
@@ -155,7 +155,7 @@ export default function PermitsScreen() {
onPress={() => setShowModal(true)}
className="absolute bottom-8 right-6 w-16 h-16 bg-[#099499] rounded-full shadow-lg items-center justify-center active:scale-90"
>
<Plus size={32} color="white" />
<Plus size={32} color="white" pointerEvents="none" />
</TouchableOpacity>
</View>
);

View File

@@ -110,7 +110,7 @@ export default function DocumentsScreen() {
<SafeAreaView edges={['top']} className='pt-5'>
<View className='flex-row items-center gap-4'>
<TouchableOpacity onPress={() => router.back()} className="p-2 rounded-full active:bg-gray-100">
<ChevronLeft size={28} color="#4b5563" />
<ChevronLeft size={28} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
<View className="flex-1">
<Text className="text-3xl font-bold text-gray-800">Documenti</Text>
@@ -126,7 +126,7 @@ export default function DocumentsScreen() {
{/* Search Bar */}
<View className={`flex-1 relative justify-center`}>
<View className="absolute left-4 z-10">
<Search size={24} color="#9ca3af" />
<Search size={24} color="#9ca3af" pointerEvents="none" />
</View>
<TextInput
placeholder="Cerca nome del documento..."
@@ -142,7 +142,7 @@ export default function DocumentsScreen() {
onPress={() => setShowRangePicker(true)}
className={`p-4 bg-white rounded-2xl shadow-sm border ${range.startDate ? 'border-[#099499]' : 'border-gray-200'}`}
>
<CalendarIcon size={24} color={range.startDate ? "#099499" : "#9ca3af"} />
<CalendarIcon size={24} color={range.startDate ? "#099499" : "#9ca3af"} pointerEvents="none" />
</TouchableOpacity>
</View>
@@ -166,12 +166,12 @@ export default function DocumentsScreen() {
<View key={doc.id} className="bg-white p-5 rounded-3xl shadow-sm flex-row items-center justify-between border border-gray-100">
<View className="flex-row items-center gap-5 flex-1">
<View className="bg-red-50 p-4 rounded-2xl">
<FileText size={32} color="#ef4444" />
<FileText size={32} color="#ef4444" pointerEvents="none" />
</View>
<View className="flex-1">
<Text className="font-bold text-gray-800 text-lg mb-1">{doc.title}</Text>
<View className="flex-row items-center mt-1">
<MapPin size={16} color="#9ca3af" />
<MapPin size={16} color="#9ca3af" pointerEvents="none" />
<Text className="text-sm text-gray-400 ml-1 font-medium">{formatTimestamp(doc.updated_at)}</Text>
</View>
</View>
@@ -179,7 +179,7 @@ export default function DocumentsScreen() {
<TouchableOpacity
onPress={() => downloadAndShareDocument(doc.mimetype, doc.title, doc.url)}
className="p-4 bg-gray-50 rounded-2xl active:bg-gray-100">
<Download size={24} color="#6b7280" />
<Download size={24} color="#6b7280" pointerEvents="none" />
</TouchableOpacity>
</View>
))}
@@ -195,7 +195,7 @@ export default function DocumentsScreen() {
onPress={() => setShowUploadModal(true)}
className="absolute bottom-8 right-6 w-16 h-16 bg-[#099499] rounded-full shadow-lg items-center justify-center active:scale-90"
>
<Plus size={32} color="white" />
<Plus size={32} color="white" pointerEvents="none" />
</TouchableOpacity>
{/* Document Upload Modal */}

View File

@@ -22,7 +22,7 @@ export default function ProfileScreen() {
<TouchableOpacity
onPress={() => router.back()}
>
<ChevronLeft size={28} color="white" />
<ChevronLeft size={28} color="white" pointerEvents="none"/>
</TouchableOpacity>
<View className="flex-row items-center gap-4">
<View className="w-16 h-16 rounded-full bg-white/20 items-center justify-center">
@@ -50,7 +50,7 @@ export default function ProfileScreen() {
<View className="mt-6 gap-5">
<View className="flex-row items-center gap-5">
<View className="w-14 h-14 bg-gray-100 rounded-2xl items-center justify-center">
<Mail size={24} color="#374151" />
<Mail size={24} color="#374151" pointerEvents="none" />
</View>
<View>
<Text className="text-lg text-gray-700 font-bold">Email</Text>
@@ -60,7 +60,7 @@ export default function ProfileScreen() {
<View className="flex-row items-center gap-5">
<View className="w-14 h-14 bg-gray-100 rounded-2xl items-center justify-center">
<User size={24} color="#374151" />
<User size={24} color="#374151" pointerEvents="none" />
</View>
<View>
<Text className="text-lg text-gray-700 font-bold">Ruolo</Text>
@@ -77,7 +77,7 @@ export default function ProfileScreen() {
<TouchableOpacity onPress={() => router.push('/profile/documents')} className="bg-white p-4 rounded-3xl shadow-sm flex-row items-center justify-between border border-gray-100 mb-4">
<View className="flex-row items-center gap-5">
<View className="bg-[#099499]/10 p-3.5 rounded-2xl">
<FileText size={26} color="#099499" />
<FileText size={26} color="#099499" pointerEvents="none" />
</View>
<View>
<Text className="text-lg text-gray-800 font-bold">I miei documenti</Text>
@@ -104,7 +104,7 @@ export default function ProfileScreen() {
<TouchableOpacity onPress={authContext.logOut} className="bg-white p-4 rounded-3xl shadow-sm flex-row items-center justify-between border border-gray-100">
<View className="flex-row items-center gap-5">
<View className="bg-red-50 p-3.5 rounded-2xl">
<LogOut size={26} color="#ef4444" />
<LogOut size={26} color="#ef4444" pointerEvents="none" />
</View>
<View>
<Text className="text-lg text-gray-800 font-bold">Esci</Text>
@@ -117,4 +117,4 @@ export default function ProfileScreen() {
</ScrollView>
</View>
);
}
}

View File

@@ -135,7 +135,7 @@ export default function SiteDocumentsScreen() {
<SafeAreaView edges={['top']} className='pt-5'>
<View className='flex-row items-center gap-4'>
<TouchableOpacity onPress={() => router.back()} className="p-2 -ml-2 rounded-full active:bg-gray-100">
<ChevronLeft size={28} color="#4b5563" />
<ChevronLeft size={28} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
<View className="flex-1">
@@ -168,7 +168,7 @@ export default function SiteDocumentsScreen() {
<View className="flex-row gap-2">
<View className="flex-1 relative justify-center">
<View className="absolute left-4 z-10">
<Search size={24} color="#9ca3af" />
<Search size={24} color="#9ca3af" pointerEvents="none" />
</View>
<TextInput
placeholder="Cerca documento..."
@@ -183,7 +183,7 @@ export default function SiteDocumentsScreen() {
onPress={() => setShowRangePicker(true)}
className={`p-4 bg-white rounded-2xl shadow-sm border ${range.startDate ? 'border-[#099499]' : 'border-gray-200'}`}
>
<CalendarIcon size={24} color={range.startDate ? "#099499" : "#9ca3af"} />
<CalendarIcon size={24} color={range.startDate ? "#099499" : "#9ca3af"} pointerEvents="none" />
</TouchableOpacity>
</View>
@@ -206,7 +206,7 @@ export default function SiteDocumentsScreen() {
<View key={doc.id} className="bg-white p-5 rounded-3xl shadow-sm flex-row items-center justify-between border border-gray-100">
<View className="flex-row items-center gap-5 flex-1">
<View className="bg-red-50 p-4 rounded-2xl">
<FileText size={32} color="#ef4444" />
<FileText size={32} color="#ef4444" pointerEvents="none" />
</View>
<View className="flex-1">
<Text className="font-bold text-gray-800 text-lg mb-1">{doc.title}</Text>
@@ -216,7 +216,7 @@ export default function SiteDocumentsScreen() {
<TouchableOpacity
onPress={() => handleDownloadAndShare(doc.mimetype, doc.title, doc.url)}
className="p-4 bg-gray-50 rounded-2xl active:bg-gray-100">
<Download size={24} color="#6b7280" />
<Download size={24} color="#6b7280" pointerEvents="none" />
</TouchableOpacity>
</View>
))}
@@ -232,7 +232,7 @@ export default function SiteDocumentsScreen() {
onPress={() => setShowUploadModal(true)}
className="absolute bottom-8 right-6 w-16 h-16 bg-[#099499] rounded-full shadow-lg items-center justify-center active:scale-90"
>
<Plus size={32} color="white" />
<Plus size={32} color="white" pointerEvents="none" />
</TouchableOpacity>
{/* Upload Document Modal */}

View File

@@ -66,7 +66,7 @@ export default function SitesScreen() {
{/* Search Bar */}
<View className={`relative justify-center`}>
<View className="absolute left-4 z-10">
<Search size={24} color="#9ca3af" />
<Search size={24} color="#9ca3af" pointerEvents="none" />
</View>
<TextInput
placeholder="Cerca per codice o nome cantiere..."
@@ -99,13 +99,13 @@ export default function SitesScreen() {
>
<View className="flex-row items-center gap-5 flex-1">
<View className="bg-blue-50 p-4 rounded-2xl">
<Building2 size={32} color="#2563eb" />
<Building2 size={32} color="#2563eb" pointerEvents="none" />
</View>
<View className="flex-1">
<Text className="text-base font-medium text-gray-400 mb-0.5">{site.code}</Text>
<Text className="font-bold text-gray-800 text-lg mb-1">{site.name}</Text>
<View className="flex-row items-center mt-1">
<MapPin size={16} color="#9ca3af" />
<MapPin size={16} color="#9ca3af" pointerEvents="none" />
<Text className="text-sm text-gray-400 ml-1 font-medium">
{site.attachments_count} Documenti disponibili
</Text>
@@ -113,7 +113,7 @@ export default function SitesScreen() {
</View>
</View>
<ChevronRight size={24} color="#9ca3af" />
<ChevronRight size={24} color="#9ca3af" pointerEvents="none" />
</TouchableOpacity>
))}

View File

@@ -85,7 +85,7 @@ export default function LoginScreen() {
<View>
<Text className="text-gray-700 text-lg font-bold mb-3 ml-1">Username o Email</Text>
<View className="flex-row items-center bg-gray-50 border border-gray-100 rounded-2xl h-16 px-4 flex">
<Mail size={24} color="#9ca3af" />
<Mail size={24} color="#9ca3af" pointerEvents="none" />
<TextInput
className="flex-1 ml-4 text-gray-800 text-lg font-medium h-full w-full"
placeholder="mario.rossi@esempio.com"
@@ -102,7 +102,7 @@ export default function LoginScreen() {
<View>
<Text className="text-gray-700 text-lg font-bold mb-3 ml-1">Password</Text>
<View className="flex-row items-center bg-gray-50 border border-gray-100 rounded-2xl h-16 px-4 flex">
<Lock size={24} color="#9ca3af" />
<Lock size={24} color="#9ca3af" pointerEvents="none" />
<TextInput
className="flex-1 ml-4 text-gray-800 text-lg font-medium h-full w-full"
placeholder="••••••••"
@@ -113,9 +113,9 @@ export default function LoginScreen() {
/>
<TouchableOpacity onPress={() => setShowPassword(!showPassword)}>
{showPassword ? (
<EyeOff size={24} color="#6b7280" />
<EyeOff size={24} color="#6b7280" pointerEvents="none" />
) : (
<Eye size={24} color="#6b7280" />
<Eye size={24} color="#6b7280" pointerEvents="none" />
)}
</TouchableOpacity>
</View>
@@ -135,7 +135,7 @@ export default function LoginScreen() {
<Text className="text-white text-xl font-bold mr-2">
{isLoading ? 'Accesso in corso...' : 'Accedi'}
</Text>
{!isLoading && <LogIn size={24} color="white" />}
{!isLoading && <LogIn size={24} color="white" pointerEvents="none" />}
</TouchableOpacity>
</View>
</ScrollView>

View File

@@ -88,7 +88,7 @@ export default function AddDocumentModal({ visible, onClose, onUpload, isUploadi
<View className="flex-row justify-between items-center mb-6">
<Text className="text-xl font-bold text-gray-800">Carica Documento</Text>
<TouchableOpacity onPress={onClose} className="p-2 bg-gray-50 rounded-full">
<X size={20} color="#374151" />
<X size={20} color="#374151" pointerEvents="none" />
</TouchableOpacity>
</View>
@@ -100,7 +100,7 @@ export default function AddDocumentModal({ visible, onClose, onUpload, isUploadi
className="h-64 border-2 border-dashed border-gray-300 rounded-2xl items-center justify-center bg-gray-50 active:bg-gray-100"
>
<View className="bg-white p-4 rounded-full shadow-sm mb-3">
<Upload size={32} color="#099499" />
<Upload size={32} color="#099499" pointerEvents="none" />
</View>
<Text className="text-lg text-gray-600 font-medium">Tocca per selezionare un file</Text>
<Text className="text-gray-400 text-sm mt-1">PDF, Immagini, Word</Text>
@@ -109,7 +109,7 @@ export default function AddDocumentModal({ visible, onClose, onUpload, isUploadi
// Selected File View
<View className="bg-[#E6F4F4] p-4 rounded-2xl border border-[#099499]/20 flex-row items-center gap-4">
<View className="bg-white p-3 rounded-xl">
<FileText size={24} color="#099499" />
<FileText size={24} color="#099499" pointerEvents="none" />
</View>
<View className="flex-1">
<Text className="text-gray-800 font-bold text-base" numberOfLines={1}>
@@ -120,7 +120,7 @@ export default function AddDocumentModal({ visible, onClose, onUpload, isUploadi
</Text>
</View>
<TouchableOpacity onPress={removeFile} className="p-2 bg-white rounded-lg">
<Trash2 size={18} color="#ef4444" />
<Trash2 size={18} color="#ef4444" pointerEvents="none" />
</TouchableOpacity>
</View>
)}
@@ -163,7 +163,7 @@ export default function AddDocumentModal({ visible, onClose, onUpload, isUploadi
<ActivityIndicator color="white" />
) : (
<>
<Upload size={20} color="white" />
<Upload size={20} color="white" pointerEvents="none" />
<Text className="text-white font-bold text-base">Carica</Text>
</>
)}

View File

@@ -81,7 +81,7 @@ export const AlertProvider = ({ children }: { children: ReactNode }) => {
{/* Icon Circle */}
<View className={`${bgColor} p-4 rounded-full mb-4`}>
<Icon size={32} className={color} strokeWidth={2.5} />
<Icon size={32} className={color} strokeWidth={2.5} pointerEvents="none" />
</View>
{/* Texts */}

View File

@@ -12,8 +12,8 @@ export const AppDatePicker = (props: AppDatePickerProps) => {
{...props}
locale="it"
components={{
IconPrev: <ChevronLeft size={24} color="#1f2937" />,
IconNext: <ChevronRight size={24} color="#1f2937" />,
IconPrev: <ChevronLeft size={24} color="#1f2937" pointerEvents="none" />,
IconNext: <ChevronRight size={24} color="#1f2937" pointerEvents="none" />,
...props.components,
}}
styles={{

View File

@@ -57,7 +57,7 @@ export default function CalendarWidget({ events, types, onMonthChange }: Calenda
onPress={() => changeMonth(-1)}
className="p-2 bg-gray-50 rounded-full"
>
<ChevronLeft size={24} color="#374151" />
<ChevronLeft size={24} color="#374151" pointerEvents="none" />
</TouchableOpacity>
<Text className="text-xl font-bold text-gray-800 capitalize">
{currentDate.toLocaleString('it-IT', { month: 'long', year: 'numeric' })}
@@ -66,7 +66,7 @@ export default function CalendarWidget({ events, types, onMonthChange }: Calenda
onPress={() => changeMonth(1)}
className="p-2 bg-gray-50 rounded-full"
>
<ChevronRight size={24} color="#374151" />
<ChevronRight size={24} color="#374151" pointerEvents="none" />
</TouchableOpacity>
</View>

View File

@@ -10,21 +10,21 @@ const DeviceCard = ({ device, onToggle }: { device: HaEntity; onToggle: (entityI
switch (domain) {
case 'light':
return <Lightbulb size={32} color="#f59e0b" />;
return <Lightbulb size={32} color="#f59e0b" pointerEvents="none" />;
case 'switch':
return <Power size={32} color="#3b82f6" />;
return <Power size={32} color="#3b82f6" pointerEvents="none" />;
case 'sensor':
return <Cpu size={32} color="#ef4444" />;
return <Cpu size={32} color="#ef4444" pointerEvents="none" />;
case 'lock':
return <Lock size={32} color="#10b981" />;
return <Lock size={32} color="#10b981" pointerEvents="none" />;
case 'fan':
return <Fan size={32} color="#6b7280" />;
return <Fan size={32} color="#6b7280" pointerEvents="none" />;
case 'camera':
return <Cctv size={32} color="#8b5cf6" />;
return <Cctv size={32} color="#8b5cf6" pointerEvents="none" />;
case 'weather':
return <CloudSun size={32} color="#3b82f6" />;
return <CloudSun size={32} color="#3b82f6" pointerEvents="none" />;
default:
return <Zap size={32} color="#8b5cf6" />;
return <Zap size={32} color="#8b5cf6" pointerEvents="none" />;
}
};

View File

@@ -112,7 +112,7 @@ export default function NfcScanModal({ visible, onClose, onScan }: NfcScanModalP
onPress={onClose}
className="absolute top-6 right-6 z-10 p-2 bg-gray-50 rounded-full"
>
<X size={20} color="#9ca3af" />
<X size={20} color="#9ca3af" pointerEvents="none" />
</TouchableOpacity>
{/* NFC Animated Area */}
@@ -132,7 +132,7 @@ export default function NfcScanModal({ visible, onClose, onScan }: NfcScanModalP
{/* Fixed Circle (Foreground) */}
<View className="bg-[#E6F4F4] p-6 rounded-full border-4 border-white shadow-sm z-10">
<SmartphoneNfc size={64} color="#099499" />
<SmartphoneNfc size={64} color="#099499" pointerEvents="none" />
</View>
</View>
@@ -147,7 +147,7 @@ export default function NfcScanModal({ visible, onClose, onScan }: NfcScanModalP
{/* Indicator (Wave Simulation) */}
<View className="flex-row gap-2 mt-8 items-center opacity-60">
<Radio size={20} color="#099499" />
<Radio size={20} color="#099499" pointerEvents="none" />
<Text className="text-[#099499] font-medium text-sm uppercase tracking-widest">
Ricerca in corso...
</Text>

View File

@@ -14,7 +14,7 @@ export default function OfflineScreen({ onRetry, isRetrying = false }: OfflineSc
<View className="flex-1 items-center justify-center px-8">
{/* Icon */}
<View className="bg-gray-100 p-6 rounded-full mb-6">
<WifiOff size={64} className="text-gray-400" />
<WifiOff size={64} className="text-gray-400" pointerEvents="none" />
</View>
<Text className="text-2xl font-bold text-gray-800 mb-2 text-center">

View File

@@ -80,14 +80,14 @@ export default function QrScanModal({ visible, onClose, onScan }: QrScanModalPro
<View className="absolute bottom-0 right-0 w-6 h-6 border-r-4 border-b-4 border-[#099499]" />
{/* Animated Scan Line or Icon */}
{!scanned && <ScanLine color="#099499" size={40} className="opacity-50" />}
{!scanned && <ScanLine color="#099499" size={40} className="opacity-50" pointerEvents="none" />}
</View>
</View>
{/* Footer Overlay */}
<View className="items-center justify-end pb-12">
<TouchableOpacity onPress={onClose} className="bg-white/20 p-4 rounded-full">
<X color="white" size={32} />
<X color="white" size={32} pointerEvents="none" />
</TouchableOpacity>
<Text className="text-white mt-4 font-medium">Chiudi</Text>
</View>

View File

@@ -28,7 +28,7 @@ export const RangePickerModal = ({ visible, onClose, onApply }: any) => {
<View className="flex-row justify-between items-center mb-4">
<Text className="text-xl font-bold text-gray-800">Seleziona Periodo</Text>
<TouchableOpacity onPress={onClose} className="p-2 bg-gray-50 rounded-full">
<X size={20} color="#4b5563" />
<X size={20} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
</View>
@@ -49,7 +49,7 @@ export const RangePickerModal = ({ visible, onClose, onApply }: any) => {
}}
className="mt-6 bg-[#099499] rounded-xl py-4 flex-row justify-center items-center active:bg-[#077d82]"
>
<Check size={20} color="white" className="mr-2" />
<Check size={20} color="white" className="mr-2" pointerEvents="none" />
<Text className="text-white font-bold text-lg ml-2">Applica Filtro</Text>
</TouchableOpacity>
<TouchableOpacity

View File

@@ -112,7 +112,7 @@ export default function RequestPermitModal({ visible, types, onClose, onSubmit }
<View className="flex-row justify-between items-center mb-6">
<Text className="text-2xl font-bold text-gray-800">Nuova Richiesta</Text>
<TouchableOpacity onPress={onClose} className="p-2 bg-gray-100 rounded-full">
<X size={24} color="#4b5563" />
<X size={24} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
</View>

View File

@@ -40,7 +40,7 @@ export const TimePickerModal = ({ visible, initialDate, title, onConfirm, onClos
<View className="flex-row justify-between items-center mb-4">
<Text className="text-lg font-bold text-gray-800">{title}</Text>
<TouchableOpacity onPress={onClose} className="p-2 bg-gray-100 rounded-full">
<X size={20} color="#4b5563" />
<X size={20} color="#4b5563" pointerEvents="none" />
</TouchableOpacity>
</View>

52
package-lock.json generated
View File

@@ -33,7 +33,7 @@
"expo-symbols": "~1.0.7",
"expo-system-ui": "~6.0.8",
"expo-web-browser": "~15.0.9",
"lucide-react-native": "^0.555.0",
"lucide-react-native": "^0.563.0",
"nativewind": "^4.2.1",
"prettier-plugin-tailwindcss": "^0.5.14",
"react": "19.1.0",
@@ -111,7 +111,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -1493,7 +1492,6 @@
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
"integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
@@ -3166,7 +3164,6 @@
"resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.25.tgz",
"integrity": "sha512-zQeWK9txDePWbYfqTs0C6jeRdJTm/7VhQtW/1IbJNDi9/rFIRzZule8bdQPAnf8QWUsNujRmi1J9OG/hhfbalg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@react-navigation/core": "^7.13.6",
"escape-string-regexp": "^4.0.0",
@@ -3365,7 +3362,6 @@
"integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.0.2"
}
@@ -3436,7 +3432,6 @@
"integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.49.0",
"@typescript-eslint/types": "8.49.0",
@@ -3998,7 +3993,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4661,7 +4655,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
"license": "ISC",
"peer": true
},
"node_modules/bplist-creator": {
"version": "0.1.0",
@@ -4725,7 +4720,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -5286,6 +5280,7 @@
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
"integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"boolbase": "^1.0.0",
"css-what": "^6.1.0",
@@ -5302,6 +5297,7 @@
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
@@ -5315,6 +5311,7 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"license": "BSD-3-Clause",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5324,6 +5321,7 @@
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
"integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">= 6"
},
@@ -5591,6 +5589,7 @@
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"license": "MIT",
"peer": true,
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
@@ -5610,13 +5609,15 @@
"url": "https://github.com/sponsors/fb55"
}
],
"license": "BSD-2-Clause"
"license": "BSD-2-Clause",
"peer": true
},
"node_modules/domhandler": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"domelementtype": "^2.3.0"
},
@@ -5632,6 +5633,7 @@
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
"integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
@@ -5714,6 +5716,7 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=0.12"
},
@@ -5945,7 +5948,6 @@
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -6142,7 +6144,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -6381,7 +6382,6 @@
"resolved": "https://registry.npmjs.org/expo/-/expo-54.0.27.tgz",
"integrity": "sha512-50BcJs8eqGwRiMUoWwphkRGYtKFS2bBnemxLzy0lrGVA1E6F4Q7L5h3WT6w1ehEZybtOVkfJu4Z6GWo2IJcpEA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.20.0",
"@expo/cli": "54.0.18",
@@ -6469,7 +6469,6 @@
"resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.11.tgz",
"integrity": "sha512-xnfrfZ7lHjb+03skhmDSYeFF7OU2K3Xn/lAeP+7RhkV2xp2f5RCKtOUYajCnYeZesvMrsUxOsbGOP2JXSOH3NA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@expo/config": "~12.0.11",
"@expo/env": "~2.0.8"
@@ -6576,7 +6575,6 @@
"resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.10.tgz",
"integrity": "sha512-UqyNaaLKRpj4pKAP4HZSLnuDQqueaO5tB1c/NWu5vh1/LF9ulItyyg2kF/IpeOp0DeOLk0GY0HrIXaKUMrwB+Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"fontfaceobserver": "^2.1.0"
},
@@ -8854,7 +8852,6 @@
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
"license": "MIT",
"peer": true,
"bin": {
"jiti": "bin/jiti.js"
}
@@ -9432,9 +9429,9 @@
}
},
"node_modules/lucide-react-native": {
"version": "0.555.0",
"resolved": "https://registry.npmjs.org/lucide-react-native/-/lucide-react-native-0.555.0.tgz",
"integrity": "sha512-AXEUJdu6e572a2ompVcX/yZDW9z3sulIcVFSdE+sIZltqlw2ltGwtvQ7ODjotn4jh+EXsNfPASCxCd4G8wuF4A==",
"version": "0.563.0",
"resolved": "https://registry.npmjs.org/lucide-react-native/-/lucide-react-native-0.563.0.tgz",
"integrity": "sha512-q4tYoAMorTqv+UXRYc0MyiEAOF+4Bu73zxD63EDrnGCFL+xuj+imBm3E2rIKRmME0heVHlK+98fsi8wbL92LNQ==",
"license": "ISC",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0",
@@ -9470,7 +9467,8 @@
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"license": "CC0-1.0"
"license": "CC0-1.0",
"peer": true
},
"node_modules/memoize-one": {
"version": "5.2.1",
@@ -10085,6 +10083,7 @@
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"boolbase": "^1.0.0"
},
@@ -10663,7 +10662,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.1.1",
@@ -11112,7 +11110,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
"integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -11132,7 +11129,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
"integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.26.0"
},
@@ -11169,7 +11165,6 @@
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz",
"integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@jest/create-cache-key-function": "^29.7.0",
"@react-native/assets-registry": "0.81.5",
@@ -11510,7 +11505,6 @@
"resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz",
"integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==",
"license": "MIT",
"peer": true,
"dependencies": {
"@egjs/hammerjs": "^2.0.17",
"hoist-non-react-statics": "^3.3.0",
@@ -11564,7 +11558,6 @@
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.6.tgz",
"integrity": "sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"react-native-is-edge-to-edge": "^1.2.1",
"semver": "7.7.2"
@@ -11593,7 +11586,6 @@
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
"integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"react": "*",
"react-native": "*"
@@ -11604,7 +11596,6 @@
"resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz",
"integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"react-freeze": "^1.0.0",
"react-native-is-edge-to-edge": "^1.2.1",
@@ -11656,7 +11647,6 @@
"resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz",
"integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.18.6",
"@react-native/normalize-colors": "^0.74.1",
@@ -11799,7 +11789,6 @@
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
"integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -12997,7 +12986,6 @@
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
"integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -13204,7 +13192,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -13411,7 +13398,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"

View File

@@ -36,7 +36,7 @@
"expo-symbols": "~1.0.7",
"expo-system-ui": "~6.0.8",
"expo-web-browser": "~15.0.9",
"lucide-react-native": "^0.555.0",
"lucide-react-native": "^0.563.0",
"nativewind": "^4.2.1",
"prettier-plugin-tailwindcss": "^0.5.14",
"react": "19.1.0",