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.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 (
-
-
-
-
-
- To get started, edit the page.js file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
+
+
+
-
-
-
- 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