add css files for each compnent

This commit is contained in:
surajb 2024-07-22 17:12:01 +05:30
parent cb7ab37eb0
commit 89d5b17dc1
24 changed files with 1092 additions and 498 deletions

21
package-lock.json generated
View File

@ -29,8 +29,8 @@
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.6",
"json-server": "^1.0.0-beta.1",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.4",
"postcss": "^8.4.39",
"tailwindcss": "^3.4.6",
"vite": "^5.2.0"
}
},
@ -1795,6 +1795,7 @@
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"browserslist": "^4.23.0",
"caniuse-lite": "^1.0.30001599",
@ -4566,9 +4567,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.38",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
"integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
"version": "8.4.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
"dev": true,
"funding": [
{
@ -4584,9 +4585,10 @@
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
"picocolors": "^1.0.1",
"source-map-js": "^1.2.0"
},
"engines": {
@ -6208,10 +6210,11 @@
}
},
"node_modules/tailwindcss": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz",
"integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==",
"version": "3.4.6",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz",
"integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",

View File

@ -36,8 +36,8 @@
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.6",
"json-server": "^1.0.0-beta.1",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.4",
"postcss": "^8.4.39",
"tailwindcss": "^3.4.6",
"vite": "^5.2.0"
}
}

View File

@ -1,18 +0,0 @@
.employee-image-container {
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.employee-image-container button {
position: absolute;
bottom: -10px;
left: 50%;
transform: translateX(-50%);
}
.input-underline:focus {
border-color: #4b5563; /* Adjust focus border color */
}

View File

@ -4,6 +4,8 @@ import Sidebar from '../sidebar/Sidebar';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faChevronLeft } from '@fortawesome/free-solid-svg-icons';
import axiosInstance from '../../api/axiosConfig';
import '../../styles/AddEmployee.css';
const AddEmployee = () => {
const navigate = useNavigate();
@ -84,12 +86,12 @@ const AddEmployee = () => {
<div className="flex flex-row">
<Sidebar />
<div className="w-full flex flex-col min-h-screen text-black">
<div className="min-h-screen text-gray-800 p-6">
<div className="flex items-center mb-6">
<Link to="/employees" className="text-#0e355b text-xl mr-4">
<div className="min-h-screen text-secondary p-6 bg-light">
<div className="flex items-center ">
<Link to="/employees" className="text-primary text-xl ">
<FontAwesomeIcon icon={faChevronLeft} />
</Link>
<h1 className="text-2xl font-semibold text-#0e355b">
<h1 className="text-2xl font-semibold text-primary">
create employee account
</h1>
</div>
@ -120,16 +122,16 @@ const AddEmployee = () => {
<button
type="button"
onClick={() => document.getElementById('imageUpload').click()}
className="absolute bottom-0 left-1/2 transform -translate-x-1/2 bg-gray-700 text-white text-xs px-2 py-1 rounded-full"
className="image-upload-btn"
>
add customer image
Upload
</button>
</div>
</div>
<form onSubmit={handleAddEmployeeSubmit} className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div>
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
employee firstname:
</label>
<input
@ -137,11 +139,11 @@ const AddEmployee = () => {
name="firstname"
value={employeeData.firstname}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
employee lastname:
</label>
<input
@ -149,11 +151,11 @@ const AddEmployee = () => {
name="lastname"
value={employeeData.lastname}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
age:
</label>
<input
@ -161,18 +163,18 @@ const AddEmployee = () => {
name="age"
value={employeeData.age}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
gender:
</label>
<select
name="gender"
value={employeeData.gender}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
>
<option value="" disabled>
select gender
@ -183,7 +185,7 @@ const AddEmployee = () => {
</select>
</div>
<div>
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
mobile:
</label>
<input
@ -191,11 +193,11 @@ const AddEmployee = () => {
name="mobile"
value={employeeData.mobile}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
address line 1:
</label>
<input
@ -203,11 +205,11 @@ const AddEmployee = () => {
name="address_line_1"
value={employeeData.address_line_1}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
address line 2:
</label>
<input
@ -215,11 +217,11 @@ const AddEmployee = () => {
name="address_line_2"
value={employeeData.address_line_2}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
nearby landmark:
</label>
<input
@ -227,11 +229,11 @@ const AddEmployee = () => {
name="nearby_landmark"
value={employeeData.nearby_landmark}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
pincode:
</label>
<input
@ -239,18 +241,18 @@ const AddEmployee = () => {
name="pincode"
value={employeeData.pincode}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
city:
</label>
<select
name="city_id"
value={employeeData.city_id}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
>
<option value="" disabled>
select city
@ -264,7 +266,7 @@ const AddEmployee = () => {
</select>
</div>
<div className="md:col-span-2 lg:col-span-3">
<label className="block text-gray-800 font-medium">
<label className="block text-secondary font-medium">
email:
</label>
<input
@ -272,14 +274,14 @@ const AddEmployee = () => {
name="email"
value={employeeData.email}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="input-underline w-full p-2 focus-border"
/>
</div>
</div>
<div className="text-center mt-6">
<button
type="submit"
className="bg-#0e355b text-white px-4 py-2 rounded-md font-semibold"
className="btn-primary"
>
create account
</button>

View File

@ -1,14 +1,13 @@
import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import Sidebar from '../sidebar/Sidebar';
import './Dashboard.css';
import '../../styles/AdminDashboard.css';
const AdminDashboard = () => {
const navigate = useNavigate();
const [userName, setUserName] = useState('');
useEffect(() => {
// Fetch user name from localStorage or state management
const user = JSON.parse(localStorage.getItem('user'));
if (user && user.name) {
setUserName(user.name);
@ -16,41 +15,37 @@ const AdminDashboard = () => {
}, []);
const handleClick = (link) => {
navigate(link); // Redirect to the provided link
navigate(link);
};
return (
<div className="flex flex-row">
<div className="dashboard-container">
<Sidebar />
<div className="w-full flex flex-col min-h-screen text-white">
<header className="w-full p-4 flex justify-between items-center">
<div className="flex items-center">
<h1 className="text-#0e355b text-2xl font-bold">admin dashboard</h1>
</div>
<div>
<p className="text-#4b5563">welcome back {userName}</p>
</div>
<div className="dashboard-content">
<header className="dashboard-header">
<h1 className="header-title">Admin Dashboard</h1>
<p className="welcome-text">Welcome back, {userName}</p>
</header>
<main className="flex-1 flex flex-col items-center justify-center p-6">
<div className="w-full max-w-3xl text-center">
<img src="path_to_image" alt="Dashboard Graphic" className="w-full rounded-md mb-6" />
<main className="dashboard-main">
<div className="dashboard-buttons">
<img src="path_to_image" alt="Dashboard Graphic" className="dashboard-image" />
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className="btn-primary"
onClick={() => handleClick('')}
>
view orders
View Orders
</button>
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className="btn-primary"
onClick={() => handleClick('/employees')}
>
view employees
View Employees
</button>
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className="btn-primary"
onClick={() => handleClick('')}
>
view customers
View Customers
</button>
</div>
</main>

View File

@ -1,89 +0,0 @@
/* Importing Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@200;400;600;800&display=swap');
/* General styles */
/* body {
font-family: 'Nunito Sans', sans-serif;
background-color: #09090B;
margin: 0;
padding: 0;
color: #fff;
} */
.dashboard {
padding: 24px;
background-color: #ffffff;
/* color: #; */
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
}
.dashboard-title {
position: absolute;
top: 20px;
left: 20px;
font-size: 24px;
}
.dashboard-content {
position: absolute;
top: 150px;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
width: 80%;
max-width: 800px;
}
.dashboard-image {
width: 100%;
height: auto;
margin-bottom: 40px;
}
.dashboard-buttons {
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
background-color: #0e355b;
}
.dashboard-button {
background-color: #0e355b;
border-color: #0e355b;
width: 300px;
height: 60px;
font-size: 16px;
}
.dashboard-link {
color: #0e355b;
}
.button:hover {
background-color: #154676;
border-color: #154676;
}
/* Responsive Styles */
@media (max-width: 768px) {
.dashboard-title {
font-size: 20px;
top: 10px;
left: 10px;
}
.dashboard-content {
top: 120px;
width: 90%;
}
.dashboard-button {
width: 100%;
}
}

View File

@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom';
import Sidebar from '../sidebar/Sidebar';
import axiosInstance from '../../api/axiosConfig';
const EmployeeList = ({ className = '' }) => {
const [employees, setEmployees] = useState([]);
const navigate = useNavigate();

View File

@ -24,23 +24,22 @@ const AddCustomer = () => {
const [cities, setCities] = useState([]);
const [imagePreview, setImagePreview] = useState(null);
// Uncomment to fetch cities data from backend
// useEffect(() => {
// const fetchCities = async () => {
// try {
// const response = await axiosInstance.get('/cities');
// if (Array.isArray(response.data)) {
// setCities(response.data);
// } else {
// console.error('Error: Data is not an array', response.data);
// }
// } catch (error) {
// console.error('Error fetching cities:', error.response || error.message);
// }
// };
useEffect(() => {
const fetchCities = async () => {
try {
const response = await axiosInstance.get('/cities');
if (Array.isArray(response.data)) {
setCities(response.data);
} else {
console.error('Error: Data is not an array', response.data);
}
} catch (error) {
console.error('Error fetching cities:', error.response || error.message);
}
};
// fetchCities();
// }, []);
fetchCities();
}, []);
const handleInputChange = (e) => {
const { name, value } = e.target;
@ -69,11 +68,13 @@ const AddCustomer = () => {
});
try {
await axiosInstance.post('http://localhost:5000/customers', formData, {
const response = await axiosInstance.post('http://localhost:5000/customers', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
console.log('Raw response:', response);
console.log('Customer added successfully:', response.data);
navigate('/customers');
} catch (error) {
console.error('Error adding customer:', error.response || error.message);
@ -85,16 +86,16 @@ const AddCustomer = () => {
<Sidebar />
<div className="w-full flex flex-col min-h-screen text-black">
<div className="min-h-screen text-gray-800 p-6">
<div className="flex justify-between items-center mb-6">
<div className="flex items-center mb-6">
<Link to="/customers" className="text-#0e355b text-xl mr-4">
<div className="flex justify-between items-center">
<div className="flex items-center">
<Link to="/customers" className="text-[#0e355b] text-xl">
<FontAwesomeIcon icon={faChevronLeft} />
</Link>
<h1 className="text-2xl font-semibold text-#0e355b">
add customer
<h1 className="text-2xl font-semibold text-[#0e355b]">
Add Customer
</h1>
</div>
<Link to="/CategoryList" className="text-blue-900">skip for now</Link>
<Link to="/CategoryList" className="text-blue-900">Skip for now</Link>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="space-y-6">
@ -109,7 +110,7 @@ const AddCustomer = () => {
/>
) : (
<div className="w-full h-full flex items-center justify-center text-gray-500">
no image
No Image
</div>
)}
</div>
@ -125,16 +126,16 @@ const AddCustomer = () => {
onClick={() => document.getElementById('imageUpload').click()}
className="absolute bottom-0 left-1/2 transform -translate-x-1/2 bg-gray-700 text-white text-xs px-2 py-1 rounded-full"
>
Upload
</button>
</div>
</div>
<div>
<Link to="/add-customer">
<h2 className="text-lg font-semibold">customer information</h2>
<h2 className="text-lg font-semibold">Customer Information</h2>
</Link>
<Link to="/measurements">
<h2 className="text-lg font-semibold">measurements</h2>
<h2 className="text-lg font-semibold">Measurements</h2>
</Link>
</div>
</div>
@ -142,130 +143,130 @@ const AddCustomer = () => {
<form onSubmit={handleAddCustomerSubmit}>
<div>
<label className="block text-gray-800 font-medium">
customer firstname:
First Name:
</label>
<input
type="text"
name="firstname"
value={customerData.firstname}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
customer lastname:
Last Name:
</label>
<input
type="text"
name="lastname"
value={customerData.lastname}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
age:
Age:
</label>
<input
type="number"
name="age"
value={customerData.age}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
gender:
Gender:
</label>
<select
name="gender"
value={customerData.gender}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
>
<option value="" disabled>
select gender
Select Gender
</option>
<option value="male">male</option>
<option value="female">female</option>
<option value="other">other</option>
<option value="male">Male</option>
<option value="female">Female</option>
<option value="other">Other</option>
</select>
</div>
<div>
<label className="block text-gray-800 font-medium">
email:
Email:
</label>
<input
type="email"
name="email"
value={customerData.email}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
address line 1:
Address Line 1:
</label>
<input
type="text"
name="address_line_1"
value={customerData.address_line_1}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
address line 2:
Address Line 2:
</label>
<input
type="text"
name="address_line_2"
value={customerData.address_line_2}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
nearby landmark:
Nearby Landmark:
</label>
<input
type="text"
name="nearby_landmark"
value={customerData.nearby_landmark}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
pincode:
Pincode:
</label>
<input
type="text"
name="pincode"
value={customerData.pincode}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div>
<label className="block text-gray-800 font-medium">
city:
City:
</label>
<select
name="city_id"
value={customerData.city_id}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
>
<option value="" disabled>
select city
Select City
</option>
{Array.isArray(cities) &&
cities.map((city) => (
@ -277,22 +278,22 @@ const AddCustomer = () => {
</div>
<div>
<label className="block text-gray-800 font-medium">
mobile:
Mobile:
</label>
<input
type="tel"
name="mobile"
value={customerData.mobile}
onChange={handleInputChange}
className="input-underline w-full p-2 border-b border-gray-400 focus:border-gray-700"
className="w-full p-2 border-b border-gray-400 focus:border-gray-700"
/>
</div>
<div className="flex justify-end">
<button
type="submit"
className="bg-#0e355b text-white py-2 px-4 rounded-md"
className="bg-[#0e355b] text-white py-2 px-4 rounded-md"
>
add customer
Add Customer
</button>
</div>
</form>

View File

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import Sidebar from '../sidebar/Sidebar';
import axiosInstance from '../../api/axiosConfig';
import '../../styles/CustomerList.css';
const CustomerList = () => {
const [customers, setCustomers] = useState([]);

View File

@ -3,13 +3,15 @@ import { Button, Input, Form } from 'antd';
import { Link } from 'react-router-dom';
import axios from 'axios';
import Sidebar from '../sidebar/Sidebar';
import '../../styles/CustomerMeasurements.css';
const CustomerMeasurements = () => {
const onFinish = async (values) => {
const token = localStorage.getItem('token'); // Assuming the token is stored in localStorage
try {
const response = await axios.post('http://localhost:8080/measurements', values, {
const response = await axios.post('http://localhost:5000/measurements', values, {
headers: {
Authorization: `Bearer ${token}`,
},
@ -22,56 +24,56 @@ const CustomerMeasurements = () => {
};
return (
<div className="flex flex-row">
<div className="container">
<Sidebar />
<div className="w-full flex flex-col min-h-screen text-white">
<div className="min-h-screen text-#4b5563 p-6">
<div className="flex justify-between items-center mb-6">
<h1 className="text-2xl font-semibold text-#0e355b">customer measurements</h1>
<Link to="/CategoryList" className="text-#0e355b">skip for now</Link>
<div className="content">
<div className="form-container">
<div className="header">
<h1 className="text-2xl font-semibold text-[#0e355b]">Customer Measurements</h1>
<Link to="/CategoryList" className="skip-link">Skip for now</Link>
</div>
<Form onFinish={onFinish} className="space-y-4">
<h2 className="text-lg font-semibold text-#0e355b">upper body measurements</h2>
<Form.Item name="neck" label={<span className="text-#0e355b">neck circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form onFinish={onFinish} className="form">
<h2 className="section-title">Upper Body Measurements</h2>
<Form.Item name="neck" label="Neck Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="chest" label={<span className="text-#0e355b">chest circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="chest" label="Chest Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="waist" label={<span className="text-#0e355b">waist circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="waist" label="Waist Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="shoulder" label={<span className="text-#0e355b">shoulder width (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="shoulder" label="Shoulder Width (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="arm" label={<span className="text-#0e355b">arm length (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="arm" label="Arm Length (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="sleeve" label={<span className="text-#0e355b">sleeve length (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="sleeve" label="Sleeve Length (in inch)">
<Input className="input" />
</Form.Item>
<h2 className="text-lg font-semibold text-#0e355b">lower body measurements</h2>
<Form.Item name="hip" label={<span className="text-#0e355b">hip circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<h2 className="section-title">Lower Body Measurements</h2>
<Form.Item name="hip" label="Hip Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="inseam" label={<span className="text-#0e355b">inseam (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="inseam" label="Inseam (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="outseam" label={<span className="text-#0e355b">out seam (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="outseam" label="Outseam (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="thigh" label={<span className="text-#0e355b">thigh circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 focus:ring-0" />
<Form.Item name="thigh" label="Thigh Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item name="ankle" label={<span className="text-#0e355b">ankle circumference (in inch)</span>}>
<Input className="w-full border-0 border-b border-gray-400 focus:border-#4b5563 " />
<Form.Item name="ankle" label="Ankle Circumference (in inch)">
<Input className="input" />
</Form.Item>
<Form.Item>
<div className="text-center">
<button type="submit" className="bg-#0e355b text-#d1d5db px-4 py-2 rounded-md text-sm">
save measurements
</button>
<div className="button-container">
<Button type="primary" htmlType="submit" className="submit-button">
Save Measurements
</Button>
</div>
</Form.Item>
</Form>

View File

@ -1,19 +0,0 @@
.dashboard {
padding: 20px;
background-color: #ffffff;
}
.dashboard-title {
font-size: 24px;
margin-bottom: 20px;
}
.dashboard-content {
display: flex;
flex-direction: column;
align-items: center;
}
.dashboard-content .ant-btn {
margin: 10px 0;
}

View File

@ -1,13 +1,25 @@
import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import Sidebar from '../sidebar/Sidebar';
import '../../styles/EmployeeDashboard.css';
const HomePage = () => {
const classNames = {
container: 'dashboard-container',
content: 'dashboard-content',
header: 'dashboard-header',
headerTitle: 'header-title',
welcomeText: 'welcome-text',
main: 'dashboard-main',
mainContent: 'dashboard-main-content',
image: 'dashboard-image',
button: 'btn-primary',
};
const EmployeeDashboard = () => {
const navigate = useNavigate();
const [userName, setUserName] = useState('');
useEffect(() => {
// Fetch user name from localStorage or state management
const user = JSON.parse(localStorage.getItem('user'));
if (user && user.name) {
setUserName(user.name);
@ -15,41 +27,41 @@ const HomePage = () => {
}, []);
const handleClick = (link) => {
navigate(link); // Redirect to the provided link
navigate(link);
};
return (
<div className="flex flex-row">
<div className={classNames.container}>
<Sidebar />
<div className="w-full flex flex-col min-h-screen text-white">
<header className="w-full p-4 flex justify-between items-center">
<div className={classNames.content}>
<header className={classNames.header}>
<div className="flex items-center">
<h1 className="text-#0e355b text-2xl font-bold">home</h1>
<h1 className={classNames.headerTitle}>Home</h1>
</div>
<div>
<p className="text-#4b5563">welcome back, {userName}</p>
<p className={classNames.welcomeText}>Welcome back, {userName}</p>
</div>
</header>
<main className="flex-1 flex flex-col items-center justify-center p-6">
<div className="w-full max-w-3xl text-center">
<img src="path_to_image" alt="Suit" className="w-full rounded-md mb-6" />
<main className={classNames.main}>
<div className={classNames.mainContent}>
<img src="path_to_image" alt="Suit" className={classNames.image} />
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className={classNames.button}
onClick={() => handleClick('/customers')}
>
create a new order
Create a New Order
</button>
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className={classNames.button}
onClick={() => handleClick('')}
>
view orders
View Orders
</button>
<button
className="w-full py-4 bg-#0e355b text-#d1d5db rounded-md font-semibold mb-4 hover:bg-#154676"
className={classNames.button}
onClick={() => handleClick('')}
>
view customers
View Customers
</button>
</div>
</main>
@ -58,4 +70,4 @@ const HomePage = () => {
);
};
export default HomePage;
export default EmployeeDashboard;

View File

@ -1,10 +1,8 @@
// src/components/sidebar/AdminSidebar.js
import React, { useState } from 'react';
import { Layout, Drawer, Button } from 'antd';
import { Layout } from 'antd';
import { Link } from 'react-router-dom';
import {
MenuFoldOutlined,
MenuUnfoldOutlined,
} from '@ant-design/icons';
import BrookslogoIcon from '../../assets/thob-data/BrookslogoIcon.svg';
import HomeIcon from '../../assets/thob-data/HomeIcon.svg';
import AddCustomerIcon from '../../assets/thob-data/AddCustomerIcon.svg';
@ -15,61 +13,62 @@ import EmployeeIcon from '../../assets/thob-data/EmployeeIcon.svg';
import MeasurmentsIcon from '../../assets/thob-data/MeasurmentsIcon.svg';
import ProfileIcon from '../../assets/thob-data/ProfileIcon.svg';
import LogoutIcon from '../../assets/thob-data/LogoutIcon.svg';
import '../../styles/AdminSidebar.css'; // Import the CSS file
const { Sider } = Layout;
const classNames = {
sider: 'desktop-sidebar',
logoContainer: 'flex items-center justify-center h-16 w-16 m-5 bg-white',
iconContainer: 'flex flex-col items-center',
iconLink: 'my-6',
icon: 'hover:opacity-75 sidebar-icon',
};
const AdminSidebar = () => {
const [visible, setVisible] = useState(false);
const showDrawer = () => {
setVisible(true);
};
const closeDrawer = () => {
setVisible(false);
};
return (
<>
<Sider
className="desktop-sidebar"
className={classNames.sider}
breakpoint="lg"
collapsedWidth="0"
width={80}
style={{ height: '100vh' }}
>
<div className="flex items-center justify-center h-16 w-16 m-5 bg-white" style={{ width: '40px', height: '40px', marginTop: '16px', marginLeft: '20px' }}>
<Link to="/admin" className="my-6">
<img src={BrookslogoIcon} alt="Home" className="hover:opacity-75 sidebar-icon" />
<div className={classNames.logoContainer} style={{ width: '40px', height: '40px', marginTop: '16px', marginLeft: '20px' }}>
<Link to="/admin" className={classNames.iconLink}>
<img src={BrookslogoIcon} alt="Home" className={classNames.icon} />
</Link>
</div>
<div className="flex flex-col items-center">
<Link to="/admin" className="my-6">
<img src={HomeIcon} alt="Home" className="hover:opacity-75 sidebar-icon" />
<div className={classNames.iconContainer}>
<Link to="/admin" className={classNames.iconLink}>
<img src={HomeIcon} alt="Home" className={classNames.icon} />
</Link>
<Link to="/admin/categories" className="my-6">
<img src={CategoriesIcon} alt="Categories" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/categories" className={classNames.iconLink}>
<img src={CategoriesIcon} alt="Categories" className={classNames.icon} />
</Link>
<Link to="/admin/add-customer" className="my-6">
<img src={AddCustomerIcon} alt="Add Customer" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/add-customer" className={classNames.iconLink}>
<img src={AddCustomerIcon} alt="Add Customer" className={classNames.icon} />
</Link>
<Link to="/admin/orders" className="my-6">
<img src={OrdersIcon} alt="Orders" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/orders" className={classNames.iconLink}>
<img src={OrdersIcon} alt="Orders" className={classNames.icon} />
</Link>
<Link to="/admin/catalog" className="my-6">
<img src={CatalogIcon} alt="Catalog" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/catalog" className={classNames.iconLink}>
<img src={CatalogIcon} alt="Catalog" className={classNames.icon} />
</Link>
<Link to="/employees" className="my-6">
<img src={EmployeeIcon} alt="Employee" className="hover:opacity-75 sidebar-icon" />
<Link to="/employees" className={classNames.iconLink}>
<img src={EmployeeIcon} alt="Employee" className={classNames.icon} />
</Link>
<Link to="/admin/measurements" className="my-6">
<img src={MeasurmentsIcon} alt="Measurements" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/measurements" className={classNames.iconLink}>
<img src={MeasurmentsIcon} alt="Measurements" className={classNames.icon} />
</Link>
<Link to="/admin/profile" className="my-6">
<img src={ProfileIcon} alt="Profile" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/profile" className={classNames.iconLink}>
<img src={ProfileIcon} alt="Profile" className={classNames.icon} />
</Link>
<Link to="/admin/logout" className="my-6">
<img src={LogoutIcon} alt="Logout" className="hover:opacity-75 sidebar-icon" />
<Link to="/admin/logout" className={classNames.iconLink}>
<img src={LogoutIcon} alt="Logout" className={classNames.icon} />
</Link>
</div>
</Sider>

View File

@ -8,45 +8,56 @@ import OrdersIcon from '../../assets/thob-data/OrdersIcon.svg';
import CategoriesIcon from '../../assets/thob-data/CategoriesIcon.svg';
import ProfileIcon from '../../assets/thob-data/ProfileIcon.svg';
import LogoutIcon from '../../assets/thob-data/LogoutIcon.svg';
import '../../styles/EmployeeSidebar.css';
const { Sider } = Layout;
const classNames = {
sider: 'desktop-sidebar',
container: 'flex flex-col items-center mt-4',
logoContainer: 'flex items-center justify-center h-16 w-16 mb-5 bg-white',
iconContainer: 'flex flex-col items-center flex-grow',
iconLink: 'my-6',
icon: 'hover:opacity-75 sidebar-icon',
logoutContainer: 'flex items-center justify-center mb-4',
};
const EmployeeSidebar = () => {
return (
<Sider
className="desktop-sidebar"
className={classNames.sider}
breakpoint="lg"
collapsedWidth="0"
width={70}
style={{ height: '100vh', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}
>
<div className="flex flex-col items-center mt-4">
<div className="flex items-center justify-center h-16 w-16 mb-5 bg-white">
<div className={classNames.container}>
<div className={classNames.logoContainer}>
<Link to="">
<img src={BrookslogoIcon} alt="Brooks Bingham Logo" className="hover:opacity-75 sidebar-icon" />
<img src={BrookslogoIcon} alt="Brooks Bingham Logo" className={classNames.icon} />
</Link>
</div>
<div className="flex flex-col items-center flex-grow">
<Link to="/employee/home" className="my-6">
<img src={HomeIcon} alt="Home" className="hover:opacity-75 sidebar-icon" />
<div className={classNames.iconContainer}>
<Link to="/employee/home" className={classNames.iconLink}>
<img src={HomeIcon} alt="Home" className={classNames.icon} />
</Link>
<Link to="/employee/categories" className="my-6">
<img src={CategoriesIcon} alt="Categories" className="hover:opacity-75 sidebar-icon" />
<Link to="/employee/categories" className={classNames.iconLink}>
<img src={CategoriesIcon} alt="Categories" className={classNames.icon} />
</Link>
<Link to="/customers" className="my-6">
<img src={AddCustomerIcon} alt="Add Customer" className="hover:opacity-75 sidebar-icon" />
<Link to="/customers" className={classNames.iconLink}>
<img src={AddCustomerIcon} alt="Add Customer" className={classNames.icon} />
</Link>
<Link to="/employee/orders" className="my-6">
<img src={OrdersIcon} alt="Orders" className="hover:opacity-75 sidebar-icon" />
<Link to="/employee/orders" className={classNames.iconLink}>
<img src={OrdersIcon} alt="Orders" className={classNames.icon} />
</Link>
<Link to="/employee/profile" className="my-6">
<img src={ProfileIcon} alt="Profile" className="hover:opacity-75 sidebar-icon" />
<Link to="/employee/profile" className={classNames.iconLink}>
<img src={ProfileIcon} alt="Profile" className={classNames.icon} />
</Link>
</div>
</div>
<div className="flex items-center justify-center mb-4">
<div className={classNames.logoutContainer}>
<Link to="/employee/logout">
<img src={LogoutIcon} alt="Logout" className="hover:opacity-75 sidebar-icon" />
<img src={LogoutIcon} alt="Logout" className={classNames.icon} />
</Link>
</div>
</Sider>

135
src/styles/AddCustomer.css Normal file
View File

@ -0,0 +1,135 @@
.container {
display: flex;
flex-direction: row;
}
.main-content {
flex: 1;
display: flex;
flex-direction: column;
min-height: 100vh;
color: #e8e8e8;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.header-title {
display: flex;
align-items: center;
margin-bottom: 1.5rem;
}
.back-link {
color: #0e355b;
font-size: 1.25rem;
margin-right: 1rem;
}
.page-title {
font-size: 1.5rem;
font-weight: 600;
color: #0e355b;
}
.skip-link {
color: #0e355b;
}
.sidebar-content {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.image-upload-container {
position: relative;
width: 6rem;
height: 6rem;
margin: 0 auto;
}
.image-preview {
background-color: #d1d5db;
width: 100%;
height: 100%;
border-radius: 9999px;
overflow: hidden;
}
.image-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.no-image {
display: flex;
align-items: center;
justify-content: center;
color: #6b7280;
}
.upload-button {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
background-color: #0e355b;
color: #fff;
font-size: 0.75rem;
padding: 0.5rem;
border-radius: 9999px;
}
.section-title {
font-size: 1.125rem;
font-weight: 600;
}
.form-group {
margin-bottom: 1rem;
display: flex;
flex-direction: column;
}
.form-label {
display: underline;
color: #4b5563;
font-weight: 500;
}
.form-input,
.form-select {
width: 100%;
padding: 0.5rem;
border: 1px solid #d1d5db;
border-radius: 0.375rem;
}
.form-input:focus,
.form-select:focus {
border-color: #e8e8e8;
}
.submit-button {
background-color: #0e355b;
color: #d1d5db;
padding: 0.5rem 1rem;
border-radius: 0.375rem;
align-self: flex-end;
}
.form-row {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.form-row .form-group {
flex: 1;
}

View File

@ -0,0 +1,52 @@
/* styles.css */
.text-primary {
color: #0e355b;
}
.bg-primary {
background-color: #0e355b;
}
.text-secondary {
color: #4b5563; /* Adjusted to a more standard color */
}
.bg-light {
background-color: #ffffff;
}
.border-input {
border-bottom: 1px solid #ddd; /* Adjusted to a lighter gray */
}
.focus-border {
border-color: #e8e8e8; /* Adjusted to a more standard color */
}
.input-underline {
border: none;
border-bottom: 1px solid #ddd; /* Adjusted to a lighter gray */
}
.btn-primary {
background-color: #0e355b;
color: white;
padding: 0.5rem 1rem;
border-radius: 0.25rem;
font-weight: 600;
}
.image-upload-btn {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
background-color: #555; /* Adjusted to a more standard gray */
color: white;
font-size: 0.75rem;
padding: 0.25rem 0.5rem;
border-radius: 9999px;
border: none; /* Ensure no border is applied */
}

View File

@ -0,0 +1,69 @@
/* Dashboard.css */
.dashboard-container {
display: flex;
flex-direction: row;
}
.dashboard-content {
width: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
color: white;
}
.dashboard-header {
width: 100%;
padding: 1rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.header-title {
color: #0e355b;
font-size: 2rem;
font-weight: bold;
}
.welcome-text {
color: #4b5563;
}
.dashboard-main {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1.5rem;
}
.dashboard-buttons {
width: 100%;
max-width: 48rem;
text-align: center;
}
.dashboard-image {
width: 100%;
border-radius: 0.375rem;
margin-bottom: 1.5rem;
}
.btn-primary {
width: 100%;
padding: 1rem;
background-color: #0e355b;
color: #d1d5db;
border-radius: 0.375rem;
font-weight: 600;
margin-bottom: 1rem;
transition: background-color 0.3s ease;
}
.btn-primary:hover {
background-color: #154676;
}

View File

@ -0,0 +1,45 @@
/* .desktop-sidebar {
}
.sidebar-icon {
} */
.hover\:opacity-75:hover {
opacity: 0.75;
}
.flex {
display: flex;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.h-16 {
height: 4rem; /* 64px */
}
.w-16 {
width: 4rem; /* 64px */
}
.m-5 {
margin: 1.25rem; /* 20px */
}
.bg-white {
background-color: #ffffff;
}
.my-6 {
margin-top: 1.5rem; /* 24px */
margin-bottom: 1.5rem; /* 24px */
}

View File

@ -0,0 +1,79 @@
/* Container styles */
.container {
display: flex;
flex-direction: row;
}
/* Content styles */
.content {
width: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
color: #ffffff;
}
/* Form container styles */
.form-container {
min-height: 100vh;
color: #4b5563;
padding: 1.5rem;
}
/* Header styles */
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.title {
font-size: 2rem;
font-weight: 600;
color: #0e355b;
}
.skip-link {
color: #0e355b;
}
/* Form styles */
.form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.section-title {
font-size: 1.125rem;
font-weight: 600;
color: #0e355b;
}
/* Input styles */
.input {
width: 100%;
border: 0;
border-bottom: 1px solid #d1d5db;
}
.input:focus {
border-color: #4b5563;
box-shadow: none;
}
/* Button container styles */
.button-container {
text-align: center;
}
/* Submit button styles */
.submit-button {
background-color: #0e355b;
color: #d1d5db;
padding: 0.5rem 1rem;
border-radius: 0.375rem;
font-size: 0.875rem;
}

View File

@ -0,0 +1,67 @@
.dashboard-container {
display: flex;
flex-direction: row;
}
.dashboard-content {
width: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
color: white;
}
.dashboard-header {
width: 100%;
padding: 1rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.header-title {
color: #0e355b;
font-size: 2rem;
font-weight: bold;
}
.welcome-text {
color: #4b5563;
}
.dashboard-main {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1.5rem;
}
.dashboard-main-content {
width: 100%;
max-width: 768px;
text-align: center;
}
.dashboard-image {
width: 100%;
border-radius: 0.375rem;
margin-bottom: 1.5rem;
}
.btn-primary {
width: 100%;
padding: 1rem;
background-color: #0e355b;
color: #d1d5db;
border-radius: 0.375rem;
font-weight: 600;
margin-bottom: 1rem;
cursor: pointer;
}
.btn-primary:hover {
background-color: #154676;
}

View File

@ -0,0 +1,62 @@
/* .desktop-sidebar {
}
.sidebar-icon {
} */
.hover\:opacity-75:hover {
opacity: 0.75;
}
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.h-16 {
height: 4rem; /* 64px */
}
.w-16 {
width: 4rem; /* 64px */
}
.mb-5 {
margin-bottom: 1.25rem; /* 20px */
}
.mt-4 {
margin-top: 1rem; /* 16px */
}
.bg-white {
background-color: #ffffff;
}
.flex-grow {
flex-grow: 1;
}
.my-6 {
margin-top: 1.5rem; /* 24px */
margin-bottom: 1.5rem; /* 24px */
}
.mb-4 {
margin-bottom: 1rem; /* 16px */
}

View File

272
yarn.lock
View File

@ -75,7 +75,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz"
integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5":
"@babel/core@^7.24.5":
version "7.24.7"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz"
integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==
@ -286,6 +286,121 @@
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
"@esbuild/aix-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
"@esbuild/android-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
"@esbuild/android-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
"@esbuild/android-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
"@esbuild/darwin-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
"@esbuild/darwin-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
"@esbuild/freebsd-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
"@esbuild/freebsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
"@esbuild/linux-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
"@esbuild/linux-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
"@esbuild/linux-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
"@esbuild/linux-loong64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
"@esbuild/linux-mips64el@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
"@esbuild/linux-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
"@esbuild/linux-riscv64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
"@esbuild/linux-s390x@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
"@esbuild/linux-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
"@esbuild/netbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
"@esbuild/openbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
"@esbuild/sunos-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
"@esbuild/win32-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
"@esbuild/win32-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
"@esbuild/win32-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
"@eslint-community/eslint-utils@^4.2.0":
version "4.4.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
@ -323,7 +438,7 @@
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz"
integrity sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==
"@fortawesome/fontawesome-svg-core@^6.6.0", "@fortawesome/fontawesome-svg-core@~1 || ~6":
"@fortawesome/fontawesome-svg-core@^6.6.0":
version "6.6.0"
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz"
integrity sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==
@ -415,7 +530,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -516,6 +631,86 @@
resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz"
integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==
"@rollup/rollup-android-arm-eabi@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27"
integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==
"@rollup/rollup-android-arm64@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203"
integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==
"@rollup/rollup-darwin-arm64@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096"
integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==
"@rollup/rollup-darwin-x64@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c"
integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==
"@rollup/rollup-linux-arm-gnueabihf@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8"
integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==
"@rollup/rollup-linux-arm-musleabihf@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549"
integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==
"@rollup/rollup-linux-arm64-gnu@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577"
integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==
"@rollup/rollup-linux-arm64-musl@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c"
integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==
"@rollup/rollup-linux-powerpc64le-gnu@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf"
integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==
"@rollup/rollup-linux-riscv64-gnu@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9"
integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==
"@rollup/rollup-linux-s390x-gnu@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec"
integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==
"@rollup/rollup-linux-x64-gnu@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942"
integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==
"@rollup/rollup-linux-x64-musl@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d"
integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==
"@rollup/rollup-win32-arm64-msvc@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf"
integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==
"@rollup/rollup-win32-ia32-msvc@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54"
integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==
"@rollup/rollup-win32-x64-msvc@4.18.0":
version "4.18.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4"
integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==
"@tinyhttp/accepts@2.2.2":
version "2.2.2"
resolved "https://registry.npmjs.org/@tinyhttp/accepts/-/accepts-2.2.2.tgz"
@ -723,7 +918,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0:
acorn@^8.9.0:
version "8.12.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz"
integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==
@ -1001,7 +1196,7 @@ braces@^3.0.3, braces@~3.0.2:
dependencies:
fill-range "^7.1.1"
browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0":
browserslist@^4.22.2, browserslist@^4.23.0:
version "4.23.1"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz"
integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==
@ -1074,7 +1269,7 @@ chokidar@^3.5.3, chokidar@^3.6.0:
optionalDependencies:
fsevents "~2.3.2"
classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1, classnames@2.x:
classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
version "2.5.1"
resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
@ -1093,16 +1288,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
@ -1183,7 +1378,7 @@ data-view-byte-offset@^1.0.0:
es-errors "^1.3.0"
is-data-view "^1.0.1"
dayjs@^1.11.11, "dayjs@>= 1.x":
dayjs@^1.11.11:
version "1.11.11"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz"
integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==
@ -1498,7 +1693,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.57.0, eslint@>=7:
eslint@^8.57.0:
version "8.57.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz"
integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
@ -1688,6 +1883,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@ -1733,7 +1933,7 @@ get-symbol-description@^1.0.2:
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
glob-parent@^5.1.2:
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@ -1747,13 +1947,6 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob@^10.3.10:
version "10.4.2"
resolved "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz"
@ -1856,7 +2049,7 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
dependencies:
function-bind "^1.1.2"
header-range-parser@^1.1.3, header-range-parser@1.1.3:
header-range-parser@1.1.3, header-range-parser@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/header-range-parser/-/header-range-parser-1.1.3.tgz"
integrity sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==
@ -2585,13 +2778,13 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.38, postcss@>=8.0.9:
version "8.4.38"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
postcss@^8.4.23, postcss@^8.4.38, postcss@^8.4.39:
version "8.4.39"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz"
integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.0"
picocolors "^1.0.1"
source-map-js "^1.2.0"
prelude-ls@^1.2.1:
@ -2979,7 +3172,7 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2:
rc-resize-observer "^1.0.0"
rc-util "^5.36.0"
react-dom@*, react-dom@^18.2.0, react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.8, react-dom@>=16.9.0:
react-dom@^18.2.0:
version "18.3.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
@ -3017,7 +3210,7 @@ react-router@6.23.1:
dependencies:
"@remix-run/router" "1.16.1"
react@*, "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, react@^18.3.1, react@>=16.0.0, react@>=16.11.0, react@>=16.3, react@>=16.8, react@>=16.9.0:
react@^18.2.0:
version "18.3.1"
resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
@ -3081,16 +3274,7 @@ resolve-from@^4.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve@^1.1.7:
version "1.22.8"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^1.22.2:
resolve@^1.1.7, resolve@^1.22.2:
version "1.22.8"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
@ -3406,10 +3590,10 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
tailwindcss@^3.4.4:
version "3.4.4"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz"
integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==
tailwindcss@^3.4.6:
version "3.4.6"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz"
integrity sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==
dependencies:
"@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
@ -3581,7 +3765,7 @@ util-deprecate@^1.0.2:
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
"vite@^4.2.0 || ^5.0.0", vite@^5.2.0:
vite@^5.2.0:
version "5.3.1"
resolved "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz"
integrity sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==