diff --git a/app/admin/page.js b/app/admin/page.js new file mode 100644 index 0000000..a98dc5c --- /dev/null +++ b/app/admin/page.js @@ -0,0 +1,847 @@ +'use client'; + +import { motion } from 'framer-motion'; +import { useState, useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; +import '../i18n/config'; +import { + Users, + Home, + Calendar, + User, + Clock, + DollarSign, + PlusCircle, + Edit, + Trash2, + CheckCircle, + XCircle, + Search, + Filter, + Download, + Eye, + MapPin, + Bed, + Bath, + Square, + Star, + Phone, + Mail, + CalendarDays +} from 'lucide-react'; + +export default function AdminPage() { + const { t, i18n } = useTranslation(); + const [activeTab, setActiveTab] = useState('properties'); + const [searchQuery, setSearchQuery] = useState(''); + const [selectedUser, setSelectedUser] = useState(null); + + // احصل على اللغة الحالية من i18n + const currentLanguage = i18n.language || 'en'; + + const [stats, setStats] = useState({ + totalUsers: 0, + totalProperties: 0, + activeBookings: 0, + availableProperties: 0 + }); + + const [properties, setProperties] = useState([ + { + id: 1, + name: "luxuryVillaDamascus", + type: "villa", + price: 500000, + location: "Damascus, Al-Mazzeh", + bedrooms: 5, + bathrooms: 4, + area: 450, + status: "available", + images: [], + features: ["swimmingPool", "privateGarden", "parking", "superLuxFinish"] + }, + { + id: 2, + name: "modernApartmentAleppo", + type: "apartment", + price: 250000, + location: "Aleppo, Al-Shahba", + bedrooms: 3, + bathrooms: 2, + area: 180, + status: "booked", + images: [], + features: ["equippedKitchen", "centralHeating", "balcony", "securitySystem"] + }, + { + id: 3, + name: "familyHouseHoms", + type: "house", + price: 350000, + location: "Homs, Baba Amr", + bedrooms: 4, + bathrooms: 3, + area: 300, + status: "available", + images: [], + features: ["largeGarden", "receptionHall", "maidRoom", "garage"] + }, + { + id: 4, + name: "seasideApartmentLatakia", + type: "apartment", + price: 300000, + location: "Latakia, Blue Beach", + bedrooms: 3, + bathrooms: 2, + area: 200, + status: "available", + images: [], + features: ["seaView", "centralHeating", "centralAC", "parking"] + }, + { + id: 5, + name: "villaDaraa", + type: "villa", + price: 400000, + location: "Daraa, Doctors District", + bedrooms: 4, + bathrooms: 3, + area: 350, + status: "booked", + images: [], + features: ["fruitGarden", "highWall", "advancedSecurity", "storage"] + } + ]); + + const [users, setUsers] = useState([ + { + id: 1, + name: "Ahmed Mohamed", + email: "ahmed@example.com", + phone: "+963 123 456 789", + joinDate: "2024-01-15", + activeBookings: 1, + totalBookings: 3, + currentBooking: { + propertyId: 2, + propertyName: "modernApartmentAleppo", + startDate: "2024-02-01", + endDate: "2024-08-01", + duration: "6 months", + totalAmount: 1500000 + } + }, + { + id: 2, + name: "Sara Ahmed", + email: "sara@example.com", + phone: "+963 987 654 321", + joinDate: "2024-02-10", + activeBookings: 0, + totalBookings: 2, + currentBooking: null + }, + { + id: 3, + name: "Mohammed Al-Halabi", + email: "mohammed@example.com", + phone: "+963 555 123 456", + joinDate: "2024-01-25", + activeBookings: 1, + totalBookings: 1, + currentBooking: { + propertyId: 5, + propertyName: "villaDaraa", + startDate: "2024-02-15", + endDate: "2024-05-15", + duration: "3 months", + totalAmount: 1200000 + } + } + ]); + + const [bookingRequests, setBookingRequests] = useState([ + { + id: "B001", + userId: 2, + userName: "Sara Ahmed", + propertyId: 1, + propertyName: "luxuryVillaDamascus", + startDate: "2024-03-01", + endDate: "2024-06-01", + duration: "3 months", + totalAmount: 1500000, + status: "pending", + requestDate: "2024-02-20" + }, + { + id: "B002", + userId: 1, + userName: "Ahmed Mohamed", + propertyId: 4, + propertyName: "seasideApartmentLatakia", + startDate: "2024-03-15", + endDate: "2024-05-15", + duration: "2 months", + totalAmount: 600000, + status: "pending", + requestDate: "2024-02-18" + } + ]); + + const formatNumber = (num) => { + return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + }; + + const fadeInUp = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5 } + } + }; + + const staggerContainer = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1 + } + } + }; + + const cardHover = { + rest: { + scale: 1, + y: 0, + boxShadow: "0 4px 6px rgba(0, 0, 0, 0.05)" + }, + hover: { + scale: 1.02, + y: -5, + boxShadow: "0 10px 25px rgba(0, 0, 0, 0.1)", + transition: { + type: "spring", + stiffness: 300 + } + } + }; + + const buttonHover = { + rest: { scale: 1 }, + hover: { scale: 1.05 }, + tap: { scale: 0.98 } + }; + + useEffect(() => { + const totalBookings = users.reduce((sum, user) => sum + user.activeBookings, 0); + const availableProps = properties.filter(p => p.status === "available").length; + + setStats({ + totalUsers: users.length, + totalProperties: properties.length, + activeBookings: totalBookings, + availableProperties: availableProps + }); + }, [users, properties]); + + const handleBookingAction = (bookingId, action) => { + setBookingRequests(prev => + prev.map(booking => + booking.id === bookingId + ? { ...booking, status: action === 'accept' ? 'approved' : 'rejected' } + : booking + ) + ); + }; + + const handlePropertyAction = (propertyId, action) => { + if (action === 'delete') { + setProperties(prev => prev.filter(p => p.id !== propertyId)); + } + }; + + const showUserDetails = (user) => { + setSelectedUser(user); + }; + + const getLocation = (location) => { + const [city, district] = location.split(",").map(s => s.trim()); + + // تحويل القيم إلى مفاتيح ترجمة + const cityKey = city.toLowerCase(); + const districtKey = district.replace(/\s+/g, ''); + + return `${t(cityKey)}, ${t(districtKey)}`; + }; + + return ( +
+ {/* Header بدون زر اختيار اللغة */} + +
+

+ {t("adminDashboard")} +

+

{t("manageProperties")}

+

{t("pricesInSYP")}

+
+
+ + {/* إحصائيات */} + + +
+
+ +
+
+
{stats.totalUsers}
+
{t("totalUsers")}
+
+
+
+ {users.filter(u => u.activeBookings > 0).length} {t("usersWithActiveBookings")} +
+
+ + +
+
+ +
+
+
{stats.totalProperties}
+
{t("totalProperties")}
+
+
+
+ {stats.availableProperties} {t("propertiesAvailable")} +
+
+ + +
+
+ +
+
+
{stats.activeBookings}
+
{t("activeBookings")}
+
+
+
+ {bookingRequests.filter(b => b.status === 'pending').length} {t("bookingRequestsPending")} +
+
+ + +
+
+ +
+
+
{stats.availableProperties}
+
{t("availableProperties")}
+
+
+
+ {properties.filter(p => p.status === 'available').length} {t("propertiesReadyForRent")} +
+
+
+ + +
+ + + + + +
+
+ +
+ + {activeTab === 'properties' && ( + +
+
+

{t("propertiesManagement")}

+

{t("addEditDeleteProperties")}

+
+ + + {t("addNewProperty")} + +
+ +
+
+ + setSearchQuery(e.target.value)} + /> +
+
+ + + {t("filter")} + + + + {t("export")} + +
+
+ +
+ {properties.map((property) => ( + +
+
+
+

{t(property.name)}

+
+ + {getLocation(property.location)} +
+
+ + {property.status === 'available' ? t("available") : t("booked")} + +
+ +
+
+
+ + {t("bedrooms")} +
+
{property.bedrooms}
+
+ +
+
+ + {t("bathrooms")} +
+
{property.bathrooms}
+
+ +
+
+ + {t("area")} +
+
{property.area} m²
+
+ +
+
+ + {t("price")} +
+
{formatNumber(property.price)} SYP/{t("month")}
+
+
+ +
+

{t("features")}:

+
+ {property.features.map((feature, idx) => ( + + {t(feature)} + + ))} +
+
+ +
+ + + {t("viewDetails")} + + + + {t("edit")} + + handlePropertyAction(property.id, 'delete')} + className="px-3 py-2 bg-red-100 text-red-800 hover:bg-red-200 rounded-lg flex items-center gap-2 text-xs" + > + + {t("delete")} + +
+
+
+ ))} +
+
+ )} + + {activeTab === 'bookings' && ( + +
+

{t("bookingRequests")}

+

{t("manageBookingRequests")}

+
+ +
+ {bookingRequests.map((request) => ( + +
+
+
+

{t("bookingRequest")} #{request.id}

+ + {request.status === 'pending' ? t("pending") : request.status === 'approved' ? t("approved") : t("rejected")} + +
+ +
+
+
{t("user")}
+
{request.userName}
+
+ +
+
{t("property")}
+
{t(request.propertyName)}
+
+ +
+
{t("duration")}
+
{request.duration}
+
+ +
+
{t("totalAmount")}
+
{formatNumber(request.totalAmount)} SYP
+
+
+ +
+
+ + {t("from")} {request.startDate} {t("to")} {request.endDate} +
+
+ + {t("requestDate")}: {request.requestDate} +
+
+
+ + {request.status === 'pending' && ( +
+ handleBookingAction(request.id, 'accept')} + className="px-4 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white rounded-lg flex items-center gap-2 text-sm" + > + + {t("accept")} + + handleBookingAction(request.id, 'reject')} + className="px-4 py-2.5 bg-red-600 hover:bg-red-700 text-white rounded-lg flex items-center gap-2 text-sm" + > + + {t("reject")} + +
+ )} +
+
+ ))} +
+
+ )} + + {activeTab === 'users' && ( + +
+

{t("users")}

+

{t("viewUserDetails")}

+
+ +
+ {users.map((user) => ( + +
+
+
+
+ +
+
+

{user.name}

+
+
+ + {user.email} +
+
+ + {user.phone} +
+
+
+
+ +
+
+
{user.activeBookings}
+
{t("activeBookings")}
+
+
+
{user.totalBookings}
+
{t("totalBookings")}
+
+
+
+ + {user.currentBooking ? ( +
+

+ + {t("currentActiveBooking")} +

+
+
+
{t("property")}
+
{t(user.currentBooking.propertyName)}
+
+
+
{t("duration")}
+
{user.currentBooking.duration}
+
+
+
{t("totalAmount")}
+
{formatNumber(user.currentBooking.totalAmount)} SYP
+
+
+
{t("bookingPeriod")}
+
+ {user.currentBooking.startDate} {t("to")} {user.currentBooking.endDate} +
+
+
+
+ ) : ( +
+
{t("noActiveBookings")}
+
+ )} + +
+ showUserDetails(user)} + className="px-4 py-2.5 bg-blue-700 hover:bg-blue-800 text-white rounded-lg flex items-center gap-2 text-sm" + > + + {t("viewFullDetails")} + +
+
+
+ ))} +
+
+ )} +
+ + {selectedUser && ( +
+ +
+
+

{t("userDetails")}: {selectedUser.name}

+ +
+ +
+
+
+

{t("personalInformation")}

+
+
+ {t("fullName")}: + {selectedUser.name} +
+
+ {t("email")}: + {selectedUser.email} +
+
+ {t("phoneNumber")}: + {selectedUser.phone} +
+
+ {t("joinDate")}: + {selectedUser.joinDate} +
+
+
+ +
+

{t("bookingStatistics")}

+
+
+ {t("activeBookings")}: + {selectedUser.activeBookings} +
+
+ {t("totalBookings")}: + {selectedUser.totalBookings} +
+
+
+
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/app/components/NavLinks.js b/app/components/NavLinks.js new file mode 100644 index 0000000..415151e --- /dev/null +++ b/app/components/NavLinks.js @@ -0,0 +1,41 @@ +'use client'; +import { usePathname } from 'next/navigation'; +import Link from 'next/link'; + +export function NavLink({ href, children }) { + const pathname = usePathname(); + const isActive = pathname === href; + return ( + + {children} + + + ); +} + +export function MobileNavLink({ href, children, onClick }) { + const pathname = usePathname(); + const isActive = pathname === href; + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/app/globals.css b/app/globals.css index a2dc41e..d592175 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,8 +1,8 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + --background: #ede6e6; + --foreground: #156874; } @theme inline { @@ -14,8 +14,8 @@ @media (prefers-color-scheme: dark) { :root { - --background: #0a0a0a; - --foreground: #ededed; + --background: #ede6e6; + --foreground: #156874; } } diff --git a/app/i18n/config.js b/app/i18n/config.js new file mode 100644 index 0000000..f7bca3e --- /dev/null +++ b/app/i18n/config.js @@ -0,0 +1,378 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +const resources = { + en: { + translation: { + "home": "Home", + "ourProducts": "Our Products", + "admin": "Admin", + "logoAlt": "SweetHome Logo", + "brandNamePart1": "Sweet", + "brandNamePart2": "Home", + "openMainMenu": "Open main menu", + "switchToArabic": "Switch to Arabic", + "switchToEnglish": "Switch to English", + + "adminDashboard": "Admin Dashboard", + "manageProperties": "Manage properties, bookings, and users", + "pricesInSYP": "All prices in Syrian Pounds (SYP)", + + + "totalUsers": "Total Users", + "totalProperties": "Total Properties", + "activeBookings": "Active Bookings", + "availableProperties": "Available Properties", + "usersWithActiveBookings": "users with active bookings", + "propertiesAvailable": "properties available for booking", + "bookingRequestsPending": "booking requests pending", + "propertiesReadyForRent": "properties ready for rent", + + + "properties": "Properties", + "bookingRequests": "Booking Requests", + "users": "Users", + "propertiesManagement": "Properties Management", + "bookingRequestsManagement": "Booking Requests Management", + "usersManagement": "Users Management", + + + "addEditDeleteProperties": "Add, edit, or delete available properties", + "addNewProperty": "Add New Property", + "searchProperties": "Search properties...", + "filter": "Filter", + "export": "Export", + "viewDetails": "View Details", + "edit": "Edit", + "delete": "Delete", + "features": "Features", + "bedrooms": "Bedrooms", + "bathrooms": "Bathrooms", + "area": "Area", + "price": "Price", + "available": "Available", + "booked": "Booked", + "month": "month", + "status": "Status", + "location": "Location", + "type": "Type", + + "swimmingPool": "Swimming Pool", + "privateGarden": "Private Garden", + "parking": "Parking", + "superLuxFinish": "Super Lux Finish", + "equippedKitchen": "Equipped Kitchen", + "centralHeating": "Central Heating", + "balcony": "Balcony", + "securitySystem": "Security System", + "largeGarden": "Large Garden", + "receptionHall": "Reception Hall", + "maidRoom": "Maid Room", + "garage": "Garage", + "seaView": "Sea View", + "centralAC": "Central AC", + "fruitGarden": "Fruit Garden", + "highWall": "High Wall", + "advancedSecurity": "Advanced Security", + "storage": "Storage", + + "villa": "Villa", + "apartment": "Apartment", + "house": "House", + + + "manageBookingRequests": "Manage property booking requests from users", + "bookingRequest": "Booking Request", + "user": "User", + "property": "Property", + "duration": "Duration", + "totalAmount": "Total Amount", + "from": "From", + "to": "to", + "requestDate": "Request Date", + "pending": "Pending", + "approved": "Approved", + "rejected": "Rejected", + "accept": "Accept", + "reject": "Reject", + "bookingId": "Booking ID", + "startDate": "Start Date", + "endDate": "End Date", + + + "viewUserDetails": "View user details and their bookings", + "activeBookings": "Active Bookings", + "totalBookings": "Total Bookings", + "currentActiveBooking": "Current Active Booking", + "bookingPeriod": "Booking Period", + "noActiveBookings": "No active bookings at the moment", + "viewFullDetails": "View Full Details", + "userDetails": "User Details", + "personalInformation": "Personal Information", + "fullName": "Full Name", + "email": "Email", + "phoneNumber": "Phone Number", + "joinDate": "Join Date", + "bookingStatistics": "Booking Statistics", + "currentBooking": "Current Booking", + + + "damascus": "Damascus", + "aleppo": "Aleppo", + "homs": "Homs", + "latakia": "Latakia", + "daraa": "Daraa", + "alMazzeh": "Al-Mazzeh", + "alShahba": "Al-Shahba", + "babaAmr": "Baba Amr", + "blueBeach": "Blue Beach", + "doctorsDistrict": "Doctors District", + + "luxuryVillaDamascus": "Luxury Villa in Damascus", + "modernApartmentAleppo": "Modern Apartment in Aleppo", + "familyHouseHoms": "Family House in Homs", + "seasideApartmentLatakia": "Seaside Apartment in Latakia", + "villaDaraa": "Villa in Daraa", + + + "heroTitleLine1": "Finding Your New", + "heroTitleLine2": "Home Is Simple", + "heroSubtitle": "We provide high-quality rental listings to help you find the perfect home", + "rentTab": "Rent", + "buyTab": "Buy", + "sellTab": "Sell", + "cityStreetLabel": "City / Street", + "cityStreetPlaceholder": "Enter city or street", + "rentTypeLabel": "Typology of rent", + "selectType": "Select type", + "studio": "Studio", + "priceLabel": "Price", + "selectPriceRange": "Select price range", + "priceRange1": "$0 - $500", + "priceRange2": "$500 - $1,000", + "priceRange3": "$1,000 - $2,000", + "priceRange4": "$2,000 - $3,000", + "priceRange5": "$3,000+", + "searchButton": "Search", + "propertiesListed": "Properties Listed", + "citiesCovered": "Cities Covered", + "customerSatisfaction": "Customer Satisfaction", + "whyChooseUsTitle": "Why Choose SweetHome?", + "whyChooseUsSubtitle": "We make finding your perfect home simple, fast, and stress-free", + "feature1Title": "Verified Listings", + "feature1Description": "Every property is thoroughly verified to ensure accuracy and quality. No surprises, just real homes.", + "feature2Title": "Secure Process", + "feature2Description": "Your safety is our priority. We provide secure transactions and protect your personal information.", + "feature3Title": "Fast Results", + "feature3Description": "Find your perfect home in minutes with our advanced search and matching algorithms.", + + + "footerDescription": "Premium furniture and home decor for your perfect space.", + "quickLinks": "Quick Links", + "contactUs": "Contact Us", + "stayUpdated": "Stay Updated", + "yourEmail": "Your email", + "subscribe": "Subscribe", + "phone": "(+963) 938 992 000", + "footerEmail": "info@sweethome.com", + "allRightsReserved": "All rights reserved.", + "copyright": "SweetHome" + } + }, + ar: { + translation: { + + "home": "الرئيسية", + "ourProducts": "منتجاتنا", + "admin": "الإدارة", + // "logoAlt": "شعار سويت هوم", + "brandNamePart1": "سويت", + "brandNamePart2": "هوم", + "openMainMenu": "فتح القائمة الرئيسية", + "switchToArabic": "التبديل للعربية", + "switchToEnglish": "التبديل للإنجليزية", + + + "adminDashboard": "لوحة تحكم المسؤول", + "manageProperties": "إدارة العقارات والحجوزات والمستخدمين", + "pricesInSYP": "جميع الأسعار بالليرة السورية", + + + "totalUsers": "إجمالي المستخدمين", + "totalProperties": "إجمالي العقارات", + "activeBookings": "الحجوزات النشطة", + "availableProperties": "العقارات المتاحة", + "usersWithActiveBookings": "مستخدم لديه حجوزات نشطة", + "propertiesAvailable": "عقار متاح للحجز", + "bookingRequestsPending": "طلب حجز بانتظار الموافقة", + "propertiesReadyForRent": "عقار جاهز للإيجار", + + + "properties": "العقارات", + "bookingRequests": "طلبات الحجز", + "users": "المستخدمين", + "propertiesManagement": "إدارة العقارات", + "bookingRequestsManagement": "إدارة طلبات الحجز", + "usersManagement": "إدارة المستخدمين", + + + "addEditDeleteProperties": "إضافة، تعديل، أو حذف العقارات المتاحة", + "addNewProperty": "إضافة عقار جديد", + "searchProperties": "بحث عن عقار...", + "filter": "فلترة", + "export": "تصدير", + "viewDetails": "عرض التفاصيل", + "edit": "تعديل", + "delete": "حذف", + "features": "المميزات", + "bedrooms": "غرف نوم", + "bathrooms": "حمامات", + "area": "المساحة", + "price": "السعر", + "available": "متاح", + "booked": "محجوز", + "month": "شهر", + "status": "الحالة", + "location": "الموقع", + "type": "النوع", + + "swimmingPool": "مسبح", + "privateGarden": "حديقة خاصة", + "parking": "موقف سيارات", + "superLuxFinish": "تشطيب سوبر لوكس", + "equippedKitchen": "مطبخ مجهز", + "centralHeating": "تدفئة مركزية", + "balcony": "بلكونة", + "securitySystem": "نظام أمني", + "largeGarden": "حديقة كبيرة", + "receptionHall": "صالة استقبال", + "maidRoom": "غرفة خادمة", + "garage": "جراج", + "seaView": "إطلالة بحرية", + "centralAC": "تكييف مركزي", + "fruitGarden": "حديقة مثمرة", + "highWall": "سور عالي", + "advancedSecurity": "أنظمة أمن متطورة", + "storage": "مخزن", + + "villa": "فيلا", + "apartment": "شقة", + "house": "بيت", + + + "manageBookingRequests": "إدارة طلبات حجز العقارات من المستخدمين", + "bookingRequest": "طلب حجز", + "user": "المستخدم", + "property": "العقار", + "duration": "المدة", + "totalAmount": "القيمة الإجمالية", + "from": "من", + "to": "إلى", + "requestDate": "تاريخ الطلب", + "pending": "بانتظار الموافقة", + "approved": "مقبول", + "rejected": "مرفوض", + "accept": "قبول", + "reject": "رفض", + "bookingId": "رقم الحجز", + "startDate": "تاريخ البدء", + "endDate": "تاريخ الانتهاء", + + + "viewUserDetails": "عرض تفاصيل المستخدمين وحجوزاتهم", + "activeBookings": "حجوزات نشطة", + "totalBookings": "إجمالي الحجوزات", + "currentActiveBooking": "الحجز النشط الحالي", + "bookingPeriod": "فترة الحجز", + "noActiveBookings": "لا يوجد حجوزات نشطة حالياً", + "viewFullDetails": "عرض تفاصيل كاملة", + "userDetails": "تفاصيل المستخدم", + "personalInformation": "المعلومات الشخصية", + "fullName": "الاسم الكامل", + "email": "البريد الإلكتروني", + "phoneNumber": "رقم الهاتف", + "joinDate": "تاريخ التسجيل", + "bookingStatistics": "إحصائيات الحجوزات", + "currentBooking": "الحجز الحالي", + + + "damascus": "دمشق", + "aleppo": "حلب", + "homs": "حمص", + "latakia": "اللاذقية", + "daraa": "درعا", + "alMazzeh": "المزة", + "alShahba": "الشهباء", + "babaAmr": "بابا عمرو", + "blueBeach": "الشاطئ الأزرق", + "doctorsDistrict": "حي الأطباء", + + "luxuryVillaDamascus": "فيلا فاخرة في دمشق", + "modernApartmentAleppo": "شقة حديثة في حلب", + "familyHouseHoms": "بيت عائلي في حمص", + "seasideApartmentLatakia": "شقة بجانب البحر في اللاذقية", + "villaDaraa": "فيلا في درعا", + + + "heroTitleLine1": "إيجاد منزلك الجديد", + "heroTitleLine2": "أصبح سهلاً", + "heroSubtitle": "نوفر قوائم عقارات عالية الجودة لمساعدتك في إيجاد المنزل المثالي", + "rentTab": "إيجار", + "buyTab": "شراء", + "sellTab": "بيع", + "cityStreetLabel": "المدينة / الشارع", + "cityStreetPlaceholder": "أدخل المدينة أو الشارع", + "rentTypeLabel": "نوع الإيجار", + "selectType": "اختر النوع", + "studio": "استوديو", + "priceLabel": "السعر", + "selectPriceRange": "اختر نطاق السعر", + "priceRange1": "٠$ - ٥٠٠$", + "priceRange2": "٥٠٠$ - ١٠٠٠$", + "priceRange3": "١٠٠٠$ - ٢٠٠٠$", + "priceRange4": "٢٠٠٠$ - ٣٠٠٠$", + "priceRange5": "٣٠٠٠$+", + "searchButton": "بحث", + "propertiesListed": "عقار مدرج", + "citiesCovered": "مدينة مغطاة", + "customerSatisfaction": "رضا العملاء", + "whyChooseUsTitle": "لماذا تختار سويت هوم؟", + "whyChooseUsSubtitle": "نجعل عملية إيجاد منزلك المثالي سهلة وسريعة وخالية من التوتر", + "feature1Title": "قوائم موثقة", + "feature1Description": "كل عقار يتم التحقق منه بدقة لضمان الدقة والجودة. لا مفاجآت، فقط منازل حقيقية.", + "feature2Title": "عملية آمنة", + "feature2Description": "سلامتك هي أولويتنا. نوفر معاملات آمنة ونحمي معلوماتك الشخصية.", + "feature3Title": "نتائج سريعة", + "feature3Description": "اعثر على منزلك المثالي في دقائق باستخدام خوارزميات البحث والمطابقة المتقدمة لدينا.", + + "footerDescription": "أثاث فاخر وديكور منزلي لمساحتك المثالية.", + "quickLinks": "روابط سريعة", + "contactUs": "اتصل بنا", + "stayUpdated": "ابق على اطلاع", + "yourEmail": "بريدك الإلكتروني", + "subscribe": "اشتراك", + "phone": "(+963) 938 992 000", + "footerEmail": "info@sweethome.com", + "allRightsReserved": "جميع الحقوق محفوظة.", + "copyright": "سويت هوم" + } + } +}; + +i18n + .use(LanguageDetector) + .use(initReactI18next) + .init({ + resources, + fallbackLng: 'en', + interpolation: { + escapeValue: false + }, + detection: { + order: ['localStorage', 'navigator'], + caches: ['localStorage'] + } + }); + +export default i18n; \ No newline at end of file diff --git a/app/layout.js b/app/layout.js index 7bf337d..032b7b2 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,5 +1,15 @@ +'use client'; + import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import "./i18n/config"; +import Link from "next/link"; +import Image from "next/image"; +import { NavLink, MobileNavLink } from "./components/NavLinks"; +import { useTranslation } from 'react-i18next'; +import { Globe } from 'lucide-react'; +import { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; const geistSans = Geist({ variable: "--font-geist-sans", @@ -11,19 +21,265 @@ const geistMono = Geist_Mono({ subsets: ["latin"], }); -export const metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - export default function RootLayout({ children }) { + const { t, i18n } = useTranslation(); + const [currentLanguage, setCurrentLanguage] = useState('en'); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const currentYear = new Date().getFullYear(); + + const changeLanguage = (lng) => { + i18n.changeLanguage(lng); + setCurrentLanguage(lng); + localStorage.setItem('language', lng); + + if (lng === 'ar') { + document.documentElement.dir = 'rtl'; + document.documentElement.lang = 'ar'; + document.documentElement.classList.add('rtl'); + document.documentElement.classList.remove('ltr'); + } else { + document.documentElement.dir = 'ltr'; + document.documentElement.lang = 'en'; + document.documentElement.classList.add('ltr'); + document.documentElement.classList.remove('rtl'); + } + }; + + useEffect(() => { + const savedLanguage = localStorage.getItem('language') || 'en'; + const lng = savedLanguage; + setCurrentLanguage(lng); + i18n.changeLanguage(lng); + + if (lng === 'ar') { + document.documentElement.dir = 'rtl'; + document.documentElement.lang = 'ar'; + document.documentElement.classList.add('rtl'); + } else { + document.documentElement.dir = 'ltr'; + document.documentElement.lang = 'en'; + document.documentElement.classList.add('ltr'); + } + }, [i18n]); + + const toggleMobileMenu = () => { + setIsMobileMenuOpen(!isMobileMenuOpen); + }; + + const closeMobileMenu = () => { + setIsMobileMenuOpen(false); + }; + return ( - - - {children} + + + {currentLanguage === 'ar' ? 'سويت هوم - أثاث فاخر' : 'SweetHome - Premium Furniture'} + + + + + +
+ {children} +
+ + ); -} +} \ No newline at end of file diff --git a/app/page.js b/app/page.js index 691817b..30d9cd2 100644 --- a/app/page.js +++ b/app/page.js @@ -1,65 +1,383 @@ -import Image from "next/image"; +'use client'; + +import { motion } from 'framer-motion'; +import { useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import './i18n/config'; + +export default function HomePage() { + const { t } = useTranslation(); + const constraintsRef = useRef(null); + + const fadeInUp = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.6, + ease: "easeOut" + } + } + }; + + const staggerContainer = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2, + delayChildren: 0.3 + } + } + }; + + const buttonHover = { + rest: { scale: 1 }, + hover: { + scale: 1.05, + transition: { + type: "spring", + stiffness: 400, + damping: 10 + } + }, + tap: { scale: 0.95 } + }; + + const floatingAnimation = { + y: [0, -10, 0], + transition: { + duration: 2, + repeat: Infinity, + ease: "easeInOut" + } + }; -export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.js file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

+
+
+
+ +
-
- - Vercel logomark - Deploy Now - - - Documentation - + +
+
+ + + {t("heroTitleLine1")}
+ + {t("heroTitleLine2")} + +
+ + {t("heroSubtitle")} + +
+ + +
+ + {t("rentTab")} + + + {t("buyTab")} + + + {t("sellTab")} + +
+ +
+
+ +
+
+ + + + +
+ +
+
+ +
+ +
+
+ + + +
+ +
+ + + +
+
+
+ +
+ +
+
+ + + +
+ +
+ + + +
+
+
+ +
+ + + + + {t("searchButton")} + +
+
+
+
-
+ + + + + + + + +
+
+ +

+ {t("whyChooseUsTitle")} +

+

+ {t("whyChooseUsSubtitle")} +

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

+ {t("feature1Title")} +

+

+ {t("feature1Description")} +

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

+ {t("feature2Title")} +

+

+ {t("feature2Description")} +

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

+ {t("feature3Title")} +

+

+ {t("feature3Description")} +

+
+
+
+
); -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f7e16f9..197b25f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,21 +8,30 @@ "name": "sweethome", "version": "0.1.0", "dependencies": { + "flowbite": "^4.0.1", + "flowbite-react": "^0.12.16", + "framer-motion": "^12.29.2", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "lucide-react": "^0.563.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "react-i18next": "^16.5.4" }, "devDependencies": { "@tailwindcss/postcss": "^4", + "autoprefixer": "^10.4.23", "babel-plugin-react-compiler": "1.0.0", - "tailwindcss": "^4" + "daisyui": "^5.5.14", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18" } }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -51,6 +60,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", @@ -75,6 +93,74 @@ "tslib": "^2.4.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom/node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", + "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "license": "ISC" + }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", @@ -545,7 +631,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -556,7 +641,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -567,7 +651,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -577,14 +660,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -725,6 +806,97 @@ "node": ">= 10" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -738,7 +910,6 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -754,7 +925,6 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -781,7 +951,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -798,7 +967,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -815,7 +983,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -832,7 +999,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -849,7 +1015,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -866,7 +1031,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -883,7 +1047,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -900,7 +1063,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -917,7 +1079,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -942,7 +1103,6 @@ "cpu": [ "wasm32" ], - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -964,7 +1124,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -981,7 +1140,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -995,7 +1153,6 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", - "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -1005,6 +1162,168 @@ "tailwindcss": "4.1.18" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "license": "MIT" + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/babel-plugin-react-compiler": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", @@ -1015,6 +1334,12 @@ "@babel/types": "^7.26.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.9.19", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", @@ -1024,6 +1349,61 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001766", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", @@ -1044,27 +1424,130 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/comment-json": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", + "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/daisyui": { + "version": "5.5.14", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.14.tgz", + "integrity": "sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/saadeghi/daisyui?sponsor=1" + } + }, + "node_modules/debounce": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", + "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=8" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.279", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", + "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==", + "dev": true, + "license": "ISC" + }, "node_modules/enhanced-resolve": { "version": "5.18.4", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -1074,28 +1557,339 @@ "node": ">=10.13.0" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flowbite": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-4.0.1.tgz", + "integrity": "sha512-UwUjvnqrQTiFm3uMJ0WWnzKXKoDyNyfyEzoNnxmZo6KyDzCedjqZw1UW0Oqdn+E0iYVdPu0fizydJN6e4pP9Rw==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.3", + "flowbite-datepicker": "^2.0.0", + "mini-svg-data-uri": "^1.4.3", + "postcss": "^8.5.1", + "tailwindcss": "^4.1.12" + } + }, + "node_modules/flowbite-datepicker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flowbite-datepicker/-/flowbite-datepicker-2.0.0.tgz", + "integrity": "sha512-m81hl0Bimq45MUg4maJLOnXrX+C9lZ0AkjMb9uotuVUSr729k/YiymWDfVAm63AYDH7g7y3rI3ke3XaBzWWqLw==", + "license": "MIT", + "dependencies": { + "@rollup/plugin-node-resolve": "^15.2.3", + "@tailwindcss/postcss": "^4.1.17" + } + }, + "node_modules/flowbite-react": { + "version": "0.12.16", + "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.12.16.tgz", + "integrity": "sha512-lq7Go6AhcrWI98efbuea9xG5j9DNUUiHkWROOQ8772g61CoGkkOz6hjU/WC7SIHfmvHiQFaCDIs7nhxH3uUbRg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "1.7.3", + "@floating-ui/react": "0.27.16", + "@iarna/toml": "2.2.5", + "@typescript-eslint/typescript-estree": "8.46.2", + "chokidar": "4.0.3", + "classnames": "2.5.1", + "comment-json": "4.4.1", + "debounce": "2.2.0", + "deepmerge-ts": "7.1.5", + "klona": "2.0.6", + "package-manager-detector": "1.5.0", + "recast": "0.23.11", + "tailwind-merge-v2": "npm:tailwind-merge@2.6.0", + "tailwind-merge-v3": "npm:tailwind-merge@3.0.1" + }, + "bin": { + "flowbite-react": "dist/cli/bin.js" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19", + "tailwindcss": "^3 || ^4" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.29.2.tgz", + "integrity": "sha512-lSNRzBJk4wuIy0emYQ/nfZ7eWhqud2umPKw2QAQki6uKhZPKm2hRQHeQoHTG9MIvfobb+A/LbEWPJU794ZUKrg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.29.2", + "motion-utils": "^12.29.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/i18next": { + "version": "25.8.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.0.tgz", + "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/lightningcss": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -1128,7 +1922,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1149,7 +1942,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1170,7 +1962,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1191,7 +1982,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1212,7 +2002,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1233,7 +2022,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1254,7 +2042,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1275,7 +2062,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1296,7 +2082,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1317,7 +2102,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1338,7 +2122,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -1352,16 +2135,103 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lucide-react": { + "version": "0.563.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz", + "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/motion-dom": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.29.2.tgz", + "integrity": "sha512-/k+NuycVV8pykxyiTCoFzIVLA95Nb1BFIVvfSu9L50/6K6qNeAYtkxXILy/LRutt7AzaYDc2myj0wkCVVYAPPA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.29.2" + } + }, + "node_modules/motion-utils": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", + "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1461,17 +2331,47 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/package-manager-detector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz", + "integrity": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==", + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1496,6 +2396,33 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.2.3", "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", @@ -1517,6 +2444,115 @@ "react": "^19.2.3" } }, + "node_modules/react-i18next": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.4.tgz", + "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -1528,7 +2564,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -1581,6 +2616,15 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1613,18 +2657,56 @@ } } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, + "node_modules/tailwind-merge-v2": { + "name": "tailwind-merge", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-merge-v3": { + "name": "tailwind-merge", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.1.tgz", + "integrity": "sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1634,11 +2716,104 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } } } } diff --git a/package.json b/package.json index 7f7697b..3cc1602 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,23 @@ "start": "next start" }, "dependencies": { + "flowbite": "^4.0.1", + "flowbite-react": "^0.12.16", + "framer-motion": "^12.29.2", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "lucide-react": "^0.563.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "react-i18next": "^16.5.4" }, "devDependencies": { "@tailwindcss/postcss": "^4", + "autoprefixer": "^10.4.23", "babel-plugin-react-compiler": "1.0.0", - "tailwindcss": "^4" + "daisyui": "^5.5.14", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18" } } diff --git a/public/hero.jpg b/public/hero.jpg new file mode 100644 index 0000000..7671b0c Binary files /dev/null and b/public/hero.jpg differ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..88960db Binary files /dev/null and b/public/logo.png differ