From 567dfb7e6b9fc38d62e426c480da0a298e7966a4 Mon Sep 17 00:00:00 2001 From: atyabbin Date: Sun, 23 Jun 2024 11:13:59 +0530 Subject: [PATCH 1/2] Added options for delete account and update subscription --- infra/staff/package.json | 5 +- infra/staff/src/App.css | 333 ++++++++++++++++++ infra/staff/src/App.tsx | 12 +- infra/staff/src/components/Sidebar.tsx | 99 +++++- .../src/components/UpdateSubscription.tsx | 183 ++++++++++ 5 files changed, 611 insertions(+), 21 deletions(-) create mode 100644 infra/staff/src/components/UpdateSubscription.tsx diff --git a/infra/staff/package.json b/infra/staff/package.json index d81c891868..6939e38937 100644 --- a/infra/staff/package.json +++ b/infra/staff/package.json @@ -11,12 +11,15 @@ "preview": "vite preview" }, "dependencies": { + "date-fns": "^3.6.0", "react": "^18", + "react-datepicker": "^7.1.0", "react-dom": "^18", "react-toastify": "^10.0.5", "zod": "^3" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^15.2.3", "@types/react": "^18", "@types/react-dom": "^18", "@typescript-eslint/eslint-plugin": "^7", @@ -29,7 +32,7 @@ "prettier": "^3", "prettier-plugin-organize-imports": "^3.2", "prettier-plugin-packagejson": "^2.5", - "typescript": "^5.4.5", + "typescript": "^5", "vite": "^5.2" }, "packageManager": "yarn@1.22.21" diff --git a/infra/staff/src/App.css b/infra/staff/src/App.css index 4e7c66ce7a..8e702df72d 100644 --- a/infra/staff/src/App.css +++ b/infra/staff/src/App.css @@ -19,6 +19,21 @@ border-radius: 5px; margin-top: 20px; } +#submitbtn{ + + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + background-color: #009879; + color: white; + border: none; + border-radius: 5px; + margin-top: 20px; +} + +#submitbtn:hover { + background-color: #007c6c; +} .fetch-button-container button:hover { background-color: #007c6c; @@ -122,3 +137,321 @@ button { .dropdown-menu button:hover { background-color: #f0f0f0; } +.modal { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: #ffffff; + padding: 20px; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + z-index: 1000; + max-width: 80%; + max-height: 80%; + overflow: auto; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 10px; + border-bottom: 1px solid #ccc; +} + +.modal-header .close-btn { + cursor: pointer; + color: #777; + font-size: 20px; +} + +.modal-content { + margin-top: 10px; +} + +/* Styles for draggable modal */ +.modal.draggable { + cursor: move; +} + +.modal.draggable .modal-header { + cursor: move; +} +.popup { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: lightgreen; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + z-index: 1000; +} + +.popup-content { + display: flex; + flex-direction: column; +} + +.popup-content div { + margin-bottom: 10px; +} +:root { + --popup-bg-color-light: #fff; + --popup-bg-color-dark: #2c2c2c; + --popup-border-color-light: #ccc; + --popup-border-color-dark: #444; + --popup-text-color-light: #000; + --popup-text-color-dark: #fff; + --popup-shadow-light: rgba(0, 0, 0, 0.1); + --popup-shadow-dark: rgba(255, 255, 255, 0.1); +} + +.update-subscription-popup { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + transform: translate(-50%, -50%); + background-color: var(--popup-bg-color-light); + border: 1px solid var(--popup-border-color-light); + padding: 20px; + z-index: 1000; + box-shadow: 0px 0px 10px var(--popup-shadow-light); +} + +.popup-content { + display: flex; + flex-direction: column; +} + +.close-button { + align-self: flex-end; + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--popup-text-color-light); +} + +.popup-content h2 { + margin-top: 0; +} + +.popup-content form label { + display: block; + margin-bottom: 10px; +} + +.popup-content form input, +.popup-content form select { + width: 100%; + padding: 8px; + margin-top: 5px; + background-color: var(--popup-bg-color-light); + color: var(--popup-text-color-light); + border: 1px solid var(--popup-border-color-light); +} + +.popup-content form button { + padding: 10px 15px; + margin-top: 10px; + cursor: pointer; + background-color: var(--popup-bg-color-light); + color: var(--popup-text-color-light); + border: 1px solid var(--popup-border-color-light); +} + +.custom-select { + position: relative; + width: 100%; +} + +.custom-select select { + width: 100%; + padding: 8px; + cursor: pointer; + background-color: var(--popup-bg-color-light); + color: var(--popup-text-color-light); + border: 1px solid var(--popup-border-color-light); + appearance: none; +} + +.custom-select::after { + content: "\25BC"; + position: absolute; + top: 50%; + right: 10px; + transform: translateY(-50%); + pointer-events: none; +} + +.message { + margin-top: 10px; + padding: 10px; + border-radius: 5px; +} + +.message.error { + background-color: #f8d7da; + color: #721c24; +} + +.message.success { + background-color: #d4edda; + color: #155724; +} + +@media (prefers-color-scheme: dark) { + .update-subscription-popup { + background-color: var(--popup-bg-color-dark); + border-color: var(--popup-border-color-dark); + color: var(--popup-text-color-dark); + box-shadow: 0px 0px 10px var(--popup-shadow-dark); + } + + .close-button { + color: var(--popup-text-color-dark); + } + + .popup-content form input, + .popup-content form select { + background-color: var(--popup-bg-color-dark); + color: var(--popup-text-color-dark); + border: 1px solid var(--popup-border-color-dark); + } + + .popup-content form button { + background-color: var(--popup-bg-color-dark); + color: var(--popup-text-color-dark); + border: 1px solid var(--popup-border-color-dark); + } +} +:root { + --popup-bg-color-light: #fff; + --popup-bg-color-dark: #2c2c2c; + --popup-border-color-light: #ccc; + --popup-border-color-dark: #444; + --popup-text-color-light: #000; + --popup-text-color-dark: #fff; + --popup-shadow-light: rgba(0, 0, 0, 0.1); + --popup-shadow-dark: rgba(255, 255, 255, 0.1); +} + +.update-subscription-popup { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: var(--popup-bg-color-light); + border: 1px solid var(--popup-border-color-light); + padding: 20px; + z-index: 1000; + box-shadow: 0px 0px 10px var(--popup-shadow-light); +} + +.popup-content { + display: flex; + flex-direction: column; +} + +.close-button { + align-self: flex-end; + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--popup-text-color-light); +} + +.popup-content h2 { + margin-top: 0; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 5px; +} + +.form-group input, +.form-group select { + width: 100%; + padding: 8px; + background-color: var(--popup-bg-color-light); + color: var(--popup-text-color-light); + border: 1px solid var(--popup-border-color-light); + border-radius: 5px; + margin-top: 5px; +} + +.custom-select { + position: relative; + width: 100%; +} + +.custom-select select { + width: 100%; + padding: 8px; + cursor: pointer; + background-color: var(--popup-bg-color-light); + color: var(--popup-text-color-light); + border: 1px solid var(--popup-border-color-light); + appearance: none; +} + +.custom-select::after { + content: "\25BC"; + position: absolute; + top: 50%; + right: 10px; + transform: translateY(-50%); + pointer-events: none; +} + +.message { + margin-top: 10px; + padding: 10px; + border-radius: 5px; +} + +.message.error { + background-color: #f8d7da; + color: #721c24; +} + +.message.success { + background-color: #d4edda; + color: #155724; +} + +@media (prefers-color-scheme: dark) { + .update-subscription-popup { + background-color: var(--popup-bg-color-dark); + border-color: var(--popup-border-color-dark); + color: var(--popup-text-color-dark); + box-shadow: 0px 0px 10px var(--popup-shadow-dark); + } + + .close-button { + color: var(--popup-text-color-dark); + } + + .form-group input, + .form-group select { + background-color: var(--popup-bg-color-dark); + color: var(--popup-text-color-dark); + border: 1px solid var(--popup-border-color-dark); + } + + .form-group button { + background-color: var(--popup-bg-color-dark); + color: var(--popup-text-color-dark); + border: 1px solid var(--popup-border-color-dark); + } +} diff --git a/infra/staff/src/App.tsx b/infra/staff/src/App.tsx index e27c24ccbf..bad145673b 100644 --- a/infra/staff/src/App.tsx +++ b/infra/staff/src/App.tsx @@ -15,7 +15,7 @@ export const App: React.FC = () => { const [email, setEmail] = useState(""); const [userData, setUserData] = useState(null); const [error, setError] = useState(null); - const [isDataFetched, setIsDataFetched] = useState(false); // Track if data has been fetched successfully + const [isDataFetched, setIsDataFetched] = useState(false); useEffect(() => { const storedToken = localStorage.getItem("token"); @@ -46,11 +46,11 @@ export const App: React.FC = () => { console.log("API Response:", userDataResponse); setUserData(userDataResponse); setError(null); - setIsDataFetched(true); // Set to true when data is successfully fetched + setIsDataFetched(true); } catch (error) { console.error("Error fetching data:", error); setError((error as Error).message); - setIsDataFetched(false); // Set to false if there's an error fetching data + setIsDataFetched(false); } }; @@ -113,7 +113,7 @@ export const App: React.FC = () => { displayValue = value; } } else if (typeof value === "object" && value !== null) { - displayValue = JSON.stringify(value, null, 2); // Pretty print JSON + displayValue = JSON.stringify(value, null, 2); } else if (value === null) { displayValue = "null"; } else if ( @@ -124,7 +124,7 @@ export const App: React.FC = () => { } else if (typeof value === "undefined") { displayValue = "undefined"; } else { - displayValue = value as string; // Fallback for any other types + displayValue = value as string; } return ( @@ -157,7 +157,7 @@ export const App: React.FC = () => { const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === "Enter") { - event.preventDefault(); // Prevent form submission + event.preventDefault(); fetchData().catch((error: unknown) => console.error("Fetch data error:", error), ); diff --git a/infra/staff/src/components/Sidebar.tsx b/infra/staff/src/components/Sidebar.tsx index 8e60b98f7c..a16aebf238 100644 --- a/infra/staff/src/components/Sidebar.tsx +++ b/infra/staff/src/components/Sidebar.tsx @@ -1,6 +1,7 @@ -import React, { useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import "../App.css"; import { apiOrigin } from "../services/support"; +import UpdateSubscription from "./UpdateSubscription"; // Import the UpdateSubscription component interface SidebarProps { token: string; @@ -12,18 +13,36 @@ interface UserData { ID: string; }; } +interface ActionResponse { + success?: boolean; + message?: string; +} export const Sidebar: React.FC = ({ token, email }) => { - const [, /*userId*/ setUserId] = useState(null); + const [userId, setUserId] = useState(null); const [error, setError] = useState(null); const [message, setMessage] = useState(null); const [dropdownVisible, setDropdownVisible] = useState(false); + const [showUpdateSubscription, setShowUpdateSubscription] = + useState(false); // State to control UpdateSubscription popup - interface ApiResponse { - data: { - userId: string; + const dropdownRef = useRef(null); + + useEffect(() => { + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); }; - } + }, []); + + const handleClickOutside = (event: MouseEvent) => { + if ( + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) + ) { + setDropdownVisible(false); + } + }; const fetchData = async (): Promise => { if (!email || !token) { @@ -32,9 +51,7 @@ export const Sidebar: React.FC = ({ token, email }) => { } try { - const url = `${apiOrigin}/admin/user?email=${encodeURIComponent( - email, - )}&token=${encodeURIComponent(token)}`; + const url = `${apiOrigin}/admin/user?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}`; const response = await fetch(url); if (!response.ok) { throw new Error("Network response was not ok"); @@ -70,9 +87,7 @@ export const Sidebar: React.FC = ({ token, email }) => { Closefamily: "/admin/user/close-family", }; - const url = `${apiOrigin}${actionUrls[action]}?id=${encodeURIComponent( - userId, - )}&token=${encodeURIComponent(token)}`; + const url = `${apiOrigin}${actionUrls[action]}?id=${encodeURIComponent(userId)}&token=${encodeURIComponent(token)}`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -85,7 +100,7 @@ export const Sidebar: React.FC = ({ token, email }) => { ); } - const result = (await response.json()) as ApiResponse; + const result = (await response.json()) as ActionResponse; console.log("API Response:", result); setMessage(`${action} completed successfully`); @@ -109,8 +124,55 @@ export const Sidebar: React.FC = ({ token, email }) => { } }; + const deleteUser = async () => { + try { + const url = `${apiOrigin}/admin/user/delete?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}`; + const response = await fetch(url, { + method: "DELETE", + }); + + if (!response.ok) { + throw new Error( + `Network response was not ok: ${response.status}`, + ); + } + + setMessage("Delete Account completed successfully"); + setError(null); + setTimeout(() => { + setMessage(null); + }, 1000); + setDropdownVisible(false); + } catch (error) { + console.error(`Error deleting account:`, error); + setError( + error instanceof Error && typeof error.message === "string" + ? error.message + : "An unexpected error occurred", + ); + + setTimeout(() => { + setError(null); + }, 1000); + setMessage(null); + } + }; + const handleActionClick = async (action: string) => { try { + if (action === "UpdateSubscription") { + const fetchedUserId = await fetchData(); + if (fetchedUserId) { + setShowUpdateSubscription(true); + } + return; + } + + if (action === "DeleteAccount") { + await deleteUser(); + return; + } + const fetchedUserId = await fetchData(); if (!fetchedUserId) { throw new Error("Incorrect email id or token"); @@ -140,6 +202,8 @@ export const Sidebar: React.FC = ({ token, email }) => { { value: "Disable2FA", label: "Disable 2FA" }, { value: "Closefamily", label: "Close Family" }, { value: "DisablePasskeys", label: "Disable Passkeys" }, + { value: "DeleteAccount", label: "Delete Account" }, + { value: "UpdateSubscription", label: "Update Subscription" }, // New option added here ]; return ( @@ -149,7 +213,7 @@ export const Sidebar: React.FC = ({ token, email }) => { MORE {dropdownVisible && ( -
+
    {dropdownOptions.map((option) => (
  • @@ -178,6 +242,13 @@ export const Sidebar: React.FC = ({ token, email }) => { {error ? `Error: ${error}` : `Success: ${message}`}
)} + {showUpdateSubscription && userId && ( + setShowUpdateSubscription(false)} + /> + )}
); }; diff --git a/infra/staff/src/components/UpdateSubscription.tsx b/infra/staff/src/components/UpdateSubscription.tsx new file mode 100644 index 0000000000..2794bdb6b8 --- /dev/null +++ b/infra/staff/src/components/UpdateSubscription.tsx @@ -0,0 +1,183 @@ +import React, { useEffect, useState } from "react"; +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import "../App.css"; +interface UpdateSubscriptionProps { + token: string; + userId: string; + onClose: () => void; +} + +export const UpdateSubscription: React.FC = ({ + token, + userId, + onClose, +}) => { + const [expiryTime, setExpiryTime] = useState(null); + const [productId, setProductId] = useState("50gb_monthly"); + const [paymentProvider, setPaymentProvider] = useState("bitpay"); + const [transactionId, setTransactionId] = useState(""); + const [message, setMessage] = useState(null); + const [error, setError] = useState(null); + const [storage, setStorage] = useState(""); + + + useEffect(() => { + if (productId === "50gb_yearly" || productId === "50gb_monthly") { + setStorage(50 * 1024 * 1024 * 1024); + } else if ( + productId === "200gb_yearly" || + productId === "200gb_monthly" + ) { + setStorage(200 * 1024 * 1024 * 1024); + } else if ( + productId === "500gb_yearly" || + productId === "500gb_monthly" + ) { + setStorage(500 * 1024 * 1024 * 1024); + } else if ( + productId === "2000gb_yearly" || + productId === "2000gb_monthly" + ) { + setStorage(2000 * 1024 * 1024 * 1024); + } else { + setStorage(""); + } + }, [productId]); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + + const expiryTimeTimestamp = expiryTime + ? expiryTime.getTime() * 1000 + : ""; + + const url = `http://localhost:8080/admin/user/subscription`; + const body = { + userId, + storage, + expiryTime: expiryTimeTimestamp, + productId, + paymentProvider, + transactionId, + }; + + try { + const response = await fetch(url, { + method: "PUT", + headers: { + "Content-Type": "application/json", + "X-AUTH-TOKEN": token, + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + throw new Error( + `Network response was not ok: ${response.status}`, + ); + } + + setMessage("Subscription updated successfully"); + setError(null); + setTimeout(() => { + setMessage(null); + onClose(); + }, 1000); + } catch (error) { + console.error("Error updating subscription:", error); + setError( + error instanceof Error && typeof error.message === "string" + ? error.message + : "An unexpected error occurred", + ); + setTimeout(() => { + setError(null); + }, 1000); + } + }; + + const handleSubmitWrapper = (event: React.FormEvent) => { + handleSubmit(event).catch((error: unknown) => { + console.error("Error in handleSubmit:", error); + }); + }; + + return ( +
+
+ +

Update Subscription

+
+
+ + setExpiryTime(date)} + dateFormat="dd/MM/yyyy" + showYearDropdown + scrollableYearDropdown + yearDropdownItemNumber={15} + /> +
+
+ + +
+
+ + +
+
+ + setTransactionId(e.target.value)} + /> +
+ +
+ {(error ?? message) && ( +
+ {error ? `Error: ${error}` : `Success: ${message}`} +
+ )} +
+
+ ); +}; + +export default UpdateSubscription; From 206e387834a5a4946e052416d0dd2b5084c01b5f Mon Sep 17 00:00:00 2001 From: atyabbin Date: Sun, 23 Jun 2024 11:37:20 +0530 Subject: [PATCH 2/2] Modified calender for date picking --- infra/staff/src/App.css | 5 +- infra/staff/src/App.tsx | 12 +- .../src/components/UpdateSubscription.tsx | 17 +- infra/staff/yarn.lock | 361 ++++++++++++++++-- 4 files changed, 342 insertions(+), 53 deletions(-) diff --git a/infra/staff/src/App.css b/infra/staff/src/App.css index 8e702df72d..e080f6b3b2 100644 --- a/infra/staff/src/App.css +++ b/infra/staff/src/App.css @@ -19,8 +19,7 @@ border-radius: 5px; margin-top: 20px; } -#submitbtn{ - +#submitbtn { padding: 10px 20px; font-size: 16px; cursor: pointer; @@ -30,7 +29,7 @@ border-radius: 5px; margin-top: 20px; } - + #submitbtn:hover { background-color: #007c6c; } diff --git a/infra/staff/src/App.tsx b/infra/staff/src/App.tsx index bad145673b..aaac53273d 100644 --- a/infra/staff/src/App.tsx +++ b/infra/staff/src/App.tsx @@ -15,7 +15,7 @@ export const App: React.FC = () => { const [email, setEmail] = useState(""); const [userData, setUserData] = useState(null); const [error, setError] = useState(null); - const [isDataFetched, setIsDataFetched] = useState(false); + const [isDataFetched, setIsDataFetched] = useState(false); useEffect(() => { const storedToken = localStorage.getItem("token"); @@ -46,11 +46,11 @@ export const App: React.FC = () => { console.log("API Response:", userDataResponse); setUserData(userDataResponse); setError(null); - setIsDataFetched(true); + setIsDataFetched(true); } catch (error) { console.error("Error fetching data:", error); setError((error as Error).message); - setIsDataFetched(false); + setIsDataFetched(false); } }; @@ -113,7 +113,7 @@ export const App: React.FC = () => { displayValue = value; } } else if (typeof value === "object" && value !== null) { - displayValue = JSON.stringify(value, null, 2); + displayValue = JSON.stringify(value, null, 2); } else if (value === null) { displayValue = "null"; } else if ( @@ -124,7 +124,7 @@ export const App: React.FC = () => { } else if (typeof value === "undefined") { displayValue = "undefined"; } else { - displayValue = value as string; + displayValue = value as string; } return ( @@ -157,7 +157,7 @@ export const App: React.FC = () => { const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === "Enter") { - event.preventDefault(); + event.preventDefault(); fetchData().catch((error: unknown) => console.error("Fetch data error:", error), ); diff --git a/infra/staff/src/components/UpdateSubscription.tsx b/infra/staff/src/components/UpdateSubscription.tsx index 2794bdb6b8..292d2947a5 100644 --- a/infra/staff/src/components/UpdateSubscription.tsx +++ b/infra/staff/src/components/UpdateSubscription.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; -import "../App.css"; +import "../App.css"; interface UpdateSubscriptionProps { token: string; userId: string; @@ -14,14 +14,13 @@ export const UpdateSubscription: React.FC = ({ onClose, }) => { const [expiryTime, setExpiryTime] = useState(null); - const [productId, setProductId] = useState("50gb_monthly"); + const [productId, setProductId] = useState("50gb_monthly"); const [paymentProvider, setPaymentProvider] = useState("bitpay"); const [transactionId, setTransactionId] = useState(""); const [message, setMessage] = useState(null); const [error, setError] = useState(null); const [storage, setStorage] = useState(""); - useEffect(() => { if (productId === "50gb_yearly" || productId === "50gb_monthly") { setStorage(50 * 1024 * 1024 * 1024); @@ -29,26 +28,25 @@ export const UpdateSubscription: React.FC = ({ productId === "200gb_yearly" || productId === "200gb_monthly" ) { - setStorage(200 * 1024 * 1024 * 1024); + setStorage(200 * 1024 * 1024 * 1024); } else if ( productId === "500gb_yearly" || productId === "500gb_monthly" ) { - setStorage(500 * 1024 * 1024 * 1024); + setStorage(500 * 1024 * 1024 * 1024); } else if ( productId === "2000gb_yearly" || productId === "2000gb_monthly" ) { setStorage(2000 * 1024 * 1024 * 1024); } else { - setStorage(""); + setStorage(""); } }, [productId]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); - const expiryTimeTimestamp = expiryTime ? expiryTime.getTime() * 1000 : ""; @@ -163,10 +161,7 @@ export const UpdateSubscription: React.FC = ({ onChange={(e) => setTransactionId(e.target.value)} /> - diff --git a/infra/staff/yarn.lock b/infra/staff/yarn.lock index 928775dcf0..6e982d4676 100644 --- a/infra/staff/yarn.lock +++ b/infra/staff/yarn.lock @@ -23,7 +23,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz" integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5": +"@babel/core@^7.24.5": version "7.24.6" resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz" integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== @@ -208,11 +208,121 @@ "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@esbuild/darwin-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz" integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -245,6 +355,42 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@floating-ui/core@^1.0.0": + version "1.6.2" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz" + integrity sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg== + dependencies: + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/dom@^1.0.0": + version "1.6.5" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz" + integrity sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.2": + version "0.26.17" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.17.tgz" + integrity sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ== + dependencies: + "@floating-ui/react-dom" "^2.1.0" + "@floating-ui/utils" "^0.2.0" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.0": + version "0.2.2" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" + integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -304,7 +450,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== @@ -322,11 +468,107 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@rollup/plugin-node-resolve@^15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@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.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz" 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== + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" @@ -360,7 +602,7 @@ dependencies: "@babel/types" "^7.20.7" -"@types/estree@1.0.5": +"@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -385,6 +627,11 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@typescript-eslint/eslint-plugin@^7": version "7.11.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz" @@ -400,7 +647,7 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^7", "@typescript-eslint/parser@^7.0.0": +"@typescript-eslint/parser@^7": version "7.11.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz" integrity sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg== @@ -487,7 +734,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.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -652,7 +899,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.22.2, "browserslist@>= 4.21.0": +browserslist@^4.22.2: version "4.23.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -662,6 +909,11 @@ browserslist@^4.22.2, "browserslist@>= 4.21.0": node-releases "^2.0.14" update-browserslist-db "^1.0.13" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" @@ -719,16 +971,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== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -780,6 +1032,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" +date-fns@^3.3.1, date-fns@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.5" resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" @@ -792,6 +1049,11 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" @@ -1053,7 +1315,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, eslint@^8.56.0, eslint@>=7: +eslint@^8: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -1125,6 +1387,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -1468,6 +1735,13 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -1525,6 +1799,11 @@ is-map@^2.0.3: resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-negative-zero@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" @@ -1735,21 +2014,7 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" -minimatch@^3.0.5: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -1952,12 +2217,12 @@ prettier-plugin-packagejson@^2.5: sort-package-json "2.10.0" synckit "0.9.0" -prettier@^3, "prettier@>= 1.16.0", prettier@>=2.0: +prettier@^3: version "3.3.0" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz" integrity sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g== -prop-types@^15.8.1: +prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -1976,7 +2241,18 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18, react-dom@>=18: +react-datepicker@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.1.0.tgz" + integrity sha512-Z91n5ybhmzI+YChj1ZG7ntPPOmHR2Dh4jbIl+mNgKXKoxyzUQBh7M3eQaFOwrBCVdKy5vsj370/ocQlGu1qsGA== + dependencies: + "@floating-ui/react" "^0.26.2" + clsx "^2.1.0" + date-fns "^3.3.1" + prop-types "^15.7.2" + react-onclickoutside "^6.13.0" + +react-dom@^18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -1989,6 +2265,11 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-onclickoutside@^6.13.0: + version "6.13.1" + resolved "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz" + integrity sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w== + react-refresh@^0.14.2: version "0.14.2" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" @@ -2001,7 +2282,7 @@ react-toastify@^10.0.5: dependencies: clsx "^2.1.0" -react@^18, react@^18.3.1, react@>=18: +react@^18: 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== @@ -2036,6 +2317,15 @@ 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.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + 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@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" @@ -2288,6 +2578,11 @@ synckit@0.9.0: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -2371,7 +2666,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.4.5, typescript@>=2.9, typescript@>=4.2.0: +typescript@^5: version "5.4.5" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -2401,7 +2696,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -"vite@^4.2.0 || ^5.0.0", vite@^5.2: +vite@^5.2: version "5.2.12" resolved "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz" integrity sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==